diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index b7199a51f12..50a89115cac 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -451,11 +451,11 @@ "abi" = ( /obj/structure/grille, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "abj" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abk" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -1083,11 +1083,11 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acF" = ( /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acG" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -1095,7 +1095,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "acH" = ( /obj/structure/chair/stool, /turf/simulated/shuttle/floor{ @@ -5619,7 +5619,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "alX" = ( /obj/structure/cable{ d1 = 1; @@ -5694,7 +5694,7 @@ /area/maintenance/fsmaint) "ami" = ( /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "amj" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -12161,7 +12161,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ayH" = ( /obj/machinery/conveyor{ dir = 4; @@ -12728,7 +12728,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "azS" = ( /obj/effect/decal/warning_stripes/southeast, /obj/effect/decal/warning_stripes/northwestcorner, @@ -12860,7 +12860,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aAf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/unary/heat_reservoir/heater{ @@ -12909,7 +12909,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aAj" = ( /obj/structure/cable{ d1 = 1; @@ -13824,7 +13824,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aBW" = ( /obj/structure/cable{ d1 = 1; @@ -14710,7 +14710,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aDD" = ( /obj/structure/cable{ d1 = 2; @@ -14991,7 +14991,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aEb" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -15123,7 +15123,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "aEq" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, @@ -15774,7 +15774,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aFA" = ( /turf/simulated/wall, /area/crew_quarters/bar) @@ -16598,7 +16598,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aGX" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -17778,7 +17778,7 @@ dir = 6 }, /turf/space, -/area/space) +/area/space/nearstation) "aIU" = ( /obj/structure/cable{ d1 = 1; @@ -18105,12 +18105,12 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aJz" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aJA" = ( /obj/structure/cable{ d1 = 4; @@ -19496,7 +19496,7 @@ /obj/item/wrench, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aLU" = ( /turf/simulated/wall, /area/crew_quarters/bar/atrium) @@ -20753,7 +20753,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aOp" = ( /obj/structure/table/wood, /obj/item/clothing/glasses/sunglasses, @@ -21053,7 +21053,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aOV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -21067,7 +21067,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aOX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -23876,7 +23876,7 @@ icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "aTT" = ( /obj/structure/cable{ d1 = 1; @@ -23899,7 +23899,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aTV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5; @@ -27687,7 +27687,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aZZ" = ( /obj/item/radio/intercom{ dir = 4; @@ -27709,7 +27709,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bab" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -28097,7 +28097,7 @@ req_access_txt = "67" }, /turf/space, -/area/space) +/area/space/nearstation) "baP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -33395,12 +33395,12 @@ "bkt" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bku" = ( /obj/structure/lattice, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bkv" = ( /obj/machinery/light/small{ dir = 8 @@ -34368,7 +34368,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bmp" = ( /obj/structure/window/reinforced{ dir = 1; @@ -34409,7 +34409,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bmt" = ( /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 4; @@ -35184,7 +35184,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bnN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -35229,7 +35229,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bnS" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/visible/cyan{ @@ -36084,7 +36084,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bpn" = ( /obj/structure/window/reinforced{ dir = 1; @@ -36156,7 +36156,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bpv" = ( /turf/simulated/floor/engine/insulated/vacuum, /area/atmos) @@ -36944,7 +36944,7 @@ pixel_y = 0 }, /turf/space, -/area/space) +/area/space/nearstation) "bqJ" = ( /obj/machinery/hologram/holopad, /obj/effect/decal/warning_stripes/yellow/hollow, @@ -37321,7 +37321,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "brr" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37329,14 +37329,14 @@ layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "brs" = ( /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "brt" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37345,7 +37345,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/space, -/area/space) +/area/space/nearstation) "bru" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -37362,7 +37362,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, -/area/space) +/area/space/nearstation) "brw" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -37373,7 +37373,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "brx" = ( /obj/machinery/light/small{ dir = 8 @@ -38788,12 +38788,12 @@ /obj/structure/closet/emcloset, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "btJ" = ( /obj/structure/closet/firecloset, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "btK" = ( /obj/structure/cable{ d1 = 1; @@ -39582,7 +39582,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bvi" = ( /obj/machinery/door/airlock/external{ name = "Labor Shuttle Airlock"; @@ -44212,7 +44212,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bCJ" = ( /turf/simulated/wall, /area/security/prisonershuttle) @@ -49717,7 +49717,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bLN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5; @@ -49769,7 +49769,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bLS" = ( /obj/structure/window/reinforced{ dir = 1; @@ -49779,7 +49779,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bLT" = ( /obj/structure/window/reinforced{ dir = 8 @@ -49810,7 +49810,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bLV" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -49836,7 +49836,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bLW" = ( /obj/structure/cable{ d1 = 4; @@ -51873,7 +51873,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bPD" = ( /obj/structure/cable{ d1 = 4; @@ -52078,10 +52078,10 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bPS" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bPT" = ( /obj/structure/lattice, /obj/structure/window/reinforced, @@ -52090,7 +52090,7 @@ icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bPU" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52098,12 +52098,12 @@ icon_state = "E-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bPV" = ( /obj/structure/lattice, /obj/structure/transit_tube, /turf/space, -/area/space) +/area/space/nearstation) "bPW" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52111,7 +52111,7 @@ icon_state = "W-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bPX" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -52119,7 +52119,7 @@ icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bPY" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -52899,7 +52899,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bRn" = ( /obj/structure/rack, /obj/item/ammo_box/shotgun/rubbershot, @@ -53136,7 +53136,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bRH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; @@ -53241,28 +53241,28 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bRP" = ( /obj/structure/transit_tube{ tag = "icon-D-NE"; icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bRQ" = ( /obj/structure/lattice, /obj/structure/transit_tube{ icon_state = "NW-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bRR" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bRS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ @@ -54806,7 +54806,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bUc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -55200,7 +55200,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bUK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/navbeacon{ @@ -55458,7 +55458,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bVg" = ( /obj/structure/cable{ d1 = 4; @@ -55675,7 +55675,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bVt" = ( /obj/structure/sign/vacuum{ pixel_x = -32; @@ -56126,28 +56126,28 @@ icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWa" = ( /obj/structure/transit_tube{ tag = "icon-D-SE"; icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bWb" = ( /obj/structure/lattice, /obj/structure/transit_tube{ icon_state = "NE-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWc" = ( /obj/structure/transit_tube{ tag = "icon-D-NW"; icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bWd" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -56155,7 +56155,7 @@ icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bWe" = ( /obj/structure/cable{ d1 = 4; @@ -56502,7 +56502,7 @@ pixel_y = -22 }, /turf/space, -/area/space) +/area/space/nearstation) "bWD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -57190,7 +57190,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bXG" = ( /obj/structure/cable{ d1 = 1; @@ -57200,7 +57200,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bXH" = ( /obj/item/twohanded/required/kirbyplants, /obj/machinery/light, @@ -57308,7 +57308,7 @@ icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bXR" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57316,7 +57316,7 @@ icon_state = "E-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bXS" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57324,7 +57324,7 @@ icon_state = "W-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bXT" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -57332,7 +57332,7 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bXU" = ( /turf/simulated/wall/r_wall, /area/engine/engineering) @@ -57393,7 +57393,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/sign/securearea{ @@ -57476,7 +57476,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYm" = ( /obj/structure/cable{ d1 = 4; @@ -57490,7 +57490,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYn" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -57699,7 +57699,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bYK" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -57920,7 +57920,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bZg" = ( /obj/structure/table/reinforced, /obj/structure/reagent_dispensers/peppertank{ @@ -58095,7 +58095,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bZx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58980,7 +58980,7 @@ /obj/effect/decal/warning_stripes/west, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cbb" = ( /turf/simulated/floor/plating/airless, /area/engine/engineering) @@ -62781,7 +62781,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "chx" = ( /obj/structure/cable{ d1 = 4; @@ -63157,10 +63157,10 @@ /obj/effect/decal/warning_stripes/east, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cif" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cig" = ( /obj/structure/table/reinforced, /obj/item/book/manual/engineering_guide{ @@ -63832,7 +63832,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cjm" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -64010,11 +64010,11 @@ "cjH" = ( /obj/effect/decal/warning_stripes/northwestcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjI" = ( /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjJ" = ( /obj/machinery/power/tesla_coil{ anchored = 1 @@ -64022,7 +64022,7 @@ /obj/structure/cable/yellow, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjK" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -64031,7 +64031,7 @@ }, /obj/effect/decal/warning_stripes/northeastcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cjL" = ( /obj/machinery/door/poddoor{ density = 0; @@ -65079,7 +65079,7 @@ "clp" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "clq" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'RADIOACTIVE AREA'"; @@ -66345,7 +66345,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cnI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/twohanded/required/kirbyplants, @@ -66468,7 +66468,7 @@ /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/space, -/area/space) +/area/space/nearstation) "cnW" = ( /obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, @@ -66478,7 +66478,7 @@ /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/space, -/area/space) +/area/space/nearstation) "cnY" = ( /obj/structure/lattice, /obj/structure/window/reinforced, @@ -66486,7 +66486,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "cnZ" = ( /obj/machinery/field/generator{ anchored = 1; @@ -66494,7 +66494,7 @@ }, /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "coa" = ( /obj/machinery/field/generator{ anchored = 1; @@ -66502,7 +66502,7 @@ }, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cob" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -66511,7 +66511,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "coc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/yellow{ @@ -66568,7 +66568,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "coj" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -67042,7 +67042,7 @@ "cpg" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cph" = ( /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, @@ -68035,11 +68035,11 @@ }, /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqO" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -68051,7 +68051,7 @@ "cqQ" = ( /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cqR" = ( /obj/structure/particle_accelerator/particle_emitter/right{ dir = 8 @@ -69035,7 +69035,7 @@ /obj/structure/transit_tube, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "css" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -69096,7 +69096,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "csz" = ( /obj/structure/closet/crate{ name = "solar pack crate" @@ -69743,7 +69743,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctJ" = ( /obj/structure/transit_tube{ tag = "icon-E-NW"; @@ -69754,7 +69754,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctK" = ( /obj/structure/table/wood, /obj/item/storage/fancy/crayons, @@ -69903,7 +69903,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ctZ" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable{ @@ -70407,7 +70407,7 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuP" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -70421,7 +70421,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuQ" = ( /obj/machinery/field/generator{ anchored = 1; @@ -70429,7 +70429,7 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cuR" = ( /obj/machinery/pipedispenser, /obj/effect/decal/warning_stripes/yellow/hollow, @@ -71280,15 +71280,15 @@ "cwt" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cwu" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cwv" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cww" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -72854,7 +72854,7 @@ }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "czj" = ( /obj/structure/closet/secure_closet/engineering_welding, /obj/machinery/light_switch{ @@ -73002,7 +73002,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "czx" = ( /obj/structure/cable{ d1 = 1; @@ -74444,7 +74444,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cBV" = ( /obj/structure/chair/office/dark, /obj/machinery/newscaster{ @@ -77537,7 +77537,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cHu" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -78384,7 +78384,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cJf" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -78831,7 +78831,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cKk" = ( /obj/structure/cable{ d1 = 4; @@ -78846,7 +78846,7 @@ /obj/structure/window/reinforced, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cKm" = ( /obj/structure/cable{ d1 = 2; @@ -80282,7 +80282,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cNo" = ( /obj/structure/cable{ d1 = 1; @@ -80751,7 +80751,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cOa" = ( /obj/structure/table/reinforced, /obj/item/book/manual/security_space_law, @@ -80927,7 +80927,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cOn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9; @@ -81686,7 +81686,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -81854,7 +81854,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPY" = ( /obj/machinery/access_button{ command = "cycle_exterior"; @@ -81867,7 +81867,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/wall, @@ -99561,7 +99561,7 @@ "dvU" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dvV" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -104257,7 +104257,7 @@ }, /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dEy" = ( /obj/structure/cable{ d1 = 1; @@ -110940,7 +110940,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQD" = ( /obj/machinery/field/generator{ anchored = 1; @@ -110948,11 +110948,11 @@ }, /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQE" = ( /obj/effect/decal/warning_stripes/southwestcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQF" = ( /obj/structure/table, /obj/item/storage/firstaid/regular, @@ -112707,7 +112707,7 @@ width = 11 }, /turf/space, -/area/space) +/area/space/nearstation) "dTV" = ( /obj/machinery/power/solar{ name = "Aft Starboard Solar Panel" @@ -113083,7 +113083,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dUF" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -113092,7 +113092,7 @@ }, /obj/effect/decal/warning_stripes/southeastcorner, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dUG" = ( /obj/structure/grille, /obj/structure/cable/yellow{ @@ -115003,7 +115003,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "dXY" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/iv_bag/blood/random, @@ -115461,7 +115461,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "dYR" = ( /obj/structure/cable{ d2 = 2; diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 0e64cefc7aa..fd4abd040cc 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -13,7 +13,7 @@ width = 18 }, /turf/space, -/area/space) +/area/space/nearstation) "aac" = ( /obj/machinery/porta_turret/syndicate, /turf/space, @@ -549,17 +549,17 @@ "abd" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "abe" = ( /obj/structure/grille/broken, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abf" = ( /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abg" = ( /obj/machinery/recharge_station/upgraded, /turf/simulated/shuttle/floor{ @@ -654,7 +654,7 @@ "abq" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "abr" = ( /obj/machinery/door/window{ dir = 4; @@ -1324,7 +1324,7 @@ dir = 8; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "acH" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall3"; @@ -1352,7 +1352,7 @@ dir = 1; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "acK" = ( /obj/item/beach_ball/holoball, /obj/structure/holohoop{ @@ -2123,7 +2123,7 @@ "aef" = ( /turf/simulated/floor/plating/airless/catwalk, /turf/space, -/area/space) +/area/space/nearstation) "aeg" = ( /obj/structure/cable{ d1 = 1; @@ -9928,12 +9928,12 @@ /area/shuttle/vox) "arA" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "arB" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "arC" = ( /obj/structure/cable{ d1 = 1; @@ -10885,7 +10885,7 @@ "ata" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "atb" = ( /obj/item/flashlight/lamp, /obj/structure/extinguisher_cabinet{ @@ -11587,7 +11587,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "auq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -13911,7 +13911,7 @@ opened = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ayz" = ( /obj/structure/cable{ d1 = 1; @@ -14600,7 +14600,7 @@ pixel_y = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "azJ" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plating, @@ -16074,7 +16074,7 @@ }, /obj/item/stack/rods, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aCo" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3"; @@ -16673,11 +16673,11 @@ "aDo" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aDp" = ( /obj/item/stack/cable_coil, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aDq" = ( /turf/simulated/shuttle/floor, /area/shuttle/mining) @@ -18331,7 +18331,7 @@ network = list("Singulo") }, /turf/space, -/area/space) +/area/space/nearstation) "aGa" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable/yellow{ @@ -20306,7 +20306,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJu" = ( /obj/machinery/door/airlock/maintenance{ name = "Law Office Maintenance"; @@ -20345,7 +20345,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJy" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -20493,7 +20493,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJK" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; @@ -20632,7 +20632,7 @@ state = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aJX" = ( /turf/simulated/floor/wood, /area/lawoffice) @@ -20663,7 +20663,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aKb" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -21569,7 +21569,7 @@ /obj/item/wirecutters, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aLy" = ( /obj/machinery/computer/guestpass{ pixel_x = 30 @@ -21688,7 +21688,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aLO" = ( /obj/machinery/power/grounding_rod{ anchored = 1 @@ -22185,7 +22185,7 @@ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aMJ" = ( /obj/machinery/door/window{ dir = 1; @@ -23083,7 +23083,7 @@ "aOj" = ( /obj/item/crowbar, /turf/space, -/area/space) +/area/space/nearstation) "aOk" = ( /obj/machinery/alarm{ dir = 4; @@ -23102,7 +23102,7 @@ "aOm" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aOn" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -23131,7 +23131,7 @@ "aOq" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aOr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -23518,7 +23518,7 @@ }, /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPe" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/warning_stripes/west, @@ -23545,7 +23545,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPh" = ( /obj/structure/table, /obj/item/hatchet, @@ -23712,7 +23712,7 @@ }, /obj/structure/cable, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aPz" = ( /obj/item/seeds/apple, /obj/item/seeds/banana, @@ -24085,7 +24085,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aQg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -24167,7 +24167,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aQo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -24580,7 +24580,7 @@ "aRe" = ( /obj/item/weldingtool, /turf/space, -/area/space) +/area/space/nearstation) "aRf" = ( /obj/item/wirecutters, /obj/structure/cable{ @@ -24608,7 +24608,7 @@ "aRh" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aRi" = ( /obj/machinery/pipedispenser, /turf/simulated/floor/plating, @@ -25199,7 +25199,7 @@ "aSk" = ( /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aSl" = ( /obj/machinery/navbeacon{ codes_txt = "delivery"; @@ -25233,7 +25233,7 @@ "aSp" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aSq" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -25990,7 +25990,7 @@ "aTG" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTH" = ( /obj/machinery/power/apc{ dir = 4; @@ -26024,7 +26024,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTJ" = ( /obj/structure/cable{ d1 = 1; @@ -26059,7 +26059,7 @@ d2 = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTN" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall3"; @@ -26646,7 +26646,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aUN" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -26724,12 +26724,12 @@ "aUU" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "aUV" = ( /obj/structure/window/reinforced, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aUW" = ( /obj/structure/chair{ dir = 1 @@ -27657,7 +27657,7 @@ "aWw" = ( /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aWx" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room"; @@ -27712,7 +27712,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aWD" = ( /turf/simulated/wall, /area/hallway/secondary/entry{ @@ -28311,7 +28311,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aXI" = ( /obj/structure/window/reinforced{ dir = 1; @@ -28369,13 +28369,13 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aXO" = ( /obj/structure/window/reinforced{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "aXP" = ( /obj/item/crowbar, /turf/simulated/floor/plating, @@ -29805,7 +29805,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "baq" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -32575,7 +32575,7 @@ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bfa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5; @@ -33702,7 +33702,7 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bgN" = ( /obj/structure/lattice, /turf/space, @@ -33807,7 +33807,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bgV" = ( /obj/machinery/conveyor_switch/oneway{ id = "packageSort2"; @@ -38279,7 +38279,7 @@ name = "EXTERNAL AIRLOCK" }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bop" = ( /obj/machinery/computer/med_data, /turf/simulated/floor/plasteel{ @@ -38945,7 +38945,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bps" = ( /obj/structure/window/reinforced{ dir = 1 @@ -39972,7 +39972,7 @@ icon_state = "D-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bqZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -40029,10 +40029,10 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bre" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "brf" = ( /obj/structure/window/reinforced{ dir = 8 @@ -40618,7 +40618,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bse" = ( /obj/structure/window/reinforced{ dir = 1 @@ -40627,7 +40627,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bsf" = ( /obj/structure/window/reinforced{ dir = 4 @@ -40971,12 +40971,12 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsJ" = ( /obj/structure/transit_tube, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsK" = ( /obj/structure/transit_tube{ tag = "icon-W-SE"; @@ -40984,14 +40984,14 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsL" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; icon_state = "D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bsM" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomfoyer{ @@ -41003,7 +41003,7 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bsO" = ( /obj/structure/table/reinforced, /obj/structure/cable/yellow{ @@ -41041,7 +41041,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsQ" = ( /obj/structure/transit_tube{ icon_state = "E-W-Pass" @@ -41049,7 +41049,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsR" = ( /obj/structure/transit_tube{ icon_state = "E-SW"; @@ -41057,13 +41057,13 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bsS" = ( /obj/structure/transit_tube{ icon_state = "W-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bsT" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -41842,7 +41842,7 @@ icon_state = "NE-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "bue" = ( /obj/structure/sign/double/map/left{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -42205,14 +42205,14 @@ tag = "icon-D-SW" }, /turf/space, -/area/space) +/area/space/nearstation) "buM" = ( /obj/structure/transit_tube{ icon_state = "D-NW"; tag = "icon-D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "buN" = ( /obj/structure/transit_tube{ icon_state = "S-NW" @@ -42239,7 +42239,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "buP" = ( /obj/structure/window/reinforced{ dir = 1 @@ -42760,7 +42760,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bvw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -43601,7 +43601,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwM" = ( /obj/structure/transit_tube{ tag = "icon-S-NE"; @@ -43622,7 +43622,7 @@ icon_state = "vault"; dir = 8 }, -/area/space) +/area/space/nearstation) "bwN" = ( /obj/item/assembly/prox_sensor, /obj/structure/cable/yellow{ @@ -43729,7 +43729,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwV" = ( /obj/machinery/vending/coffee, /turf/simulated/floor/plasteel{ @@ -43752,7 +43752,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwX" = ( /obj/structure/transit_tube{ tag = "icon-D-SE"; @@ -43771,7 +43771,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwY" = ( /obj/structure/transit_tube, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -43783,7 +43783,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bwZ" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -43909,7 +43909,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bxj" = ( /obj/structure/transit_tube{ tag = "icon-S-NE"; @@ -43917,14 +43917,14 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bxk" = ( /obj/structure/transit_tube{ tag = "icon-D-NE"; icon_state = "D-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bxl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -43936,7 +43936,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bxm" = ( /obj/structure/transit_tube{ icon_state = "W-NE-SE" @@ -43952,7 +43952,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxn" = ( /obj/structure/transit_tube{ tag = "icon-D-SW"; @@ -43973,7 +43973,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -43986,7 +43986,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxp" = ( /obj/structure/transit_tube/station{ icon_state = "closed"; @@ -44027,7 +44027,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "bxr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -45168,7 +45168,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bzd" = ( /obj/structure/transit_tube{ tag = "icon-N-SW"; @@ -45176,7 +45176,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bze" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/ai_slipper{ @@ -45403,7 +45403,7 @@ icon_state = "NW-SE" }, /turf/space, -/area/space) +/area/space/nearstation) "bzu" = ( /obj/structure/transit_tube{ icon_state = "N-SW" @@ -45963,7 +45963,7 @@ icon_state = "vault"; dir = 8 }, -/area/space) +/area/space/nearstation) "bAu" = ( /obj/machinery/vending/boozeomat, /turf/simulated/wall, @@ -46292,7 +46292,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bAY" = ( /obj/structure/transit_tube{ tag = "icon-W-NE"; @@ -46300,7 +46300,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bAZ" = ( /obj/structure/lattice, /obj/structure/transit_tube{ @@ -46308,14 +46308,14 @@ icon_state = "D-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bBa" = ( /obj/structure/transit_tube{ tag = "icon-E-NW"; icon_state = "E-NW" }, /turf/space, -/area/space) +/area/space/nearstation) "bBb" = ( /obj/structure/transit_tube{ icon_state = "D-SE"; @@ -46325,7 +46325,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bBc" = ( /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, @@ -47212,7 +47212,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bCx" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; @@ -47502,7 +47502,7 @@ /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/space) +/area/space/nearstation) "bCZ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -48824,12 +48824,12 @@ /obj/structure/lattice, /obj/structure/grille, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bFc" = ( /obj/structure/grille, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bFd" = ( /obj/machinery/computer/security/telescreen{ dir = 8; @@ -48932,7 +48932,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bFl" = ( /turf/simulated/floor/plasteel{ icon_state = "grimy" @@ -49802,13 +49802,13 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bGN" = ( /obj/structure/transit_tube{ icon_state = "W-NE" }, /turf/space, -/area/space) +/area/space/nearstation) "bGO" = ( /obj/structure/window/reinforced{ dir = 1 @@ -50623,7 +50623,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bIv" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ @@ -51768,7 +51768,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/insulated, /turf/space, -/area/space) +/area/space/nearstation) "bKy" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 1 @@ -53038,7 +53038,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bMk" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -53087,7 +53087,7 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "bMo" = ( /obj/machinery/telecomms/processor/preset_one, /turf/simulated/floor/bluegrid{ @@ -54076,7 +54076,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bNZ" = ( /obj/machinery/telecomms/bus/preset_one, /turf/simulated/floor/bluegrid{ @@ -54973,20 +54973,20 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bPG" = ( /obj/structure/lattice, /obj/structure/grille, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bPH" = ( /obj/structure/window/reinforced{ dir = 1 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bPI" = ( /obj/machinery/light/small{ dir = 8 @@ -55794,7 +55794,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bRn" = ( /obj/machinery/message_server, /turf/simulated/floor/bluegrid{ @@ -55829,7 +55829,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "bRq" = ( /obj/machinery/door/airlock/hatch{ name = "Telecoms Server Room" @@ -59662,7 +59662,7 @@ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "bXP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/extinguisher_cabinet{ @@ -63185,7 +63185,7 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/engine/vacuum, -/area/space) +/area/space/nearstation) "cdS" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - CO2"; @@ -67010,7 +67010,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ckp" = ( /obj/structure/window/reinforced{ dir = 4 @@ -67020,7 +67020,7 @@ layer = 2.9 }, /turf/space, -/area/space) +/area/space/nearstation) "ckq" = ( /obj/structure/window/reinforced{ dir = 1; @@ -67030,7 +67030,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "ckr" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -67942,7 +67942,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "clI" = ( /obj/machinery/requests_console{ announcementConsole = 0; @@ -68501,31 +68501,31 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/green, /turf/space, -/area/space) +/area/space/nearstation) "cmL" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "cmM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cmN" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 9 }, /turf/space, -/area/space) +/area/space/nearstation) "cmO" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/cyan, /turf/space, -/area/space) +/area/space/nearstation) "cmP" = ( /obj/structure/window/reinforced{ dir = 1 @@ -71960,11 +71960,11 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/binary/pump/on, /turf/space, -/area/space) +/area/space/nearstation) "csp" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "csq" = ( /obj/machinery/light/small, /turf/simulated/floor/engine{ @@ -72780,7 +72780,7 @@ icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "ctt" = ( /obj/structure/disposaloutlet{ dir = 2 @@ -72789,7 +72789,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ctu" = ( /turf/simulated/wall/r_wall/coated, /area/maintenance/incinerator) @@ -75747,7 +75747,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cyo" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -76392,7 +76392,7 @@ "czm" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "czn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; @@ -78499,7 +78499,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cCA" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -78816,7 +78816,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cDa" = ( /obj/machinery/door/airlock/maintenance{ name = "airlock access"; @@ -78950,7 +78950,7 @@ "cDn" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/engine/vacuum, -/area/space) +/area/space/nearstation) "cDo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -81330,7 +81330,7 @@ "cHf" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "cHg" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -83393,7 +83393,7 @@ /area/medical/surgery2) "cKI" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "cKJ" = ( /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, @@ -86874,7 +86874,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPV" = ( /obj/structure/closet/wardrobe/robotics_black{ pixel_x = 2 @@ -88571,13 +88571,13 @@ icon_state = "pipe-c" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSA" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -89153,7 +89153,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTy" = ( /obj/structure/morgue, /turf/simulated/floor/plasteel{ @@ -95292,14 +95292,14 @@ "ddO" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ddP" = ( /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ddQ" = ( /obj/docking_port/stationary{ dheight = 9; @@ -95445,7 +95445,7 @@ d2 = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dea" = ( /obj/structure/cable{ d1 = 1; @@ -95453,7 +95453,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "deb" = ( /obj/machinery/vending/wallmed1{ name = "Emergency NanoMed"; @@ -95472,7 +95472,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ded" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -95673,7 +95673,7 @@ dir = 6 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dex" = ( /obj/structure/rack{ dir = 1 @@ -95692,7 +95692,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dez" = ( /obj/structure/disposalpipe/segment{ dir = 8; diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 50a81f6e6e8..199577ece74 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -10,9 +10,6 @@ dir = 8 }, /area/space) -"ad" = ( -/turf/space/transit, -/area/syndicate_station/transit) "ae" = ( /turf/unsimulated/wall{ tag = "icon-iron6"; @@ -1284,7 +1281,7 @@ width = 18 }, /turf/space/transit, -/area/syndicate_station/transit) +/area/space) "dy" = ( /obj/docking_port/stationary/transit{ dir = 8; @@ -14886,15 +14883,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15137,21 +15134,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15394,21 +15391,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15651,21 +15648,21 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -15901,28 +15898,28 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16158,25 +16155,25 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16415,27 +16412,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16672,27 +16669,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16929,27 +16926,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17186,27 +17183,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17443,27 +17440,27 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17700,25 +17697,25 @@ aa aa aa aa -ad -ad -ad -ad -ad aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17957,28 +17954,28 @@ aa aa aa aa -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa aa aa aa aa dx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18223,19 +18220,19 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18480,19 +18477,19 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18741,15 +18738,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18998,15 +18995,15 @@ aa aa aa aa -ad -ad -ad -ad -ad -ad -ad -ad -ad +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm index c1e20ddacaa..6784ca8ceca 100644 --- a/_maps/map_files/MetaStation/z3.dmm +++ b/_maps/map_files/MetaStation/z3.dmm @@ -145,7 +145,7 @@ "ay" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "az" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless{ @@ -156,31 +156,31 @@ "be" = ( /obj/item/trash/cheesie, /turf/space, -/area/space) +/area/space/nearstation) "bj" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bk" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "bl" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bm" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bn" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "bo" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bp" = ( /turf/simulated/wall/r_wall, /area/tcommsat/chamber) @@ -198,7 +198,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bt" = ( /obj/structure/window/reinforced{ dir = 8 @@ -258,7 +258,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bE" = ( /obj/structure/cable{ d1 = 1; @@ -285,7 +285,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bI" = ( /turf/simulated/floor/plating/airless, /area/tcommsat/chamber) @@ -355,7 +355,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/item/folder/yellow, /turf/simulated/floor/plating/airless, @@ -372,7 +372,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bY" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -383,7 +383,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bZ" = ( /obj/structure/window/reinforced{ dir = 8 @@ -399,18 +399,18 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cb" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cc" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "cd" = ( /obj/structure/sign/securearea, /turf/simulated/wall/r_wall, @@ -520,20 +520,20 @@ dir = 4 }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "cv" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cw" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cx" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -542,7 +542,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cy" = ( /obj/structure/window/reinforced{ dir = 8 @@ -562,20 +562,20 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cA" = ( /obj/structure/window/reinforced{ dir = 1 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cB" = ( /obj/structure/window/reinforced{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "cC" = ( /obj/structure/table, /obj/item/radio/off, @@ -606,14 +606,14 @@ /turf/simulated/floor/plasteel{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "cI" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cJ" = ( /obj/structure/window/reinforced{ dir = 8 @@ -679,7 +679,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cQ" = ( /obj/structure/window/reinforced{ dir = 4 @@ -846,19 +846,19 @@ }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "du" = ( /obj/structure/window/reinforced, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dz" = ( /obj/structure/window/reinforced{ dir = 4 }, /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "dA" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -886,7 +886,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dJ" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -894,7 +894,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dK" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -906,7 +906,7 @@ "dM" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "dO" = ( /obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel, @@ -943,7 +943,7 @@ "ed" = ( /obj/item/crowbar, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ej" = ( /obj/structure/computerframe, /turf/simulated/floor/plating, diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index 95277b92bf9..526fd945efd 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ac" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plating/airless{ @@ -18,7 +18,7 @@ "ae" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /turf/simulated/wall, /area/djstation) @@ -350,7 +350,7 @@ "aY" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aZ" = ( /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -460,7 +460,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bl" = ( /turf/simulated/floor/plating/airless{ tag = "icon-platingdmg2"; @@ -646,7 +646,7 @@ /area/derelict/bridge/ai_upload) "bE" = ( /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bF" = ( /turf/simulated/floor/plasteel, /area/derelict/solar_control) @@ -843,7 +843,7 @@ /area/derelict/solar_control) "ce" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "cf" = ( /obj/machinery/porta_turret, /turf/simulated/floor/plasteel, @@ -877,7 +877,7 @@ "cj" = ( /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ck" = ( /obj/machinery/light/small, /turf/simulated/floor/plasteel, @@ -908,7 +908,7 @@ "co" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "cp" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, @@ -1019,7 +1019,7 @@ "cH" = ( /obj/structure/closet/crate, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cI" = ( /turf/simulated/floor/plating/airless{ icon_state = "damaged4" @@ -1115,7 +1115,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "damaged4" }, -/area/space) +/area/space/nearstation) "cZ" = ( /obj/structure/cable{ d1 = 1; @@ -1167,7 +1167,7 @@ /area/derelict/bridge/ai_upload) "df" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "dg" = ( /obj/structure/cable{ d1 = 1; @@ -1197,7 +1197,7 @@ /obj/item/stack/ore/iron, /obj/item/stack/ore/iron, /turf/space, -/area/space) +/area/space/nearstation) "dl" = ( /turf/simulated/floor/plating/airless{ icon_state = "damaged2" @@ -1309,7 +1309,7 @@ "dE" = ( /obj/item/stack/ore/slag, /turf/space, -/area/space) +/area/space/nearstation) "dF" = ( /obj/structure/cable{ d1 = 1; @@ -1490,7 +1490,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "eb" = ( /obj/structure/cable{ d1 = 4; @@ -1536,7 +1536,7 @@ "ef" = ( /obj/item/stack/cable_coil/cut, /turf/space, -/area/space) +/area/space/nearstation) "eg" = ( /obj/machinery/light/small{ dir = 8 @@ -1893,7 +1893,7 @@ "fk" = ( /obj/item/stack/rods, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fl" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -2088,7 +2088,7 @@ "fK" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "fL" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -2283,7 +2283,7 @@ /area/derelict/bridge/access) "gp" = ( /turf/simulated/wall/mineral/bananium, -/area/space) +/area/space/nearstation) "gq" = ( /obj/structure/window/reinforced{ dir = 4 @@ -2460,7 +2460,7 @@ "gO" = ( /obj/machinery/door/airlock/bananium, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gP" = ( /obj/structure/cable{ d1 = 2; @@ -2513,28 +2513,28 @@ "gX" = ( /obj/item/flag/clown, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gY" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gZ" = ( /obj/effect/landmark/burnturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ha" = ( /obj/effect/mob_spawn/human/corpse/clownmili{ name = "Clown Pilot" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hb" = ( /obj/effect/mob_spawn/human/corpse/clownmili, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hc" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hd" = ( /obj/machinery/light/small{ dir = 4 @@ -2627,7 +2627,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "floorscorched2" }, -/area/space) +/area/space/nearstation) "hp" = ( /obj/structure/computerframe, /obj/effect/landmark/damageturf, @@ -2648,7 +2648,7 @@ name = "Clown Pilot" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hs" = ( /obj/structure/closet, /obj/structure/window/reinforced{ @@ -2707,7 +2707,7 @@ "hB" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) "hC" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, @@ -2738,7 +2738,7 @@ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "hG" = ( /turf/simulated/wall/r_wall, /area/derelict/arrival) @@ -2769,7 +2769,7 @@ /obj/structure/lattice, /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "hN" = ( /obj/structure/table, /turf/simulated/floor/plasteel, @@ -2901,7 +2901,7 @@ name = "External Engineering" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "il" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -2970,7 +2970,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "iv" = ( /obj/structure/table, /turf/simulated/floor/plasteel{ @@ -2996,7 +2996,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "iz" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -3004,7 +3004,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "iA" = ( /turf/simulated/floor/plating, /area/derelict/arrival) @@ -3014,7 +3014,7 @@ }, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "iC" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -3106,7 +3106,7 @@ "iN" = ( /obj/item/stack/cable_coil/cut, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iO" = ( /obj/structure/table, /obj/structure/window/reinforced{ @@ -3204,7 +3204,7 @@ "jb" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "jc" = ( /obj/structure/window/reinforced{ dir = 4 @@ -3212,7 +3212,7 @@ /obj/structure/window/reinforced, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "jd" = ( /obj/structure/window/reinforced{ dir = 1 @@ -3283,13 +3283,13 @@ "jl" = ( /obj/item/shard, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jm" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jn" = ( /obj/structure/cable{ d1 = 4; @@ -3337,7 +3337,7 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jt" = ( /obj/structure/cable{ d1 = 4; @@ -3380,13 +3380,13 @@ "jw" = ( /obj/structure/closet/l3closet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jx" = ( /obj/structure/window/reinforced{ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jy" = ( /obj/item/pen, /turf/simulated/floor/plasteel, @@ -3396,7 +3396,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "jA" = ( /obj/structure/window/reinforced{ dir = 4 @@ -3406,7 +3406,7 @@ }, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "jB" = ( /obj/structure/cable{ d1 = 2; @@ -3453,7 +3453,7 @@ "jG" = ( /obj/item/cigbutt, /turf/space, -/area/space) +/area/space/nearstation) "jH" = ( /obj/structure/table, /obj/item/stock_parts/cell, @@ -3496,7 +3496,7 @@ /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jN" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -3554,7 +3554,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jT" = ( /obj/structure/cable{ d1 = 2; @@ -3562,7 +3562,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jU" = ( /obj/structure/closet/wardrobe/genetics_white, /turf/simulated/floor/plating/airless{ @@ -3577,7 +3577,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jW" = ( /obj/machinery/light/small{ dir = 4 @@ -3593,12 +3593,12 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "jY" = ( /turf/simulated/floor/plating/airless{ icon_state = "white" }, -/area/space) +/area/space/nearstation) "jZ" = ( /obj/structure/cable{ d1 = 1; @@ -3606,7 +3606,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ka" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -3615,7 +3615,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kb" = ( /obj/machinery/light/small{ dir = 4 @@ -3629,7 +3629,7 @@ icon_state = "medium" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kd" = ( /obj/structure/window/basic{ dir = 1 @@ -3640,7 +3640,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ke" = ( /obj/machinery/door/window{ dir = 8 @@ -3652,7 +3652,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "kg" = ( /obj/machinery/light/small{ dir = 1 @@ -3667,7 +3667,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ki" = ( /obj/structure/cable{ d1 = 4; @@ -3728,13 +3728,13 @@ "kp" = ( /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "kq" = ( /obj/structure/window/basic{ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "kr" = ( /obj/structure/cable{ d1 = 4; @@ -3827,12 +3827,12 @@ }, /obj/structure/window/basic, /turf/space, -/area/space) +/area/space/nearstation) "kE" = ( /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "kF" = ( /obj/machinery/door/airlock/external{ name = "Arrivals Docking Bay 1" @@ -3972,7 +3972,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "kV" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Access"; @@ -4017,7 +4017,7 @@ }, /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ld" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ tag = "icon-manifold-b-f (EAST)"; @@ -4038,26 +4038,26 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "lg" = ( /obj/structure/window/basic{ dir = 5 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lh" = ( /obj/structure/grille, /obj/structure/window/basic{ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "li" = ( /obj/structure/window/basic{ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lj" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Access"; @@ -4114,7 +4114,7 @@ icon_state = "4-8" }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "lt" = ( /obj/structure/cable{ d1 = 4; @@ -4130,14 +4130,14 @@ "lv" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lw" = ( /obj/structure/lattice, /obj/structure/window/basic{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "lx" = ( /obj/structure/girder, /obj/structure/window/basic, @@ -4191,13 +4191,13 @@ "lD" = ( /obj/machinery/door/window, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lE" = ( /obj/item/shard{ icon_state = "small" }, /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "lF" = ( /obj/structure/window/basic{ dir = 1 @@ -4223,7 +4223,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "lJ" = ( /obj/machinery/vending/sovietsoda, /turf/simulated/floor/plating/airless, @@ -4235,24 +4235,24 @@ "lL" = ( /obj/structure/table, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lM" = ( /obj/structure/window/reinforced{ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lN" = ( /obj/item/paper{ info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lO" = ( /obj/structure/lattice, /obj/item/stack/cable_coil/cut, /turf/space, -/area/space) +/area/space/nearstation) "lP" = ( /obj/structure/girder, /turf/simulated/floor/plating, @@ -4273,13 +4273,13 @@ "lS" = ( /obj/structure/closet/wardrobe/orange, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "lT" = ( /obj/structure/window/basic{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "lU" = ( /obj/structure/grille, /turf/simulated/floor/plating, @@ -4328,7 +4328,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "me" = ( /turf/simulated/wall/r_wall, /area/derelict/atmospherics) @@ -4343,7 +4343,7 @@ "mg" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mh" = ( /obj/structure/grille, /obj/structure/grille, @@ -4354,11 +4354,11 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mi" = ( /obj/structure/bed, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mj" = ( /turf/simulated/floor/plating/airless{ icon_state = "floorgrime" @@ -4403,7 +4403,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mr" = ( /obj/structure/closet/wardrobe/mixed, /turf/simulated/floor/plasteel, @@ -4411,7 +4411,7 @@ "ms" = ( /obj/item/pickaxe, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mt" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 4 @@ -4458,7 +4458,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "my" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -4515,7 +4515,7 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mH" = ( /obj/machinery/light/small{ dir = 1 @@ -4601,7 +4601,7 @@ dir = 5 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "mP" = ( /obj/structure/window/reinforced, /turf/simulated/floor/plasteel, @@ -4782,7 +4782,7 @@ icon_state = "right" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "nl" = ( /obj/machinery/door/window{ base_state = "right"; @@ -5039,7 +5039,7 @@ /obj/item/stack/cable_coil/cut, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "nM" = ( /turf/simulated/floor/plating/airless{ icon_state = "derelict1" @@ -5173,7 +5173,7 @@ "oi" = ( /obj/structure/girder/reinforced, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "oj" = ( /obj/structure/cable{ d1 = 1; @@ -5238,7 +5238,7 @@ req_access_txt = "46" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "os" = ( /obj/structure/table, /obj/item/stack/sheet/metal{ @@ -5264,7 +5264,7 @@ opened = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ou" = ( /obj/structure/shuttle/engine/propulsion{ color = "#FFFF00"; @@ -5272,7 +5272,7 @@ icon_state = "propulsion_l" }, /turf/space, -/area/space) +/area/space/nearstation) "ov" = ( /obj/machinery/atmospherics/unary/vent_pump{ on = 1 @@ -5292,7 +5292,7 @@ /turf/simulated/floor/plating/airless{ color = "#FFFF00" }, -/area/space) +/area/space/nearstation) "ox" = ( /turf/simulated/floor/plating/airless, /area/derelict/se_solar) @@ -5314,7 +5314,7 @@ /turf/simulated/floor/plating/airless{ color = "#FFFF00" }, -/area/space) +/area/space/nearstation) "oB" = ( /obj/machinery/light/small{ dir = 4 @@ -5373,10 +5373,10 @@ /area/derelict/teleporter) "pr" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ps" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm index 7411218a3f0..5d578d212b5 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -315,7 +315,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "aL" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -356,7 +356,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "aR" = ( /obj/machinery/light/small{ dir = 4 @@ -754,7 +754,7 @@ "bK" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bL" = ( /obj/machinery/light/small{ dir = 8 @@ -781,7 +781,7 @@ "bP" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bQ" = ( /obj/machinery/shieldwallgen{ active = 2; @@ -803,7 +803,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "bS" = ( /obj/structure/cable{ d1 = 1; @@ -828,11 +828,11 @@ "bV" = ( /obj/machinery/shieldwallgen, /turf/space, -/area/space) +/area/space/nearstation) "bW" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm index dbe0bc5d16c..95ad761e62c 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm @@ -9,7 +9,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "c" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plating, @@ -21,7 +21,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "e" = ( /obj/structure/window/reinforced{ tag = "icon-rwindow (EAST)"; @@ -65,7 +65,7 @@ "k" = ( /obj/structure/window/reinforced, /turf/space, -/area/space) +/area/space/nearstation) "l" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -113,7 +113,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "q" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm index 78054b180c1..be313cd7770 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm @@ -11,12 +11,12 @@ "d" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "e" = ( /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" a diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm index c7fc01bccd8..adbb913421a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm @@ -7,7 +7,7 @@ /area/ruin/unpowered) "c" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "d" = ( /turf/simulated/floor/plating/airless/asteroid, /area/ruin/unpowered) @@ -66,7 +66,7 @@ /area/ruin/unpowered) "r" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) (1,1,1) = {" a diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index bd53ea5a0f1..02ee81bf42d 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -171,7 +171,7 @@ "D" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "E" = ( /obj/item/stack/rods, /turf/simulated/floor/plating/airless, @@ -205,7 +205,7 @@ "K" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "L" = ( /obj/effect/decal/mecha_wreckage/gygax, /turf/simulated/shuttle/floor{ @@ -215,7 +215,7 @@ /area/ruin/powered) "M" = ( /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "N" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall14"; @@ -231,7 +231,7 @@ "P" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "Q" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall15"; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm index 9a43faaf8ed..8f19d1cc390 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm @@ -11,7 +11,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -21,7 +21,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ad" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -30,7 +30,7 @@ icon_state = "2-8" }, /turf/space, -/area/space) +/area/space/nearstation) "ae" = ( /obj/structure/lattice, /obj/item/stack/cable_coil/cut{ @@ -39,7 +39,7 @@ icon_state = "coil_red2" }, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -49,7 +49,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) "ag" = ( /turf/simulated/wall, /area/ruin/onehalf/dorms_med) @@ -66,7 +66,7 @@ icon_state = "1-2" }, /turf/space, -/area/space) +/area/space/nearstation) "aj" = ( /turf/unsimulated/floor/plating/airless, /area/ruin/onehalf/hallway) @@ -155,7 +155,7 @@ "aw" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ax" = ( /obj/structure/lattice, /turf/space, @@ -806,7 +806,7 @@ "bU" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/structure/disposalpipe/segment, /obj/item/stack/rods, @@ -903,11 +903,11 @@ "ck" = ( /obj/structure/girder/reinforced, /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cl" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "cm" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -926,7 +926,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "co" = ( /obj/structure/grille, /obj/structure/window/full/reinforced, @@ -1009,15 +1009,15 @@ "cv" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "cw" = ( /turf/unsimulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cx" = ( /obj/structure/lattice, /obj/item/stack/sheet/plasteel, /turf/space, -/area/space) +/area/space/nearstation) "cy" = ( /obj/structure/lattice, /obj/item/shard{ @@ -1072,7 +1072,7 @@ "cE" = ( /obj/item/stack/tile/wood, /turf/space, -/area/space) +/area/space/nearstation) "cF" = ( /turf/space, /area/ruin/onehalf/hallway) @@ -1162,7 +1162,7 @@ "cR" = ( /obj/item/stack/sheet/plasteel, /turf/space, -/area/space) +/area/space/nearstation) "cS" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1223,7 +1223,7 @@ icon_state = "2-8" }, /turf/space, -/area/space) +/area/space/nearstation) "db" = ( /obj/structure/table, /obj/item/flashlight, @@ -1258,12 +1258,12 @@ icon_state = "1-2" }, /turf/space, -/area/space) +/area/space/nearstation) "dg" = ( /obj/structure/girder/reinforced, /obj/item/stack/sheet/plasteel, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dj" = ( /obj/structure/grille, /obj/item/shard, @@ -1352,7 +1352,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "dp" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1368,7 +1368,7 @@ }, /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "dq" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -1384,7 +1384,7 @@ tag = "" }, /turf/space, -/area/space) +/area/space/nearstation) (1,1,1) = {" aa diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index 54e511a4373..c376fc59361 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -4,10 +4,10 @@ /area/space) "ab" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "ac" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "ad" = ( /obj/structure/grille, /obj/structure/window/full/reinforced, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm index dd00d8bd38d..96e43773146 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -5,7 +5,7 @@ "b" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "c" = ( /obj/structure/grille, /turf/simulated/floor/plating, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index 28df12718e6..016c4cbf447 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -502,7 +502,7 @@ /area/ruin/unpowered) "bH" = ( /turf/simulated/wall/mineral/titanium, -/area/space) +/area/space/nearstation) "bI" = ( /obj/structure/window/reinforced, /turf/simulated/floor/mineral/plasma, diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 37406781007..5dd4050d567 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -264,7 +264,7 @@ "aP" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aQ" = ( /obj/machinery/door/airlock/gold{ locked = 1 @@ -1517,7 +1517,7 @@ "et" = ( /obj/singularity/academy, /turf/space, -/area/space) +/area/space/nearstation) "eu" = ( /obj/structure/window/reinforced{ dir = 8 @@ -3716,7 +3716,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "jz" = ( /obj/machinery/igniter, /turf/simulated/floor/plating, @@ -4490,12 +4490,7 @@ /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, -/area/space) -"lu" = ( -/turf/simulated/floor/plasteel{ - icon_state = "hydrofloor" - }, -/area/space) +/area/awaymission/academy/academyaft) "lv" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5; @@ -4504,7 +4499,7 @@ /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, -/area/space) +/area/awaymission/academy/academyaft) "lw" = ( /obj/machinery/door/poddoor/shutters{ dir = 2; @@ -15432,10 +15427,10 @@ hM lp hp hp -lu -lu -lu -lu +hp +hp +hp +hp hp hp gZ @@ -15564,8 +15559,8 @@ lq lr lt lv -lu -lu +hp +hp hp hp gZ diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 8f9d8ce8133..2a6fedbbdc7 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -16,7 +16,7 @@ /obj/item/circular_saw, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -46,7 +46,7 @@ "aj" = ( /mob/living/simple_animal/hostile/carp, /turf/space, -/area/space) +/area/space/nearstation) "ak" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -97,7 +97,7 @@ "as" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "at" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -2626,14 +2626,6 @@ }, /turf/simulated/floor/engine, /area/awaymission/BMPship/Aft) -"gy" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/space) "gz" = ( /obj/item/shard, /obj/effect/landmark/damageturf, @@ -3273,7 +3265,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "ip" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall13"; @@ -3522,12 +3514,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/simulated/floor/plating, /area/awaymission) -"jf" = ( -/turf/space, -/area/crew_quarters/bar) -"jg" = ( -/turf/space, -/area/exploration/methlab) "jh" = ( /obj/machinery/door_control{ id = "packerMed"; @@ -9820,7 +9806,7 @@ eW fF ee aW -gy +gg aa aa gP @@ -13998,7 +13984,7 @@ aa aa aa aa -jf +aa aa aa aa @@ -14389,11 +14375,11 @@ aa aa aa aa -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa aa aa aa @@ -14518,12 +14504,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -14648,13 +14634,13 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -14779,9 +14765,9 @@ aa aa aa aa -jg -jg -jg +aa +aa +aa aa aa aa @@ -14908,8 +14894,8 @@ aa aa aa aa -jg -jg +aa +aa aa aa aa @@ -15038,12 +15024,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -15168,12 +15154,12 @@ aa aa aa aa -jg -jg -jg -jg -jg -jg +aa +aa +aa +aa +aa +aa aa aa aa @@ -15300,7 +15286,7 @@ aa aa aa aa -jg +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index bd6b40c51de..3fa3d569c09 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -483,7 +483,7 @@ "bm" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bn" = ( /turf/simulated/floor/plasteel{ icon_state = "vault"; @@ -1264,7 +1264,7 @@ pixel_y = 0 }, /turf/simulated/floor/plating, -/area/space) +/area/awaymission/centcomAway/maint) "dl" = ( /turf/simulated/shuttle/wall{ icon_state = "swallc1"; @@ -1887,12 +1887,6 @@ icon_state = "floor" }, /area/awaymission/centcomAway/general) -"eP" = ( -/turf/space, -/area/awaycontent/a2{ - has_gravity = 1; - name = "MO19 Research" - }) "eQ" = ( /turf/simulated/shuttle/wall{ icon_state = "swall2"; @@ -3595,20 +3589,6 @@ dir = 4 }, /area/awaymission/centcomAway/general) -"iZ" = ( -/obj/structure/grille, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/space) "ja" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -5805,8 +5785,8 @@ icon_state = "propulsion_r"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nV" = ( /obj/machinery/light, /turf/simulated/floor/plasteel{ @@ -5818,15 +5798,15 @@ icon_state = "propulsion_l"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nX" = ( /obj/structure/shuttle/engine/propulsion{ icon_state = "propulsion"; dir = 1 }, -/turf/space, -/area/space) +/turf/simulated/shuttle/plating, +/area/awaymission/centcomAway/thunderdome) "nY" = ( /obj/structure/computerframe, /turf/simulated/floor/plasteel{ @@ -16520,7 +16500,7 @@ eO oa lb eF -iZ +fg eF lV mc @@ -20660,7 +20640,7 @@ cc aa aa aa -eP +aa aa aa aa @@ -20790,7 +20770,7 @@ cc aa aa aa -eP +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm index 674c8099882..85763845c2b 100644 --- a/_maps/map_files/RandomZLevels/spacebattle.dmm +++ b/_maps/map_files/RandomZLevels/spacebattle.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ab" = ( /turf/space, /area/space) @@ -2617,23 +2617,23 @@ "iq" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ir" = ( /obj/effect/mob_spawn/human/corpse/syndicatesoldier, /turf/space, -/area/space) +/area/space/nearstation) "is" = ( /turf/simulated/shuttle/wall{ icon_state = "wall3" }, -/area/space) +/area/space/nearstation) "it" = ( /turf/space, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iu" = ( /obj/machinery/sleeper, /turf/simulated/floor/plasteel/airless{ @@ -2641,14 +2641,14 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iv" = ( /turf/simulated/floor/plasteel/airless{ tag = "icon-floor4 (SOUTHWEST)"; icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iw" = ( /obj/effect/mob_spawn/human/corpse/syndicatesoldier, /turf/simulated/floor/plasteel/airless{ @@ -2656,7 +2656,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "ix" = ( /obj/machinery/door/airlock/external, /turf/simulated/floor/plasteel/airless{ @@ -2664,7 +2664,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iy" = ( /obj/item/stack/rods, /turf/simulated/floor/plasteel/airless{ @@ -2672,7 +2672,7 @@ icon_state = "floor4"; dir = 10 }, -/area/space) +/area/space/nearstation) "iz" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -2695,7 +2695,7 @@ "iC" = ( /obj/machinery/sleeper, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "iD" = ( /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -2712,14 +2712,14 @@ /turf/simulated/shuttle/wall{ icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iG" = ( /turf/space, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" }, -/area/space) +/area/space/nearstation) "iH" = ( /obj/machinery/sleeper, /turf/simulated/shuttle/floor{ @@ -2741,11 +2741,11 @@ dir = 1 }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "iK" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "iL" = ( /obj/machinery/door/airlock/external, /turf/simulated/shuttle/floor{ @@ -2853,7 +2853,7 @@ /area/awaymission/spacebattle/syndicate6) "jc" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "jd" = ( /turf/simulated/wall/mineral/plasma, /area/awaymission/spacebattle/secret) @@ -2898,7 +2898,7 @@ tag = "icon-propulsion_l (WEST)" }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "Jj" = ( /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion_l (NORTH)"; diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 73d86c17201..add5efa4d1c 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -2113,30 +2113,30 @@ id = "turbinespace" }, /turf/space, -/area/space) +/area/space/nearstation) "dQ" = ( /turf/unsimulated/wall, -/area/space) +/area/space/nearstation) "dR" = ( /turf/unsimulated/wall/fakeglass{ dir = 8; icon_state = "fakewindows"; opacity = 0 }, -/area/space) +/area/space/nearstation) "dS" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows2"; dir = 8 }, -/area/space) +/area/space/nearstation) "dT" = ( /turf/unsimulated/wall/fakeglass{ dir = 4; icon_state = "fakewindows"; opacity = 0 }, -/area/space) +/area/space/nearstation) "dU" = ( /turf/unsimulated/wall/fakeglass{ dir = 8; @@ -2409,7 +2409,7 @@ icon_state = "fakewindows"; dir = 1 }, -/area/space) +/area/space/nearstation) "eC" = ( /obj/machinery/light{ dir = 1 @@ -2425,7 +2425,7 @@ icon_state = "fakewindows2"; dir = 1 }, -/area/space) +/area/space/nearstation) "eF" = ( /obj/structure/closet/crate/can, /turf/unsimulated/floor/carpet, @@ -2463,7 +2463,7 @@ /area/awaymission/spacehotel) "eL" = ( /turf/unsimulated/wall/fakeglass, -/area/space) +/area/space/nearstation) "eM" = ( /turf/unsimulated/floor{ dir = 2; @@ -2684,7 +2684,7 @@ /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows3" }, -/area/space) +/area/space/nearstation) "fv" = ( /obj/effect/landmark/map_loader/hotel_room{ dir = 1 @@ -3124,12 +3124,6 @@ icon_state = "cafeteria" }, /area/awaymission/spacehotel/kitchen) -"gE" = ( -/mob/living/carbon/human/interactive/away/hotel/chef, -/turf/unsimulated/floor{ - icon_state = "cafeteria" - }, -/area/awaymission/spacehotel/kitchen) "gF" = ( /obj/machinery/camera{ c_tag = "Room 201"; @@ -3277,12 +3271,6 @@ icon_state = "whiteyellowfull" }, /area/awaymission/spacehotel) -"ha" = ( -/mob/living/carbon/human/interactive/away/hotel/bartender, -/turf/unsimulated/floor{ - icon_state = "whiteyellowfull" - }, -/area/awaymission/spacehotel) "hb" = ( /turf/unsimulated/wall/fakeglass, /area/awaymission/spacehotel) @@ -3685,7 +3673,7 @@ dir = 1; icon_state = "fakewindows2" }, -/area/space) +/area/space/nearstation) "if" = ( /obj/effect/view_portal{ id = "hotel_13" @@ -4134,12 +4122,6 @@ }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) -"jm" = ( -/obj/effect/spawner/snpc_squad{ - squad_type = /mob/living/carbon/human/interactive/away/hotel/guard - }, -/turf/unsimulated/floor/carpet, -/area/awaymission/spacehotel) "jn" = ( /obj/structure{ desc = "It appears to be similar to a SMES."; @@ -4489,7 +4471,6 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/carbon/human/interactive/away/hotel/concierge, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) "kk" = ( @@ -4512,12 +4493,6 @@ /obj/structure/table/reinforced, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) -"kn" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/unsimulated/floor/carpet, -/area/awaymission/spacehotel/reception) "ko" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/light{ @@ -4577,14 +4552,14 @@ dir = 10; icon_state = "fakewindows" }, -/area/space) +/area/space/nearstation) "ky" = ( /turf/unsimulated/wall/fakeglass{ dir = 4; icon_state = "fakewindows"; opacity = 1 }, -/area/space) +/area/space/nearstation) "kz" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock" @@ -4596,13 +4571,13 @@ icon_state = "fakewindows"; dir = 8 }, -/area/space) +/area/space/nearstation) "kB" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows"; dir = 6 }, -/area/space) +/area/space/nearstation) "kC" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s6"; @@ -4656,19 +4631,19 @@ icon_state = "swall_s6"; dir = 2 }, -/area/space) +/area/space/nearstation) "kL" = ( /turf/simulated/shuttle/wall{ icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "kM" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s10"; dir = 2 }, -/area/space) +/area/space/nearstation) "kN" = ( /turf/unsimulated/wall/fakeglass{ icon_state = "fakewindows3" @@ -4726,22 +4701,22 @@ icon_state = "swallc4"; dir = 2 }, -/area/space) +/area/space/nearstation) "kX" = ( /turf/simulated/shuttle/wall/interior, -/area/space) +/area/space/nearstation) "kY" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3" }, -/area/space) +/area/space/nearstation) "kZ" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4; icon_state = "propulsion" }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "la" = ( /obj/structure/chair{ dir = 8 @@ -4793,13 +4768,13 @@ icon_state = "swall_s5"; dir = 2 }, -/area/space) +/area/space/nearstation) "li" = ( /turf/simulated/shuttle/wall{ icon_state = "swallc1"; dir = 2 }, -/area/space) +/area/space/nearstation) "lj" = ( /turf/simulated/shuttle/wall{ icon_state = "swall_s9"; @@ -4811,7 +4786,7 @@ icon_state = "swall_s9"; dir = 2 }, -/area/space) +/area/space/nearstation) "ll" = ( /obj/machinery/shower{ dir = 8 @@ -9762,7 +9737,7 @@ cl jF jT kj -kn +kj jT kv dS @@ -10655,7 +10630,7 @@ gh eb gp gw -gE +gD gN gT gD @@ -11058,7 +11033,7 @@ cl iw iI eG -jm +eb jH jV cl @@ -18978,7 +18953,7 @@ dX gI gP gX -ha +gX hq cl hB diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index a8e3a533033..2f225fea612 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -41,7 +41,7 @@ "ak" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "al" = ( /obj/machinery/door/window/westright, /turf/simulated/floor/plasteel/airless, @@ -256,10 +256,10 @@ /turf/simulated/shuttle/wall{ icon_state = "wall3" }, -/area/space) +/area/space/nearstation) "ba" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bb" = ( /obj/machinery/door/airlock/engineering, /turf/simulated/floor/plasteel/airless, @@ -4123,7 +4123,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/arrivalblock) "kG" = ( -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /obj/item/clothing/under/syndicate, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 1a64a0d7f0a..ed0bb019b83 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -13398,7 +13398,7 @@ /area/awaymission/UO71/loot) "zt" = ( /obj/structure/chair/wood/normal, -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zu" = ( diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 9a7b73800c2..6a59267ed05 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -13,12 +13,6 @@ power_light = 0; poweralm = 0 }) -"ab" = ( -/turf/unsimulated/wall{ - icon_state = "rock"; - name = "rock" - }, -/area/space) "ac" = ( /turf/simulated/mineral/random/labormineral, /area/awaycontent/a7{ @@ -6998,7 +6992,10 @@ dir = 9; icon_state = "warnwhite" }, -/area/space) +/area/awaycontent/a5{ + has_gravity = 1; + name = "UO45 Research" + }) "lc" = ( /obj/structure/sink{ pixel_y = 25 @@ -27794,10 +27791,10 @@ aa aa "} (72,1,1) = {" -ab -ab -ab -ab +aa +aa +aa +aa aa aa aa @@ -27944,10 +27941,10 @@ aa aa "} (73,1,1) = {" -ab -ab -ab -ab +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm index a60988466a1..f5f7d96e4ea 100644 --- a/_maps/map_files/RandomZLevels/wildwest.dmm +++ b/_maps/map_files/RandomZLevels/wildwest.dmm @@ -204,7 +204,7 @@ /area/awaymission/wwvaultdoors) "aG" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "aH" = ( /obj/structure/cable{ d2 = 8; @@ -268,7 +268,7 @@ name = "Blocker" }, /turf/space, -/area/space) +/area/space/nearstation) "aQ" = ( /obj/effect/forcefield{ desc = "You can't get in. Heh."; @@ -276,7 +276,7 @@ name = "Blocker" }, /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "aR" = ( /obj/effect/forcefield{ desc = "You can't get in. Heh."; @@ -349,7 +349,7 @@ /area/awaymission/wwmines) "be" = ( /turf/simulated/wall/mineral/sandstone, -/area/space) +/area/space/nearstation) "bf" = ( /obj/structure/largecrate, /turf/simulated/floor/plating, @@ -393,7 +393,7 @@ "bp" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bq" = ( /obj/effect/mine/dnascramble, /obj/item/ammo_box/c10mm, @@ -431,14 +431,14 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "bx" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow"; icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "by" = ( /obj/structure/closet/secure_closet/freezer/fridge, /turf/simulated/floor/plasteel{ @@ -605,7 +605,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bV" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (NORTH)"; @@ -668,7 +668,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cb" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; @@ -736,7 +736,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ck" = ( /turf/simulated/floor/wood, /area/awaymission/wwgov) @@ -810,7 +810,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "cs" = ( /obj/effect/decal/cleanable/blood/splatter, /turf/simulated/floor/carpet, @@ -981,7 +981,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "cT" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -1075,7 +1075,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dg" = ( /obj/machinery/light/small{ tag = "icon-bulb1 (WEST)"; @@ -1701,7 +1701,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "eM" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -1710,7 +1710,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "eN" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (EAST)"; @@ -1739,7 +1739,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "eP" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (NORTH)"; @@ -1752,7 +1752,7 @@ dir = 8 }, /turf/space, -/area/space) +/area/space/nearstation) "eQ" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (EAST)"; @@ -2080,7 +2080,7 @@ /area/awaymission/wwrefine) "fI" = ( /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "fJ" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/chair/office/dark{ @@ -2329,7 +2329,7 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "gp" = ( /obj/structure/window/reinforced{ tag = "icon-fwindow (WEST)"; @@ -2341,7 +2341,7 @@ icon_state = "fwindow" }, /turf/space, -/area/space) +/area/space/nearstation) "gq" = ( /obj/item/paper{ info = "The syndicate have invaded. Their ships appeared out of nowhere and now they likely intend to kill us all and take everything. On the off-chance that the Vault may grant us sanctuary, many of us have decided to force our way inside and bolt the door, taking as many provisions with us as we can carry. In case you find this, send for help immediately and open the Vault. Find us inside."; @@ -2422,7 +2422,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "gC" = ( /obj/item/gun/projectile/shotgun, /turf/simulated/floor/wood, @@ -2473,7 +2473,7 @@ dir = 8 }, /turf/simulated/floor/plasteel, -/area/space) +/area/space/nearstation) "gK" = ( /obj/item/gun/projectile/revolver/russian, /turf/simulated/floor/wood, diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 15154bd85d3..7596727d426 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5,7 +5,7 @@ "aab" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aac" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; @@ -696,7 +696,7 @@ "abM" = ( /obj/structure/lattice, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "abN" = ( /turf/simulated/wall/r_wall, /area/security/permabrig) @@ -714,7 +714,7 @@ }, /obj/structure/lattice, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "abQ" = ( /turf/simulated/shuttle/wall{ dir = 4; @@ -2670,7 +2670,7 @@ pixel_x = -30 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afn" = ( /obj/structure/chair{ dir = 8 @@ -2937,7 +2937,7 @@ /area/security/podbay) "afO" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afP" = ( /obj/machinery/door/window{ dir = 4; @@ -3037,7 +3037,7 @@ "afX" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "afY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -6541,11 +6541,11 @@ /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "alw" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "alx" = ( /obj/item/broken_bottle, /turf/simulated/shuttle/floor4/vox, @@ -6955,7 +6955,7 @@ /obj/structure/grille/broken, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ami" = ( /obj/structure/chair{ dir = 4 @@ -7402,7 +7402,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "amX" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, @@ -8851,7 +8851,7 @@ "apo" = ( /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "app" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -9371,7 +9371,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aqq" = ( /obj/item/soap, /turf/simulated/floor/plating, @@ -13088,7 +13088,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "avN" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -13973,7 +13973,7 @@ /obj/structure/lattice, /obj/item/stack/cable_coil, /turf/space, -/area/space) +/area/space/nearstation) "axo" = ( /obj/structure/chair{ dir = 4 @@ -14544,7 +14544,7 @@ /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "ayj" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ @@ -15172,7 +15172,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "azc" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable, @@ -15296,7 +15296,7 @@ "azo" = ( /obj/item/clothing/mask/gas/clown_hat, /turf/space, -/area/space) +/area/space/nearstation) "azp" = ( /obj/machinery/door/airlock{ name = "Bathroom"; @@ -16451,7 +16451,7 @@ "aBm" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "aBn" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -16538,11 +16538,11 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aBy" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "aBz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -16741,7 +16741,7 @@ /obj/item/paper/crumpled, /obj/effect/landmark/damageturf, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aBU" = ( /obj/machinery/light_construct/small{ dir = 8 @@ -16788,7 +16788,7 @@ "aBZ" = ( /obj/effect/landmark/damageturf, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aCa" = ( /obj/machinery/ai_status_display{ pixel_x = 32 @@ -18256,7 +18256,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "aEN" = ( /obj/structure/closet/emcloset, /turf/simulated/floor/plating, @@ -21774,7 +21774,7 @@ /area/maintenance/electrical) "aMr" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "aMs" = ( /turf/simulated/wall, /area/hallway/secondary/entry) @@ -22951,7 +22951,7 @@ /obj/structure/lattice, /obj/structure/closet, /turf/space, -/area/space) +/area/space/nearstation) "aOY" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -29941,7 +29941,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bco" = ( /obj/structure/filingcabinet, /turf/simulated/floor/wood, @@ -32674,7 +32674,7 @@ amount = 10 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bho" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -34583,7 +34583,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "bkJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9; @@ -50861,7 +50861,7 @@ icon_state = "diagonalWall3" }, /area/shuttle/administration) -"bPM" = ( +"bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; @@ -50874,25 +50874,17 @@ id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; + timid = 1; width = 18 }, /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_home"; name = "port bay 1"; - width = 18 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bPN" = ( -/obj/machinery/door/airlock/external{ - id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "106" + timid = 1; + width = 19 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -52067,21 +52059,6 @@ icon_state = "wall3" }, /area/shuttle/administration) -"bRH" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -54159,28 +54136,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) -"bVk" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bVl" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Workshop"; - opacity = 1; - req_access_txt = "105" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -55150,14 +55105,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bWO" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l"; - tag = "icon-propulsion_l (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -56132,14 +56079,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bYu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_r"; - tag = "icon-propulsion_r (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -57422,17 +57361,6 @@ "cam" = ( /turf/simulated/wall, /area/quartermaster/miningdock) -"can" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58236,23 +58164,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"cby" = ( -/obj/machinery/computer/shuttle/admin, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"cbz" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Bridge"; - opacity = 1; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -58311,7 +58222,7 @@ pixel_y = 32 }, /turf/space, -/area/space) +/area/space/nearstation) "cbH" = ( /obj/machinery/power/apc{ dir = 1; @@ -59505,18 +59416,9 @@ icon_state = "floor3" }, /area/shuttle/administration) -"cdq" = ( -/obj/machinery/computer/card/centcom, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cdr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "remote shutter control"; - req_access_txt = "106" +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -60290,17 +60192,6 @@ tag = "icon-cafeteria (NORTHEAST)" }, /area/crew_quarters/hor) -"ceT" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Medbay"; - opacity = 1; - req_access_txt = "103" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "ceU" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, @@ -68442,7 +68333,7 @@ "csj" = ( /obj/structure/girder, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "csk" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -71917,7 +71808,7 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cxZ" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/cobweb, @@ -72824,7 +72715,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "czF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -74314,7 +74205,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cCt" = ( /obj/machinery/atmospherics/pipe/simple/visible, /turf/simulated/floor/plasteel{ @@ -80585,7 +80476,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cNF" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -81591,7 +81482,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cPx" = ( /obj/structure/cable, /turf/space, @@ -82017,7 +81908,7 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cQq" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -83472,7 +83363,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSF" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -83480,7 +83371,7 @@ icon_state = "4-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSG" = ( /obj/structure/table/reinforced, /obj/machinery/photocopier/faxmachine{ @@ -83511,7 +83402,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSJ" = ( /obj/structure/cable{ d1 = 1; @@ -83540,7 +83431,7 @@ icon_state = "2-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cSN" = ( /obj/structure/chair/stool, /obj/structure/cable/yellow{ @@ -83963,7 +83854,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTy" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -84034,7 +83925,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTE" = ( /obj/machinery/power/tesla_coil{ anchored = 1 @@ -84045,7 +83936,7 @@ icon_state = "0-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTF" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -84058,7 +83949,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cTG" = ( /obj/machinery/door/airlock/maintenance{ name = "Engineering Shuttle"; @@ -84209,7 +84100,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cTS" = ( /obj/effect/landmark/burnturf, /turf/simulated/floor/plating, @@ -84478,7 +84369,7 @@ icon_state = "0-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUm" = ( /obj/structure/reagent_dispensers/fueltank, /obj/structure/cable{ @@ -84769,7 +84660,7 @@ icon_state = "1-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUN" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4; @@ -84794,7 +84685,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUP" = ( /obj/structure/window/reinforced{ dir = 8 @@ -84823,7 +84714,7 @@ icon_state = "1-8" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cUR" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -84862,7 +84753,7 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cUW" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -86866,7 +86757,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "cYA" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -87242,7 +87133,7 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "cZi" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -87733,7 +87624,7 @@ dir = 10 }, /turf/space, -/area/space) +/area/space/nearstation) "dae" = ( /obj/structure/door_assembly/door_assembly_mai, /turf/simulated/floor/plating, @@ -88196,7 +88087,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction, /turf/space, -/area/space) +/area/space/nearstation) "dbb" = ( /turf/simulated/floor/engine{ carbon_dioxide = 0; @@ -88543,7 +88434,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dbJ" = ( /obj/structure/cable{ d1 = 1; @@ -88618,7 +88509,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dbQ" = ( /obj/machinery/power/emitter{ anchored = 1; @@ -88663,7 +88554,7 @@ /obj/structure/grille, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dbU" = ( /obj/structure/rack, /obj/item/clothing/suit/fire/firefighter, @@ -88697,7 +88588,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dbY" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -88720,13 +88611,13 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dca" = ( /obj/machinery/atmospherics/unary/passive_vent{ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dcb" = ( /turf/simulated/floor/plasteel{ icon_state = "blue"; @@ -88776,7 +88667,7 @@ d2 = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dcg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -89116,7 +89007,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dcT" = ( /obj/machinery/atmospherics/unary/outlet_injector{ dir = 8; @@ -89451,12 +89342,12 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddD" = ( /obj/item/wrench, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddE" = ( /obj/structure/cable{ d1 = 1; @@ -89473,7 +89364,7 @@ pixel_y = 32 }, /turf/space, -/area/space) +/area/space/nearstation) "ddG" = ( /obj/machinery/field/generator, /turf/simulated/floor/plating, @@ -89530,7 +89421,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddN" = ( /obj/structure/cable, /turf/space, @@ -89543,7 +89434,7 @@ }, /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ddP" = ( /obj/structure/cable{ d1 = 2; @@ -89668,7 +89559,7 @@ tag = "icon-catwalk0"; icon_state = "catwalk0" }, -/area/space) +/area/space/nearstation) "ddY" = ( /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 @@ -89814,7 +89705,7 @@ }, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) "dem" = ( /turf/simulated/floor/engine{ carbon_dioxide = 50000; @@ -90912,7 +90803,7 @@ anchored = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dgF" = ( /turf/simulated/shuttle/wall{ icon_state = "swall1"; @@ -90957,7 +90848,7 @@ pixel_y = 32 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dgK" = ( /obj/effect/spawner/lootdrop/trade_sol/sec, /obj/structure/closet, @@ -91101,7 +90992,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dhd" = ( /obj/machinery/computer/shuttle/engineering, /turf/simulated/shuttle/floor{ @@ -91770,7 +91661,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "div" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -92070,21 +91961,21 @@ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "diV" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ level = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "diW" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "diX" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -92094,14 +91985,14 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "diY" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "diZ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ @@ -92111,7 +92002,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "dja" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ @@ -92121,26 +92012,26 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "djb" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djc" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djd" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dje" = ( /obj/item/twohanded/required/kirbyplants, /turf/simulated/floor/plasteel{ @@ -92279,7 +92170,7 @@ state = 2 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "djr" = ( /obj/structure/closet/emcloset, /turf/simulated/floor/plating, @@ -92346,7 +92237,7 @@ /obj/structure/lattice, /obj/item/wirecutters, /turf/space, -/area/space) +/area/space/nearstation) "djz" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -92413,7 +92304,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/space, -/area/space) +/area/space/nearstation) "djF" = ( /obj/structure/cable{ d1 = 1; @@ -92572,7 +92463,7 @@ /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "djU" = ( /obj/machinery/atmospherics/pipe/simple/visible, /obj/structure/grille, @@ -92952,19 +92843,19 @@ "dkz" = ( /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkA" = ( /obj/effect/decal/warning_stripes/north, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkB" = ( /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dkC" = ( /obj/item/crowbar, /turf/space, -/area/space) +/area/space/nearstation) "dkD" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -93371,18 +93262,18 @@ }, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlf" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlg" = ( /obj/machinery/the_singularitygen/tesla{ anchored = 1 }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlh" = ( /obj/machinery/door/airlock/external{ frequency = 1450; @@ -93613,19 +93504,19 @@ "dlE" = ( /obj/item/weldingtool, /turf/space, -/area/space) +/area/space/nearstation) "dlF" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlG" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlH" = ( /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dlI" = ( /obj/structure/lattice, /obj/machinery/atmospherics/binary/pump/on, @@ -93785,7 +93676,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/purple, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dlZ" = ( /obj/structure/chair{ dir = 8 @@ -93930,7 +93821,7 @@ "dmo" = ( /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "dmp" = ( /obj/structure/table, /obj/item/weldingtool, @@ -94069,7 +93960,7 @@ /area/turret_protected/aisat_interior) "dmD" = ( /turf/simulated/wall/r_wall/coated, -/area/space) +/area/space/nearstation) "dmE" = ( /obj/machinery/door/poddoor{ id_tag = "auxiliaryturbinevent"; @@ -94081,7 +93972,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/purple, /turf/space, -/area/space) +/area/space/nearstation) "dmG" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -94163,7 +94054,7 @@ "dmN" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dmO" = ( /obj/structure/cable{ d2 = 2; @@ -94302,14 +94193,14 @@ "dmW" = ( /obj/structure/transit_tube, /turf/space, -/area/space) +/area/space/nearstation) "dmX" = ( /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "dmY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -94355,7 +94246,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dne" = ( /obj/structure/cable, /obj/machinery/power/turbine, @@ -94493,7 +94384,7 @@ }, /obj/structure/disposaloutlet, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dnq" = ( /obj/structure/cable{ d1 = 1; @@ -95261,7 +95152,7 @@ tag = "icon-catwalk0"; icon_state = "catwalk0" }, -/area/space) +/area/space/nearstation) "doF" = ( /turf/simulated/floor/plating, /area/toxins/launch{ @@ -96553,7 +96444,7 @@ dir = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "gMZ" = ( /obj/machinery/atmospherics/pipe/simple/insulated{ dir = 6 @@ -96572,6 +96463,12 @@ }, /turf/simulated/floor/plating, /area/toxins/mixing) +"gQL" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "hsy" = ( /obj/machinery/atmospherics/pipe/simple/insulated{ dir = 4 @@ -96598,7 +96495,7 @@ dir = 1 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iJf" = ( /obj/machinery/atmospherics/pipe/simple/insulated, /obj/machinery/door/poddoor{ @@ -96626,35 +96523,132 @@ /area/toxins/launch{ name = "Toxins Launch Room" }) +"jnJ" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "kOE" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "nMi" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, /turf/space, -/area/space) +/area/space/nearstation) +"oZV" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"pwN" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "pZO" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, /turf/space, -/area/space) +/area/space/nearstation) +"qgG" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "qUv" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, -/area/space) +/area/space/nearstation) +"rEw" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"rSv" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"rYq" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "uxy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) +"uBM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) "uDK" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ tag = "icon-intact (NORTHEAST)"; @@ -96662,21 +96656,21 @@ dir = 5 }, /turf/space, -/area/space) +/area/space/nearstation) "vup" = ( /obj/machinery/atmospherics/pipe/simple/insulated{ dir = 10 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "xAw" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 8 }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "xWg" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ tag = "icon-intact (SOUTHEAST)"; @@ -96684,7 +96678,33 @@ dir = 6 }, /turf/space, -/area/space) +/area/space/nearstation) +"yeP" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ylx" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) (1,1,1) = {" aaa @@ -105049,15 +105069,15 @@ aaa aaa aaa aaa +bPL +rSv +uBM +cae aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bPL +rSv +uBM +cae aaa aaa aaa @@ -105305,18 +105325,18 @@ aaa aaa aaa aaa -aaa bPL -bWO -bYu +bPI +bWG +bWG +bPI +bPI +bPI +bWG +bWG +bPI cae aaa -bPL -bWO -bYu -cae -aaa -aaa aaa aaa aaa @@ -105561,16 +105581,17 @@ aaa aaa aaa aaa -aaa bPL bPI -bWG -bWG +bVe +bRA +bRA +caf bPI -bPI -bPI -bWG -bWG +cdl +ceR +ceR +cig bPI cae aaa @@ -105679,7 +105700,6 @@ aaa aaa aaa aaa -aaa "} (36,1,1) = {" aaa @@ -105813,22 +105833,23 @@ bCd bCd bCd bAR -aaa -aaa +bjQ aaa aaa aaa bPL -bPI -bVe +bRu +bRA +bVf bRA bRA -caf +cag bPI -cdl +cdm ceR ceR -cig +ceR +ckd bPI cae aaa @@ -105936,7 +105957,6 @@ aaa aaa aaa aaa -aaa "} (37,1,1) = {" aaa @@ -106070,25 +106090,25 @@ bCc bDG bEK bAR -bjQ +aLd aaa aaa aaa -bPL -bRu -bRA -bVf -bRA -bRA -cag bPI -cdm -ceR -ceR -ceR -ckd +bRv +bRA +bVg +cuH +bRA +cah +bPI +cdp +ceR +ceR +ceR +ceR +clC bPI -cae aaa aaa aaa @@ -106327,24 +106347,24 @@ aAi bCb bCl bAR -aLd +aSd aaa aaa aaa bPI -bRv +bRw bRA -bVg +bVh cuH bRA -cah +cai bPI -cdp +cdl ceR +cgw +cih ceR -ceR -ceR -clC +clD bPI aaa aaa @@ -106589,19 +106609,19 @@ aaa aaa aaa bPI -bRw -bRA -bVh +bRx +bTl +bVi cuH bRA -cai +bRA bPI -cdl +cdo ceR -cgw -cih -ceR -clD +cgx +cii +ckf +clE bPI aaa aaa @@ -106842,23 +106862,23 @@ bCb bEL bAR aSd -aaa -aaa -aaa +aSd +aSd +aSd bPI -bRx -bTl -bVi -cuH -bRA -bRA -bPI -cdo -ceR -cgx -cii -ckf -clE +bRG +bRG +bRG +bRG +bYt +bRG +bRG +bRG +oZV +bRG +bRG +bRG +bRG bPI aaa aaa @@ -107099,23 +107119,23 @@ bCb bEL bAR aSd -aSd -aSd -aSd -bPI -bRG -bRG -bRG -bRG -bYt -bRG -bRG -bRG -ceT -bRG -bRG -bRG -bRG +bGm +bLY +bKp +qgG +yeP +bTn +pwN +bRA +bRA +bRA +bTo +bRA +bRA +bRA +bRA +bRA +bRA bPI aaa aaa @@ -107356,23 +107376,23 @@ bCb bEL bAR aSd -bGm -bLY +bGl +bLX bKp bPN -bRH +bRA bTn -bVk -bRA -bRA -bRA -bTo bRA bRA bRA bRA bRA bRA +bRA +bRA +bRA +bRA +clF bPI aaa aaa @@ -107613,23 +107633,23 @@ bCb bEL bAR aSd -bGl -bLX bKp -bPM -bRA -bTn -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -clF +bKp +bOb +bPI +bRG +bRG +ylx +bRG +bRG +bRG +rYq +bRG +bRG +bRG +cik +bRG +bRG bPI aaa aaa @@ -107870,23 +107890,23 @@ bCb bAR bER aSd -bKp -bKp -bOb +aMd +bLZ +aSd bPI -bRG -bRG -bVl -bRG -bRG -bRG -cbz -bRG -bRG -bRG -cik -bRG -bRG +bRB +bTo +bRA +bWI +bPI +gQL +bRA +bRA +bPI +bRA +bRA +ckg +clG bPI aaa aaa @@ -108131,19 +108151,19 @@ aMd bLZ aSd bPI -bRB -bTo +bRC bRA -bWI +bRA +bWJ +bPI +jnJ +cbx +cbx bPI bRA bRA bRA -bPI -bRA -bRA -ckg -clG +clI bPI aaa aaa @@ -108388,19 +108408,19 @@ aMd bLZ aSd bPI -bRC +bRD bRA bRA -bWJ +bWK bPI -can -cbx +cak +rEw cdr bPI bRA bRA bRA -clI +bRA bPI aaa aaa @@ -108644,21 +108664,21 @@ aSd aMd bMa bjQ +bPR bPI -bRD -bRA -bRA -bWK -bPI -cak -cby -cdq -bPI -bRA -bRA +bTp bRA bRA bPI +car +cbA +cds +bPI +cgz +cio +ckj +bPI +bYv aaa aaa aaa @@ -108901,21 +108921,21 @@ bLs bmS bMb aLd -bPR +aaa +bPI +bWL +bRA +bWM +bPI +aaa +aaa +aaa bPI -bTp bRA bRA +ckh bPI -car -cbA -cds -bPI -cgz -cio -ckj -bPI -bYv +aaa aaa aaa aaa @@ -109159,19 +109179,19 @@ aSf bLZ aSd aaa +bPR bPI -bWL -bRA -bWM +bTl +bWN bPI aaa aaa aaa bPI -bRA -bRA -ckh +cgA +cil bPI +bYv aaa aaa aaa @@ -109416,22 +109436,22 @@ aSf bMc aSd aaa +aaa bPR -bPI -bTl -bWN -bPI -aaa -aaa -aaa -bPI -cgA -cil -bPI +bRG +bRG bYv aaa aaa aaa +bPR +bRG +bRG +bYv +aaa +aaa +aaa +aaa aaa aaa aaa @@ -109674,17 +109694,17 @@ bCf bCf aaa aaa -bPR -bRG -bRG -bYv aaa aaa aaa -bPR -bRG -bRG -bYv +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ee6ca15f83d..dda71eb7e09 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -8030,11 +8030,12 @@ "tH" = ( /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_away"; name = "centcom bay 1"; - width = 18 + timid = 1; + width = 19 }, /turf/space, /area/space) @@ -8543,7 +8544,7 @@ pixel_y = 3 }, /obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/voice, +/obj/item/clothing/mask/chameleon, /obj/item/clothing/mask/balaclava{ pixel_x = 3; pixel_y = -3 @@ -8729,7 +8730,7 @@ /area/admin) "uY" = ( /obj/structure/rack, -/obj/item/clothing/under/chameleon/all{ +/obj/item/clothing/mask/chameleon{ pixel_x = -3; pixel_y = 3 }, @@ -9036,7 +9037,7 @@ pixel_y = 3 }, /obj/item/clothing/shoes/centcom, -/obj/item/clothing/shoes/syndigaloshes{ +/obj/item/clothing/shoes/chameleon/noslip{ pixel_x = 3; pixel_y = -3 }, @@ -12275,7 +12276,7 @@ "Hv" = ( /obj/structure/rack, /obj/item/katana/energy, -/obj/item/clothing/mask/gas/voice/space_ninja, +/obj/item/clothing/mask/gas/space_ninja, /turf/unsimulated/floor{ icon_state = "engine" }, @@ -35340,9 +35341,9 @@ wK wK wK wK -aN -aN -aN +wK +wK +wK aN aN aN @@ -35581,21 +35582,24 @@ aN aN cp cj -yt -yt -yt -cr aN aN -cr -yt -cr aN aN -cr -yt -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35638,9 +35642,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -35838,9 +35839,6 @@ aN aN cp cj -yt -yt -cr aN aN aN @@ -35850,9 +35848,15 @@ aN aN aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35918,9 +35922,6 @@ aN aN aN aN -aN -aN -aN "} (91,1,1) = {" aN @@ -36095,8 +36096,6 @@ aN aN cp cj -yt -cr aN aN aN @@ -36108,8 +36107,13 @@ aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -36152,9 +36156,6 @@ aN aN aN aN -aN -aN -aN jU kw kE @@ -36352,7 +36353,6 @@ aN aN cp cj -cr aN aN aN @@ -36366,7 +36366,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -36408,9 +36412,6 @@ aN aN aN aN -aN -aN -aN jQ jW kD @@ -36624,6 +36625,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36665,9 +36669,6 @@ aN aN aN aN -aN -aN -aN jP kt kx @@ -36881,6 +36882,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36922,9 +36926,6 @@ aN aN aN aN -aN -aN -aN jS kv kx @@ -37138,6 +37139,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37179,9 +37183,6 @@ aN aN aN aN -aN -aN -aN jR ku kx @@ -37395,6 +37396,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37436,9 +37440,6 @@ aN aN aN aN -aN -aN -aN jT ka kA @@ -37652,6 +37653,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37694,9 +37698,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -37909,6 +37910,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37974,9 +37978,6 @@ aN aN aN aN -aN -aN -aN "} (99,1,1) = {" aN @@ -38166,6 +38167,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38231,9 +38235,6 @@ aN aN aN aN -aN -aN -aN "} (100,1,1) = {" aN @@ -38423,6 +38424,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38488,9 +38492,6 @@ aN aN aN aN -aN -aN -aN "} (101,1,1) = {" aN @@ -38680,6 +38681,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38713,9 +38717,6 @@ aN aN aN aN -aN -aN -aN mr mr mr @@ -38937,6 +38938,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38970,9 +38974,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39179,7 +39180,6 @@ qo qs tx wK -cr aN aN aN @@ -39193,7 +39193,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -39227,9 +39231,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39436,21 +39437,24 @@ qo qs tA wK -yt aN aN aN aN aN -yt -yt -yt aN aN aN aN aN -yt +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39484,9 +39488,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39693,21 +39694,24 @@ tq tv tz wK -yt -cr aN aN aN aN -yt -yt -yt aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39741,9 +39745,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39950,21 +39951,24 @@ wK wK wK wK -yt -yt -cr aN aN -cr -yt -yt -yt -cr aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39998,9 +40002,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -40207,22 +40208,6 @@ aN aN aN wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK aN aN aN @@ -40241,6 +40226,22 @@ aN aN aN aN +wK +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN aN aN aN @@ -40463,26 +40464,26 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK aN aN aN diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index 3d298fc02eb..4dd47bcb4be 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/item/trash/cheesie, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/docking_port/stationary{ dir = 8; @@ -412,7 +412,7 @@ "aT" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aU" = ( /obj/structure/reagent_dispensers/watertank/high, /turf/simulated/floor/plating, @@ -457,28 +457,28 @@ icon_state = "swall_s6"; dir = 2 }, -/area/space) +/area/space/nearstation) "bb" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall14"; icon_state = "swall14"; dir = 2 }, -/area/space) +/area/space/nearstation) "bc" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall12"; icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "bd" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2 }, -/area/space) +/area/space/nearstation) "be" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall14"; @@ -503,7 +503,7 @@ icon_state = "swall7"; dir = 2 }, -/area/space) +/area/space/nearstation) "bj" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -513,12 +513,12 @@ icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "bk" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" }, -/area/space) +/area/space/nearstation) "bl" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -528,14 +528,14 @@ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "bm" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall11"; icon_state = "swall11"; dir = 2 }, -/area/space) +/area/space/nearstation) "bn" = ( /obj/machinery/vending/hydroseeds, /turf/simulated/floor/mineral/titanium/purple, @@ -549,7 +549,7 @@ /turf/simulated/shuttle/floor{ icon_state = "floor3" }, -/area/space) +/area/space/nearstation) "bq" = ( /turf/simulated/floor/mineral/titanium/purple, /area/shuttle/freegolem) @@ -572,7 +572,7 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) +/area/space/nearstation) "bt" = ( /obj/machinery/light{ dir = 1; @@ -589,7 +589,7 @@ icon_state = "swall_f6"; dir = 2 }, -/area/space) +/area/space/nearstation) "bv" = ( /obj/machinery/light{ dir = 1; @@ -608,21 +608,21 @@ icon_state = "swall_s5"; dir = 2 }, -/area/space) +/area/space/nearstation) "by" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall13"; icon_state = "swall13"; dir = 2 }, -/area/space) +/area/space/nearstation) "bz" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2 }, -/area/space) +/area/space/nearstation) "bA" = ( /obj/machinery/vending/coffee/free, /turf/simulated/floor/mineral/titanium/purple, @@ -793,7 +793,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bX" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -803,7 +803,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "bY" = ( /obj/structure/cable{ d1 = 2; @@ -817,7 +817,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bZ" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -827,7 +827,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ca" = ( /obj/structure/cable{ d1 = 2; @@ -846,12 +846,12 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cb" = ( /obj/structure/lattice, /obj/structure/grille/broken, /turf/space, -/area/space) +/area/space/nearstation) "cc" = ( /obj/machinery/camera{ c_tag = "Telecomms North Solars"; @@ -859,7 +859,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "cd" = ( /obj/structure/cable{ d1 = 1; @@ -868,7 +868,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ce" = ( /obj/structure/cable{ d1 = 4; @@ -878,7 +878,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cf" = ( /obj/structure/cable{ d1 = 2; @@ -892,7 +892,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cg" = ( /obj/structure/cable{ d1 = 1; @@ -901,7 +901,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ch" = ( /obj/structure/cable{ d1 = 1; @@ -909,7 +909,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ci" = ( /obj/structure/lattice, /obj/structure/grille, @@ -919,7 +919,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cj" = ( /obj/structure/lattice, /obj/structure/grille, @@ -931,7 +931,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ck" = ( /obj/structure/grille, /obj/structure/cable{ @@ -954,7 +954,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cl" = ( /obj/structure/lattice, /obj/structure/grille, @@ -965,7 +965,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cm" = ( /obj/structure/lattice, /obj/structure/grille, @@ -976,10 +976,10 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cn" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "co" = ( /obj/structure/lattice, /obj/structure/grille, @@ -990,7 +990,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cp" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomsat) @@ -1006,7 +1006,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "cs" = ( /obj/structure/lattice, /turf/space, @@ -1619,7 +1619,7 @@ dir = 4 }, /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "dP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -1631,13 +1631,13 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dR" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -1646,7 +1646,7 @@ dir = 8 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "dS" = ( /obj/structure/window/reinforced{ dir = 8 @@ -1704,7 +1704,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "dY" = ( /obj/structure/cable{ d1 = 1; @@ -1720,7 +1720,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ea" = ( /obj/machinery/door/window/brigdoor{ dir = 8; @@ -2043,7 +2043,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eE" = ( /obj/structure/cable{ d1 = 1; @@ -2064,7 +2064,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eF" = ( /obj/structure/cable{ d1 = 2; @@ -2073,7 +2073,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eG" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2151,7 +2151,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eO" = ( /obj/structure/cable{ d1 = 2; @@ -2173,7 +2173,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eP" = ( /obj/structure/cable{ d1 = 1; @@ -2188,7 +2188,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "eQ" = ( /obj/structure/table/wood, /obj/item/storage/firstaid/brute, @@ -2334,7 +2334,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "fd" = ( /obj/structure/window/reinforced{ dir = 4 @@ -2450,7 +2450,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "fo" = ( /obj/structure/cable{ d1 = 2; @@ -2464,7 +2464,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fp" = ( /obj/structure/table/wood, /obj/item/storage/firstaid/adv, @@ -2491,7 +2491,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fr" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2717,7 +2717,7 @@ icon_state = "2-4" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "fJ" = ( /obj/machinery/telecomms/bus/preset_one, /turf/simulated/floor/plasteel{ @@ -3481,7 +3481,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hC" = ( /obj/structure/cable{ d1 = 1; @@ -3790,7 +3790,7 @@ /area/tcommsat/entrance) "ii" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "ij" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -3845,7 +3845,7 @@ }, /obj/machinery/power/tracker, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iu" = ( /obj/structure/cable{ d1 = 1; @@ -3860,7 +3860,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iv" = ( /obj/structure/cable{ d1 = 4; @@ -3871,7 +3871,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iw" = ( /obj/machinery/computer/teleporter, /turf/simulated/floor/plating, @@ -3895,7 +3895,7 @@ }, /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iA" = ( /obj/structure/grille, /obj/structure/cable{ @@ -3917,7 +3917,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iB" = ( /obj/structure/cable{ d1 = 1; @@ -3932,7 +3932,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iC" = ( /obj/structure/cable{ d1 = 1; @@ -3952,7 +3952,7 @@ icon_state = "1-2" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "iD" = ( /obj/machinery/camera{ c_tag = "Telecomms South Solars"; @@ -3960,7 +3960,7 @@ network = list("Telecomms") }, /turf/space, -/area/space) +/area/space/nearstation) "iF" = ( /turf/simulated/wall/r_wall, /area/AIsattele) diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index e533422b39a..7e2b21f0e3a 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -5,7 +5,7 @@ "ab" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /turf/simulated/wall, /area/constructionsite/hallway/port) @@ -554,10 +554,10 @@ /area/constructionsite/hallway/starboard) "bC" = ( /turf/simulated/wall, -/area/space) +/area/space/nearstation) "bD" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "bE" = ( /obj/machinery/light{ dir = 1; @@ -850,14 +850,14 @@ tag = "icon-catwalk6"; icon_state = "catwalk6" }, -/area/space) +/area/space/nearstation) "cm" = ( /turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, -/area/space) +/area/space/nearstation) "cn" = ( /turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ @@ -878,7 +878,7 @@ tag = "icon-catwalk10"; icon_state = "catwalk10" }, -/area/space) +/area/space/nearstation) "cq" = ( /obj/structure/inflatable/door, /turf/simulated/floor/plasteel/airless, @@ -889,7 +889,7 @@ tag = "icon-catwalk3"; icon_state = "catwalk3" }, -/area/space) +/area/space/nearstation) "cs" = ( /turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ @@ -1164,7 +1164,7 @@ tag = "icon-catwalk1"; icon_state = "catwalk1" }, -/area/space) +/area/space/nearstation) "cU" = ( /obj/structure/lattice, /turf/space, @@ -1208,7 +1208,7 @@ /area/engiestation) "dc" = ( /turf/simulated/wall/r_wall, -/area/space) +/area/space/nearstation) "dd" = ( /obj/machinery/power/solar, /obj/structure/cable{ @@ -2024,7 +2024,7 @@ tag = "icon-catwalk9"; icon_state = "catwalk9" }, -/area/space) +/area/space/nearstation) "et" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "0"; @@ -2336,7 +2336,7 @@ tag = "icon-catwalk2"; icon_state = "catwalk2" }, -/area/space) +/area/space/nearstation) "fj" = ( /obj/machinery/vending/cola, /turf/simulated/floor/plasteel{ @@ -2640,7 +2640,7 @@ tag = "icon-catwalk5"; icon_state = "catwalk5" }, -/area/space) +/area/space/nearstation) "fR" = ( /obj/item/lighter/zippo, /turf/simulated/floor/plating/airless, @@ -2648,7 +2648,7 @@ tag = "icon-catwalk8"; icon_state = "catwalk8" }, -/area/space) +/area/space/nearstation) "fS" = ( /obj/machinery/shower{ dir = 4; @@ -2746,7 +2746,7 @@ tag = "icon-catwalk4"; icon_state = "catwalk4" }, -/area/space) +/area/space/nearstation) "gd" = ( /obj/structure/lattice, /obj/structure/disposaloutlet{ @@ -2756,18 +2756,18 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "ge" = ( /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" }, /turf/space, -/area/space) +/area/space/nearstation) "gf" = ( /obj/structure/grille, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "gg" = ( /obj/item/radio/intercom{ dir = 1; @@ -4077,7 +4077,7 @@ /area/constructionsite/engineering) "jh" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "ji" = ( /obj/structure/cable{ d1 = 1; diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index a75ca9403e0..59389f18e75 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -7,7 +7,7 @@ amount = 2 }, /turf/space, -/area/space) +/area/space/nearstation) "ac" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plasteel/airless{ @@ -17,17 +17,17 @@ "ad" = ( /turf/space, /turf/simulated/floor/plating/airless/catwalk, -/area/space) +/area/space/nearstation) "ae" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "af" = ( /obj/machinery/power/solar/fake, /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "ag" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -41,7 +41,7 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "aj" = ( /obj/machinery/power/terminal, /turf/simulated/floor/plating, @@ -55,7 +55,7 @@ amount = 1 }, /turf/space, -/area/space) +/area/space/nearstation) "am" = ( /obj/item/extinguisher, /turf/simulated/floor/plating, @@ -86,7 +86,7 @@ }, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ap" = ( /obj/structure/cable{ d1 = 1; @@ -135,12 +135,12 @@ icon_state = "brokengrille" }, /turf/space, -/area/space) +/area/space/nearstation) "au" = ( /obj/structure/lattice, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "av" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -174,7 +174,7 @@ /area/djstation) "az" = ( /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "aA" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -511,7 +511,7 @@ "bj" = ( /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bk" = ( /obj/structure/table/reinforced, /obj/item/ashtray/bronze, @@ -577,7 +577,7 @@ /obj/structure/lattice, /obj/structure/grille, /turf/space, -/area/space) +/area/space/nearstation) "bt" = ( /turf/simulated/wall/mineral/titanium/nodecon, /area/derelict/arrival) @@ -1257,7 +1257,7 @@ /turf/simulated/floor/plasteel/airless{ icon_state = "solarpanel" }, -/area/space) +/area/space/nearstation) "cJ" = ( /obj/structure/sign/securearea, /turf/simulated/wall/mineral/titanium/nodecon/nodiagonal, @@ -1836,7 +1836,7 @@ "ed" = ( /obj/item/stack/rods, /turf/space, -/area/space) +/area/space/nearstation) "ee" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -2282,7 +2282,7 @@ "fa" = ( /mob/living/simple_animal/hostile/carp, /turf/space, -/area/space) +/area/space/nearstation) "fb" = ( /obj/structure/grille, /obj/structure/window/full/shuttle, @@ -2510,7 +2510,7 @@ /area/derelict/crew_quarters) "fC" = ( /turf/simulated/wall/mineral/titanium/nodecon, -/area/space) +/area/space/nearstation) "fD" = ( /obj/machinery/light_switch{ pixel_x = 32; @@ -2708,7 +2708,7 @@ "fZ" = ( /obj/item/shard, /turf/space, -/area/space) +/area/space/nearstation) "ga" = ( /obj/structure/toilet{ dir = 8 @@ -3086,7 +3086,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "gV" = ( /obj/structure/coatrack, /turf/simulated/floor/plasteel{ @@ -3382,7 +3382,7 @@ "hw" = ( /obj/machinery/atmospherics/unary/passive_vent, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hx" = ( /obj/structure/chair/wood/normal, /turf/simulated/floor/wood{ @@ -4417,7 +4417,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "ju" = ( /obj/structure/chair{ dir = 4 @@ -4876,7 +4876,7 @@ "kp" = ( /obj/item/stack/ore/uranium, /turf/space, -/area/space) +/area/space/nearstation) "kq" = ( /obj/structure/table/reinforced, /obj/item/paper/djstation{ @@ -5221,7 +5221,7 @@ "kZ" = ( /obj/item/stack/ore/iron, /turf/space, -/area/space) +/area/space/nearstation) "la" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -5392,7 +5392,7 @@ dir = 1 }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "lu" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -5400,7 +5400,7 @@ icon_state = "swall_f6"; tag = "icon-swall_f6" }, -/area/space) +/area/space/nearstation) "lv" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -5415,7 +5415,7 @@ }, /obj/structure/window/reinforced, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "lx" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -5423,11 +5423,11 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) +/area/space/nearstation) "ly" = ( /obj/item/stack/tile, /turf/space, -/area/space) +/area/space/nearstation) "lz" = ( /obj/machinery/light{ dir = 1; @@ -5454,13 +5454,13 @@ icon_state = "swall11"; dir = 2 }, -/area/space) +/area/space/nearstation) "lC" = ( /turf/simulated/shuttle/wall{ icon_state = "swall7"; dir = 2 }, -/area/space) +/area/space/nearstation) "lD" = ( /turf/space, /area/derelict/eva{ @@ -5472,7 +5472,7 @@ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "lF" = ( /turf/space, /area/syndicate_depot/perimeter) @@ -5533,13 +5533,13 @@ icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "lP" = ( /turf/simulated/shuttle/wall{ icon_state = "swall3"; dir = 2 }, -/area/space) +/area/space/nearstation) "lQ" = ( /obj/structure/cable{ d1 = 1; @@ -5710,19 +5710,19 @@ /obj/item/shard, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mp" = ( /obj/item/broken_bottle, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mq" = ( /obj/item/shard{ icon_state = "medium" }, /obj/effect/mob_spawn/human/mime/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mr" = ( /obj/structure/falsewall, /turf/simulated/floor/plasteel{ @@ -5774,7 +5774,7 @@ icon_state = "swall12"; dir = 2 }, -/area/space) +/area/space/nearstation) "my" = ( /turf/simulated/floor/plating/airless/asteroid, /turf/simulated/shuttle/wall{ @@ -5782,7 +5782,7 @@ icon_state = "swall_f9"; dir = 2 }, -/area/space) +/area/space/nearstation) "mz" = ( /obj/structure/closet/crate{ icon_state = "crateopen"; @@ -5791,7 +5791,7 @@ /obj/item/stack/ore/bananium, /obj/item/grenade/bananade, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mA" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -5814,7 +5814,7 @@ icon_state = "medium" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mE" = ( /obj/structure/cable{ d1 = 1; @@ -5840,7 +5840,7 @@ tag = "icon-burst_r (WEST)" }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "mG" = ( /obj/structure/shuttle/engine/heater{ tag = "icon-heater (EAST)"; @@ -5851,13 +5851,13 @@ dir = 8 }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "mH" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "mI" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "mJ" = ( /obj/effect/decal/cleanable/blood, /turf/simulated/floor/plasteel{ @@ -5871,7 +5871,7 @@ "mL" = ( /obj/machinery/door/unpowered/shuttle, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mM" = ( /obj/effect/spawner/random_spawners/syndicate/loot, /turf/simulated/floor/plasteel{ @@ -5900,7 +5900,7 @@ /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/tranquillite, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mQ" = ( /obj/structure/closet/crate, /obj/item/stack/ore/tranquillite, @@ -5911,7 +5911,7 @@ /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/tranquillite, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mR" = ( /obj/machinery/light{ dir = 1; @@ -5935,7 +5935,7 @@ "mT" = ( /obj/item/shard, /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "mU" = ( /obj/structure/closet/crate, /obj/item/stack/ore/bananium, @@ -5944,25 +5944,25 @@ /obj/item/stack/ore/bananium, /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mV" = ( /obj/effect/mob_spawn/human/mime/corpse{ name = "Mime Pilot" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mW" = ( /obj/structure/computerframe/HONKputer, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mX" = ( /obj/effect/mob_spawn/human/corpse/clownmili, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mY" = ( /obj/effect/mob_spawn/human/corpse/clownoff, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "mZ" = ( /obj/effect/spawner/random_spawners/syndicate/turret/external, /turf/simulated/floor/plasteel{ @@ -5979,17 +5979,17 @@ dir = 4 }, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "nb" = ( /obj/item/shard{ icon_state = "small" }, /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "nc" = ( /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nd" = ( /obj/item/stack/sheet/metal{ layer = 4.1 @@ -6005,7 +6005,7 @@ tag = "icon-propulsion_l (WEST)" }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "nf" = ( /obj/effect/spawner/random_spawners/syndicate/trap/mine, /obj/item/stack/sheet/metal{ @@ -6018,14 +6018,14 @@ "ng" = ( /obj/item/paper/clownship, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nh" = ( /obj/item/shard, /obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "ni" = ( /obj/machinery/light{ dir = 4; @@ -6039,7 +6039,7 @@ "nj" = ( /obj/effect/mob_spawn/human/clown/corpse, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nk" = ( /obj/machinery/computer/syndicate_depot/teleporter, /turf/simulated/floor/plasteel{ @@ -6049,7 +6049,7 @@ "nl" = ( /obj/item/pickaxe, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nm" = ( /obj/structure/closet/crate, /obj/item/stack/ore/bananium, @@ -6057,7 +6057,7 @@ /obj/item/stack/ore/bananium, /obj/item/stack/ore/bananium, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nn" = ( /turf/simulated/floor/plasteel{ dir = 1; @@ -6080,7 +6080,7 @@ icon_state = "swall_f10"; dir = 2 }, -/area/space) +/area/space/nearstation) "nq" = ( /obj/structure/shuttle/engine/propulsion{ dir = 4; @@ -6093,7 +6093,7 @@ tag = "icon-propulsion_l (WEST)" }, /turf/simulated/shuttle/plating, -/area/space) +/area/space/nearstation) "nr" = ( /obj/effect/decal/warning_stripes/red, /obj/structure/window/plasmareinforced{ @@ -6267,13 +6267,13 @@ dir = 8 }, /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "nO" = ( /obj/effect/mob_spawn/human/clown/corpse{ name = "Clown Pilot" }, /turf/simulated/floor/plasteel/airless, -/area/space) +/area/space/nearstation) "nP" = ( /obj/structure/dispenser, /turf/simulated/floor/plasteel{ @@ -7454,7 +7454,7 @@ /obj/effect/landmark/burnturf, /obj/structure/grille/broken, /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "qI" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -8047,7 +8047,7 @@ /turf/simulated/wall/mineral/titanium/nodecon/nosmooth{ icon_state = "swall_f10" }, -/area/space) +/area/space/nearstation) "rM" = ( /turf/simulated/floor/plasteel/airless{ dir = 5; @@ -8965,7 +8965,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "tA" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ @@ -10583,7 +10583,7 @@ "wz" = ( /obj/item/stack/sheet/metal, /turf/space, -/area/space) +/area/space/nearstation) "wC" = ( /obj/effect/landmark/burnturf, /obj/machinery/light/small{ @@ -11119,7 +11119,7 @@ name = "I PISS ON YOU!" }, /turf/space, -/area/space) +/area/space/nearstation) "yo" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -11325,7 +11325,7 @@ max_amount = 30 }, /turf/space, -/area/space) +/area/space/nearstation) "yS" = ( /obj/machinery/door/airlock/external{ frequency = 1501; @@ -11489,7 +11489,7 @@ icon_state = "small" }, /turf/space, -/area/space) +/area/space/nearstation) "zt" = ( /turf/simulated/wall, /area/derelict/teleporter) @@ -11647,7 +11647,7 @@ icon_state = "swall_f5"; dir = 2 }, -/area/space) +/area/space/nearstation) "zR" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm index af8d04699dc..1ee940615a5 100644 --- a/_maps/map_files/generic/z5.dmm +++ b/_maps/map_files/generic/z5.dmm @@ -39,7 +39,7 @@ "ag" = ( /obj/spacepod/random, /turf/space, -/area/space) +/area/space/nearstation) "ah" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -57,7 +57,7 @@ "aj" = ( /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "ak" = ( /turf/simulated/mineral/random/high_chance, /area/mine/dangerous/unexplored) @@ -104,7 +104,7 @@ icon_state = "pwall"; dir = 1 }, -/area/space) +/area/mine/abandoned) "ar" = ( /turf/simulated/floor/plating/airless, /turf/simulated/shuttle/wall{ @@ -143,7 +143,7 @@ tag = "icon-floor2"; icon_state = "floor2" }, -/area/space) +/area/mine/abandoned) "aw" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; @@ -156,7 +156,7 @@ tag = "" }, /turf/simulated/floor/plating/airless, -/area/space) +/area/mine/abandoned) "ax" = ( /obj/machinery/door/airlock/hatch, /turf/simulated/shuttle/floor{ @@ -172,7 +172,7 @@ tag = "icon-floor2"; icon_state = "floor2" }, -/area/space) +/area/mine/abandoned) "az" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -223,7 +223,7 @@ icon_state = "pwall"; dir = 5 }, -/area/space) +/area/mine/abandoned) "aH" = ( /obj/structure/alien/weeds, /turf/simulated/floor/plating/airless{ @@ -236,7 +236,7 @@ icon_state = "medium" }, /turf/space, -/area/space) +/area/space/nearstation) "aJ" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -252,7 +252,7 @@ icon_state = "pwall"; dir = 6 }, -/area/space) +/area/mine/abandoned) "aL" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -260,7 +260,7 @@ icon_state = "pwall"; dir = 9 }, -/area/space) +/area/mine/abandoned) "aM" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -305,7 +305,7 @@ /obj/item/stack/rods, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "aS" = ( /obj/item/shard, /obj/item/stack/rods, @@ -411,7 +411,7 @@ /obj/item/shard, /obj/structure/lattice, /turf/space, -/area/space) +/area/space/nearstation) "bj" = ( /obj/machinery/power/terminal{ dir = 4 @@ -1564,13 +1564,13 @@ /area/mine/abandoned) "eg" = ( /turf/simulated/mineral/random/labormineral, -/area/space) +/area/space/nearstation) "eh" = ( /turf/simulated/wall/r_wall, /area/mine/dangerous/explored) "ei" = ( /turf/simulated/mineral/random, -/area/space) +/area/space/nearstation) "ej" = ( /obj/structure/girder/displaced, /turf/simulated/floor/plating/airless{ @@ -2494,7 +2494,7 @@ d2 = 4 }, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "gb" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable{ @@ -2526,7 +2526,7 @@ icon_state = "0-8" }, /turf/simulated/floor/plating, -/area/space) +/area/space/nearstation) "ge" = ( /obj/machinery/computer/shuttle/labor/one_way, /obj/structure/cable{ @@ -3099,10 +3099,10 @@ /area/mine/west_outpost) "hu" = ( /turf/simulated/floor/plating/airless, -/area/space) +/area/space/nearstation) "hv" = ( /turf/simulated/mineral, -/area/space) +/area/space/nearstation) "hw" = ( /obj/machinery/computer/mech_bay_power_console, /obj/structure/window/reinforced{ @@ -4315,12 +4315,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/mine/eva) -"kh" = ( -/turf/simulated/floor/plating/airless{ - icon_state = "asteroidwarning"; - dir = 5 - }, -/area/space) "ki" = ( /obj/machinery/light, /turf/simulated/floor/plating/airless/asteroid, @@ -4598,7 +4592,7 @@ icon_state = "asteroidwarning"; dir = 4 }, -/area/space) +/area/mine/dangerous/explored) "kR" = ( /obj/machinery/door/airlock/external{ frequency = 1379; @@ -4774,7 +4768,7 @@ /area/mine/living_quarters) "ll" = ( /turf/simulated/floor/plating/airless/asteroid, -/area/space) +/area/space/nearstation) "lm" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/firedoor, @@ -5368,12 +5362,6 @@ }, /turf/simulated/floor/plasteel, /area/mine/eva) -"mx" = ( -/turf/simulated/floor/plating/airless{ - icon_state = "asteroidwarning"; - dir = 6 - }, -/area/space) "my" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden, @@ -6702,7 +6690,7 @@ dir = 4 }, /turf/space, -/area/space) +/area/space/nearstation) "pj" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/warning_stripes/blue/hollow, @@ -52246,11 +52234,11 @@ bV bV bV bV -ll -kh +bV +dP kQ -mx -ll +dK +bV mQ nj nj @@ -52503,11 +52491,11 @@ bV bV bV bV -ll -ll -ll -ll -ll +bV +bV +bV +bV +bV bV bV bV diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm new file mode 100644 index 00000000000..fda5ff55056 --- /dev/null +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -0,0 +1,1092 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ad" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ae" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 8; + height = 15; + id = "admin"; + name = "admin"; + roundstart_move = null; + timid = 1; + width = 18 + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"af" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ag" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/beer, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/drinkingglasses, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/soda, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ak" = ( +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "wall3" + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"am" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"an" = ( +/obj/machinery/cell_charger, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ao" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ap" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/door/poddoor/preopen{ + id_tag = "adminshuttleblast"; + name = "Blast Doors"; + req_access_txt = "101" + }, +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "General Access"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"as" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"at" = ( +/obj/item/stack/sheet/metal, +/obj/structure/table, +/obj/item/stack/sheet/glass{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"au" = ( +/obj/machinery/mecha_part_fabricator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"av" = ( +/obj/machinery/kitchen_machine/microwave/upgraded, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aw" = ( +/obj/machinery/door/window/northright{ + name = "bar" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ay" = ( +/obj/item/ashtray/glass, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"az" = ( +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/lighter/zippo{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aC" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aD" = ( +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (WEST)"; + icon_state = "heater"; + dir = 8 + }, +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 4 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aE" = ( +/obj/structure/chair/stool/bar, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aH" = ( +/obj/machinery/recharge_station/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/autolathe/upgraded{ + hacked = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aL" = ( +/obj/machinery/door/airlock/public/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aM" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aN" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/machinery/vending/snack, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aP" = ( +/obj/machinery/vending/cola, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/spot, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aR" = ( +/obj/machinery/vending/cigarette, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aS" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/computer/communications, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aW" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aY" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/dna_scannernew/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/computer/cloning, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/clonepod/upgraded, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bc" = ( +/obj/machinery/computer/scan_consolenew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"be" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"bg" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bm" = ( +/obj/machinery/sleeper/upgraded{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bn" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bo" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Holding Cell"; + opacity = 1; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/door/window/brigdoor/westleft{ + color = "#d70000"; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"br" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bs" = ( +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bt" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bv" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bx" = ( +/obj/structure/table, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/hemostat, +/obj/item/cautery, +/obj/item/surgicaldrill, +/obj/item/circular_saw, +/obj/item/scalpel, +/obj/item/retractor, +/obj/item/FixOVein, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/table, +/obj/item/storage/lockbox/mindshield, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bC" = ( +/obj/structure/table, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/storage/box/trackimp, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) + +(1,1,1) = {" +aa +aa +aa +ab +aC +aK +aN +aa +ab +aC +aK +aN +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +ab +ac +aD +aD +ac +ac +ac +aD +aD +ac +aN +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +ab +ac +av +am +am +aO +ac +aZ +bg +bg +bm +ac +aN +aa +aa +aa +aa +"} +(4,1,1) = {" +ab +ag +am +aw +am +am +aP +ac +ba +bg +bg +bg +bs +ac +aN +aa +aa +aa +"} +(5,1,1) = {" +ac +ah +am +ax +aE +am +aQ +ac +bb +bg +bg +bg +bg +bx +ac +aa +aa +aa +"} +(6,1,1) = {" +ac +ai +am +ay +aE +am +aR +ac +aZ +bg +bi +bn +bg +by +ac +aa +aa +aa +"} +(7,1,1) = {" +ac +aj +aq +az +aE +am +am +ac +bc +bg +bj +bo +bt +bz +ac +aa +aa +aa +"} +(8,1,1) = {" +ac +ak +ak +ak +ak +aL +ak +ak +ak +bh +ak +ak +ak +ak +ac +aa +aa +aa +"} +(9,1,1) = {" +ad +al +ar +aA +am +am +am +as +am +am +am +am +am +am +ac +aa +aa +aa +"} +(10,1,1) = {" +ae +am +ar +am +am +am +am +am +am +am +am +am +am +bA +ac +aa +aa +aa +"} +(11,1,1) = {" +ac +ak +ak +aB +ak +ak +ak +bd +ak +ak +ak +bp +ak +ak +ac +aa +aa +aa +"} +(12,1,1) = {" +ac +an +as +am +aF +ac +aS +am +am +ac +am +am +bu +bB +ac +aa +aa +aa +"} +(13,1,1) = {" +ac +ao +am +am +aG +ac +aV +aW +aW +ac +am +am +am +bC +ac +aa +aa +aa +"} +(14,1,1) = {" +ac +ap +am +am +aH +ac +aT +aX +be +ac +am +am +am +am +ac +aa +aa +aa +"} +(15,1,1) = {" +af +ac +at +am +am +ac +aU +aY +bf +ac +bk +bq +bv +ac +aM +aa +aa +aa +"} +(16,1,1) = {" +aa +ac +au +am +aI +ac +aa +aa +aa +ac +am +am +bw +ac +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +af +ac +aq +aJ +ac +aa +aa +aa +ac +bl +br +ac +aM +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +af +ak +ak +aM +aa +aa +aa +af +ak +ak +aM +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm new file mode 100644 index 00000000000..de3cacaf413 --- /dev/null +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -0,0 +1,1661 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s6"; + dir = 2 + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"ad" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ae" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"af" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ag" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 9; + height = 18; + id = "admin"; + name = "hospital"; + roundstart_move = "cc_bay_1"; + timid = 1; + width = 19 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ak" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/turf/space, +/area/shuttle/administration) +"am" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/turf/space, +/area/shuttle/administration) +"an" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s10"; + dir = 2 + }, +/area/shuttle/administration) +"ao" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall3"; + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"ap" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/chem_heater, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"as" = ( +/obj/structure/closet/secure_closet/reagents, +/obj/item/storage/bag/chemistry, +/obj/item/storage/bag/chemistry, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"at" = ( +/obj/structure/closet/secure_closet/chemical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"au" = ( +/obj/structure/sign/chemistry{ + pixel_y = 1 + }, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"av" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aw" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Lobby"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ay" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"az" = ( +/obj/machinery/clonepod{ + biomass = 300 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/computer/cloning, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/dna_scannernew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aC" = ( +/obj/machinery/atmospherics/unary/cryo_cell, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aD" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westleft{ + req_access_txt = "33" + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"aK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aL" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "propulsion" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/administration) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; + name = "Chemistry Cleaner" + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aP" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aR" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/machinery/reagentgrinder, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Chemistry"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/airlock/shuttle/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Cloning"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aW" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s9"; + dir = 2 + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/iv_drip, +/obj/item/reagent_containers/iv_bag, +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aY" = ( +/obj/structure/chair/office/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/chem_heater, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"bc" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/vending/coffee, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"be" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bg" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/smartfridge/medbay, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"bm" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"bn" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall15"; + icon_state = "swall15"; + dir = 2 + }, +/area/shuttle/administration) +"bo" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/computer/pandemic, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 2; + name = "NHV Asclepius Command Center"; + network = list("NHV Asclepius") + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/door_control{ + dir = 4; + id = "Asclshutters"; + name = "remote shutter control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/obj/machinery/door_control{ + dir = 2; + id = "asclblast"; + name = "blast door control"; + pixel_x = 5; + pixel_y = 35; + pixel_z = 0; + req_access = list(101); + req_access_txt = "0" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"br" = ( +/obj/machinery/recharger/wallcharger{ + pixel_y = 25 + }, +/obj/machinery/recharger/wallcharger{ + pixel_y = 35 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bs" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bt" = ( +/obj/structure/sink{ + icon_state = "sink"; + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = 32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bv" = ( +/obj/machinery/vending/medical, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/table/tray, +/obj/item/stack/medical/bruise_pack/advanced, +/obj/item/scalpel, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/circular_saw, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/cautery, +/obj/item/FixOVein, +/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffel/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bx" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bC" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NHV Asclepius shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bD" = ( +/obj/machinery/door/airlock/command{ + name = "Command Center"; + req_access = null; + req_access_txt = "19" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bF" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bG" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 1"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bH" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NHV Asclepius navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bI" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Operating Room"; + req_access = null; + req_access_txt = "45" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bJ" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bK" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bL" = ( +/obj/machinery/computer/communications{ + name = "NHV Asclepius Communications Console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bN" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall2"; + icon_state = "swall2"; + dir = 2 + }, +/area/shuttle/administration) +"bO" = ( +/obj/machinery/sleeper, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bP" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bQ" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bR" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bS" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bT" = ( +/obj/machinery/light, +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bU" = ( +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/structure/table/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bV" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bW" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bX" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bY" = ( +/obj/structure/sign/examroom, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bZ" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ca" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 5; + icon_state = "camera"; + name = "NHV Asclepius Central"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cb" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cc" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"cd" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/administration) +"ce" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cf" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cg" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Cryo"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/unary/portables_connector, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ch" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/machinery/cell_charger, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ci" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cj" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ck" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 2"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cl" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cm" = ( +/obj/structure/closet/l3closet, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cn" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/clothing/head/beret/med, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"co" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cp" = ( +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cq" = ( +/obj/machinery/light, +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cr" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cs" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ct" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s5"; + dir = 2 + }, +/area/shuttle/administration) +"cu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4; + level = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"hL" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) +"qa" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"Kq" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) +"Vi" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 2; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/turf/space, +/area/shuttle/administration) + +(1,1,1) = {" +ab +ao +aE +aE +aE +aE +aE +aD +bo +bB +bB +bK +aD +aE +aE +aE +aE +ct +"} +(2,1,1) = {" +ac +ap +aF +aN +aS +aX +ap +ac +bp +bC +bH +bL +ac +cg +cu +aw +cl +ac +"} +(3,1,1) = {" +ad +aq +aG +aw +aw +aY +aq +ac +bq +aR +aR +bM +ac +aC +cv +aw +cm +qa +"} +(4,1,1) = {" +ae +ar +aw +aw +aw +aw +ba +ac +br +aw +aw +aw +bW +cf +cw +aw +cn +hL +"} +(5,1,1) = {" +af +as +aw +aw +aw +aw +aw +ag +bs +bD +aP +bN +bX +aC +cv +aw +co +Vi +"} +(6,1,1) = {" +ac +at +aw +aO +aw +aw +aw +bj +bt +aw +aw +bO +bY +cj +cx +aw +cp +ac +"} +(7,1,1) = {" +ag +au +aH +aP +aT +aP +bb +bk +bu +aw +aw +bP +bZ +ch +aw +aw +cq +ac +"} +(8,1,1) = {" +ah +av +aw +aQ +aw +aQ +bc +bl +aw +aw +aw +aw +ca +aw +aw +aw +cr +ac +"} +(9,1,1) = {" +ai +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bR +ac +"} +(10,1,1) = {" +aj +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bS +ac +"} +(11,1,1) = {" +ak +ax +aI +aR +aw +aR +bd +bm +bv +bE +aw +bQ +cb +ci +bQ +aw +cs +ac +"} +(12,1,1) = {" +ag +ao +aJ +aP +aU +aP +bb +bn +aP +bF +bI +bN +cc +aP +bF +bI +bN +bX +"} +(13,1,1) = {" +ac +ay +aw +aw +aw +aw +be +ac +bw +bG +aw +bR +ac +bw +ck +aw +bR +ac +"} +(14,1,1) = {" +ad +az +aw +aw +aw +aw +bg +ac +bx +aw +aw +bS +ac +bx +aw +aw +bS +Kq +"} +(15,1,1) = {" +al +aA +aw +aw +aw +aw +bh +ac +by +aw +aw +bT +ac +by +aw +aw +bT +hL +"} +(16,1,1) = {" +am +aB +aw +aw +aw +aZ +bi +ac +bz +aw +aw +bU +ac +bz +aw +aw +bU +Vi +"} +(17,1,1) = {" +ac +aC +aK +aK +aV +bf +ce +ac +bA +aw +bJ +bV +ac +bA +aw +bJ +bV +ac +"} +(18,1,1) = {" +an +aD +aL +aL +aD +aE +aE +bn +aL +aL +aD +aE +cd +aD +aL +aL +aD +aW +"} +(19,1,1) = {" +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +"} diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index ede0351993b..a6b346ee1c2 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -11,7 +11,8 @@ Pipelines + Other Objects -> Pipe network GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics anchored = 1 - layer = 2.4 //under wires with their 2.44 + layer = GAS_PIPE_HIDDEN_LAYER //under wires + plane = FLOOR_PLANE idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON @@ -61,10 +62,14 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) // Icons/overlays/underlays /obj/machinery/atmospherics/update_icon() - return null + var/turf/T = loc + if(level == 2 || !T.intact) + plane = GAME_PLANE + else + plane = FLOOR_PLANE /obj/machinery/atmospherics/proc/update_pipe_image() - pipe_image = image(src, loc, layer = 20, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) + pipe_image = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) pipe_image.plane = HUD_PLANE /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) @@ -327,3 +332,4 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics/update_remote_sight(mob/user) user.sight |= (SEE_TURFS|BLIND) + . = ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 5b09cc250c5..68a1033a266 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -3,6 +3,8 @@ initialize_directions = SOUTH|NORTH use_power = IDLE_POWER_USE + layer = GAS_PUMP_LAYER + var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index 3e18cfb41fa..6bb16cb36c9 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -15,8 +15,6 @@ var/obj/machinery/power/generator/generator - layer = 2.45 // Just above wires - anchored = 1 density = 1 @@ -112,6 +110,8 @@ ..() /obj/machinery/atmospherics/binary/circulator/update_icon() + ..() + if(stat & (BROKEN|NOPOWER)) icon_state = "circ[side]-p" else if(last_pressure_delta > 0) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 8f828c178ad..62b4f55470e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -71,6 +71,8 @@ add_underlay(T, node2, dir) /obj/machinery/atmospherics/binary/dp_vent_pump/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 8becfa37c10..3448655c953 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -28,6 +28,7 @@ return ..() /obj/machinery/atmospherics/binary/passive_gate/update_icon() + ..() icon_state = "[on ? "on" : "off"]" /obj/machinery/atmospherics/binary/passive_gate/update_underlays() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 8171efa7825..1998e67e17d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -79,6 +79,8 @@ Thus, the two variables affect pump operation are set in New(): on = 1 /obj/machinery/atmospherics/binary/pump/update_icon() + ..() + if(!powered()) icon_state = "off" else diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index dabe548ce9f..f9da99544b5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -16,6 +16,8 @@ icon_state = "map_valve1" /obj/machinery/atmospherics/binary/valve/update_icon(animation) + ..() + if(animation) flick("valve[src.open][!src.open]",src) else diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 6633c1ac10d..0947b2ee860 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -83,6 +83,8 @@ Thus, the two variables affect pump operation are set in New(): set_frequency(frequency) /obj/machinery/atmospherics/binary/volume_pump/update_icon() + ..() + if(!powered()) icon_state = "off" else diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index a3903f278fb..cde1c9e80b0 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -72,6 +72,8 @@ update_ports() /obj/machinery/atmospherics/omni/update_icon() + ..() + if(stat & NOPOWER) overlays = overlays_off on = 0 @@ -83,8 +85,6 @@ underlays = underlays_current - return - /obj/machinery/atmospherics/omni/proc/error_check() return diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index a778b01ea86..e45a8c3956f 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -79,6 +79,8 @@ Filter types: radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/trinary/filter/update_icon() + ..() + if(flipped) icon_state = "m" else diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index e7c91172e3b..19849582a0f 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -57,6 +57,8 @@ update_icon() /obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0) + ..() + if(flipped) icon_state = "m" else diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index c0787a95612..8087db9966e 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -4,6 +4,7 @@ use_power = IDLE_POWER_USE var/on = 0 + layer = GAS_FILTER_LAYER var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 3ec4e8443e4..7b3f8299339 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -135,6 +135,7 @@ /obj/machinery/atmospherics/trinary/tvalve/digital/update_icon() ..() + if(!powered()) icon_state = "tvalvenopower" diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 51415223de2..7cae2968a22 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -13,6 +13,8 @@ var/current_heat_capacity = 50000 //totally random /obj/machinery/atmospherics/unary/cold_sink/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -20,8 +22,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/cold_sink/process_atmos() ..() if(!on) diff --git a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm index 42c3676836c..cb095b1e551 100644 --- a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm +++ b/code/ATMOSPHERICS/components/unary_devices/generator_input.dm @@ -9,12 +9,12 @@ var/update_cycle /obj/machinery/atmospherics/unary/generator_input/update_icon() + ..() + if(node) icon_state = "intact" else icon_state = "exposed" - return - /obj/machinery/atmospherics/unary/generator_input/proc/return_exchange_air() return air_contents diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm index 58b374578df..e4afcadc7fa 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm @@ -13,13 +13,13 @@ burn_state = LAVA_PROOF /obj/machinery/atmospherics/unary/heat_exchanger/update_icon() + ..() + if(node) icon_state = "intact" else icon_state = "exposed" - return - /obj/machinery/atmospherics/unary/heat_exchanger/atmos_init() if(!partner) var/partner_connect = turn(dir,180) diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index 31eb7305ded..b3b1d0c4fdc 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -13,6 +13,8 @@ var/current_heat_capacity = 50000 //totally random /obj/machinery/atmospherics/unary/heat_reservoir/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -20,8 +22,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/heat_reservoir/process_atmos() ..() if(!on) diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 509b36ff8ab..5302a99caa1 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -2,7 +2,7 @@ icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" use_power = IDLE_POWER_USE - layer = 3 + layer = GAS_SCRUBBER_LAYER can_unwrench = 1 @@ -38,6 +38,8 @@ return ..() /obj/machinery/atmospherics/unary/outlet_injector/update_icon() + ..() + if(!powered()) icon_state = "off" else diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm index 0f575fb9c3a..a9c3b98ad74 100644 --- a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm +++ b/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm @@ -14,6 +14,8 @@ var/oxygen_content = 10 /obj/machinery/atmospherics/unary/oxygen_generator/update_icon() + ..() + if(node) icon_state = "intact_[on?("on"):("off")]" else @@ -21,8 +23,6 @@ on = 0 - return - /obj/machinery/atmospherics/unary/oxygen_generator/New() ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index 711a1df3861..7b4ba08af77 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -6,7 +6,7 @@ desc = "For connecting portables devices related to atmospherics control." can_unwrench = 1 - layer = 2.4 + layer = GAS_FILTER_LAYER var/obj/machinery/portable_atmospherics/connected_device @@ -18,6 +18,7 @@ return ..() /obj/machinery/atmospherics/unary/portables_connector/update_icon() + ..() icon_state = "connector" /obj/machinery/atmospherics/unary/portables_connector/update_underlays() diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm index c245bfc120e..5a6e76a182b 100644 --- a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm +++ b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm @@ -11,10 +11,12 @@ desc = "Transfers heat to and from an area" /obj/machinery/atmospherics/unary/thermal_plate/update_icon() - var/prefix="" + ..() + + var/prefix = "" //var/suffix="_idle" // Also available: _heat, _cool if(level == 1 && istype(loc, /turf/simulated)) - prefix="h" + prefix = "h" icon_state = "[prefix]off" /obj/machinery/atmospherics/unary/thermal_plate/process_atmos() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 0ac609cb6ec..2a22052c7dc 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -10,6 +10,8 @@ desc = "Has a valve and pump attached to it" use_power = IDLE_POWER_USE + layer = GAS_SCRUBBER_LAYER + can_unwrench = 1 var/open = 0 @@ -77,6 +79,10 @@ air_contents.volume = 1000 /obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0) + ..() + + plane = FLOOR_PLANE + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 82cdfa46e97..86f2d3b9973 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -6,6 +6,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it" + layer = GAS_SCRUBBER_LAYER use_power = IDLE_POWER_USE idle_power_usage = 10 @@ -91,6 +92,10 @@ return 1 /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) + ..() + + plane = FLOOR_PLANE + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 2552f6e0794..8421685d44c 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -4,7 +4,6 @@ icon = 'icons/atmos/pipes.dmi' icon_state = "cap" level = 2 - layer = 2.4 //under wires with their 2.44 volume = 35 @@ -55,6 +54,8 @@ node.update_underlays() /obj/machinery/atmospherics/pipe/cap/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 199942e7a40..13e35d10c7b 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -14,7 +14,6 @@ var/obj/machinery/atmospherics/node3 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold/New() @@ -116,6 +115,8 @@ node3.update_underlays() /obj/machinery/atmospherics/pipe/manifold/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 502795e1da9..d2cee29c0ba 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -15,7 +15,6 @@ var/obj/machinery/atmospherics/node4 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold4w/New() ..() @@ -90,6 +89,8 @@ node4.update_underlays() /obj/machinery/atmospherics/pipe/manifold4w/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 4cd51e66b67..ec4f6bfd7ec 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -3,7 +3,6 @@ var/datum/pipeline/parent var/volume = 0 force = 20 - layer = 2.4 //under wires with their 2.44 use_power = NO_POWER_USE can_unwrench = 1 var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index b2c2750a452..b966690733b 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -137,6 +137,8 @@ node2.update_underlays() /obj/machinery/atmospherics/pipe/simple/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm index 3efd22ed446..db982639c2f 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm @@ -28,6 +28,8 @@ icon_state = "map_universal" /obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm index 9bf085b534a..1ca4da646ac 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm @@ -39,6 +39,8 @@ icon_state = "map_universal" /obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(var/safety = 0) + ..() + if(!check_icon_cache()) return diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ba4bf0090c7..a8c6b4bd5e8 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -52,12 +52,6 @@ #define GRAB_UPGRADING 4 #define GRAB_KILL 5 - -//Hostile Mob AI Status -#define AI_ON 1 -#define AI_IDLE 2 -#define AI_OFF 3 - //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 diff --git a/code/__DEFINES/game.dm b/code/__DEFINES/game.dm index 68518e80d6c..5c262724a14 100644 --- a/code/__DEFINES/game.dm +++ b/code/__DEFINES/game.dm @@ -1,3 +1,4 @@ +#define GAME_STATE_STARTUP 0 #define GAME_STATE_PREGAME 1 #define GAME_STATE_SETTING_UP 2 #define GAME_STATE_PLAYING 3 diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index a1e469e3c94..a3efbab50d9 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -8,12 +8,12 @@ #define TARGET_INVALID_EVENT 7 //gamemode istype helpers -#define GAMEMODE_IS_BLOB (ticker && istype(ticker.mode, /datum/game_mode/blob)) -#define GAMEMODE_IS_CULT (ticker && istype(ticker.mode, /datum/game_mode/cult)) -#define GAMEMODE_IS_HEIST (ticker && istype(ticker.mode, /datum/game_mode/heist)) -#define GAMEMODE_IS_NUCLEAR (ticker && istype(ticker.mode, /datum/game_mode/nuclear)) -#define GAMEMODE_IS_REVOLUTION (ticker && istype(ticker.mode, /datum/game_mode/revolution)) -#define GAMEMODE_IS_WIZARD (ticker && istype(ticker.mode, /datum/game_mode/wizard)) +#define GAMEMODE_IS_BLOB (SSticker && istype(SSticker.mode, /datum/game_mode/blob)) +#define GAMEMODE_IS_CULT (SSticker && istype(SSticker.mode, /datum/game_mode/cult)) +#define GAMEMODE_IS_HEIST (SSticker && istype(SSticker.mode, /datum/game_mode/heist)) +#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) +#define GAMEMODE_IS_REVOLUTION (SSticker && istype(SSticker.mode, /datum/game_mode/revolution)) +#define GAMEMODE_IS_WIZARD (SSticker && istype(SSticker.mode, /datum/game_mode/wizard)) //special roles // Distinct from the ROLE_X defines because some antags have multiple special roles but only one ban type diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9da2c725a43..db88f46a676 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -6,7 +6,9 @@ #define PLANE_SPACE -95 #define PLANE_SPACE_PARALLAX -90 -#define GAME_PLANE 0 +#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 @@ -83,23 +85,29 @@ #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 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 18 -#define FLASH_LAYER 18 -#define FULLSCREEN_LAYER 18.1 -#define UI_DAMAGE_LAYER 18.2 -#define BLIND_LAYER 18.3 -#define CRIT_LAYER 18.4 -#define CURSE_LAYER 18.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 19 -#define HUD_LAYER 19 -#define ABOVE_HUD_PLANE 20 -#define ABOVE_HUD_LAYER 20 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 21 -#define SPLASHSCREEN_PLANE 21 \ No newline at end of file +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 \ No newline at end of file diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3db7c467c24..7357c5f441e 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,42 +1,92 @@ -#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square -#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources -#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone +//Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it +#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process -#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects +#define MINIMUM_USEFUL_LIGHT_RANGE 1.4 -#define LIGHTING_ROUND_VALUE (1 / 128) //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. +#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square +#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources +#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone +#define LIGHTING_ROUND_VALUE (1 / 64) //Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. -#define LIGHTING_SOFT_THRESHOLD 0.05 // If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting overlays. +#define LIGHTING_ICON 'icons/effects/lighting_object.dmi' // icon used for lighting shading effects + +// If the max of the lighting lumcounts of each spectrum drops below this, disable luminosity on the lighting objects. +// Set to zero to disable soft lighting. Luminosity changes then work if it's lit at all. +#define LIGHTING_SOFT_THRESHOLD 0 // If I were you I'd leave this alone. #define LIGHTING_BASE_MATRIX \ list \ ( \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ - LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, LIGHTING_SOFT_THRESHOLD, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ + 1, 1, 1, 0, \ 0, 0, 0, 1 \ ) \ -// Helpers so we can (more easily) control the colour matrices. -#define CL_MATRIX_RR 1 -#define CL_MATRIX_RG 2 -#define CL_MATRIX_RB 3 -#define CL_MATRIX_RA 4 -#define CL_MATRIX_GR 5 -#define CL_MATRIX_GG 6 -#define CL_MATRIX_GB 7 -#define CL_MATRIX_GA 8 -#define CL_MATRIX_BR 9 -#define CL_MATRIX_BG 10 -#define CL_MATRIX_BB 11 -#define CL_MATRIX_BA 12 -#define CL_MATRIX_AR 13 -#define CL_MATRIX_AG 14 -#define CL_MATRIX_AB 15 -#define CL_MATRIX_AA 16 -#define CL_MATRIX_CR 17 -#define CL_MATRIX_CG 18 -#define CL_MATRIX_CB 19 -#define CL_MATRIX_CA 20 \ No newline at end of file + +//Some defines to generalise colours used in lighting. +//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated +#define LIGHT_COLOR_WHITE "#FFFFFF" +#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130) +#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100) +#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250) + +#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175) +#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225) +#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255) +#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248) +#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225) +#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125) +#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50) +#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50) +#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244) +#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255) + +#define LIGHT_COLOR_HOLY_MAGIC "#FFF743" //slightly desaturated bright yellow. +#define LIGHT_COLOR_BLOOD_MAGIC "#D00000" //deep crimson + +#define LIGHT_COLOR_PURE_CYAN "#00FFFF" +#define LIGHT_COLOR_DARKRED "#A91515" +#define LIGHT_COLOR_PURE_RED "#FF0000" +#define LIGHT_COLOR_DARKGREEN "#50AB00" +#define LIGHT_COLOR_PURE_GREEN "#00FF00" +#define LIGHT_COLOR_LIGHTBLUE "#0099FF" +#define LIGHT_COLOR_DARKBLUE "#315AB4" +#define LIGHT_COLOR_PURE_BLUE "#0000FF" +#define LIGHT_COLOR_FADEDPURPLE "#A97FAA" + +//These ones aren't a direct colour like the ones above, because nothing would fit +#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25) +#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24) +#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) +#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75) +#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) +#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) + +#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow. + +#define LIGHTING_PLANE_ALPHA_VISIBLE 255 +#define LIGHTING_PLANE_ALPHA_NV_TRAIT 245 +#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 +#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell. +#define LIGHTING_PLANE_ALPHA_INVISIBLE 0 + +//lighting area defines +#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness) +#define DYNAMIC_LIGHTING_ENABLED 1 //dynamic lighting enabled +#define DYNAMIC_LIGHTING_FORCED 2 //dynamic lighting enabled even if the area doesn't require power +#define DYNAMIC_LIGHTING_IFSTARLIGHT 3 //dynamic lighting enabled only if starlight is. +#define IS_DYNAMIC_LIGHTING(A) A.dynamic_lighting + + +//code assumes higher numbers override lower numbers. +#define LIGHTING_NO_UPDATE 0 +#define LIGHTING_VIS_UPDATE 1 +#define LIGHTING_CHECK_UPDATE 2 +#define LIGHTING_FORCE_UPDATE 3 + +#define FLASH_LIGHT_DURATION 2 +#define FLASH_LIGHT_POWER 3 +#define FLASH_LIGHT_RANGE 3.8 \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index dff9426c641..5edb17bd92b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -114,33 +114,6 @@ #define CHRISTMAS "Christmas" #define FRIDAY_13TH "Friday the 13th" -//Light color defs, for light-emitting things -//Some defs may be pure color- this is for neatness, and configurability. Changing #define COLOR_ is a bad idea. -#define LIGHT_COLOR_CYAN "#7BF9FF" -#define LIGHT_COLOR_PURE_CYAN "#00FFFF" - -#define LIGHT_COLOR_RED "#B40000" -#define LIGHT_COLOR_ORANGE "#FF9933" -#define LIGHT_COLOR_DARKRED "#A91515" -#define LIGHT_COLOR_PURE_RED "#FF0000" - -#define LIGHT_COLOR_GREEN "#00CC00" -#define LIGHT_COLOR_DARKGREEN "#50AB00" -#define LIGHT_COLOR_PURE_GREEN "#00FF00" - -#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250) -#define LIGHT_COLOR_LIGHTBLUE "#0099FF" -#define LIGHT_COLOR_DARKBLUE "#315AB4" -#define LIGHT_COLOR_PURE_BLUE "#0000FF" - -#define LIGHT_COLOR_FADEDPURPLE "#A97FAA" -#define LIGHT_COLOR_PURPLE "#CD00CD" -#define LIGHT_COLOR_PINK "#FF33CC" - -#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125) - -#define LIGHT_COLOR_WHITE "#FFFFFF" - #define RESIZE_DEFAULT_SIZE 1 //transfer_ai() defines. Main proc in ai_core.dm @@ -208,33 +181,34 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define BODY_LAYER 37 -#define MUTANTRACE_LAYER 36 -#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. -#define LIMBS_LAYER 34 -#define INTORGAN_LAYER 33 -#define MARKINGS_LAYER 32 -#define UNDERWEAR_LAYER 31 -#define MUTATIONS_LAYER 30 -#define H_DAMAGE_LAYER 29 -#define UNIFORM_LAYER 28 -#define ID_LAYER 27 -#define SHOES_LAYER 26 -#define GLOVES_LAYER 25 -#define EARS_LAYER 24 -#define SUIT_LAYER 23 -#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 21 -#define BACK_LAYER 20 -#define HEAD_ACCESSORY_LAYER 19 -#define FHAIR_LAYER 18 -#define GLASSES_LAYER 17 -#define HAIR_LAYER 16 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. -#define FHAIR_OVER_LAYER 14 //Select-layer rendering. -#define GLASSES_OVER_LAYER 13 //Select-layer rendering. -#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 11 +#define BODY_LAYER 38 +#define MUTANTRACE_LAYER 37 +#define TAIL_UNDERLIMBS_LAYER 36 //Tail split-rendering. +#define LIMBS_LAYER 35 +#define INTORGAN_LAYER 34 +#define MARKINGS_LAYER 33 +#define UNDERWEAR_LAYER 32 +#define MUTATIONS_LAYER 31 +#define H_DAMAGE_LAYER 30 +#define UNIFORM_LAYER 29 +#define ID_LAYER 28 +#define SHOES_LAYER 27 +#define GLOVES_LAYER 26 +#define EARS_LAYER 25 +#define SUIT_LAYER 24 +#define BELT_LAYER 23 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 22 +#define BACK_LAYER 21 +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 19 +#define GLASSES_LAYER 18 +#define HAIR_LAYER 17 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 16 //Select-layer rendering. +#define FHAIR_OVER_LAYER 15 //Select-layer rendering. +#define GLASSES_OVER_LAYER 14 //Select-layer rendering. +#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 12 +#define OVER_MASK_LAYER 11 //Select-layer rendering. #define HEAD_LAYER 10 #define COLLAR_LAYER 9 #define HANDCUFF_LAYER 8 @@ -245,7 +219,7 @@ #define FIRE_LAYER 3 //If you're on fire #define MISC_LAYER 2 #define FROZEN_LAYER 1 -#define TOTAL_LAYERS 37 +#define TOTAL_LAYERS 38 ///Access Region Codes/// #define REGION_ALL 0 @@ -303,7 +277,7 @@ #define TRIGGER_GUARD_NORMAL 1 // Macro to get the current elapsed round time, rather than total world runtime -#define ROUND_TIME (round_start_time ? (world.time - round_start_time) : 0) +#define ROUND_TIME (SSticker.round_start_time ? (world.time - SSticker.round_start_time) : 0) // Macro that returns true if it's too early in a round to freely ghost out #define TOO_EARLY_TO_GHOST (config && (ROUND_TIME < (config.round_abandon_penalty_period))) @@ -318,10 +292,8 @@ #define SHELTER_DEPLOY_BAD_AREA "bad area" #define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects" -// Client donator levels -#define DONATOR_LEVEL_NONE 0 -#define DONATOR_LEVEL_ONE 1 -#define DONATOR_LEVEL_TWO 2 +// Maximum donation level +#define DONATOR_LEVEL_MAX 4 // The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps #define OOC_COOLDOWN 5 @@ -401,4 +373,17 @@ #define GHOST_ORBIT_TRIANGLE "triangle" #define GHOST_ORBIT_HEXAGON "hexagon" #define GHOST_ORBIT_SQUARE "square" -#define GHOST_ORBIT_PENTAGON "pentagon" \ No newline at end of file +#define GHOST_ORBIT_PENTAGON "pentagon" + +// Filters +#define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") + +//Fullscreen overlay resolution in tiles. +#define FULLSCREEN_OVERLAY_RESOLUTION_X 15 +#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15 + +//suit sensors: sensor_mode defines +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 0f05c08b2f7..284b0e4d745 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -94,6 +94,13 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm +//Hostile Mob AI Status +#define AI_ON 1 +#define AI_IDLE 2 +#define AI_OFF 3 +#define AI_Z_OFF 4 + // Intents #define INTENT_HELP "help" #define INTENT_DISARM "disarm" diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index aa3652046b5..22b4334e3be 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -29,10 +29,12 @@ #define UI_DARKMODE 131072 #define DISABLE_KARMA 262144 #define CHAT_NO_MENTORTICKETLOGS 524288 - #define TYPING_ONCE 1048576 +#define AMBIENT_OCCLUSION 2097152 -#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC) +#define TOGGLES_TOTAL 4194303 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined. + +#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION) // Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack #define ATKLOG_ALL 0 diff --git a/code/__DEFINES/snpc.dm b/code/__DEFINES/snpc.dm deleted file mode 100644 index 8d4768005cd..00000000000 --- a/code/__DEFINES/snpc.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define SNPC_MAX_RANGE_FIND 32 -#define SNPC_MIN_RANGE_FIND 16 -#define SNPC_FUZZY_CHANCE_HIGH 85 -#define SNPC_FUZZY_CHANCE_LOW 50 -#define SNPC_CHANCE_TALK 15 - -#define SNPC_BRUTE 1 -#define SNPC_STEALTH 2 -#define SNPC_MARTYR 3 -#define SNPC_PSYCHO 4 - -#define SNPC_INTERACTING 2 -#define SNPC_TRAVEL 4 -#define SNPC_FIGHTING 8 -#define SNPC_SPECIAL 16 - -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index e7f5262db1f..65fc87c3b34 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -150,7 +150,7 @@ // A logging proc that only outputs after setup is done, to // help devs test initialization stuff that happens a lot /proc/log_after_setup(var/message) - if(ticker && ticker.current_state > GAME_STATE_SETTING_UP) + if(SSticker && SSticker.current_state > GAME_STATE_SETTING_UP) to_chat(world, "[message]") log_world(message) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 2db8621195d..472f7be75f4 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -114,7 +114,7 @@ return if(QDELETED(A)) return - if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) + if(A.smooth & (SMOOTH_TRUE | SMOOTH_MORE)) var/adjacencies = calculate_adjacencies(A) if(A.smooth & SMOOTH_DIAGONAL) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index dad2ecd7630..ed4f3242c4d 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -634,170 +634,214 @@ The _flatIcons list is a cache for generated icon files. */ // Creates a single icon from a given /atom or /image. Only the first argument is required. -/proc/getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) - // We start with a blank canvas, otherwise some icon procs crash silently - var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon - if(!A) - return flat - if(A.alpha <= 0) - return flat +/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) + //Define... defines. + var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing") + + #define BLANK icon(flat_template) + #define SET_SELF(SETVAR) do { \ + var/icon/SELF_ICON=icon(icon(curicon, curstate, base_icon_dir),"",SOUTH,no_anim?1:null); \ + if(A.alpha<255) { \ + SELF_ICON.Blend(rgb(255,255,255,A.alpha),ICON_MULTIPLY);\ + } \ + if(A.color) { \ + if(islist(A.color)){ \ + SELF_ICON.MapColors(arglist(A.color))} \ + else{ \ + SELF_ICON.Blend(A.color,ICON_MULTIPLY)} \ + } \ + ##SETVAR=SELF_ICON;\ + } while (0) + #define INDEX_X_LOW 1 + #define INDEX_X_HIGH 2 + #define INDEX_Y_LOW 3 + #define INDEX_Y_HIGH 4 + + #define flatX1 flat_size[INDEX_X_LOW] + #define flatX2 flat_size[INDEX_X_HIGH] + #define flatY1 flat_size[INDEX_Y_LOW] + #define flatY2 flat_size[INDEX_Y_HIGH] + #define addX1 add_size[INDEX_X_LOW] + #define addX2 add_size[INDEX_X_HIGH] + #define addY1 add_size[INDEX_Y_LOW] + #define addY2 add_size[INDEX_Y_HIGH] + + if(!A || A.alpha <= 0) + return BLANK + var/noIcon = FALSE + if(start) + if(!defdir) + defdir = A.dir + if(!deficon) + deficon = A.icon + if(!defstate) + defstate = A.icon_state + if(!defblend) + defblend = A.blend_mode - var/curicon - if(A.icon) - curicon = A.icon - else - curicon = deficon + var/curicon = A.icon || deficon + var/curstate = A.icon_state || defstate - if(!curicon) - noIcon = TRUE // Do not render this object. - - var/curstate - if(A.icon_state) - curstate = A.icon_state - else - curstate = defstate - - if(!noIcon && !(curstate in icon_states(curicon))) - if("" in icon_states(curicon)) - curstate = "" - else - noIcon = TRUE // Do not render this object. + if(!((noIcon = (!curicon)))) + var/curstates = icon_states(curicon) + if(!(curstate in curstates)) + if("" in curstates) + curstate = "" + else + noIcon = TRUE // Do not render this object. var/curdir - if(A.dir != 2) - curdir = A.dir - else + var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have + + //These should use the parent's direction (most likely) + if(!A.dir || A.dir == SOUTH) curdir = defdir - - var/curblend - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend else - curblend = A.blend_mode + curdir = A.dir - // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed - var/list/layers = list() - var/image/copy - // Add the atom's icon itself, without pixel_x/y offsets. - if(!noIcon) - copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir) - copy.color = A.color - copy.alpha = A.alpha - copy.blend_mode = curblend - layers[copy] = A.layer - - // Loop through the underlays, then overlays, sorting them into the layers list - var/list/process = A.underlays // Current list being processed - var/pSet=0 // Which list is being processed: 0 = underlays, 1 = overlays - var/curIndex=1 // index of 'current' in list being processed - var/current // Current overlay being sorted - var/currentLayer // Calculated layer that overlay appears on (special case for FLOAT_LAYER) - var/compare // The overlay 'add' is being compared against - var/cmpIndex // The index in the layers list of 'compare' - while(TRUE) - if(curIndex<=process.len) - current = process[curIndex] - if(!current) - curIndex++ //Skip this bad layer item - continue - currentLayer = current:layer - if(currentLayer<0) // Special case for FLY_LAYER - if(currentLayer <= -1000) return flat - if(pSet == 0) // Underlay - currentLayer = A.layer+currentLayer/1000 - else // Overlay - currentLayer = A.layer+(1000+currentLayer)/1000 - - // Sort add into layers list - for(cmpIndex=1,cmpIndex<=layers.len,cmpIndex++) - compare = layers[cmpIndex] - if(currentLayer < layers[compare]) // Associated value is the calculated layer - layers.Insert(cmpIndex,current) - layers[current] = currentLayer - break - if(cmpIndex>layers.len) // Reached end of list without inserting - layers[current]=currentLayer // Place at end - - curIndex++ - - if(curIndex>process.len) - if(pSet == 0) // Switch to overlays - curIndex = 1 - pSet = 1 - process = A.overlays - else // All done + //Try to remove/optimize this section ASAP, CPU hog. + //Determines if there's directionals. + if(!noIcon && curdir != SOUTH) + var/exist = FALSE + var/static/list/checkdirs = list(NORTH, EAST, WEST) + for(var/i in checkdirs) //Not using GLOB for a reason. + if(length(icon_states(icon(curicon, curstate, i)))) + exist = TRUE break + if(!exist) + base_icon_dir = SOUTH + // - var/icon/add // Icon of overlay being added + if(!base_icon_dir) + base_icon_dir = curdir - // Current dimensions of flattened icon - var/flatX1 = 1 - var/flatX2 = flat.Width() - var/flatY1 = 1 - var/flatY2 = flat.Height() - // Dimensions of overlay being added - var/addX1 - var/addX2 - var/addY1 - var/addY2 + ASSERT(!BLEND_DEFAULT) //I might just be stupid but lets make sure this define is 0. - for(var/I in layers) + var/curblend = A.blend_mode || defblend - if(I:alpha == 0) - continue + if(A.overlays.len || A.underlays.len) + var/icon/flat = BLANK + // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed + var/list/layers = list() + var/image/copy + // Add the atom's icon itself, without pixel_x/y offsets. + if(!noIcon) + copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=base_icon_dir) + copy.color = A.color + copy.alpha = A.alpha + copy.blend_mode = curblend + layers[copy] = A.layer - if(I == copy) // 'I' is an /image based on the object being flattened. - curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) - // This checks for a silent failure mode of the icon routine. If the requested dir - // doesn't exist in this icon state it returns a 32x32 icon with 0 alpha. - if(I:dir != SOUTH && add.Width() == 32 && add.Height() == 32) - // Check every pixel for blank (computationally expensive, but the process is limited - // by the amount of film on the station, only happens when we hit something that's - // turned, and bails at the very first pixel it sees. - var/blankpixel; - for(var/y;y<=32;y++) - for(var/x;x<32;x++) - blankpixel = isnull(add.GetPixel(x,y)) - if(!blankpixel) - break - if(!blankpixel) + // Loop through the underlays, then overlays, sorting them into the layers list + for(var/process_set in 0 to 1) + var/list/process = process_set? A.overlays : A.underlays + for(var/i in 1 to process.len) + var/image/current = process[i] + if(!current) + continue + if(current.plane != FLOAT_PLANE && current.plane != A.plane) + continue + var/current_layer = current.layer + if(current_layer < 0) + if(current_layer <= -1000) + return flat + current_layer = process_set + A.layer + current_layer / 1000 + + for(var/p in 1 to layers.len) + var/image/cmp = layers[p] + if(current_layer < layers[cmp]) + layers.Insert(p, current) break - // If we ALWAYS returned a null (which happens when GetPixel encounters something with alpha 0) - if(blankpixel) - // Pull the default direction. - add = icon(I:icon, I:icon_state) - else // 'I' is an appearance object. - add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) + layers[current] = current_layer - // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + //sortTim(layers, /proc/cmp_image_layer_asc) - if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) - // Resize the flattened icon so the new icon fits - flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) - flatX1=addX1;flatX2=addX2 - flatY1=addY1;flatY2=addY2 + var/icon/add // Icon of overlay being added - // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + // Current dimensions of flattened icon + var/list/flat_size = list(1, flat.Width(), 1, flat.Height()) + // Dimensions of overlay being added + var/list/add_size[4] - if(A.color) - flat.Blend(A.color, ICON_MULTIPLY) - if(A.alpha < 255) - flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + for(var/V in layers) + var/image/I = V + if(I.alpha == 0) + continue - return icon(flat, "", SOUTH) + if(I == copy) // 'I' is an /image based on the object being flattened. + curblend = BLEND_OVERLAY + add = icon(I.icon, I.icon_state, base_icon_dir) + else // 'I' is an appearance object. + add = getFlatIcon(image(I), curdir, curicon, curstate, curblend, FALSE, no_anim) + if(!add) + continue + // Find the new dimensions of the flat icon to fit the added overlay + add_size = list( + min(flatX1, I.pixel_x+1), + max(flatX2, I.pixel_x+add.Width()), + min(flatY1, I.pixel_y+1), + max(flatY2, I.pixel_y+add.Height()) + ) + + if(flat_size ~! add_size) + // Resize the flattened icon so the new icon fits + flat.Crop( + addX1 - flatX1 + 1, + addY1 - flatY1 + 1, + addX2 - flatX1 + 1, + addY2 - flatY1 + 1 + ) + flat_size = add_size.Copy() + + // Blend the overlay into the flattened icon + flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) + + if(A.color) + if(islist(A.color)) + flat.MapColors(arglist(A.color)) + else + flat.Blend(A.color, ICON_MULTIPLY) + + if(A.alpha < 255) + flat.Blend(rgb(255, 255, 255, A.alpha), ICON_MULTIPLY) + + if(no_anim) + //Clean up repeated frames + var/icon/cleaned = new /icon() + cleaned.Insert(flat, "", SOUTH, 1, 0) + . = cleaned + else + . = icon(flat, "", SOUTH) + else //There's no overlays. + if(!noIcon) + SET_SELF(.) + + //Clear defines + #undef flatX1 + #undef flatX2 + #undef flatY1 + #undef flatY2 + #undef addX1 + #undef addX2 + #undef addY1 + #undef addY2 + + #undef INDEX_X_LOW + #undef INDEX_X_HIGH + #undef INDEX_Y_LOW + #undef INDEX_Y_HIGH + + #undef BLANK + #undef SET_SELF /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + if(I.layer>A.layer) + continue//If layer is greater than what we need, skip it. + var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects. //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. return alpha_mask//And now return the mask. diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index f1e6f38a2d4..6b5807deaef 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -124,9 +124,13 @@ . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list -/proc/typecacheof(path, ignore_root_path) +/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) - var/list/types = ignore_root_path ? subtypesof(path) : typesof(path) + var/list/types = list() + if(only_root_path) + types = list(path) + else + types = ignore_root_path ? subtypesof(path) : typesof(path) var/list/L = list() for(var/T in types) L[T] = TRUE @@ -140,8 +144,11 @@ L[T] = TRUE else for(var/P in pathlist) - for(var/T in typesof(P)) - L[T] = TRUE + if(only_root_path) + L[P] = TRUE + else + for(var/T in typesof(P)) + L[T] = TRUE return L //Removes any null entries from the list diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 5b90cda376e..246377eba32 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -112,8 +112,8 @@ var/syndicate_name = null //Traitors and traitor silicons will get these. Revs will not. -var/syndicate_code_phrase//Code phrase for traitors. -var/syndicate_code_response//Code response for traitors. +GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. +GLOBAL_VAR(syndicate_code_response) //Code response for traitors. /* Should be expanded. diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 54fd47a220d..d13bf08c58b 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -35,7 +35,7 @@ * If you want to display the canonical station "time" (aka the in-character time of the station) use station_time_timestamp */ /proc/classic_worldtime2text(time = world.time) - time = (round_start_time ? (time - round_start_time) : (time - world.time)) + time = (SSticker.round_start_time ? (time - SSticker.round_start_time) : (time - world.time)) return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" //Returns the world time in english @@ -59,7 +59,7 @@ - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date which is much more useful for a player)*/ /proc/station_time(time=world.time, display_only=FALSE) - return ((((time - round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) + return ((((time - SSticker.round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) /proc/station_time_timestamp(format = "hh:mm:ss", time=world.time) return time2text(station_time(time, TRUE), format) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 619d09713d6..00724c94a03 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -2029,3 +2029,17 @@ var/mob/dview/dview_mob = new /proc/pass() return + +/proc/params2turf(scr_loc, turf/origin, client/C) + if(!scr_loc) + return null + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + var/list/actual_view = getviewsize(C ? C.view : world.view) + tX = Clamp(origin.x + text2num(tX) - round(actual_view[1] / 2) - 1, 1, world.maxx) + tY = Clamp(origin.y + text2num(tY) - round(actual_view[2] / 2) - 1, 1, world.maxy) + return locate(tX, tY, tZ) \ No newline at end of file diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 551b729028e..b6fcae25061 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -22,8 +22,7 @@ GLOBAL_LIST_INIT(living_mob_list, list()) //List of all alive mobs, including GLOBAL_LIST_INIT(dead_mob_list, list()) //List of all dead mobs, including clientless. Excludes /mob/new_player GLOBAL_LIST_INIT(respawnable_list, list()) //List of all mobs, dead or in mindless creatures that still be respawned. GLOBAL_LIST_INIT(non_respawnable_keys, list()) //List of ckeys that are excluded from respawning for remainder of round. -GLOBAL_LIST_INIT(simple_animal_list, list()) //List of all simple animals, including clientless -GLOBAL_LIST_INIT(snpc_list, list()) //List of all snpc's, including clientless +GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless GLOBAL_LIST_INIT(bots_list, list()) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_INIT(med_hud_users, list()) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 77443fb4ab2..e5674a9b47b 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -83,4 +83,7 @@ GLOBAL_VAR_INIT(gametime_offset, 432000) // 12:00 in seconds //printers shutdown if too much shit printed var/copier_items_printed = 0 var/copier_max_items = 300 -var/copier_items_printed_logged = FALSE \ No newline at end of file +var/copier_items_printed_logged = FALSE + + +GLOBAL_VAR(map_name) // Self explanatory \ No newline at end of file diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index e997a672e1f..ba8b70991c2 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,3 +1,2 @@ -var/global/datum/datacore/data_core = null - -var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file +// TODO: Move this to be not in its own fucking file all alone on its own +var/global/datum/datacore/data_core = null \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 286f8ce7095..b823efe2563 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -403,7 +403,25 @@ icon_state = "passage0" plane = CLICKCATCHER_PLANE mouse_opacity = MOUSE_OPACITY_OPAQUE - screen_loc = "CENTER-7,CENTER-7" + screen_loc = "CENTER" + +#define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) +#define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. + +/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) + var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher") + var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) + var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) + var/px = view_size_x * world.icon_size + var/py = view_size_y * world.icon_size + var/sx = min(MAX_SAFE_BYOND_ICON_SCALE_PX, px) + var/sy = min(MAX_SAFE_BYOND_ICON_SCALE_PX, py) + newicon.Scale(sx, sy) + icon = newicon + screen_loc = "CENTER-[(ox-1)*0.5],CENTER-[(oy-1)*0.5]" + var/matrix/M = new + M.Scale(px/sx, py/sy) + transform = M /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) @@ -411,6 +429,6 @@ var/mob/living/carbon/C = usr C.swap_hand() else - var/turf/T = screen_loc2turf(modifiers["screen-loc"], get_turf(usr)) + var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr)) T.Click(location, control, params) return 1 diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index feb57d83c05..6fe3a781642 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -141,6 +141,9 @@ blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blobpwrdisplay.layer = ABOVE_HUD_LAYER + blobpwrdisplay.plane = ABOVE_HUD_PLANE static_inventory += blobpwrdisplay blobhealthdisplay = new /obj/screen() diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 2a7dab21a03..1e17cae1708 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -40,7 +40,6 @@ using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand1 - using.layer = 19 static_inventory += using using = new /obj/screen/swap_hand() @@ -48,7 +47,6 @@ using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand2 - using.layer = 19 static_inventory += using mymob.zone_sel = new /obj/screen/zone_sel() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 673a49ffd22..9d00f216eac 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -2,23 +2,21 @@ var/list/screens = list() /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen - if(screens[category]) - screen = screens[category] - if(screen.type != type) - clear_fullscreen(category, FALSE) - return .() - else if(!severity || severity == screen.severity) - return null - else - screen = new type + var/obj/screen/fullscreen/screen = screens[category] + if (!screen || screen.type != type) + // needs to be recreated + clear_fullscreen(category, FALSE) + screens[category] = screen = new type() + else if ((!severity || severity == screen.severity) && (!client || screen.screen_loc != "CENTER-7,CENTER-7" || screen.view == client.view)) + // doesn't need to be updated + return screen screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity - - screens[category] = screen - if(client) + if (client && screen.should_show_to(src)) + screen.update_for_view(client.view) client.screen += screen + return screen /mob/proc/clear_fullscreen(category, animated = 10) @@ -45,17 +43,38 @@ clear_fullscreen(category) /datum/hud/proc/reload_fullscreen() - var/list/screens = mymob.screens - for(var/category in screens) - mymob.client.screen |= screens[category] + if(mymob.client) + var/obj/screen/fullscreen/screen + var/list/screens = mymob.screens + for(var/category in screens) + screen = screens[category] + if(screen.should_show_to(mymob)) + screen.update_for_view(mymob.client.view) + mymob.client.screen |= screen + else + mymob.client.screen -= screen /obj/screen/fullscreen icon = 'icons/mob/screen_full.dmi' icon_state = "default" screen_loc = "CENTER-7,CENTER-7" layer = FULLSCREEN_LAYER + plane = FULLSCREEN_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/view = 7 var/severity = 0 + var/show_when_dead = FALSE + +/obj/screen/fullscreen/proc/update_for_view(client_view) + if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) + var/list/actualview = getviewsize(client_view) + view = client_view + transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) + +/obj/screen/fullscreen/proc/should_show_to(mob/mymob) + if(!show_when_dead && mymob.stat == DEAD) + return FALSE + return TRUE /obj/screen/fullscreen/Destroy() severity = 0 @@ -100,6 +119,33 @@ screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" +/obj/screen/fullscreen/lighting_backdrop + icon = 'icons/mob/screen_gen.dmi' + icon_state = "flash" + transform = matrix(200, 0, 0, 0, 200, 0) + plane = LIGHTING_PLANE + blend_mode = BLEND_OVERLAY + show_when_dead = TRUE + +//Provides darkness to the back of the lighting plane +/obj/screen/fullscreen/lighting_backdrop/lit + invisibility = INVISIBILITY_LIGHTING + layer = BACKGROUND_LAYER+21 + color = "#000" + show_when_dead = TRUE + +//Provides whiteness in case you don't see lights so everything is still visible +/obj/screen/fullscreen/lighting_backdrop/unlit + layer = BACKGROUND_LAYER+20 + show_when_dead = TRUE + +/obj/screen/fullscreen/see_through_darkness + icon_state = "nightvision" + plane = LIGHTING_PLANE + layer = LIGHTING_LAYER + blend_mode = BLEND_ADD + show_when_dead = TRUE + #undef FULLSCREEN_LAYER #undef BLIND_LAYER #undef CRIT_LAYER diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 410d49f973e..0063feae9cf 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -38,15 +38,23 @@ var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = 0 + var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + /mob/proc/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud(src) + update_sight() /datum/hud/New(mob/owner) mymob = owner hide_actions_toggle = new hide_actions_toggle.InitialiseIcon(mymob) + for(var/mytype in subtypesof(/obj/screen/plane_master)) + var/obj/screen/plane_master/instance = new mytype() + plane_masters["[instance.plane]"] = instance + instance.backdrop(mymob) + /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null @@ -83,14 +91,16 @@ nightvisionicon = null devilsouldisplay = null + QDEL_LIST_ASSOC_VAL(plane_masters) + mymob = null return ..() /datum/hud/proc/show_hud(version = 0) if(!ismob(mymob)) - return 0 + return FALSE if(!mymob.client) - return 0 + return FALSE mymob.client.screen = list() @@ -162,13 +172,25 @@ mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() + plane_masters_update() + +/datum/hud/proc/plane_masters_update() + // Plane masters are always shown to OUR mob, never to observers + for(var/thing in plane_masters) + var/obj/screen/plane_master/PM = plane_masters[thing] + PM.backdrop(mymob) + mymob.client.screen += PM /datum/hud/human/show_hud(version = 0) - ..() + . = ..() + if(!.) + return hidden_inventory_update() /datum/hud/robot/show_hud(version = 0) - ..() + . = ..() + if(!.) + return update_robot_modules_display() /datum/hud/proc/hidden_inventory_update() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 6f5c8ee0548..811a7e89cdb 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -83,6 +83,7 @@ /datum/hud/human/New(mob/living/carbon/human/owner, var/ui_style = 'icons/mob/screen_white.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255) ..() + owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) var/obj/screen/using var/obj/screen/inventory/inv_box diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index bbac6e36df3..e011aea037c 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,7 +1,7 @@ /obj/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" - plane = GAME_PLANE + plane = FLOOR_PLANE var/atom/center var/width = 0 var/height = 0 diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm new file mode 100644 index 00000000000..b43715ee598 --- /dev/null +++ b/code/_onclick/hud/plane_master.dm @@ -0,0 +1,53 @@ +/obj/screen/plane_master + screen_loc = "CENTER" + icon_state = "blank" + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + blend_mode = BLEND_OVERLAY + var/show_alpha = 255 + var/hide_alpha = 0 + +/obj/screen/plane_master/proc/Show(override) + alpha = override || show_alpha + +/obj/screen/plane_master/proc/Hide(override) + alpha = override || hide_alpha + +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) + +/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset, border = _border) + +/obj/screen/plane_master/proc/clear_filters() + filters = list() + +//Why do plane masters need a backdrop sometimes? Read http://www.byond.com/forum/?post=2141928 +//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/floor + name = "floor plane master" + plane = FLOOR_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_OVERLAY + +/obj/screen/plane_master/game_world + name = "game world plane master" + plane = GAME_PLANE + appearance_flags = PLANE_MASTER //should use client color + blend_mode = BLEND_OVERLAY + +/obj/screen/plane_master/game_world/backdrop(mob/mymob) + clear_filters() + if(istype(mymob) && mymob.client && mymob.client.prefs && (mymob.client.prefs.toggles & AMBIENT_OCCLUSION)) + filters += FILTER_AMBIENT_OCCLUSION + +/obj/screen/plane_master/lighting + name = "lighting plane master" + plane = LIGHTING_PLANE + blend_mode = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) \ No newline at end of file diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index a542c0345fd..ea23a56d8e4 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -226,8 +226,8 @@ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" else A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 - A.plane = HUD_PLANE + A.layer = ABOVE_HUD_LAYER + A.plane = ABOVE_HUD_PLANE x++ if(x == 4) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d9f6653b0ff..c583617ac23 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,9 +9,10 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = HUD_LAYER_SCREEN + layer = HUD_LAYER plane = HUD_PLANE - unacidable = 1 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/datum/hud/hud = null appearance_flags = NO_CLIENT_COLOR @@ -36,6 +37,8 @@ /obj/screen/close name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE /obj/screen/close/Click() if(master) @@ -47,7 +50,6 @@ /obj/screen/drop name = "drop" icon_state = "act_drop" - layer = 19 /obj/screen/drop/Click() usr.drop_item_v() @@ -143,7 +145,6 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = 19 /obj/screen/resist/Click() if(isliving(usr)) @@ -327,7 +328,6 @@ /obj/screen/inventory var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. var/list/object_overlays = list() - layer = 19 /obj/screen/inventory/MouseEntered() ..() @@ -417,7 +417,6 @@ return 1 /obj/screen/swap_hand - layer = 19 name = "swap hand" /obj/screen/swap_hand/Click() diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 238ce2d5a94..6ef7a797136 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -65,8 +65,8 @@ var/const/tk_maxrange = 15 flags = NOBLUDGEON | ABSTRACT | DROPDEL //item_state = null w_class = WEIGHT_CLASS_GIGANTIC - layer = 20 - plane = HUD_PLANE + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE var/last_throw = 0 var/atom/movable/focus = null diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm deleted file mode 100644 index d46cab1d19f..00000000000 --- a/code/controllers/Processes/lighting.dm +++ /dev/null @@ -1,98 +0,0 @@ -/var/lighting_overlays_initialised = FALSE - -/var/list/lighting_update_lights = list() // List of lighting sources queued for update. -/var/list/lighting_update_corners = list() // List of lighting corners queued for update. -/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update. - -/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated. -/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated. -/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated. - - -/datum/controller/process/lighting - // Queues of update counts, waiting to be rolled into stats lists - var/list/stats_queues = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - // Stats lists - var/list/stats_lists = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - var/update_stats_every = (1 SECONDS) - var/next_stats_update = 0 - var/stat_updates_to_keep = 5 - -/datum/controller/process/lighting/setup() - name = "lighting" - - schedule_interval = 0 // run as fast as you possibly can - sleep_interval = 10 // Yield every 10% of a tick - defer_usage = 80 // Defer at 80% of a tick - create_all_lighting_overlays() - lighting_overlays_initialised = TRUE - - // Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load. - spawn(300) - doWork(1) - -/datum/controller/process/lighting/doWork(roundstart) - - lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated. - lighting_update_lights = list() - for(var/datum/light_source/L in lighting_update_lights_old) - - if(L.check() || L.destroyed || L.force_update) - L.remove_lum() - if(!L.destroyed) - L.apply_lum() - - else if(L.vis_update) //We smartly update only tiles that became (in) visible to use. - L.smart_vis_update() - - L.vis_update = FALSE - L.force_update = FALSE - L.needs_update = FALSE - - SCHECK - - lighting_update_corners_old = lighting_update_corners //Same as above. - lighting_update_corners = list() - for(var/A in lighting_update_corners_old) - var/datum/lighting_corner/C = A - - C.update_overlays() - - C.needs_update = FALSE - - SCHECK - - lighting_update_overlays_old = lighting_update_overlays //Same as above. - lighting_update_overlays = list() - - for(var/A in lighting_update_overlays_old) - var/atom/movable/lighting_overlay/O = A - O.update_overlay() - O.needs_update = 0 - SCHECK - - stats_queues["Source"] += lighting_update_lights_old.len - stats_queues["Corner"] += lighting_update_corners_old.len - stats_queues["Overlay"] += lighting_update_overlays_old.len - - if(next_stats_update <= world.time) - next_stats_update = world.time + update_stats_every - for(var/stat_name in stats_queues) - var/stat_sum = 0 - var/list/stats_queue = stats_queues[stat_name] - for(var/count in stats_queue) - stat_sum += count - stats_queue.Cut() - - var/list/stats_list = stats_lists[stat_name] - stats_list.Insert(1, stat_sum) - if(stats_list.len > stat_updates_to_keep) - stats_list.Cut(stats_list.len) - -/datum/controller/process/lighting/statProcess() - ..() - stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays") - for(var/stat_type in stats_lists) - stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]") diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm deleted file mode 100644 index 127429efd34..00000000000 --- a/code/controllers/Processes/npcai.dm +++ /dev/null @@ -1,41 +0,0 @@ -var/global/datum/controller/process/npcai/npcai_master - -/datum/controller/process/npcai - var/current_cycle - -/datum/controller/process/npcai/setup() - name = "npc ai" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - log_startup_progress("NPC ticker starting up.") - -/datum/controller/process/npcai/started() - ..() - if(!GLOB.simple_animal_list) - GLOB.simple_animal_list = list() - if(!GLOB.snpc_list) - GLOB.snpc_list = list() - -/datum/controller/process/npcai/statProcess() - ..() - stat(null, "[GLOB.simple_animal_list.len] simple animals") - stat(null, "[GLOB.snpc_list.len] SNPC's") - -/datum/controller/process/npcai/doWork() - for(last_object in GLOB.simple_animal_list) - var/mob/living/simple_animal/M = last_object - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - try - M.process_ai() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - GLOB.simple_animal_list -= M - - current_cycle++ - - -DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master) diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm deleted file mode 100644 index 578c2725710..00000000000 --- a/code/controllers/Processes/ticker.dm +++ /dev/null @@ -1,36 +0,0 @@ -var/global/datum/controller/process/ticker/tickerProcess - -/datum/controller/process/ticker - var/lastTickerTimeDuration - var/lastTickerTime - -/datum/controller/process/ticker/setup() - name = "ticker" - schedule_interval = 20 // every 2 seconds - - lastTickerTime = world.timeofday - log_startup_progress("Time ticker starting up.") - - if(!ticker) - ticker = new - - spawn(0) - if(ticker) - ticker.pregame() - -DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess) - -/datum/controller/process/ticker/doWork() - var/currentTime = world.timeofday - - if(currentTime < lastTickerTime) // check for midnight rollover - lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND - else - lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND - - lastTickerTime = currentTime - - ticker.process_decrepit() - -/datum/controller/process/ticker/proc/getLastTickerTimeDuration() - return lastTickerTimeDuration diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 12b5b0fd1a5..b452e10adbd 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -605,8 +605,7 @@ config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) if("starlight") - var/vvalue = text2num(value) - config.starlight = vvalue >= 0 ? vvalue : 0 + config.starlight = 1 if("player_reroute_cap") var/vvalue = text2num(value) @@ -787,7 +786,7 @@ config.sql_enabled = 0 log_config("WARNING: DB_CONFIG DEFINITION MISMATCH!") spawn(60) - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) going = 0 spawn(600) to_chat(world, "DB_CONFIG MISMATCH, ROUND START DELAYED.
Please check database version for recent upstream changes!
") diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 49919279242..59510162e1c 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -9,114 +9,3 @@ * Called in gameticker.dm when a round starts. */ /hook/roundstart - -/** - * Roundend hook. - * Called in gameticker.dm when a round ends. - */ -/hook/roundend - -/** - * LateSpawn hook. - * Called in newplayer.dm when a humanoid character joins the round after it started. - * Parameters: var/mob/living/carbon/human - */ -/hook/latespawn - -/** - * Death hook. - * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed - */ -/hook/death - -/** - * Cloning hook. - * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human - */ -/hook/clone - -/** - * Debrained hook. - * Called in brain_item.dm when someone gets debrained. - * Parameters: var/obj/item/brain - */ -/hook/debrain - -/** - * Borged hook. - * Called in robot_parts.dm when someone gets turned into a cyborg. - * Parameters: var/mob/living/silicon/robot - */ -/hook/borgify - -/** - * Podman hook. - * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/primitive/diona - */ -/hook/harvest_podman - -/** - * Payroll revoked hook. - * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/revoke_payroll - -/** - * Account suspension hook. - * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/change_account_status - -/** - * Employee reassignment hook. - * Called in card.dm when someone's card is reassigned at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/reassign_employee - -/** - * Employee terminated hook. - * Called in card.dm when someone's card is terminated at the HoP's desk. - * Parameters: var/obj/item/card/id - */ -/hook/terminate_employee - -/** - * Crate sold hook. - * Called in supplyshuttle.dm when a crate is sold on the shuttle. - * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle - */ -/hook/sell_crate - -/** - * Captain spawned hook. - * Called in supervisor.dm when a captain spawns - * Parameters: var/mob/living/carbon/human/captain - */ -/hook/captain_spawned - -/** - * Mob login hook. - * Called in login.dm when a player logs in to a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_login - - /** - * Mob logout hook. - * Called in logout.dm when a player logs out of a mob. - * Parameters: var/client/client, var/mob/mob - */ -/hook/mob_logout - -/** - * Mob area change hook. - * Called in area.dm when a mob moves from one area to another. - * Parameters: var/mob/mob, var/area/newarea, var/area/oldarea - */ -/hook/mob_area_change diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a9c7e0dbb7b..fa2465854f3 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -194,8 +194,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new to_chat(world, "[msg]") log_world(msg) - if(config.developer_express_start & ticker.current_state == GAME_STATE_PREGAME) - ticker.current_state = GAME_STATE_SETTING_UP + if(config.developer_express_start & SSticker.current_state == GAME_STATE_PREGAME) + SSticker.current_state = GAME_STATE_SETTING_UP if(!current_runlevel) SetRunLevel(1) diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm new file mode 100644 index 00000000000..2dad0abca0f --- /dev/null +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -0,0 +1,41 @@ +SUBSYSTEM_DEF(idlenpcpool) + name = "Idling NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_IDLE_NPC + wait = 60 + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/static/list/idle_mobs_by_zlevel[][] + +/datum/controller/subsystem/idlenpcpool/stat_entry() + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + var/list/zlist = GLOB.simple_animals[AI_Z_OFF] + ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") + +/datum/controller/subsystem/idlenpcpool/Initialize(start_timeofday) + idle_mobs_by_zlevel = new /list(world.maxz,0) + return ..() + +/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) + if(!resumed) + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + src.currentrun = idlelist.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len + if(!SA) + GLOB.simple_animals[AI_IDLE] -= SA + continue + + if(!SA.ckey) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.consider_wakeup() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 02f2681b22d..6a603bd7235 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -1,7 +1,8 @@ SUBSYSTEM_DEF(jobs) name = "Jobs" init_order = INIT_ORDER_JOBS // 12 - flags = SS_NO_FIRE + wait = 3000 // 5 minutes (Deciseconds) + runlevels = RUNLEVEL_GAME //List of all jobs var/list/occupations = list() @@ -21,6 +22,12 @@ SUBSYSTEM_DEF(jobs) LoadJobs("config/jobs.txt") return ..() +// Only fires every 5 minutes +/datum/controller/subsystem/jobs/fire() + if(!config.sql_enabled || !config.use_exp_tracking) + return + update_exp(5,0) + /datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() var/list/all_jobs = subtypesof(/datum/job) @@ -270,9 +277,9 @@ SUBSYSTEM_DEF(jobs) SetupOccupations() //Holder for Triumvirate is stored in the ticker, this just processes it - if(ticker) + if(SSticker) for(var/datum/job/ai/A in occupations) - if(ticker.triai) + if(SSticker.triai) A.spawn_positions = 3 //Get the players who are ready @@ -473,10 +480,10 @@ SUBSYSTEM_DEF(jobs) T = S.loc if(T) - H.loc = T + H.forceMove(T) // Moving wheelchair if they have one if(H.buckled && istype(H.buckled, /obj/structure/chair/wheelchair)) - H.buckled.loc = H.loc + H.buckled.forceMove(H.loc) H.buckled.dir = H.dir if(job) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm new file mode 100644 index 00000000000..82bbd52471a --- /dev/null +++ b/code/controllers/subsystem/lighting.dm @@ -0,0 +1,87 @@ +GLOBAL_LIST_EMPTY(lighting_update_lights) // List of lighting sources queued for update. +GLOBAL_LIST_EMPTY(lighting_update_corners) // List of lighting corners queued for update. +GLOBAL_LIST_EMPTY(lighting_update_objects) // List of lighting objects queued for update. + +SUBSYSTEM_DEF(lighting) + name = "Lighting" + wait = 2 + init_order = INIT_ORDER_LIGHTING + flags = SS_TICKER + +/datum/controller/subsystem/lighting/stat_entry() + ..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]") + +/datum/controller/subsystem/lighting/Initialize(timeofday) + if(!initialized) + if(config.starlight) + for(var/I in GLOB.all_areas) + var/area/A = I + if(A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) + A.luminosity = 0 + + create_all_lighting_objects() + initialized = TRUE + + fire(FALSE, TRUE) + + return ..() + +/datum/controller/subsystem/lighting/fire(resumed, init_tick_checks) + MC_SPLIT_TICK_INIT(3) + if(!init_tick_checks) + MC_SPLIT_TICK + var/i = 0 + for(i in 1 to GLOB.lighting_update_lights.len) + var/datum/light_source/L = GLOB.lighting_update_lights[i] + + L.update_corners() + + L.needs_update = LIGHTING_NO_UPDATE + + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_lights.Cut(1, i+1) + i = 0 + + if(!init_tick_checks) + MC_SPLIT_TICK + + for (i in 1 to GLOB.lighting_update_corners.len) + var/datum/lighting_corner/C = GLOB.lighting_update_corners[i] + + C.update_objects() + C.needs_update = FALSE + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_corners.Cut(1, i+1) + i = 0 + + + if(!init_tick_checks) + MC_SPLIT_TICK + + for (i in 1 to GLOB.lighting_update_objects.len) + var/atom/movable/lighting_object/O = GLOB.lighting_update_objects[i] + + if(QDELETED(O)) + continue + + O.update() + O.needs_update = FALSE + if(init_tick_checks) + CHECK_TICK + else if(MC_TICK_CHECK) + break + if(i) + GLOB.lighting_update_objects.Cut(1, i+1) + + +/datum/controller/subsystem/lighting/Recover() + initialized = SSlighting.initialized + ..() \ No newline at end of file diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index d19396af767..20061d7489b 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -1,14 +1,19 @@ SUBSYSTEM_DEF(mobs) name = "Mobs" priority = FIRE_PRIORITY_MOBS - flags = SS_KEEP_TIMING | SS_NO_INIT + flags = SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() + var/static/list/clients_by_zlevel[][] /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_list.len]") +/datum/controller/subsystem/mobs/Initialize(start_timeofday) + clients_by_zlevel = new /list(world.maxz,0) + return ..() + /datum/controller/subsystem/mobs/fire(resumed = 0) var/seconds = wait * 0.1 if(!resumed) diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 358076c5652..4ebe1dceb0e 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(nightshift) return ..() /datum/controller/subsystem/nightshift/fire(resumed = FALSE) - if(world.time - round_start_time < nightshift_first_check) + if(world.time - SSticker.round_start_time < nightshift_first_check) return check_nightshift() diff --git a/code/controllers/subsystem/npcai.dm b/code/controllers/subsystem/npcai.dm deleted file mode 100644 index f8fa3a5aa0f..00000000000 --- a/code/controllers/subsystem/npcai.dm +++ /dev/null @@ -1,24 +0,0 @@ -SUBSYSTEM_DEF(npcai) - name = "NPC AI" // Simple AI controller, isolated from the SNPC one (NPCPool). - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/simple_animal_list = list() - -/datum/controller/subsystem/npcai/stat_entry() - ..("SimAnimals:[simple_animal_list.len]") - -/datum/controller/subsystem/npcai/fire(resumed = FALSE) - if(!resumed) - src.simple_animal_list = simple_animal_list.Copy() - for(var/mob/living/simple_animal/M in simple_animal_list) - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - M.process_ai() - if(MC_TICK_CHECK) - return - else - simple_animal_list -= M - -/datum/controller/subsystem/npcai/Recover() - simple_animal_list = SSnpcai.simple_animal_list \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index b06d33f6f32..0de306b12eb 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -1,127 +1,33 @@ -#define PROCESSING_NPCS 0 -#define PROCESSING_DELEGATES 1 -#define PROCESSING_ASSISTANTS 2 - SUBSYSTEM_DEF(npcpool) - name = "NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + name = "NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/canBeUsed = list() - var/list/needsDelegate = list() - var/list/needsAssistant = list() - - var/list/processing = list() - var/list/currentrun = list() - var/stage + var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() - ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") - -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) - processing -= I - currentrun -= I - needsDelegate -= I - canBeUsed -= I - needsAssistant -= I + var/list/activelist = GLOB.simple_animals[AI_ON] + ..("SimpleAnimals:[activelist.len]") /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - //bot delegation and coordination systems - //General checklist/Tasks for delegating a task or coordinating it (for SNPCs) - // 1. Bot proximity to task target: if too far, delegate, if close, coordinate - // 2. Bot Health/status: check health with bots in local area, if their health is higher, delegate task to them, else coordinate - // 3. Process delegation: if a bot (or bots) has been delegated, assign them to the task. - // 4. Process coordination: if a bot(or bots) has been asked to coordinate, assign them to help. - // 5. Do all assignments: goes through the delegated/coordianted bots and assigns the right variables/tasks to them. - if (!resumed) - currentrun = processing.Copy() - stage = PROCESSING_NPCS - //cache for sanic speed (lists are references anyways) - var/list/cachecurrentrun = currentrun - var/list/cachecanBeUsed = canBeUsed + if(!resumed) + var/list/activelist = GLOB.simple_animals[AI_ON] + src.currentrun = activelist.Copy() - if(stage == PROCESSING_NPCS) - while(cachecurrentrun.len) - var/mob/living/carbon/human/interactive/thing = cachecurrentrun[cachecurrentrun.len] - --cachecurrentrun.len + var/list/currentrun = src.currentrun - thing.InteractiveProcess() + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len - var/checkInRange = view(SNPC_MAX_RANGE_FIND,thing) - if(thing.IsDeadOrIncap(FALSE) || !(locate(thing.TARGET) in checkInRange)) - needsDelegate += thing - else if(thing.doing & SNPC_FIGHTING) - needsAssistant += thing - else - cachecanBeUsed += thing - - if (MC_TICK_CHECK) - return - stage = PROCESSING_DELEGATES - cachecurrentrun = needsDelegate //localcache - currentrun = cachecurrentrun - - if(stage == PROCESSING_DELEGATES) - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 0, 0) - candidate.update_icons() - - if(MC_TICK_CHECK) - return - stage = PROCESSING_ASSISTANTS - cachecurrentrun = needsAssistant //localcache - currentrun = cachecurrentrun - - //no need for the stage check - - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check,FALSE)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 255, 0) - candidate.update_icons() - - if(!cachecurrentrun.len || MC_TICK_CHECK) //don't change SS state if it isn't necessary - return - -/datum/controller/subsystem/npcpool/Recover() - processing = SSnpcpool.processing \ No newline at end of file + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_speech() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 30021df4fb1..a1ca9b5fdad 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -106,8 +106,8 @@ SUBSYSTEM_DEF(shuttle) return emergency = backup_shuttle - if(world.time - round_start_time < config.shuttle_refuel_delay) - to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + if(world.time - SSticker.round_start_time < config.shuttle_refuel_delay) + to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") return switch(emergency.mode) @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(shuttle) return if(!emergency.canRecall) return - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) diff --git a/code/game/gamemodes/gameticker.dm b/code/controllers/subsystem/ticker.dm similarity index 79% rename from code/game/gamemodes/gameticker.dm rename to code/controllers/subsystem/ticker.dm index 972075ceece..668dfe5a3d6 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,73 +1,118 @@ -var/global/datum/controller/gameticker/ticker -var/round_start_time = 0 +SUBSYSTEM_DEF(ticker) + name = "Ticker" + init_order = INIT_ORDER_TICKER -/datum/controller/gameticker + priority = FIRE_PRIORITY_TICKER + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME + + var/round_start_time = 0 var/const/restart_timeout = 600 - var/current_state = GAME_STATE_PREGAME + var/current_state = GAME_STATE_STARTUP + var/force_start = 0 // Do we want to force-start as soon as we can var/force_ending = 0 - var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null var/event_time = null var/event = 0 - var/login_music // music played in pregame lobby - var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking. - var/Bible_icon_state // icon_state the chaplain has chosen for his bible var/Bible_item_state // item_state the chaplain has chosen for his bible var/Bible_name // name of the bible var/Bible_deity_name - var/datum/cult_info/cultdat = null //here instead of cult for adminbus purposes - var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders - var/list/syndicate_coalition = list() // list of traitor-compatible factions var/list/factions = list() // list of all factions var/list/availablefactions = list() // list of factions with openings - var/tipped = FALSE //Did we broadcast the tip of the day yet? var/selected_tip // What will be the tip of the day? - - var/pregame_timeleft = 0 + var/pregame_timeleft // This is used for calculations var/delay_end = 0 //if set to nonzero, the round will not restart on it's own - var/triai = 0//Global holder for Triumvirate var/initialtpass = 0 //holder for inital autotransfer vote timer - var/obj/screen/cinematic = null //used for station explosion cinematic - var/round_end_announced = 0 // Spam Prevention. Announce round end only once.\ - -/datum/controller/gameticker/proc/pregame() +/datum/controller/subsystem/ticker/Initialize() login_music = pick(\ 'sound/music/thunderdome.ogg',\ 'sound/music/space.ogg',\ 'sound/music/title1.ogg',\ 'sound/music/title2.ogg',\ 'sound/music/title3.ogg',) - do - pregame_timeleft = config.pregame_timestart - to_chat(world, "Welcome to the pre-game lobby!") - to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") - while(current_state == GAME_STATE_PREGAME) - sleep(10) - if(going) - pregame_timeleft-- + // Setup codephrase + if(!GLOB.syndicate_code_phrase) + GLOB.syndicate_code_phrase = generate_code_phrase() + if(!GLOB.syndicate_code_response) + GLOB.syndicate_code_response = generate_code_phrase() - if(pregame_timeleft <= 60 && !tipped) + // Map name + if(using_map && using_map.name) + GLOB.map_name = "[using_map.name]" + else + GLOB.map_name = "Unknown" + + // World name + if(config && config.server_name) + world.name = "[config.server_name]: [station_name()]" + else + world.name = station_name() + + return ..() + + +/datum/controller/subsystem/ticker/fire() + switch(current_state) + if(GAME_STATE_STARTUP) + // This is ran as soon as the MC starts firing, and should only run ONCE, unless startup fails + round_start_time = world.time + (config.pregame_timestart * 10) + to_chat(world, "Welcome to the pre-game lobby!") + to_chat(world, "Please, setup your character and select ready. Game will start in [config.pregame_timestart] seconds") + current_state = GAME_STATE_PREGAME + fire() // TG says this is a good idea + if(GAME_STATE_PREGAME) + // This is so we dont have sleeps in controllers, because that is a bad, bad thing + pregame_timeleft = max(0,round_start_time - world.time) + + if(pregame_timeleft <= 600 && !tipped) // 60 seconds send_tip_of_the_round() tipped = TRUE - - if(pregame_timeleft <= 0) + + if(pregame_timeleft <= 0 || force_start) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) - while(!setup()) + if(GAME_STATE_SETTING_UP) + if(!setup()) // Setup failed + current_state = GAME_STATE_STARTUP + Master.SetRunLevel(RUNLEVEL_LOBBY) + if(GAME_STATE_PLAYING) + mode.process() + mode.process_job_tasks() + var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if(config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result + else + game_finished |= mode.check_finished() + if(game_finished) + current_state = GAME_STATE_FINISHED + if(GAME_STATE_FINISHED) + current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) // This shouldnt process more than once, but you never know + auto_toggle_ooc(1) // Turn it on -/datum/controller/gameticker/proc/votetimer() + spawn(0) + declare_completion() + + spawn(50) + if(mode.station_was_nuked) + world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + else + world.Reboot("Round ended.", "end_proper", "proper completion") + + +/datum/controller/subsystem/ticker/proc/votetimer() var/timerbuffer = 0 if(initialtpass == 0) timerbuffer = config.vote_autotransfer_initial @@ -78,7 +123,8 @@ var/round_start_time = 0 initialtpass = 1 votetimer() -/datum/controller/gameticker/proc/setup() + +/datum/controller/subsystem/ticker/proc/setup() cultdat = setupcult() //Create and announce mode if(master_mode=="secret") @@ -252,9 +298,7 @@ var/round_start_time = 0 return 1 - //Plus it provides an easy way to make cinematics for other events. Just use this as a template :) -//Plus it provides an easy way to make cinematics for other events. Just use this as a template -/datum/controller/gameticker/proc/station_explosion_cinematic(station_missed = 0, override = null) +/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed = 0, override = null) if(cinematic) return //already a cinematic in progress! @@ -350,7 +394,7 @@ var/round_start_time = 0 -/datum/controller/gameticker/proc/create_characters() +/datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/new_player/player in GLOB.player_list) if(player.ready && player.mind) if(player.mind.assigned_role == "AI") @@ -364,13 +408,13 @@ var/round_start_time = 0 qdel(player) -/datum/controller/gameticker/proc/collect_minds() +/datum/controller/subsystem/ticker/proc/collect_minds() for(var/mob/living/player in GLOB.player_list) if(player.mind) - ticker.minds += player.mind + SSticker.minds += player.mind -/datum/controller/gameticker/proc/equip_characters() +/datum/controller/subsystem/ticker/proc/equip_characters() var/captainless=1 for(var/mob/living/carbon/human/player in GLOB.player_list) if(player && player.mind && player.mind.assigned_role) @@ -385,7 +429,7 @@ var/round_start_time = 0 if(!istype(M,/mob/new_player)) to_chat(M, "Captainship not forced on anyone.") -/datum/controller/gameticker/proc/send_tip_of_the_round() +/datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m if(selected_tip) m = selected_tip @@ -400,45 +444,13 @@ var/round_start_time = 0 if(m) to_chat(world, "Tip of the round: [html_encode(m)]") -/datum/controller/gameticker/proc/process_decrepit() - if(current_state != GAME_STATE_PLAYING) - return 0 - - mode.process() - mode.process_job_tasks() - - //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - - var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked - if(config.continuous_rounds) - mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result - else - game_finished |= mode.check_finished() - - if((!mode.explosion_in_progress && game_finished) || force_ending) - current_state = GAME_STATE_FINISHED - Master.SetRunLevel(RUNLEVEL_POSTGAME) - auto_toggle_ooc(1) // Turn it on - spawn - declare_completion() - - spawn(50) - callHook("roundend") - - if(mode.station_was_nuked) - world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") - else - world.Reboot("Round ended.", "end_proper", "proper completion") - - return 1 - -/datum/controller/gameticker/proc/getfactionbyname(var/name) +/datum/controller/subsystem/ticker/proc/getfactionbyname(var/name) for(var/datum/faction/F in factions) if(F.name == name) return F -/datum/controller/gameticker/proc/declare_completion() +/datum/controller/subsystem/ticker/proc/declare_completion() nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point. //Round statistics report var/datum/station_state/end_state = new /datum/station_state() @@ -483,9 +495,9 @@ var/round_start_time = 0 if(dronecount) to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.") - if(ticker.mode.eventmiscs.len) + if(mode.eventmiscs.len) var/emobtext = "" - for(var/datum/mind/eventmind in ticker.mode.eventmiscs) + for(var/datum/mind/eventmind in mode.eventmiscs) emobtext += printeventplayer(eventmind) emobtext += "
" emobtext += printobjectives(eventmind) @@ -516,5 +528,6 @@ var/round_start_time = 0 return 1 -/datum/controller/gameticker/proc/HasRoundStarted() +/datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING + diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 4b267fe757f..27d499254a1 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/fire() if(mode) // No more change mode votes after the game has started. - if(mode == "gamemode" && ticker.current_state >= GAME_STATE_SETTING_UP) + if(mode == "gamemode" && SSticker.current_state >= GAME_STATE_SETTING_UP) to_chat(world, "Voting aborted due to game start.") reset() return @@ -125,7 +125,7 @@ SUBSYSTEM_DEF(vote) var/text if(winners.len > 0) if(winners.len > 1) - if(mode != "gamemode" || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes + if(mode != "gamemode" || SSticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes text = "Vote Tied Between:\n" for(var/option in winners) text += "\t[option]\n" @@ -134,7 +134,7 @@ SUBSYSTEM_DEF(vote) for(var/key in current_votes) if(choices[current_votes[key]] == .) round_voters += key // Keep track of who voted for the winning round. - if(mode == "gamemode" && (. == "extended" || ticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes + if(mode == "gamemode" && (. == "extended" || SSticker.hide_mode == 0)) // Announce Extended gamemode, but not other gamemodes text += "Vote Result: [.] ([choices[.]] vote\s)" else if(mode == "custom") @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(vote) if("gamemode") if(master_mode != .) world.save_mode(.) - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) restart = 1 else master_mode = . @@ -208,17 +208,17 @@ SUBSYSTEM_DEF(vote) if("restart") choices.Add("Restart Round","Continue Playing") if("gamemode") - if(ticker.current_state >= 2) + if(SSticker.current_state >= 2) return 0 choices.Add(config.votable_modes) if("crew_transfer") if(check_rights(R_ADMIN|R_MOD)) - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if(ticker.current_state <= 2) + if(SSticker.current_state <= 2) return 0 question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index eeef65bd2e2..55d68d9ea1a 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -36,7 +36,7 @@ debug_variables(Master) feedback_add_details("admin_verb","Dsmc") if("Ticker") - debug_variables(ticker) + debug_variables(SSticker) feedback_add_details("admin_verb","DTicker") if("Air") debug_variables(SSair) @@ -80,9 +80,9 @@ if("Mob") debug_variables(SSmobs) feedback_add_details("admin_verb","DMob") - if("NPC AI") - debug_variables(SSnpcai) - feedback_add_details("admin_verb","DNPCAI") + if("NPC Pool") + debug_variables(SSnpcpool) + feedback_add_details("admin_verb","DNPCPool") if("Shuttle") debug_variables(SSshuttle) feedback_add_details("admin_verb","DShuttle") diff --git a/code/datums/action.dm b/code/datums/action.dm index d316bd29b41..3b98a0fef1a 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -107,6 +107,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS var/use_itemicon = TRUE + /datum/action/item_action/New(Target, custom_icon, custom_icon_state) ..() var/obj/item/I = target @@ -136,9 +137,10 @@ var/obj/item/I = target var/old_layer = I.layer var/old_plane = I.plane - I.layer = HUD_LAYER_SCREEN + 1 - I.plane = HUD_PLANE - current_button.overlays += I + I.layer = FLOAT_LAYER //AAAH + I.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(I) I.layer = old_layer I.plane = old_plane else @@ -406,6 +408,19 @@ name = "Use [target.name]" button.name = name +/datum/action/item_action/voice_changer/toggle + name = "Toggle Voice Changer" + +/datum/action/item_action/voice_changer/voice + name = "Set Voice" + +/datum/action/item_action/voice_changer/voice/Trigger() + if(!IsAvailable()) + return FALSE + + var/obj/item/voice_changer/V = target + V.set_voice(usr) + // for clothing accessories like holsters /datum/action/item_action/accessory check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index a4b3ee21c56..a4d012df464 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -11,7 +11,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(!refresh) return cache_entry.data - if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time alarms = cache_entry.data // Don't deleate the list if(is_station_contact(passed_alarm.z)) // Still need sanity checks alarms[++alarms.len] = passed_alarm.get_nano_data_console() diff --git a/code/datums/cache/cache.dm b/code/datums/cache/cache.dm index 2502bb871b2..f401e54517a 100644 --- a/code/datums/cache/cache.dm +++ b/code/datums/cache/cache.dm @@ -1,6 +1,6 @@ /datum/cache_entry var/timestamp - var/data - + var/list/data = list() + /datum/repository var/cache_data \ No newline at end of file diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 3fe88f7d0e9..e5b948f4f26 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -1,5 +1,3 @@ -// Squeak component ported over from tg - /datum/component/squeak var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1) var/list/override_squeak_sounds @@ -49,21 +47,12 @@ else playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1) -/datum/component/squeak/proc/step_squeak(datum/source, mob/living/carbon/human/H) - if(H.m_intent == MOVE_INTENT_RUN) - if(steps > step_delay) - play_squeak() - steps = 0 - else - steps++ - else +/datum/component/squeak/proc/step_squeak() + if(steps > step_delay) play_squeak() - -/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) - RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) - -/datum/component/squeak/proc/on_drop(datum/source, mob/user) - UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + steps = 0 + else + steps++ /datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM) if(isitem(AM)) @@ -83,6 +72,13 @@ last_use = world.time play_squeak() +/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot) + RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE) + +/datum/component/squeak/proc/on_drop(datum/source, mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING) + +// Disposal pipes related shit /datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source) //We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 6fdb8a359c2..13c3fb64f33 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1242,13 +1242,28 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount, robotic=1) - if("fire") L.adjustFireLoss(amount, robotic=1) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - if("stamina") L.adjustStaminaLoss(amount) + if("brute") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustBruteLoss(amount, robotic = TRUE) + else + L.adjustBruteLoss(amount) + if("fire") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.adjustFireLoss(amount, robotic = TRUE) + else + L.adjustFireLoss(amount) + if("toxin") + L.adjustToxLoss(amount) + if("oxygen") + L.adjustOxyLoss(amount) + if("brain") + L.adjustBrainLoss(amount) + if("clone") + L.adjustCloneLoss(amount) + if("stamina") + L.adjustStaminaLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 2dd2d72a816..e5948a47e30 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -93,8 +93,8 @@ var/datum/atom_hud/huds = list( \ // gang_huds += G.ganghud var/serv_huds = list()//mindslaves and/or vampire thralls - if(ticker.mode) - for(var/datum/mindslaves/serv in (ticker.mode.vampires | ticker.mode.traitors)) + if(SSticker.mode) + for(var/datum/mindslaves/serv in (SSticker.mode.vampires | SSticker.mode.traitors)) serv_huds += serv.thrallhud diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 65b3940cde2..c20ded784a1 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -84,7 +84,7 @@ soulOwner = src /datum/mind/Destroy() - ticker.minds -= src + SSticker.minds -= src if(islist(antag_datums)) for(var/i in antag_datums) var/datum/antagonist/antag_datum = i @@ -163,7 +163,7 @@ /datum/mind/proc/_memory_edit_header(gamemode, list/alt) . = gamemode - if(ticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (ticker.mode.config_tag in alt))) + if(SSticker.mode.config_tag == gamemode || (LAZYLEN(alt) && (SSticker.mode.config_tag in alt))) . = uppertext(.) . = "[.]: " @@ -183,7 +183,7 @@ . = _memory_edit_header("revolution") if(ismindshielded(H)) . += "NO|headrev|rev" - else if(src in ticker.mode.head_revolutionaries) + else if(src in SSticker.mode.head_revolutionaries) . += "no|HEADREV|rev" . += "
Flash: give" @@ -200,7 +200,7 @@ . += " Reequip (gives traitor uplink)." if(objectives.len==0) . += "
Objectives are empty! Set to kill all heads." - else if(src in ticker.mode.revolutionaries) + else if(src in SSticker.mode.revolutionaries) . += "no|headrev|REV" else . += "NO|headrev|rev" @@ -211,7 +211,7 @@ . = _memory_edit_header("cult") if(ismindshielded(H)) . += "NO|cultist" - else if(src in ticker.mode.cult) + else if(src in SSticker.mode.cult) . += "no|CULTIST" . += "
Give tome|equip." else @@ -221,7 +221,7 @@ /datum/mind/proc/memory_edit_wizard(mob/living/carbon/human/H) . = _memory_edit_header("wizard") - if(src in ticker.mode.wizards) + if(src in SSticker.mode.wizards) . += "WIZARD|no" . += "
To lair, undress, dress up, let choose name." if(objectives.len==0) @@ -233,7 +233,7 @@ /datum/mind/proc/memory_edit_changeling(mob/living/carbon/human/H) . = _memory_edit_header("changeling", list("traitorchan")) - if(src in ticker.mode.changelings) + if(src in SSticker.mode.changelings) . += "CHANGELING|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -246,7 +246,7 @@ /datum/mind/proc/memory_edit_vampire(mob/living/carbon/human/H) . = _memory_edit_header("vampire", list("traitorvamp")) - if(src in ticker.mode.vampires) + if(src in SSticker.mode.vampires) . += "VAMPIRE|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -256,14 +256,14 @@ . += _memory_edit_role_enabled(ROLE_VAMPIRE) /** Enthralled ***/ . += "
enthralled: " - if(src in ticker.mode.vampire_enthralled) + if(src in SSticker.mode.vampire_enthralled) . += "THRALL|no" else . += "thrall|NO" /datum/mind/proc/memory_edit_nuclear(mob/living/carbon/human/H) . = _memory_edit_header("nuclear") - if(src in ticker.mode.syndicates) + if(src in SSticker.mode.syndicates) . += "OPERATIVE|no" . += "
To shuttle, undress, dress up." var/code @@ -280,9 +280,9 @@ /datum/mind/proc/memory_edit_shadowling(mob/living/carbon/human/H) . = _memory_edit_header("shadowling") - if(src in ticker.mode.shadows) + if(src in SSticker.mode.shadows) . += "SHADOWLING|thrall|no" - else if(src in ticker.mode.shadowling_thralls) + else if(src in SSticker.mode.shadowling_thralls) . += "Shadowling|THRALL|no" else . += "shadowling|thrall|NO" @@ -291,7 +291,7 @@ /datum/mind/proc/memory_edit_abductor(mob/living/carbon/human/H) . = _memory_edit_header("abductor") - if(src in ticker.mode.abductors) + if(src in SSticker.mode.abductors) . += "ABDUCTOR|no" . += "|undress|equip" else @@ -301,14 +301,14 @@ /datum/mind/proc/memory_edit_devil(mob/living/H) . = _memory_edit_header("devil", list("devilagents")) - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(!devilinfo) . += "No devilinfo found! Yell at a coder!" else if(!devilinfo.ascendable) . += "DEVIL|Ascendable Devil|sintouched|no" else . += "DEVIL|ASCENDABLE DEVIL|sintouched|no" - else if(src in ticker.mode.sintouched) + else if(src in SSticker.mode.sintouched) . += "devil|Ascendable Devil|SINTOUCHED|no" else . += "devil|Ascendable Devil|sintouched|NO" @@ -317,14 +317,14 @@ /datum/mind/proc/memory_edit_eventmisc(mob/living/H) . = _memory_edit_header("event", list()) - if(src in ticker.mode.eventmiscs) + if(src in SSticker.mode.eventmiscs) . += "YES|no" else . += "Event Role|NO" /datum/mind/proc/memory_edit_traitor() . = _memory_edit_header("traitor", list("traitorchan", "traitorvamp")) - if(src in ticker.mode.traitors) + if(src in SSticker.mode.traitors) . += "TRAITOR|no" if(objectives.len==0) . += "
Objectives are empty! Randomize!" @@ -348,9 +348,9 @@ /datum/mind/proc/memory_edit_uplink() . = "" - if(ishuman(current) && ((src in ticker.mode.head_revolutionaries) || \ - (src in ticker.mode.traitors) || \ - (src in ticker.mode.syndicates))) + if(ishuman(current) && ((src in SSticker.mode.head_revolutionaries) || \ + (src in SSticker.mode.traitors) || \ + (src in SSticker.mode.syndicates))) . = "Uplink: give" var/obj/item/uplink/hidden/suplink = find_syndicate_uplink() var/crystals @@ -366,7 +366,7 @@ // ^ whoever left this comment is literally a grammar nazi. stalin better. in russia grammar correct you. /datum/mind/proc/edit_memory() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("Not before round-start!", "Alert") return @@ -419,7 +419,7 @@ This prioritizes antags relevant to the current round to make them appear at the top of the panel. Traitorchan and traitorvamp are snowflaked in because they have multiple sections. */ - if(ticker.mode.config_tag == "traitorchan") + if(SSticker.mode.config_tag == "traitorchan") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["changeling"]) @@ -427,7 +427,7 @@ sections -= "traitor" sections -= "changeling" // Elif technically unnecessary but it makes the following else look better - else if(ticker.mode.config_tag == "traitorvamp") + else if(SSticker.mode.config_tag == "traitorvamp") if(sections["traitor"]) out += sections["traitor"] + "
" if(sections["vampire"]) @@ -435,9 +435,9 @@ sections -= "traitor" sections -= "vampire" else - if(sections[ticker.mode.config_tag]) - out += sections[ticker.mode.config_tag] + "
" - sections -= ticker.mode.config_tag + if(sections[SSticker.mode.config_tag]) + out += sections[SSticker.mode.config_tag] + "
" + sections -= SSticker.mode.config_tag for(var/i in sections) if(sections[i]) @@ -512,7 +512,7 @@ var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string. var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) possible_targets += possible_target.current @@ -612,7 +612,7 @@ if("identity theft") var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != src) && ishuman(possible_target.current)) possible_targets += possible_target possible_targets = sortAtom(possible_targets) @@ -687,19 +687,19 @@ message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant") to_chat(H, "You somehow have become the recepient of a mindshield transplant, and it just activated!") - if(src in ticker.mode.revolutionaries) + if(src in SSticker.mode.revolutionaries) special_role = null - ticker.mode.revolutionaries -= src + SSticker.mode.revolutionaries -= src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.head_revolutionaries) + if(src in SSticker.mode.head_revolutionaries) special_role = null - ticker.mode.head_revolutionaries -=src + SSticker.mode.head_revolutionaries -=src to_chat(src, "The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) + if(src in SSticker.mode.cult) + SSticker.mode.cult -= src + SSticker.mode.update_cult_icons_removed(src) special_role = null - var/datum/game_mode/cult/cult = ticker.mode + var/datum/game_mode/cult/cult = SSticker.mode if(istype(cult)) cult.memorize_cult_objectives(src) to_chat(current, "The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day!") @@ -709,46 +709,46 @@ switch(href_list["revolution"]) if("clear") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src to_chat(current, "You have been brainwashed! You are no longer a head revolutionary!") - ticker.mode.update_rev_icons_removed(src) + SSticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name(usr)] has de-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-rev'd [key_name_admin(current)]") if("rev") - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.head_revolutionaries) + SSticker.mode.head_revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "Revolution has been disappointed of your leadership traits! You are a regular revolutionary now!") - else if(!(src in ticker.mode.revolutionaries)) + else if(!(src in SSticker.mode.revolutionaries)) to_chat(current, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") else return - ticker.mode.revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_REV log_admin("[key_name(usr)] has rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has rev'd [key_name_admin(current)]") if("headrev") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) + if(src in SSticker.mode.revolutionaries) + SSticker.mode.revolutionaries -= src + SSticker.mode.update_rev_icons_removed(src) to_chat(current, "You have proven your devotion to revolution! You are a head revolutionary now!") - else if(!(src in ticker.mode.head_revolutionaries)) + else if(!(src in SSticker.mode.head_revolutionaries)) to_chat(current, "You are a member of the revolutionaries' leadership now!") else return - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -756,21 +756,21 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV log_admin("[key_name(usr)] has head-rev'd [key_name(current)]") message_admins("[key_name_admin(usr)] has head-rev'd [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) log_admin("[key_name(usr)] has automatically forged revolutionary objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged revolutionary objectives for [key_name_admin(current)]") if("flash") - if(!ticker.mode.equip_revolutionary(current)) + if(!SSticker.mode.equip_revolutionary(current)) to_chat(usr, "Spawning flash failed!") log_admin("[key_name(usr)] has given [key_name(current)] a flash") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash") @@ -800,8 +800,8 @@ qdel(flash) take_uplink() var/fail = 0 - fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_traitor(current, 1) + fail |= !SSticker.mode.equip_revolutionary(current) if(fail) to_chat(usr, "Reequipping revolutionary goes wrong!") return @@ -811,17 +811,17 @@ else if(href_list["cult"]) switch(href_list["cult"]) if("clear") - if(src in ticker.mode.cult) - ticker.mode.remove_cultist(src) + if(src in SSticker.mode.cult) + SSticker.mode.remove_cultist(src) special_role = null log_admin("[key_name(usr)] has de-culted [key_name(current)]") message_admins("[key_name_admin(usr)] has de-culted [key_name_admin(current)]") if("cultist") - if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) + if(!(src in SSticker.mode.cult)) + SSticker.mode.add_cultist(src) special_role = SPECIAL_ROLE_CULTIST - to_chat(current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") - to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [ticker.cultdat.entity_title2] above all else. Bring It back.") + to_chat(current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") + to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve [SSticker.cultdat.entity_title2] above all else. Bring It back.") log_admin("[key_name(usr)] has culted [key_name(current)]") message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]") if("tome") @@ -846,7 +846,7 @@ message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]") if("equip") - if(!ticker.mode.equip_cultist(current)) + if(!SSticker.mode.equip_cultist(current)) to_chat(usr, "Spawning equipment failed!") log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist") @@ -855,21 +855,21 @@ switch(href_list["wizard"]) if("clear") - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src + if(src in SSticker.mode.wizards) + SSticker.mode.wizards -= src special_role = null current.spellremove(current) current.faction = list("Station") - ticker.mode.update_wiz_icons_removed(src) + SSticker.mode.update_wiz_icons_removed(src) to_chat(current, "You have been brainwashed! You are no longer a wizard!") log_admin("[key_name(usr)] has de-wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]") if("wizard") - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.update_wiz_icons_added(src) SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg') to_chat(current, "You are a Space Wizard!") current.faction = list("wizard") @@ -880,15 +880,15 @@ log_admin("[key_name(usr)] has moved [key_name(current)] to the wizard's lair") message_admins("[key_name_admin(usr)] has moved [key_name_admin(current)] to the wizard's lair") if("dressup") - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) log_admin("[key_name(usr)] has equipped [key_name(current)] as a wizard") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a wizard") if("name") - ticker.mode.name_wizard(current) + SSticker.mode.name_wizard(current) log_admin("[key_name(usr)] has allowed wizard [key_name(current)] to name themselves") message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves") if("autoobjectives") - ticker.mode.forge_wizard_objectives(src) + SSticker.mode.forge_wizard_objectives(src) to_chat(usr, "The objectives for wizard [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]") @@ -897,20 +897,20 @@ else if(href_list["changeling"]) switch(href_list["changeling"]) if("clear") - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src + if(src in SSticker.mode.changelings) + SSticker.mode.changelings -= src special_role = null current.remove_changeling_powers() - ticker.mode.update_change_icons_removed(src) + SSticker.mode.update_change_icons_removed(src) if(changeling) qdel(changeling) to_chat(current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") log_admin("[key_name(usr)] has de-changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]") if("changeling") - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) - ticker.mode.update_change_icons_added(src) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) + SSticker.mode.update_change_icons_added(src) special_role = SPECIAL_ROLE_CHANGELING SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg') to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling!") @@ -918,7 +918,7 @@ message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_changeling_objectives(src) + SSticker.mode.forge_changeling_objectives(src) to_chat(usr, "The objectives for changeling [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -937,22 +937,22 @@ else if(href_list["vampire"]) switch(href_list["vampire"]) if("clear") - if(src in ticker.mode.vampires) - ticker.mode.vampires -= src + if(src in SSticker.mode.vampires) + SSticker.mode.vampires -= src special_role = null if(vampire) vampire.remove_vampire_powers() qdel(vampire) vampire = null - ticker.mode.update_vampire_icons_removed(src) + SSticker.mode.update_vampire_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") if("vampire") - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) - ticker.mode.update_vampire_icons_added(src) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) + SSticker.mode.update_vampire_icons_added(src) var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone @@ -963,7 +963,7 @@ message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") if("autoobjectives") - ticker.mode.forge_vampire_objectives(src) + SSticker.mode.forge_vampire_objectives(src) to_chat(usr, "The objectives for vampire [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -971,8 +971,8 @@ else if(href_list["vampthrall"]) switch(href_list["vampthrall"]) if("clear") - if(src in ticker.mode.vampire_enthralled) - ticker.mode.remove_vampire_mind(src) + if(src in SSticker.mode.vampire_enthralled) + SSticker.mode.remove_vampire_mind(src) log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]") @@ -981,9 +981,9 @@ switch(href_list["nuclear"]) if("clear") - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) + if(src in SSticker.mode.syndicates) + SSticker.mode.syndicates -= src + SSticker.mode.update_synd_icons_removed(src) special_role = null for(var/datum/objective/nuclear/O in objectives) objectives-=O @@ -992,17 +992,17 @@ log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]") if("nuclear") - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) log_admin("[key_name(usr)] has nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has nuke op'd [key_name_admin(current)]") if("lair") @@ -1022,10 +1022,10 @@ qdel(H.wear_suit) qdel(H.w_uniform) - if(!ticker.mode.equip_syndicate(current)) + if(!SSticker.mode.equip_syndicate(current)) to_chat(usr, "Equipping a syndicate failed!") return - ticker.mode.update_syndicate_id(current.mind, ticker.mode.syndicates.len == 1) + SSticker.mode.update_syndicate_id(current.mind, SSticker.mode.syndicates.len == 1) log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -1046,27 +1046,27 @@ else if(href_list["eventmisc"]) switch(href_list["eventmisc"]) if("clear") - if(src in ticker.mode.eventmiscs) - ticker.mode.eventmiscs -= src - ticker.mode.update_eventmisc_icons_removed(src) + if(src in SSticker.mode.eventmiscs) + SSticker.mode.eventmiscs -= src + SSticker.mode.update_eventmisc_icons_removed(src) special_role = null message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].") log_admin("[key_name(usr)] has de-eventantag'ed [current].") if("eventmisc") - ticker.mode.eventmiscs += src + SSticker.mode.eventmiscs += src special_role = SPECIAL_ROLE_EVENTMISC - ticker.mode.update_eventmisc_icons_added(src) + SSticker.mode.update_eventmisc_icons_added(src) message_admins("[key_name_admin(usr)] has eventantag'ed [current].") log_admin("[key_name(usr)] has eventantag'ed [current].") else if(href_list["devil"]) switch(href_list["devil"]) if("clear") - if(src in ticker.mode.devils) + if(src in SSticker.mode.devils) if(istype(current,/mob/living/carbon/true_devil/)) to_chat(usr,"This cannot be used on true or arch-devils.") else - ticker.mode.devils -= src - ticker.mode.update_devil_icons_removed(src) + SSticker.mode.devils -= src + SSticker.mode.update_devil_icons_removed(src) special_role = null to_chat(current,"Your infernal link has been severed! You are no longer a devil!") RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt) @@ -1085,8 +1085,8 @@ S.laws.clear_sixsixsix_laws() devilinfo = null log_admin("[key_name(usr)] has de-devil'ed [current].") - else if(src in ticker.mode.sintouched) - ticker.mode.sintouched -= src + else if(src in SSticker.mode.sintouched) + SSticker.mode.sintouched -= src message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].") log_admin("[key_name(usr)] has de-sintouch'ed [current].") if("devil") @@ -1098,12 +1098,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, FALSE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, FALSE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current].") log_admin("[key_name(usr)] has devil'ed [current].") if("ascendable_devil") @@ -1115,12 +1115,12 @@ if(!ishuman(current) && !isrobot(current)) to_chat(usr, "This only works on humans and cyborgs!") return - ticker.mode.devils += src + SSticker.mode.devils += src special_role = "devil" - ticker.mode.update_devil_icons_added(src) - ticker.mode.finalize_devil(src, TRUE) - ticker.mode.forge_devil_objectives(src, 2) - ticker.mode.greet_devil(src) + SSticker.mode.update_devil_icons_added(src) + SSticker.mode.finalize_devil(src, TRUE) + SSticker.mode.forge_devil_objectives(src, 2) + SSticker.mode.greet_devil(src) message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.") log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.") if("sintouched") @@ -1132,8 +1132,8 @@ else if(href_list["traitor"]) switch(href_list["traitor"]) if("clear") - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src + if(src in SSticker.mode.traitors) + SSticker.mode.traitors -= src special_role = null to_chat(current, "You have been brainwashed! You are no longer a traitor!") log_admin("[key_name(usr)] has de-traitored [key_name(current)]") @@ -1145,12 +1145,12 @@ A.verbs -= /mob/living/silicon/ai/proc/choose_modules A.malf_picker.remove_verbs(A) qdel(A.malf_picker) - ticker.mode.update_traitor_icons_removed(src) + SSticker.mode.update_traitor_icons_removed(src) if("traitor") - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src var/datum/mindslaves/slaved = new() slaved.masters += src som = slaved //we MIGT want to mindslave someone @@ -1160,14 +1160,14 @@ message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") if(isAI(current)) var/mob/living/silicon/ai/A = current - ticker.mode.add_law_zero(A) + SSticker.mode.add_law_zero(A) SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') else SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.update_traitor_icons_added(src) if("autoobjectives") - ticker.mode.forge_traitor_objectives(src) + SSticker.mode.forge_traitor_objectives(src) to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -1175,17 +1175,17 @@ else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") - ticker.mode.update_shadow_icons_removed(src) - if(src in ticker.mode.shadows) - ticker.mode.shadows -= src + SSticker.mode.update_shadow_icons_removed(src) + if(src in SSticker.mode.shadows) + SSticker.mode.shadows -= src special_role = null to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") message_admins("[key_name_admin(usr)] has de-shadowlinged [current].") log_admin("[key_name(usr)] has de-shadowlinged [current].") current.spellremove(current) current.remove_language("Shadowling Hivemind") - else if(src in ticker.mode.shadowling_thralls) - ticker.mode.remove_thrall(src,0) + else if(src in SSticker.mode.shadowling_thralls) + SSticker.mode.remove_thrall(src,0) message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") log_admin("[key_name(usr)] has de-thralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]") @@ -1193,20 +1193,20 @@ if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.shadows += src + SSticker.mode.shadows += src special_role = SPECIAL_ROLE_SHADOWLING to_chat(current, "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ ") - ticker.mode.finalize_shadowling(src) - ticker.mode.update_shadow_icons_added(src) + SSticker.mode.finalize_shadowling(src) + SSticker.mode.update_shadow_icons_added(src) log_admin("[key_name(usr)] has shadowlinged [key_name(current)]") message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]") if("thrall") if(!ishuman(current)) to_chat(usr, "This only works on humans!") return - ticker.mode.add_thrall(src) + SSticker.mode.add_thrall(src) message_admins("[key_name_admin(usr)] has thralled [current].") log_admin("[key_name(usr)] has thralled [current].") @@ -1221,7 +1221,7 @@ return make_Abductor() log_admin("[key_name(usr)] turned [current] into abductor.") - ticker.mode.update_abductor_icons_added(src) + SSticker.mode.update_abductor_icons_added(src) if("equip") if(!ishuman(current)) to_chat(usr, "This only works on humans!") @@ -1306,7 +1306,7 @@ log_admin("[key_name(usr)] has set [key_name(current)]'s telecrystals to [crystals]") message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]") if("uplink") - if(!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors))) to_chat(usr, "Equipping a syndicate failed!") return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") @@ -1392,27 +1392,27 @@ qdel(H) /datum/mind/proc/make_Traitor() - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src + if(!(src in SSticker.mode.traitors)) + SSticker.mode.traitors += src special_role = SPECIAL_ROLE_TRAITOR - ticker.mode.forge_traitor_objectives(src) - ticker.mode.finalize_traitor(src) - ticker.mode.greet_traitor(src) - ticker.mode.update_traitor_icons_added(src) + SSticker.mode.forge_traitor_objectives(src) + SSticker.mode.finalize_traitor(src) + SSticker.mode.greet_traitor(src) + SSticker.mode.update_traitor_icons_added(src) /datum/mind/proc/make_Nuke() - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if(ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if(SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = SPECIAL_ROLE_NUKEOPS assigned_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) current.loc = get_turf(locate("landmark*Syndicate-Spawn")) @@ -1429,34 +1429,34 @@ qdel(H.wear_suit) qdel(H.w_uniform) - ticker.mode.equip_syndicate(current) + SSticker.mode.equip_syndicate(current) /datum/mind/proc/make_Vampire() - if(!(src in ticker.mode.vampires)) - ticker.mode.vampires += src - ticker.mode.grant_vampire_powers(current) + if(!(src in SSticker.mode.vampires)) + SSticker.mode.vampires += src + SSticker.mode.grant_vampire_powers(current) special_role = SPECIAL_ROLE_VAMPIRE - ticker.mode.forge_vampire_objectives(src) - ticker.mode.greet_vampire(src) - ticker.mode.update_vampire_icons_added(src) + SSticker.mode.forge_vampire_objectives(src) + SSticker.mode.greet_vampire(src) + SSticker.mode.update_vampire_icons_added(src) /datum/mind/proc/make_Changeling() - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - ticker.mode.grant_changeling_powers(current) + if(!(src in SSticker.mode.changelings)) + SSticker.mode.changelings += src + SSticker.mode.grant_changeling_powers(current) special_role = SPECIAL_ROLE_CHANGELING - ticker.mode.forge_changeling_objectives(src) - ticker.mode.greet_changeling(src) - ticker.mode.update_change_icons_added(src) + SSticker.mode.forge_changeling_objectives(src) + SSticker.mode.greet_changeling(src) + SSticker.mode.update_change_icons_added(src) /datum/mind/proc/make_Overmind() - if(!(src in ticker.mode.blob_overminds)) - ticker.mode.blob_overminds += src + if(!(src in SSticker.mode.blob_overminds)) + SSticker.mode.blob_overminds += src special_role = SPECIAL_ROLE_BLOB_OVERMIND /datum/mind/proc/make_Wizard() - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src + if(!(src in SSticker.mode.wizards)) + SSticker.mode.wizards += src special_role = SPECIAL_ROLE_WIZARD assigned_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) @@ -1466,18 +1466,18 @@ else current.loc = pick(wizardstart) - ticker.mode.equip_wizard(current) + SSticker.mode.equip_wizard(current) for(var/obj/item/spellbook/S in current.contents) S.op = 0 - ticker.mode.name_wizard(current) - ticker.mode.forge_wizard_objectives(src) - ticker.mode.greet_wizard(src) - ticker.mode.update_wiz_icons_added(src) + SSticker.mode.name_wizard(current) + SSticker.mode.forge_wizard_objectives(src) + SSticker.mode.greet_wizard(src) + SSticker.mode.update_wiz_icons_added(src) /datum/mind/proc/make_Rev() - if(ticker.mode.head_revolutionaries.len>0) + if(SSticker.mode.head_revolutionaries.len>0) // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + var/datum/mind/valid_head = locate() in SSticker.mode.head_revolutionaries if(valid_head) for(var/datum/objective/mutiny/O in valid_head.objectives) var/datum/objective/mutiny/rev_obj = new @@ -1485,13 +1485,13 @@ rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) + SSticker.mode.greet_revolutionary(src,0) + SSticker.mode.head_revolutionaries += src + SSticker.mode.update_rev_icons_added(src) special_role = SPECIAL_ROLE_HEAD_REV - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) + SSticker.mode.forge_revolutionary_objectives(src) + SSticker.mode.greet_revolutionary(src,0) var/list/L = current.get_contents() var/obj/item/flash/flash = locate() in L @@ -1499,7 +1499,7 @@ take_uplink() var/fail = 0 // fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) + fail |= !SSticker.mode.equip_revolutionary(current) /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") @@ -1512,7 +1512,7 @@ if(!ishuman(current)) return - ticker.mode.abductors |= src + SSticker.mode.abductors |= src var/datum/objective/experiment/O = new O.owner = src @@ -1621,15 +1621,15 @@ var/list/implanters var/ref = "\ref[missionary.mind]" - if(!(missionary.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(missionary.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(src) - ticker.mode.implanted.Add(src) - ticker.mode.implanted[src] = missionary.mind + SSticker.mode.implanted.Add(src) + SSticker.mode.implanted[src] = missionary.mind //ticker.mode.implanter[missionary.mind] += src - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += src + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += src special_role = "traitor" to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -1640,8 +1640,8 @@ for(var/datum/objective/objective in objectives) to_chat(current, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(missionary.mind) - ticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(missionary.mind) + SSticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall... var/datum/mindslaves/slaved = missionary.mind.som @@ -1665,7 +1665,7 @@ /datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null) if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages return - ticker.mode.remove_traitor_mind(src) + SSticker.mode.remove_traitor_mind(src) add_attack_logs(zealot_master, current, "Lost control of zealot") zealot_master = null @@ -1696,8 +1696,8 @@ mind.key = key else mind = new /datum/mind(key) - if(ticker) - ticker.minds += mind + if(SSticker) + SSticker.minds += mind else error("mind_initialize(): No ticker ready yet! Please inform Carn") if(!mind.name) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index d8b893caaf9..31c20315508 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,15 +4,21 @@ // Mutable appearances are children of images, just so you know. +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer + MA.plane = plane return MA -/mutable_appearance/clean + /mutable_appearance/clean/New() . = ..() alpha = 255 diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 8c172f3592f..184f1155da2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -25,6 +25,7 @@ var/list/implants = null var/list/cybernetic_implants = null + var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc @@ -151,4 +152,10 @@ H.r_store.add_fingerprint(H, 1) if(H.wear_pda) H.wear_pda.add_fingerprint(H, 1) - return 1 \ No newline at end of file + return 1 + +/datum/outfit/proc/get_chameleon_disguise_info() + var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda) + types += chameleon_extras + listclearnulls(types) + return types diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 3ac473edfeb..09282ec77b1 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -123,7 +123,7 @@ /datum/outfit/admin/syndicate/spy name = "Syndicate Spy" uniform = /obj/item/clothing/under/suit_jacket/really_black - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip uplink_uses = 40 id_access = "Syndicate Agent" @@ -228,7 +228,7 @@ back = /obj/item/storage/backpack belt = /obj/item/storage/belt/utility/full/multitool gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/centcom id = /obj/item/card/id pda = /obj/item/pda @@ -990,7 +990,7 @@ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id/syndicate l_hand = /obj/item/twohanded/dualsaber/red @@ -1021,7 +1021,7 @@ suit = /obj/item/clothing/suit/draculacoat back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id backpack_contents = list( diff --git a/code/datums/periodic_news.dm b/code/datums/periodic_news.dm index cdf2d5b9ad8..9a09ec4a7ec 100644 --- a/code/datums/periodic_news.dm +++ b/code/datums/periodic_news.dm @@ -118,7 +118,7 @@ var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluespace_research, /datum/news_announcement/lotus_tree, /datum/news_announcement/random_junk, /datum/news_announcement/food_riots) proc/process_newscaster() - check_for_newscaster_updates(ticker.mode.newscaster_announcements) + check_for_newscaster_updates(SSticker.mode.newscaster_announcements) var/global/tmp/announced_news_types = list() proc/check_for_newscaster_updates(type) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index d20255bc57c..53517d5dbc9 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -25,6 +25,11 @@ port_id = "ferry" name = "Base Shuttle Template (Ferry)" +/datum/map_template/shuttle/admin + port_id = "admin" + name = "Base Shuttle Template (Admin)" + + // Shuttles start here: @@ -117,3 +122,13 @@ definitely no zombifyin' reagents!" admin_notes = "Meat currently contains no zombifying reagents, people on \ meatspike must be spawned in." + +/datum/map_template/shuttle/admin/hospital + suffix = "hospital" + name = "NHV Asclepius" + description = "Nanostrasen Hospital ship, for medical assistance during disasters." + +/datum/map_template/shuttle/admin/admin + suffix = "admin" + name = "NTV Argos" + description = "Default Admin ship. An older ship used for special operations." diff --git a/code/datums/spells/chaplain.dm b/code/datums/spells/chaplain.dm index f9c2641c50e..bdb7bb3f551 100644 --- a/code/datums/spells/chaplain.dm +++ b/code/datums/spells/chaplain.dm @@ -64,9 +64,9 @@ spawn(0) // allows cast to complete even if recipient ignores the prompt if(alert(target, "[user] wants to bless you, in the name of [user.p_their()] religion. Accept?", "Accept Blessing?", "Yes", "No") == "Yes") // prevents forced conversions - user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "You start blessing [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] starts blessing [target] in the name of [SSticker.Bible_deity_name].", "You start blessing [target] in the name of [SSticker.Bible_deity_name].") if(do_after(user, 150, target = target)) - user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "You have blessed [target] in the name of [ticker.Bible_deity_name].") + user.visible_message("[user] has blessed [target] in the name of [SSticker.Bible_deity_name].", "You have blessed [target] in the name of [SSticker.Bible_deity_name].") if(!target.mind.isblessed) target.mind.isblessed = TRUE user.mind.num_blessed++ diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index f1744e22550..f37d48c0a10 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -20,7 +20,7 @@ action_icon_state = "skeleton" /obj/effect/proc_holder/spell/targeted/lichdom/Destroy() - for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about + for(var/datum/mind/M in SSticker.mode.wizards) //Make sure no other bones are about for(var/obj/effect/proc_holder/spell/S in M.spell_list) if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) return ..() diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index ec43330a8eb..8fdaf8c25df 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1073,6 +1073,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/critter/cow containername = "cow crate" +/datum/supply_packs/organic/pig + name = "Pig Crate" + cost = 25 + containertype = /obj/structure/closet/critter/pig + containername = "pig crate" + /datum/supply_packs/organic/goat name = "Goat Crate" cost = 25 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..b6167338ad3 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -12,9 +12,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/datum/uplink_item/I = new path if(!I.item) continue - if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) + if(I.gamemodes.len && SSticker && !(SSticker.mode.type in I.gamemodes)) continue - if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom)) + if(I.excludefrom.len && SSticker && (SSticker.mode.type in I.excludefrom)) continue if(I.last) last += I @@ -1067,13 +1067,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools category = "Stealth and Camouflage Items" -/datum/uplink_item/stealthy_tools/chameleon_jumpsuit - name = "Chameleon Jumpsuit" - desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." - reference = "CJ" - item = /obj/item/clothing/under/chameleon - cost = 2 - /datum/uplink_item/stealthy_tools/chameleon_stamp name = "Chameleon Stamp" desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ @@ -1092,20 +1085,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 35 /datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Syndicate Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ + They do not work on heavily lubricated surfaces." reference = "NSSS" - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Tactical No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." - reference = "NNSSS" + reference = "TNSSS" cost = 4 //but they aren't - gamemodes = list(/datum/game_mode/nuclear) excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" @@ -1146,12 +1138,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/id/syndicate cost = 2 -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable." - reference = "VC" - item = /obj/item/clothing/mask/gas/voice - cost = 3 +/datum/uplink_item/stealthy_tools/chameleon + name = "Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp." + reference = "CHAM" + item = /obj/item/storage/box/syndie_kit/chameleon + cost = 2 /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1210,7 +1203,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" - desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." + desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." reference = "HBIK" item = /obj/item/storage/backpack/clown/syndie cost = 6 @@ -1544,10 +1537,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 12 /datum/uplink_item/cyber_implants/reviver - name = "Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool." + name = "Hardened Reviver Implant" + desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool." reference = "CIR" - item = /obj/item/organ/internal/cyberimp/chest/reviver + item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened cost = 8 // POINTLESS BADASSERY diff --git a/code/datums/vision_override.dm b/code/datums/vision_override.dm index 140ceb8d5fa..86aab6d65ec 100644 --- a/code/datums/vision_override.dm +++ b/code/datums/vision_override.dm @@ -1,13 +1,15 @@ /datum/vision_override var/name = "vision override" - var/see_in_dark = 0 - var/see_invisible = 0 - var/light_sensitive = 0 + var/sight_flags = 0 + var/see_in_dark = 0 + var/lighting_alpha + + var/light_sensitive = 0 /datum/vision_override/nightvision see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /datum/vision_override/nightvision/thermals sight_flags = SEE_MOBS diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 2f3a4c4bcba..42700f2725f 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -28,6 +28,7 @@ var/impacted_z_levels // The list of z-levels that this weather is actively affecting var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. + var/overlay_plane = BLACKNESS_PLANE var/aesthetic = FALSE //If the weather has no purpose other than looks var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather @@ -121,6 +122,7 @@ for(var/V in impacted_areas) var/area/N = V N.layer = overlay_layer + N.plane = overlay_plane N.icon = 'icons/effects/weather_effects.dmi' N.invisibility = 0 N.color = weather_color @@ -135,6 +137,6 @@ N.color = null N.icon_state = "" N.icon = 'icons/turf/areas.dmi' - N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial - N.invisibility = INVISIBILITY_MAXIMUM + N.layer = initial(N.layer) + N.plane = initial(N.plane) N.set_opacity(FALSE) diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 6d06e3ca1ef..72f49ad5057 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -19,6 +19,7 @@ target_trait = STATION_LEVEL overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only + overlay_plane = FLOOR_PLANE immunity_type = "lava" diff --git a/code/game/area/Dynamic areas.dm b/code/game/area/Dynamic areas.dm index 1cb24e23512..c6d1154847b 100644 --- a/code/game/area/Dynamic areas.dm +++ b/code/game/area/Dynamic areas.dm @@ -24,18 +24,21 @@ match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/dynamic/source/lobby_russian name = "\improper Russian Lounge" match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/dynamic/source/lobby_disco name = "\improper Disco Lounge" match_tag = "arrivals" match_width = 5 match_height = 4 - requires_power = 0 \ No newline at end of file + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index dcf5223e29c..82fe75b3cf7 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1,2735 +1,2339 @@ -/* - -### This file contains a list of all the areas in your station. Format is as follows: - -/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) - name = "NICE NAME" (not required but makes things really nice) - icon = "ICON FILENAME" (defaults to areas.dmi) - icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) - requires_power = 0 (defaults to 1) - music = "music/music.ogg" (defaults to "music/music.ogg") - -NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 - -*/ - - - -/area - var/fire = null - var/atmosalm = ATMOS_ALARM_NONE - var/poweralm = 1 - var/party = null - var/report_alerts = 1 // Should atmos alerts notify the AI/computers - level = null - name = "Space" - icon = 'icons/turf/areas.dmi' - icon_state = "unknown" - layer = AREA_LAYER - luminosity = 0 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - invisibility = INVISIBILITY_LIGHTING - var/valid_territory = TRUE //used for cult summoning areas on station zlevel - var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. - var/lightswitch = 1 - - var/eject = null - - var/debug = 0 - var/requires_power = 1 - var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() - - var/power_equip = 1 - var/power_light = 1 - var/power_environ = 1 - var/music = null - var/used_equip = 0 - var/used_light = 0 - var/used_environ = 0 - var/static_equip - var/static_light = 0 - var/static_environ - - var/has_gravity = 1 - var/list/apc = list() - var/no_air = null -// var/list/lights // list of all lights on this area - var/air_doors_activated = 0 - - var/tele_proof = 0 - var/no_teleportlocs = 0 - - var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) - var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? - var/nad_allowed = FALSE //is the station NAD allowed on this area? - - var/fast_despawn = FALSE - -/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ -/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ -var/list/teleportlocs = list() -/hook/startup/proc/process_teleport_locs() - for(var/area/AR in world) - if(AR.no_teleportlocs) continue - if(teleportlocs.Find(AR.name)) continue - var/turf/picked = safepick(get_area_turfs(AR.type)) - if(picked && is_station_level(picked.z)) - teleportlocs += AR.name - teleportlocs[AR.name] = AR - - teleportlocs = sortAssoc(teleportlocs) - - return 1 - -var/list/ghostteleportlocs = list() -/hook/startup/proc/process_ghost_teleport_locs() - for(var/area/AR in world) - if(ghostteleportlocs.Find(AR.name)) continue - var/list/turfs = get_area_turfs(AR.type) - if(turfs.len) - ghostteleportlocs += AR.name - ghostteleportlocs[AR.name] = AR - - ghostteleportlocs = sortAssoc(ghostteleportlocs) - - return 1 - -/*-----------------------------------------------------------------------------*/ - -/area/engine/ - -/area/turret_protected/ - -/area/arrival - requires_power = 0 - -/area/arrival/start - name = "\improper Arrival Area" - icon_state = "start" - -/area/admin/ - name = "\improper Admin Room" - icon_state = "start" - requires_power = 0 - dynamic_lighting = 0 - - -/area/adminconstruction - name = "\improper Admin Testing Area" - icon_state = "start" - requires_power = 0 - dynamic_lighting = 0 - -/area/space - icon_state = "space" - requires_power = 1 - always_unpowered = 1 - power_light = 0 - power_equip = 0 - power_environ = 0 - valid_territory = FALSE - outdoors = 1 - ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') - -/area/space/atmosalert() - return - -/area/space/fire_alert() - return - -/area/space/fire_reset() - return - -/area/space/readyalert() - return - -/area/space/partyalert() - return - -//These are shuttle areas, they must contain two areas in a subgroup if you want to move a shuttle from one -//place to another. Look at escape shuttle for example. -//All shuttles show now be under shuttle since we have smooth-wall code. - -/area/shuttle - no_teleportlocs = 1 - requires_power = 0 - valid_territory = FALSE - -/area/shuttle/arrival - name = "\improper Arrival Shuttle" - -/area/shuttle/arrival/pre_game - icon_state = "shuttle2" - -/area/shuttle/arrival/station - icon_state = "shuttle" - -/area/shuttle/auxillary_base - icon_state = "shuttle" - -/area/shuttle/escape - name = "\improper Emergency Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle2" - nad_allowed = TRUE - -/area/shuttle/pod_1 - name = "\improper Escape Pod One" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_2 - name = "\improper Escape Pod Two" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_3 - name = "\improper Escape Pod Three" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/pod_4 - name = "\improper Escape Pod Four" - music = "music/escape.ogg" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/escape_pod1 - name = "\improper Escape Pod One" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod1/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod1/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod1/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod2 - name = "\improper Escape Pod Two" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod2/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod2/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod2/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod3 - name = "\improper Escape Pod Three" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod3/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod3/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod3/transit - icon_state = "shuttle" - -/area/shuttle/escape_pod5 //Pod 4 was lost to meteors - name = "\improper Escape Pod Five" - music = "music/escape.ogg" - nad_allowed = TRUE - -/area/shuttle/escape_pod5/station - icon_state = "shuttle2" - -/area/shuttle/escape_pod5/centcom - icon_state = "shuttle" - -/area/shuttle/escape_pod5/transit - icon_state = "shuttle" - -/area/shuttle/mining - name = "\improper Mining Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/transport - icon_state = "shuttle" - name = "\improper Transport Shuttle" - -/area/shuttle/transport1 - icon_state = "shuttle" - name = "\improper Transport Shuttle" - -/area/shuttle/alien/base - icon_state = "shuttle" - name = "\improper Alien Shuttle Base" - requires_power = 1 - -/area/shuttle/alien/mine - icon_state = "shuttle" - name = "\improper Alien Shuttle Mine" - requires_power = 1 - -/area/shuttle/gamma/space - icon_state = "shuttle" - name = "\improper Gamma Armory" - requires_power = 0 - -/area/shuttle/gamma/station - icon_state = "shuttle" - name = "\improper Gamma Armory Station" - requires_power = 0 - -/area/shuttle/prison/ - name = "\improper Prison Shuttle" - -/area/shuttle/prison/station - icon_state = "shuttle" - -/area/shuttle/prison/prison - icon_state = "shuttle2" - -/area/shuttle/siberia - name = "\improper Labor Camp Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/specops - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered" - -/area/shuttle/specops/centcom - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered" - -/area/shuttle/specops/station - name = "\improper Special Ops Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/syndicate_elite - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered" - nad_allowed = TRUE - -/area/shuttle/syndicate_elite/mothership - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered" - -/area/shuttle/syndicate_elite/station - name = "\improper Syndicate Elite Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/syndicate_sit - name = "\improper Syndicate SIT Shuttle" - icon_state = "shuttlered" - nad_allowed = TRUE - -/area/shuttle/assault_pod - name = "Steel Rain" - icon_state = "shuttle" - -/area/shuttle/administration - name = "\improper Administration Shuttle" - icon_state = "shuttlered" - -/area/shuttle/administration/centcom - name = "\improper Administration Shuttle Centcom" - icon_state = "shuttlered" - -/area/shuttle/administration/station - name = "\improper Administration Shuttle" - icon_state = "shuttlered2" - -/area/shuttle/thunderdome - name = "honk" - -/area/shuttle/thunderdome/grnshuttle - name = "\improper Thunderdome GRN Shuttle" - icon_state = "green" - -/area/shuttle/thunderdome/grnshuttle/dome - name = "\improper GRN Shuttle" - icon_state = "shuttlegrn" - -/area/shuttle/thunderdome/grnshuttle/station - name = "\improper GRN Station" - icon_state = "shuttlegrn2" - -/area/shuttle/thunderdome/redshuttle - name = "\improper Thunderdome RED Shuttle" - icon_state = "red" - -/area/shuttle/thunderdome/redshuttle/dome - name = "\improper RED Shuttle" - icon_state = "shuttlered" - -/area/shuttle/thunderdome/redshuttle/station - name = "\improper RED Station" - icon_state = "shuttlered2" -// === Trying to remove these areas: - -/area/shuttle/research - name = "\improper Research Shuttle" - music = "music/escape.ogg" - icon_state = "shuttle" - -/area/shuttle/research/station - icon_state = "shuttle2" - -/area/shuttle/research/outpost - icon_state = "shuttle" - -/area/shuttle/vox - name = "\improper Vox Skipjack" - icon_state = "shuttle" - requires_power = 0 - -/area/shuttle/vox/station - name = "\improper Vox Skipjack" - icon_state = "yellow" - requires_power = 0 - -/area/shuttle/salvage - name = "\improper Salvage Ship" - icon_state = "yellow" - requires_power = 0 - -/area/shuttle/salvage/start - name = "\improper Middle of Nowhere" - icon_state = "yellow" - -/area/shuttle/salvage/arrivals - name = "\improper Space Station Auxiliary Docking" - icon_state = "yellow" - -/area/shuttle/salvage/derelict - name = "\improper Derelict Station" - icon_state = "yellow" - -/area/shuttle/salvage/djstation - name = "\improper Ruskie DJ Station" - icon_state = "yellow" - -/area/shuttle/salvage/north - name = "\improper North of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/east - name = "\improper East of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/south - name = "\improper South of the Station" - icon_state = "yellow" - -/area/shuttle/salvage/commssat - name = "\improper The Communications Satellite" - icon_state = "yellow" - -/area/shuttle/salvage/mining - name = "\improper South-West of the Mining Asteroid" - icon_state = "yellow" - -/area/shuttle/salvage/abandoned_ship - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/salvage/clown_asteroid - name = "\improper Clown Asteroid" - icon_state = "yellow" - -/area/shuttle/salvage/trading_post - name = "\improper Trading Post" - icon_state = "yellow" - -/area/shuttle/salvage/transit - name = "\improper hyperspace" - icon_state = "shuttle" - -/area/shuttle/supply - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - -/area/shuttle/abandoned - name = "Abandoned Ship" - icon_state = "shuttle" - -/area/shuttle/syndicate - name = "Syndicate Nuclear Team Shuttle" - icon_state = "shuttle" - nad_allowed = TRUE - -/area/shuttle/trade - name = "Trade Shuttle" - icon_state = "shuttle" - requires_power = 0 - -/area/shuttle/trade/sol - name = "Sol Freighter" - -/area/shuttle/freegolem - name = "Free Golem Ship" - icon_state = "purple" - xenobiology_compatible = TRUE - -/area/airtunnel1/ // referenced in airtunnel.dm:759 - -/area/dummy/ // Referenced in engine.dm:261 - -/area/start // will be unused once kurper gets his login interface patch done - name = "start area" - icon_state = "start" - requires_power = 0 - luminosity = 1 - dynamic_lighting = 0 - has_gravity = 1 - -// === end remove - -/area/alien - name = "\improper Alien base" - icon_state = "yellow" - requires_power = 0 - -// CENTCOM - -/area/centcom - name = "\improper Centcom" - icon_state = "centcom" - requires_power = 0 - dynamic_lighting = 0 - nad_allowed = TRUE - -/area/centcom/control - name = "\improper Centcom Control" - icon_state = "centcom_ctrl" - -/area/centcom/evac - name = "\improper Centcom Emergency Shuttle" - icon_state = "centcom_evac" - -/area/centcom/suppy - name = "\improper Centcom Supply Shuttle" - icon_state = "centcom_supply" - -/area/centcom/ferry - name = "\improper Centcom Transport Shuttle" - icon_state = "centcom_ferry" - -/area/centcom/shuttle - name = "\improper Centcom Administration Shuttle" - -/area/centcom/test - name = "\improper Centcom Testing Facility" - -/area/centcom/living - name = "\improper Centcom Living Quarters" - -/area/centcom/specops - name = "\improper Centcom Special Ops" - icon_state = "centcom_specops" - -/area/centcom/gamma - name = "\improper Centcom Gamma Armory" - icon_state = "centcom_gamma" - -/area/centcom/holding - name = "\improper Holding Facility" - -/area/centcom/bathroom - name = "\improper Centcom Emergency Shuttle Bathrooms" - -//SYNDICATES - -/area/syndicate_mothership - name = "\improper Syndicate Forward Base" - icon_state = "syndie-ship" - requires_power = 0 - nad_allowed = TRUE - -/area/syndicate_mothership/control - name = "\improper Syndicate Control Room" - icon_state = "syndie-control" - -/area/syndicate_mothership/elite_squad - name = "\improper Syndicate Elite Squad" - icon_state = "syndie-elite" - -/area/syndicate_mothership/infteam - name = "\improper Syndicate Infiltrators" - icon_state = "syndie-elite" - -//EXTRA - -/area/asteroid // -- TLE - name = "\improper Asteroid" - icon_state = "asteroid" - requires_power = 0 - valid_territory = FALSE - -/area/asteroid/cave // -- TLE - name = "\improper Asteroid - Underground" - icon_state = "cave" - requires_power = 0 - outdoors = 1 - -/area/asteroid/artifactroom - name = "\improper Asteroid - Artifact" - icon_state = "cave" - -/area/tdome - name = "\improper Thunderdome" - icon_state = "thunder" - requires_power = 0 - dynamic_lighting = 0 - - -/area/tdome/arena_source - name = "\improper Thunderdome Arena Template" - icon_state = "thunder" - -/area/tdome/arena - name = "\improper Thunderdome Arena" - icon_state = "thunder" - -/area/tdome/tdome1 - name = "\improper Thunderdome (Team 1)" - icon_state = "green" - -/area/tdome/tdome2 - name = "\improper Thunderdome (Team 2)" - icon_state = "yellow" - -/area/tdome/tdomeadmin - name = "\improper Thunderdome (Admin.)" - icon_state = "purple" - -/area/tdome/tdomeobserve - name = "\improper Thunderdome (Observer.)" - icon_state = "purple" - -/area/exploration/methlab - name = "\improper Abandoned Drug Lab" - icon_state = "green" - -//ENEMY - -//names are used -/area/syndicate_station - name = "\improper Syndicate Station" - icon_state = "yellow" - requires_power = 0 - -/area/syndicate_station/start - name = "\improper Syndicate Forward Operating Base" - icon_state = "yellow" - -/area/syndicate_station/southwest - name = "\improper South-West of SS13" - icon_state = "southwest" - -/area/syndicate_station/northwest - name = "\improper North-West of SS13" - icon_state = "northwest" - -/area/syndicate_station/northeast - name = "\improper North-East of SS13" - icon_state = "northeast" - -/area/syndicate_station/southeast - name = "\improper South-East of SS13" - icon_state = "southeast" - -/area/syndicate_station/north - name = "\improper North of SS13" - icon_state = "north" - -/area/syndicate_station/south - name = "\improper South of SS13" - icon_state = "south" - -/area/syndicate_station/commssat - name = "\improper South of the Communication Satellite" - icon_state = "south" - -/area/syndicate_station/mining - name = "\improper North-East of the Mining Asteroid" - icon_state = "north" - -/area/syndicate_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - -//Abductors -/area/abductor_ship - name = "\improper Abductor Ship" - icon_state = "yellow" - requires_power = 0 - has_gravity = 1 - dynamic_lighting = 0 - -/area/wizard_station - name = "\improper Wizard's Den" - icon_state = "yellow" - requires_power = 0 - -/area/ninja - name = "\improper Ninja Area Parent" - icon_state = "ninjabase" - requires_power = 0 - no_teleportlocs = 1 - -/area/ninja/outpost - name = "\improper SpiderClan Outpost" - -/area/ninja/holding - name = "\improper SpiderClan Holding Facility" - -/area/vox_station - name = "\improper Vox Base" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = 0 - no_teleportlocs = 1 - -/area/vox_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - requires_power = 0 - -/area/vox_station/southwest_solars - name = "\improper Aft Port Solars" - icon_state = "southwest" - requires_power = 0 - -/area/vox_station/northwest_solars - name = "\improper Fore Port Solars" - icon_state = "northwest" - requires_power = 0 - -/area/vox_station/northeast_solars - name = "\improper Fore Starboard Solars" - icon_state = "northeast" - requires_power = 0 - -/area/vox_station/southeast_solars - name = "\improper Aft Starboard Solars" - icon_state = "southeast" - requires_power = 0 - -/area/trader_station - name = "Trade Base" - icon_state = "yellow" - requires_power = 0 - -/area/trader_station/sol - name = "Jupiter Station 6" - -/area/vox_station/mining - name = "\improper Nearby Mining Asteroid" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/start - name = "\improper Alien Shuttle" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/transit - name = "\improper Hyperspace" - icon_state = "shuttle" - requires_power = 0 - -/area/xenos_station/southwest - name = "\improper Aft Port Solars Landing Area" - icon_state = "southwest" - requires_power = 0 - -/area/xenos_station/northwest - name = "\improper Fore Port Solars Landing Area" - icon_state = "northwest" - requires_power = 0 - -/area/xenos_station/northeast - name = "\improper Fore Starboard Solars Landing Area" - icon_state = "northeast" - requires_power = 0 - -/area/xenos_station/southeast - name = "\improper Aft Starboard Solars Landing Area" - icon_state = "southeast" - requires_power = 0 - -/area/xenos_station/east - name = "\improper East Landing Area" - icon_state = "east" - requires_power = 0 - -/area/xenos_station/west - name = "\improper West Landing Area" - icon_state = "west" - requires_power = 0 - -/area/xenos_station/researchoutpost - name = "\improper Research Outpost Landing Area" - icon_state = "north" - requires_power = 0 - -/area/xenos_station/miningoutpost - name = "\improper Mining Outpost Landing Area" - icon_state = "south" - requires_power = 0 - -//PRISON -/area/prison - name = "\improper Prison Station" - icon_state = "brig" - -/area/prison/arrival_airlock - name = "\improper Prison Station Airlock" - icon_state = "green" - requires_power = 0 - -/area/prison/control - name = "\improper Prison Security Checkpoint" - icon_state = "security" - -/area/prison/crew_quarters - name = "\improper Prison Security Quarters" - icon_state = "security" - -/area/prison/rec_room - name = "\improper Prison Rec Room" - icon_state = "green" - -/area/prison/closet - name = "\improper Prison Supply Closet" - icon_state = "dk_yellow" - -/area/prison/hallway/fore - name = "\improper Prison Fore Hallway" - icon_state = "yellow" - -/area/prison/hallway/aft - name = "\improper Prison Aft Hallway" - icon_state = "yellow" - -/area/prison/hallway/port - name = "\improper Prison Port Hallway" - icon_state = "yellow" - -/area/prison/hallway/starboard - name = "\improper Prison Starboard Hallway" - icon_state = "yellow" - -/area/prison/morgue - name = "\improper Prison Morgue" - icon_state = "morgue" - -/area/prison/medical_research - name = "\improper Prison Genetic Research" - icon_state = "medresearch" - -/area/prison/medical - name = "\improper Prison Medbay" - icon_state = "medbay" - -/area/prison/solar - name = "\improper Prison Solar Array" - icon_state = "storage" - requires_power = 0 - -/area/prison/podbay - name = "\improper Prison Podbay" - icon_state = "dk_yellow" - -/area/prison/solar_control - name = "\improper Prison Solar Array Control" - icon_state = "dk_yellow" - -/area/prison/solitary - name = "\improper Solitary Confinement" - icon_state = "brig" - fast_despawn = TRUE - -/area/prison/cell_block - name = "\improper Prison Cell Block" - icon_state = "brig" - fast_despawn = TRUE - -/area/prison/cell_block/A - name = "\improper Prison Cell Block A" - icon_state = "brig" - -/area/prison/cell_block/B - name = "\improper Prison Cell Block B" - icon_state = "brig" - -/area/prison/cell_block/C - name = "\improper Prison Cell Block C" - icon_state = "brig" - -//Labor camp -/area/mine/laborcamp - name = "Labor Camp" - icon_state = "brig" - -/area/mine/laborcamp/security - name = "Labor Camp Security" - icon_state = "security" - -//STATION13 - -/area/atmos - name = "Atmospherics" - icon_state = "atmos" - -/area/atmos/control - name = "Atmospherics Control Room" - icon_state = "atmos" - -/area/atmos/distribution - name = "Atmospherics Distribution Loop" - icon_state = "atmos" - -//Maintenance -/area/maintenance - ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') - valid_territory = FALSE - -/area/maintenance/atmos_control - name = "Atmospherics Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fpmaint - name = "EVA Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fpmaint2 - name = "Arrivals North Maintenance" - icon_state = "fpmaint" - -/area/maintenance/fsmaint - name = "Dormitory Maintenance" - icon_state = "fsmaint" - -/area/maintenance/fsmaint2 - name = "Bar Maintenance" - icon_state = "fsmaint" - -/area/maintenance/asmaint - name = "Medbay Maintenance" - icon_state = "asmaint" - -/area/maintenance/asmaint2 - name = "Science Maintenance" - icon_state = "asmaint" - -/area/maintenance/apmaint - name = "Cargo Maintenance" - icon_state = "apmaint" - -/area/maintenance/maintcentral - name = "Bridge Maintenance" - icon_state = "maintcentral" - -/area/maintenance/fore - name = "Fore Maintenance" - icon_state = "fmaint" - -/area/maintenance/starboard - name = "Starboard Maintenance" - icon_state = "smaint" - -/area/maintenance/port - name = "Locker Room Maintenance" - icon_state = "pmaint" - -/area/maintenance/aft - name = "Engineering Maintenance" - icon_state = "amaint" - -/area/maintenance/engi_shuttle - name = "Engineering Shuttle Access" - icon_state = "maint_e_shuttle" - -/area/maintenance/storage - name = "Atmospherics Maintenance" - icon_state = "green" - -/area/maintenance/incinerator - name = "\improper Incinerator" - icon_state = "disposal" - -/area/maintenance/turbine - name = "\improper Turbine" - icon_state = "disposal" - -/area/maintenance/disposal - name = "Waste Disposal" - icon_state = "disposal" - -/area/maintenance/genetics - name = "Genetics Maintenance" - icon_state = "asmaint" - - -/area/maintenance/electrical - name = "Electrical Maintenance" - icon_state = "yellow" - -/area/maintenance/abandonedbar - name = "Maintenance Bar" - icon_state = "yellow" - power_equip = 0 - power_light = 0 - power_environ = 0 - -/area/maintenance/electrical_shop - name ="Electronics Den" - icon_state = "yellow" - -/area/maintenance/gambling_den - name = "Gambling Den" - icon_state = "yellow" - -/area/maintenance/consarea - name = "Alternate Construction Area" - icon_state = "yellow" - - -//Hallway - -/area/hallway/primary/fore - name = "\improper Fore Primary Hallway" - icon_state = "hallF" - -/area/hallway/primary/starboard - name = "\improper Starboard Primary Hallway" - icon_state = "hallS" - -/area/hallway/primary/starboard/west -/area/hallway/primary/starboard/east - -/area/hallway/primary/aft - name = "\improper Aft Primary Hallway" - icon_state = "hallA" - - -/area/hallway/primary/port - name = "\improper Port Primary Hallway" - icon_state = "hallP" - -/area/hallway/primary/port/west - name = "\improper Port West Hallway" - -/area/hallway/primary/port/east - name = "\improper Port East Hallway" - -/area/hallway/primary/central - name = "\improper Central Primary Hallway" - icon_state = "hallC" - -/area/hallway/primary/central/north -/area/hallway/primary/central/south -/area/hallway/primary/central/west -/area/hallway/primary/central/east -/area/hallway/primary/central/nw -/area/hallway/primary/central/ne -/area/hallway/primary/central/sw -/area/hallway/primary/central/se - -/area/hallway/secondary/exit - name = "\improper Escape Shuttle Hallway" - icon_state = "escape" - -/area/hallway/secondary/construction - name = "\improper Construction Area" - icon_state = "construction" - -/area/hallway/secondary/entry - name = "\improper Arrival Shuttle Hallway" - icon_state = "entry" - -/area/hallway/secondary/entry/north - -/area/hallway/secondary/entry/south - -/area/hallway/secondary/entry/louge - name = "\improper Arrivals Lounge" - - -//Command - -/area/bridge - name = "\improper Bridge" - icon_state = "bridge" - music = "signal" - -/area/bridge/meeting_room - name = "\improper Heads of Staff Meeting Room" - icon_state = "meeting" - music = null - -/area/crew_quarters/captain - name = "\improper Captain's Office" - icon_state = "captain" - -/area/crew_quarters/captain/bedroom - name = "\improper Captain's Bedroom" - icon_state = "captain" - -/area/crew_quarters/recruit - name = "\improper Recruitment Office" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hop - name = "\improper Head of Personnel's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hor - name = "\improper Research Director's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/chief - name = "\improper Chief Engineer's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/hos - name = "\improper Head of Security's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/heads/cmo - name = "\improper Chief Medical Officer's Quarters" - icon_state = "head_quarters" - -/area/crew_quarters/courtroom - name = "\improper Courtroom" - icon_state = "courtroom" - -/area/crew_quarters/heads - name = "\improper Head of Personnel's Office" - icon_state = "head_quarters" - -/area/crew_quarters/hor - name = "\improper Research Director's Office" - icon_state = "head_quarters" - -/area/crew_quarters/hos - name = "\improper Head of Security's Office" - icon_state = "head_quarters" - -/area/crew_quarters/chief - name = "\improper Chief Engineer's Office" - icon_state = "head_quarters" - -/area/mint - name = "\improper Mint" - icon_state = "green" - -/area/comms - name = "\improper Communications Relay" - icon_state = "tcomsatcham" - -/area/server - name = "\improper Messaging Server Room" - icon_state = "server" - -/area/ntrep - name = "\improper Nanotrasen Representative's Office" - icon_state = "bluenew" - -/area/blueshield - name = "\improper Blueshield's Office" - icon_state = "blueold" - -/area/centcomdocks - name = "\improper Central Command Docks" - icon_state = "centcom" - -//Crew - -/area/crew_quarters - name = "\improper Dormitories" - icon_state = "Sleep" - -/area/crew_quarters/toilet - name = "\improper Dormitory Toilets" - icon_state = "toilet" - -/area/crew_quarters/sleep - name = "\improper Dormitories" - icon_state = "Sleep" - valid_territory = FALSE - -/area/crew_quarters/sleep_male - name = "\improper Male Dorm" - icon_state = "Sleep" - -/area/crew_quarters/sleep_male/toilet_male - name = "\improper Male Toilets" - icon_state = "toilet" - -/area/crew_quarters/sleep_female - name = "\improper Female Dorm" - icon_state = "Sleep" - -/area/crew_quarters/sleep_female/toilet_female - name = "\improper Female Toilets" - icon_state = "toilet" - -/area/crew_quarters/locker - name = "\improper Locker Room" - icon_state = "locker" - -/area/crew_quarters/locker/locker_toilet - name = "\improper Locker Toilets" - icon_state = "toilet" - -/area/crew_quarters/fitness - name = "\improper Fitness Room" - icon_state = "fitness" - -/area/crew_quarters/dorms - name = "\improper Dorms" - icon_state = "dorms" - -/area/crew_quarters/arcade - name = "\improper Arcade" - icon_state = "arcade" - -/area/crew_quarters/cafeteria - name = "\improper Cafeteria" - icon_state = "cafeteria" - -/area/crew_quarters/kitchen - name = "\improper Kitchen" - icon_state = "kitchen" - -/area/crew_quarters/bar - name = "\improper Bar" - icon_state = "bar" - -/area/crew_quarters/bar/atrium - name = "Atrium" - icon_state = "bar" - -/area/crew_quarters/theatre - name = "\improper Theatre" - icon_state = "Theatre" - -/area/crew_quarters/mrchangs - name = "\improper Mr Chang's" - icon_state = "Theatre" - -/area/library - name = "\improper Library" - icon_state = "library" - -/area/library/abandoned - name = "\improper Abandoned Library" - icon_state = "library" - -/area/chapel/main - name = "\improper Chapel" - icon_state = "chapel" - ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') - -/area/chapel/office - name = "\improper Chapel Office" - icon_state = "chapeloffice" - -/area/escapepodbay - name = "\improper Escape Shuttle Hallway Podbay" - icon_state = "escape" - -/area/lawoffice - name = "\improper Law Office" - icon_state = "law" - -/area/magistrateoffice - name = "\improper Magistrate's Office" - icon_state = "magistrate" - -/area/clownoffice - name = "\improper Clown's Office" - icon_state = "clown_office" - -/area/mimeoffice - name = "\improper Mime's Office" - icon_state = "mime_office" - -/area/civilian/barber - name = "\improper Barber Shop" - icon_state = "barber" - -/area/civilian/clothing - name = "\improper Clothing Shop" - icon_state = "Theatre" - -/area/civilian/pet_store - name = "\improper Pet Store" - icon_state = "pet_store" - -/area/holodeck - name = "\improper Holodeck" - icon_state = "Holodeck" - dynamic_lighting = 0 - -/area/holodeck/alphadeck - name = "\improper Holodeck Alpha" - - -/area/holodeck/source_plating - name = "\improper Holodeck - Off" - icon_state = "Holodeck" - -/area/holodeck/source_emptycourt - name = "\improper Holodeck - Empty Court" - -/area/holodeck/source_boxingcourt - name = "\improper Holodeck - Boxing Court" - -/area/holodeck/source_basketball - name = "\improper Holodeck - Basketball Court" - -/area/holodeck/source_thunderdomecourt - name = "\improper Holodeck - Thunderdome Court" - -/area/holodeck/source_beach - name = "\improper Holodeck - Beach" - icon_state = "Holodeck" // Lazy. - -/area/holodeck/source_burntest - name = "\improper Holodeck - Atmospheric Burn Test" - -/area/holodeck/source_wildlife - name = "\improper Holodeck - Wildlife Simulation" - -/area/holodeck/source_meetinghall - name = "\improper Holodeck - Meeting Hall" - -/area/holodeck/source_theatre - name = "\improper Holodeck - Theatre" - -/area/holodeck/source_picnicarea - name = "\improper Holodeck - Picnic Area" - -/area/holodeck/source_snowfield - name = "\improper Holodeck - Snow Field" - -/area/holodeck/source_desert - name = "\improper Holodeck - Desert" - -/area/holodeck/source_space - name = "\improper Holodeck - Space" - -/area/holodeck/source_knightarena - name = "\improper Holodeck - Knight Arena" - - -//Embassies -/area/embassy/ - name = "\improper Embassy Hallway" - -/area/embassy/tajaran - name = "\improper Tajaran Embassy" - icon_state = "tajaran" - -/area/embassy/skrell - name = "\improper Skrell Embassy" - icon_state = "skrell" - -/area/embassy/unathi - name = "\improper Unathi Embassy" - icon_state = "unathi" - -/area/embassy/kidan - name = "\improper Kidan Embassy" - icon_state = "kidan" - -/area/embassy/diona - name = "\improper Diona Embassy" - icon_state = "diona" - -/area/embassy/slime - name = "\improper Slime Person Embassy" - icon_state = "slime" - -/area/embassy/grey - name = "\improper Grey Embassy" - icon_state = "grey" - -/area/embassy/vox - name = "\improper Vox Embassy" - icon_state = "vox" - - - -//Engineering -/area/engine - ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg') - -/area/engine/engine_smes - name = "\improper Engineering SMES" - icon_state = "engine_smes" - requires_power = 0//This area only covers the batteries and they deal with their own power - -/area/engine/engineering - name = "Engineering" - icon_state = "engine_smes" - -/area/engine/break_room - name = "\improper Engineering Foyer" - icon_state = "engine" - -/area/engine/equipmentstorage - name = "\improper Engineering Equipment Storage" - icon_state = "storage" - -/area/engine/hardsuitstorage - name = "\improper Engineering Hardsuit Storage" - icon_state = "storage" - -/area/engine/controlroom - name = "\improper Engineering Control Room" - icon_state = "engine_control" - -/area/engine/gravitygenerator - name = "\improper Gravity Generator" - icon_state = "engine" - -/area/engine/chiefs_office - name = "\improper Chief Engineer's office" - icon_state = "engine_control" - -/area/engine/mechanic_workshop - name = "\improper Mechanic Workshop" - icon_state = "engine" - -/area/engine/mechanic_workshop/hanger - name = "\improper Hanger Bay" - icon_state = "engine" - -/area/engine/supermatter - name = "\improper Supermatter Engine" - icon_state = "engine" - -//Solars - -/area/solar - requires_power = 0 - dynamic_lighting = 0 - valid_territory = FALSE - -/area/solar/auxport - name = "\improper Fore Port Solar Array" - icon_state = "panelsA" - -/area/solar/auxstarboard - name = "\improper Fore Starboard Solar Array" - icon_state = "panelsA" - -/area/solar/fore - name = "\improper Fore Solar Array" - icon_state = "yellow" - -/area/solar/aft - name = "\improper Aft Solar Array" - icon_state = "aft" - -/area/solar/starboard - name = "\improper Aft Starboard Solar Array" - icon_state = "panelsS" - -/area/solar/port - name = "\improper Aft Port Solar Array" - icon_state = "panelsP" - -/area/maintenance/auxsolarport - name = "\improper Fore Port Solar Maintenance" - icon_state = "SolarcontrolA" - -/area/maintenance/starboardsolar - name = "\improper Aft Starboard Solar Maintenance" - icon_state = "SolarcontrolS" - -/area/maintenance/portsolar - name = "\improper Aft Port Solar Maintenance" - icon_state = "SolarcontrolP" - -/area/maintenance/auxsolarstarboard - name = "\improper Fore Starboard Solar Maintenance" - icon_state = "SolarcontrolA" - - -/area/assembly/chargebay - name = "\improper Mech Bay" - icon_state = "mechbay" - -/area/assembly/showroom - name = "\improper Robotics Showroom" - icon_state = "showroom" - -/area/assembly/robotics - name = "\improper Robotics Lab" - icon_state = "ass_line" - -/area/assembly/assembly_line //Derelict Assembly Line - name = "\improper Assembly Line" - icon_state = "ass_line" - power_equip = 0 - power_light = 0 - power_environ = 0 - -//Teleporter - -/area/teleporter - name = "\improper Teleporter" - icon_state = "teleporter" - music = "signal" - -/area/gateway - name = "\improper Gateway" - icon_state = "teleporter" - music = "signal" - -/area/AIsattele - name = "\improper Abandoned Teleporter" - icon_state = "teleporter" - music = "signal" - ambientsounds = list('sound/ambience/ambimalf.ogg') - -/area/toxins/explab - name = "\improper E.X.P.E.R.I-MENTOR Lab" - icon_state = "toxmisc" - -/area/toxins/explab_chamber - name = "\improper E.X.P.E.R.I-MENTOR Chamber" - icon_state = "toxmisc" - -//MedBay - -/area/medical/medbay - name = "\improper Medbay" - icon_state = "medbay" - music = 'sound/ambience/signal.ogg' - -//Medbay is a large area, these additional areas help level out APC load. -/area/medical/medbay2 - name = "\improper Medbay" - icon_state = "medbay2" - music = 'sound/ambience/signal.ogg' - -/area/medical/medbay3 - name = "\improper Medbay" - icon_state = "medbay3" - music = 'sound/ambience/signal.ogg' - - -/area/medical/biostorage - name = "\improper Medical Storage" - icon_state = "medbaysecstorage" - music = 'sound/ambience/signal.ogg' - -/area/medical/reception - name = "\improper Medbay Reception" - icon_state = "medbay" - music = 'sound/ambience/signal.ogg' - -/area/medical/psych - name = "\improper Psych Room" - icon_state = "medbaypsych" - music = 'sound/ambience/signal.ogg' - -/area/medical/medbreak - name = "\improper Break Room" - icon_state = "medbaybreak" - music = 'sound/ambience/signal.ogg' - -/area/medical/patients_rooms - name = "\improper Patient's Rooms" - icon_state = "patients" - -/area/medical/ward - name = "\improper Medbay Patient Ward" - icon_state = "patientsward" - -/area/medical/patient_a - name = "\improper Isolation A" - icon_state = "medbayisoa" - -/area/medical/patient_b - name = "\improper Isolation B" - icon_state = "medbayisob" - -/area/medical/patient_c - name = "\improper Isolation C" - icon_state = "medbayisoc" - -/area/medical/iso_access - name = "\improper Isolation Access" - icon_state = "medbayisoaccess" - -/area/medical/cmo - name = "\improper Chief Medical Officer's office" - icon_state = "CMO" - -/area/medical/cmostore - name = "\improper Medical Secondary Storage" - icon_state = "medbaysecstorage" - -/area/medical/robotics - name = "\improper Robotics" - icon_state = "medresearch" - -/area/medical/research - name = "\improper Medical Research" - icon_state = "medresearch" - -/area/medical/research_shuttle_dock - name = "\improper Research Shuttle Dock" - icon_state = "medresearch" - -/area/medical/virology - name = "\improper Virology" - icon_state = "virology" - -/area/medical/virology/lab - name = "\improper Virology Laboratory" - icon_state = "virology" - -/area/medical/morgue - name = "\improper Morgue" - icon_state = "morgue" - ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg') - -/area/medical/chemistry - name = "\improper Chemistry" - icon_state = "chem" - -/area/medical/surgery - name = "\improper Surgery" - icon_state = "surgery" - -/area/medical/surgery1 - name = "\improper Surgery 1" - icon_state = "surgery1" - -/area/medical/surgery2 - name = "\improper Surgery 2" - icon_state = "surgery2" - -/area/medical/surgeryobs - name = "\improper Surgery Observation" - icon_state = "surgery" - -/area/medical/cryo - name = "\improper Cryogenics" - icon_state = "cryo" - -/area/medical/exam_room - name = "\improper Exam Room" - icon_state = "exam_room" - -/area/medical/genetics - name = "\improper Genetics Lab" - icon_state = "genetics" - -/area/medical/genetics_cloning - name = "\improper Cloning Lab" - icon_state = "cloning" - -/area/medical/sleeper - name = "\improper Medical Treatment Center" - icon_state = "exam_room" - -/area/medical/paramedic - name = "\improper Paramedic" - icon_state = "medbay" - -//Security - -/area/security/main - name = "\improper Security Office" - icon_state = "securityoffice" - -/area/security/lobby - name = "\improper Security Lobby" - icon_state = "securitylobby" - -/area/security/brig - name = "\improper Brig" - icon_state = "brig" - -/area/security/brig/prison_break() - for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for(var/obj/machinery/door_timer/temp_timer in src) - temp_timer.releasetime = 1 - ..() - -/area/security/permabrig - name = "\improper Prison Wing" - icon_state = "sec_prison_perma" - fast_despawn = TRUE - -/area/security/prison - name = "\improper Prison Wing" - icon_state = "sec_prison" - -/area/security/prison/prison_break() - for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for(var/obj/machinery/door_timer/temp_timer in src) - temp_timer.releasetime = 1 - ..() - -/area/security/prison/cell_block - name = "\improper Prison Cell Block" - icon_state = "brig" - -/area/security/prison/cell_block/A - name = "\improper Prison Cell Block A" - icon_state = "brigcella" - -/area/security/prison/cell_block/B - name = "\improper Prison Cell Block B" - icon_state = "brigcellb" - -/area/security/prison/cell_block/C - name = "\improper Prison Cell Block C" - icon_state = "brig" - -/area/security/execution - name = "\improper Execution" - icon_state = "execution" - -/area/security/processing - name = "\improper Prisoner Processing" - icon_state = "prisonerprocessing" - -/area/security/interrogation - name = "\improper Interrogation" - icon_state = "interrogation" - -/area/security/seceqstorage - name = "\improper Security Equipment Storage" - icon_state = "securityequipmentstorage" - -/area/security/interrogationhallway - name = "\improper Interrogation Hallway" - icon_state = "interrogationhall" - -/area/security/courtroomdandp - name = "\improper Courtroom Defense and Prosecution" - icon_state = "seccourt" - -/area/security/interrogationobs - name = "\improper Interrogation Observation" - icon_state = "security" - -/area/security/evidence - name = "\improper Evidence Room" - icon_state = "evidence" - -/area/security/prisonlockers - name = "\improper Prisoner Lockers" - icon_state = "sec_prison_lockers" - -/area/security/medbay - name = "\improper Security Medbay" - icon_state = "security_medbay" - -/area/security/prisonershuttle - name = "\improper Security Prisoner Shuttle" - icon_state = "security" - -/area/security/warden - name = "\improper Warden's Office" - icon_state = "Warden" - -/area/security/armoury - name = "\improper Armory" - icon_state = "armory" - -/area/security/securearmoury - name = "\improper Secure Armory" - icon_state = "secarmory" - -/area/security/armoury/gamma - name = "\improper Gamma Armory" - icon_state = "Warden" - requires_power = 0 - -/area/security/securehallway - name = "\improper Security Secure Hallway" - icon_state = "securehall" - -/area/security/hos - name = "\improper Head of Security's Office" - icon_state = "sec_hos" - -/area/security/podbay - name = "\improper Security Podbay" - icon_state = "securitypodbay" - -/area/security/detectives_office - name = "\improper Detective's Office" - icon_state = "detective" - -/area/security/range - name = "\improper Firing Range" - icon_state = "firingrange" - -/area/security/nuke_storage - name = "\improper Vault" - icon_state = "nuke_storage" - -/area/security/customs - name = "\improper Customs" - icon_state = "checkpoint1" - -/area/security/customs2 - name = "\improper Customs" - icon_state = "security" - -/area/security/checkpoint - name = "\improper Security Checkpoint" - icon_state = "checkpoint1" - -/area/security/checkpoint2 - name = "\improper Security Checkpoint" - icon_state = "security" - -/area/security/checkpoint/supply - name = "Security Post - Cargo Bay" - icon_state = "checkpoint1" - -/area/security/checkpoint/engineering - name = "Security Post - Engineering" - icon_state = "checkpoint1" - -/area/security/checkpoint/medical - name = "Security Post - Medbay" - icon_state = "checkpoint1" - -/area/security/checkpoint/science - name = "Security Post - Science" - icon_state = "checkpoint1" - -/area/security/vacantoffice - name = "\improper Vacant Office" - icon_state = "security" - -/area/security/vacantoffice2 - name = "\improper Vacant Office" - icon_state = "security" - -/area/quartermaster - name = "\improper Quartermasters" - icon_state = "quart" - -///////////WORK IN PROGRESS////////// - -/area/quartermaster/sorting - name = "\improper Delivery Office" - icon_state = "quartstorage" - -////////////WORK IN PROGRESS////////// - -/area/quartermaster/office - name = "\improper Cargo Office" - icon_state = "quartoffice" - -/area/quartermaster/storage - name = "\improper Cargo Bay" - icon_state = "quartstorage" - -/area/quartermaster/qm - name = "\improper Quartermaster's Office" - icon_state = "quart" - -/area/quartermaster/miningdock - name = "\improper Mining Dock" - icon_state = "mining" - -/area/quartermaster/miningstorage - name = "\improper Mining Storage" - icon_state = "green" - -/area/quartermaster/mechbay - name = "\improper Mech Bay" - icon_state = "yellow" - -/area/janitor - name = "\improper Custodial Closet" - icon_state = "janitor" - -/area/hydroponics - name = "\improper Hydroponics" - icon_state = "hydro" - -/area/hydroponics/abandoned_garden - name = "\improper Abandoned Garden" - icon_state = "hydro" - -//Toxins - -/area/toxins/lab - name = "\improper Research and Development" - icon_state = "toxlab" - -/area/toxins/hallway - name = "\improper Research Lab" - icon_state = "toxlab" - -/area/toxins/rdoffice - name = "\improper Research Director's Office" - icon_state = "head_quarters" - -/area/toxins/supermatter - name = "\improper Supermatter Lab" - icon_state = "toxlab" - -/area/toxins/xenobiology - name = "\improper Xenobiology Lab" - icon_state = "toxmix" - xenobiology_compatible = TRUE - -/area/toxins/xenobiology/xenoflora_storage - name = "\improper Xenoflora Storage" - icon_state = "toxlab" - -/area/toxins/xenobiology/xenoflora - name = "\improper Xenoflora Lab" - icon_state = "toxlab" - -/area/toxins/storage - name = "\improper Toxins Storage" - icon_state = "toxstorage" - -/area/toxins/test_area - name = "\improper Toxins Test Area" - icon_state = "toxtest" - valid_territory = FALSE - -/area/toxins/mixing - name = "\improper Toxins Mixing Room" - icon_state = "toxmix" - -/area/toxins/launch - name = "Toxins Launch Room" - icon_state = "toxlaunch" - -/area/toxins/misc_lab - name = "\improper Research Testing Lab" - icon_state = "toxmisc" - -/area/toxins/test_chamber - name = "\improper Research Testing Chamber" - icon_state = "toxtest" - -/area/toxins/server - name = "\improper Server Room" - icon_state = "server" - -/area/toxins/server_coldroom - name = "\improper Server Coldroom" - icon_state = "servercold" - -/area/toxins/explab - name = "\improper Experimentation Lab" - icon_state = "toxmisc" - -//Storage - -/area/storage/tools - name = "Auxiliary Tool Storage" - icon_state = "storage" - -/area/storage/primary - name = "Primary Tool Storage" - icon_state = "primarystorage" - -/area/storage/autolathe - name = "Autolathe Storage" - icon_state = "storage" - -/area/storage/art - name = "Art Supply Storage" - icon_state = "storage" - -/area/storage/auxillary - name = "Auxillary Storage" - icon_state = "auxstorage" - -/area/storage/eva - name = "EVA Storage" - icon_state = "eva" - -/area/storage/secure - name = "Secure Storage" - icon_state = "storage" - -/area/storage/emergency - name = "Starboard Emergency Storage" - icon_state = "emergencystorage" - -/area/storage/emergency2 - name = "Port Emergency Storage" - icon_state = "emergencystorage" - -/area/storage/tech - name = "Technical Storage" - icon_state = "auxstorage" - -/area/storage/testroom - requires_power = 0 - name = "\improper Test Room" - icon_state = "storage" - -/area/storage/office - name = "\improper Office Supplies" - icon_state = "office_supplies" - -// ENGIE OUTPOST - -/area/engiestation - name = "\improper Engineering Outpost" - icon_state = "construction" - -/area/engiestation/solars - name = "\improper Engineering Outpost Solars" - icon_state = "panelsP" - -//DJSTATION - -/area/djstation - name = "\improper Ruskie DJ Station" - icon_state = "DJ" - -/area/djstation/solars - name = "\improper Ruskie DJ Station Solars" - icon_state = "DJ" - -//DERELICT - -/area/derelict - name = "\improper Derelict Station" - icon_state = "storage" - -/area/derelict/hallway/primary - name = "\improper Derelict Primary Hallway" - icon_state = "hallP" - -/area/derelict/hallway/secondary - name = "\improper Derelict Secondary Hallway" - icon_state = "hallS" - -/area/derelict/arrival - name = "\improper Derelict Arrival Centre" - icon_state = "yellow" - -/area/derelict/storage/equipment - name = "Derelict Equipment Storage" - -/area/derelict/storage/storage_access - name = "Derelict Storage Access" - -/area/derelict/storage/engine_storage - name = "Derelict Engine Storage" - icon_state = "green" - -/area/derelict/bridge - name = "\improper Derelict Control Room" - icon_state = "bridge" - -/area/derelict/secret - name = "\improper Derelict Secret Room" - icon_state = "library" - -/area/derelict/bridge/access - name = "Derelict Control Room Access" - icon_state = "auxstorage" - -/area/derelict/bridge/ai_upload - name = "\improper Derelict Computer Core" - icon_state = "ai" - -/area/derelict/solar_control - name = "\improper Derelict Solar Control" - icon_state = "engine" - -/area/derelict/se_solar - name = "South East Solars" - icon_state = "engine" - -/area/derelict/crew_quarters - name = "\improper Derelict Crew Quarters" - icon_state = "fitness" - -/area/derelict/medical - name = "Derelict Medbay" - icon_state = "medbay" - -/area/derelict/medical/morgue - name = "\improper Derelict Morgue" - icon_state = "morgue" - -/area/derelict/medical/chapel - name = "\improper Derelict Chapel" - icon_state = "chapel" - -/area/derelict/teleporter - name = "\improper Derelict Teleporter" - icon_state = "teleporter" - -/area/derelict/eva - name = "Derelict EVA Storage" - icon_state = "eva" - -/area/shuttle/derelict/ship/start - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/derelict/ship/transit - name = "\improper Abandoned Ship" - icon_state = "yellow" - -/area/shuttle/derelict/ship/engipost - name = "\improper Engineering Outpost" - icon_state = "yellow" - -/area/shuttle/derelict/ship/station - name = "\improper North of SS13" - icon_state = "yellow" - -/area/solar/derelict_starboard - name = "\improper Derelict Starboard Solar Array" - icon_state = "panelsS" - -/area/solar/derelict_aft - name = "\improper Derelict Aft Solar Array" - icon_state = "aft" - -/area/derelict/singularity_engine - name = "\improper Derelict Singularity Engine" - icon_state = "engine" - -/area/derelict/gravity_generator - name = "\improper Derelict Gravity Generator Room" - icon_state = "red" - -/area/derelict/atmospherics - name = "Derelict Atmospherics" - icon_state = "red" - -//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM) - -/area/shuttle/constructionsite - name = "\improper Construction Site Shuttle" - icon_state = "yellow" - -/area/shuttle/constructionsite/station - name = "\improper Construction Site Shuttle" - -/area/shuttle/constructionsite/site - name = "\improper Construction Site Shuttle" - -/area/constructionsite - name = "\improper Construction Site" - icon_state = "storage" - -/area/constructionsite/storage - name = "\improper Construction Site Storage Area" - -/area/constructionsite/science - name = "\improper Construction Site Research" - icon_state = "medresearch" - -/area/constructionsite/bridge - name = "\improper Construction Site Bridge" - icon_state = "bridge" - -/area/constructionsite/hallway/center - name = "\improper Construction Site Central Hallway" - icon_state = "hallC" - -/area/constructionsite/hallway/engcore - name = "\improper Construction Site Eng Core" - icon_state = "green" - -/area/constructionsite/hallway/fore - name = "\improper Construction Site Fore" - icon_state = "green" - -/area/constructionsite/hallway/port - name = "\improper Construction Site Port" - icon_state = "hallP" - -/area/constructionsite/hallway/aft - name = "\improper Construction Site Aft" - icon_state = "hallA" - -/area/constructionsite/hallway/starboard - name = "\improper Construction Site Starboard" - icon_state = "hallS" - -/area/constructionsite/atmospherics - name = "\improper Construction Site Atmospherics" - icon_state = "atmos" - -/area/constructionsite/medical - name = "\improper Construction Site Medbay" - icon_state = "medbay" - -/area/constructionsite/ai - name = "\improper Construction Computer Core" - icon_state = "ai" - -/area/constructionsite/engineering - name = "\improper Construction Site Engine Bay" - icon_state = "engine" - -/area/solar/constructionsite - name = "\improper Construction Site Solars" - icon_state = "panelsA" - - -//Construction - -/area/construction - name = "\improper Construction Area" - icon_state = "yellow" - -/area/mining_construction - name = "Auxillary Base Construction" - icon_state = "yellow" - -/area/construction/supplyshuttle - name = "\improper Supply Shuttle" - icon_state = "yellow" - -/area/construction/quarters - name = "\improper Engineer's Quarters" - icon_state = "yellow" - -/area/construction/qmaint - name = "Maintenance" - icon_state = "yellow" - -/area/construction/hallway - name = "\improper Hallway" - icon_state = "yellow" - -/area/construction/solars - name = "\improper Solar Panels" - icon_state = "yellow" - -/area/construction/solarscontrol - name = "\improper Solar Panel Control" - icon_state = "yellow" - -/area/construction/Storage - name = "Construction Site Storage" - icon_state = "yellow" - - -//GAYBAR -/area/secret/gaybar - name = "\improper Dance Bar" - icon_state = "dancebar" - - -//Traitor Station -/area/traitor - name = "\improper Syndicate Base" - icon_state = "syndie_hall" - report_alerts = 0 - -/area/traitor/rnd - name = "\improper Syndicate Research and Development" - icon_state = "syndie_rnd" - -/area/traitor/chem - name = "\improper Syndicate Chemistry" - icon_state = "syndie_chem" - -/area/traitor/tox - name = "\improper Syndicate Toxins" - icon_state = "syndie_tox" - -/area/traitor/atmos - name = "\improper Syndicate Atmos" - icon_state = "syndie_atmo" - -/area/traitor/inter - name = "\improper Syndicate Interrogation" - icon_state = "syndie_inter" - -/area/traitor/radio - name = "\improper Syndicate Eavesdropping Booth" - icon_state = "syndie_radio" - -/area/traitor/surgery - name = "\improper Syndicate Surgery Theatre" - icon_state = "syndie_surgery" - -/area/traitor/hall - name = "\improper Syndicate Station" - icon_state = "syndie_hall" - -/area/traitor/kitchen - name = "\improper Syndicate Kitchen" - icon_state = "syndie_kitchen" - -/area/traitor/empty - name = "\improper Syndicate Project Room" - icon_state = "syndie_empty" - - -//AI - -/area/ai_monitored/storage/eva - name = "EVA Storage" - icon_state = "eva" - -/area/ai_monitored/storage/secure - name = "Secure Storage" - icon_state = "storage" - -/area/ai_monitored/storage/emergency - name = "Emergency Storage" - icon_state = "storage" - -/area/turret_protected/ - ambientsounds = list('sound/ambience/ambimalf.ogg') - -/area/turret_protected/ai_upload - name = "\improper AI Upload Chamber" - icon_state = "ai_upload" - -/area/turret_protected/ai_upload_foyer - name = "AI Upload Access" - icon_state = "ai_foyer" - -/area/turret_protected/ai - name = "\improper AI Chamber" - icon_state = "ai_chamber" - -/area/turret_protected/aisat - name = "\improper AI Satellite" - icon_state = "ai" - -/area/aisat - name = "\improper AI Satellite Exterior" - icon_state = "yellow" - -/area/aisat/entrance - name = "\improper AI Satellite Entrance" - icon_state = "ai_foyer" - -/area/aisat/maintenance - name = "\improper AI Satellite Maintenance" - icon_state = "storage" - -/area/turret_protected/aisat_interior - name = "\improper AI Satellite Antechamber" - icon_state = "ai" - -/area/turret_protected/AIsatextFP - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextFS - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextAS - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/AIsatextAP - name = "\improper AI Sat Ext" - icon_state = "storage" - luminosity = 1 - dynamic_lighting = 0 - -/area/turret_protected/NewAIMain - name = "\improper AI Main New" - icon_state = "storage" - - - -//Misc - -/area/wreck/ai - name = "\improper AI Chamber" - icon_state = "ai" - -/area/wreck/main - name = "\improper Wreck" - icon_state = "storage" - -/area/wreck/engineering - name = "\improper Power Room" - icon_state = "engine" - -/area/wreck/bridge - name = "\improper Bridge" - icon_state = "bridge" - -/area/generic - name = "Unknown" - icon_state = "storage" - - - -// Telecommunications Satellite - -/area/tcommsat - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/tcommsat/entrance - name = "\improper Telecoms Teleporter" - icon_state = "tcomsatentrance" - -/area/tcommsat/chamber - name = "\improper Telecoms Central Compartment" - icon_state = "tcomsatcham" - -/area/turret_protected/tcomsat - name = "\improper Telecoms Satellite" - icon_state = "tcomsatlob" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomfoyer - name = "\improper Telecoms Foyer" - icon_state = "tcomsatentrance" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomwest - name = "\improper Telecoms West Wing" - icon_state = "tcomsatwest" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/turret_protected/tcomeast - name = "\improper Telecoms East Wing" - icon_state = "tcomsateast" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') - -/area/tcommsat/computer - name = "\improper Telecoms Control Room" - icon_state = "tcomsatcomp" - -/area/tcommsat/server - name = "\improper Telecoms Server Room" - icon_state = "tcomsatcham" - -/area/tcommsat/lounge - name = "\improper Telecoms Lounge" - icon_state = "tcomsatlounge" - -/area/tcommsat/powercontrol - name = "\improper Telecoms Power Control" - icon_state = "tcomsatwest" - -// Away Missions -/area/awaymission - name = "\improper Strange Location" - icon_state = "away" - report_alerts = 0 - -/area/awaymission/example - name = "\improper Strange Station" - icon_state = "away" - -/area/awaymission/wwmines - name = "\improper Wild West Mines" - icon_state = "away1" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwgov - name = "\improper Wild West Mansion" - icon_state = "away2" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwrefine - name = "\improper Wild West Refinery" - icon_state = "away3" - luminosity = 1 - requires_power = 0 - -/area/awaymission/wwvault - name = "\improper Wild West Vault" - icon_state = "away3" - luminosity = 0 - -/area/awaymission/wwvaultdoors - name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power - icon_state = "away2" - requires_power = 0 - luminosity = 0 - -/area/awaymission/desert - name = "Mars" - icon_state = "away" - -/area/awaymission/BMPship1 - name = "\improper Aft Block" - icon_state = "away1" - -/area/awaymission/BMPship2 - name = "\improper Midship Block" - icon_state = "away2" - -/area/awaymission/BMPship3 - name = "\improper Fore Block" - icon_state = "away3" - -/area/awaymission/spacebattle - name = "\improper Space Battle" - icon_state = "away" - requires_power = 0 - -/area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" - -/area/awaymission/spacebattle/syndicate1 - name = "\improper Syndicate Assault Ship 1" - -/area/awaymission/spacebattle/syndicate2 - name = "\improper Syndicate Assault Ship 2" - -/area/awaymission/spacebattle/syndicate3 - name = "\improper Syndicate Assault Ship 3" - -/area/awaymission/spacebattle/syndicate4 - name = "\improper Syndicate War Sphere 1" - -/area/awaymission/spacebattle/syndicate5 - name = "\improper Syndicate War Sphere 2" - -/area/awaymission/spacebattle/syndicate6 - name = "\improper Syndicate War Sphere 3" - -/area/awaymission/spacebattle/syndicate7 - name = "\improper Syndicate Fighter" - -/area/awaymission/spacebattle/secret - name = "\improper Hidden Chamber" - -/area/awaymission/beach - name = "Beach" - icon_state = "beach" - luminosity = 1 - dynamic_lighting = 0 - requires_power = 0 - ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg') - -/area/awaymission/undersea - name = "Undersea" - icon_state = "undersea" - - -////////////////////////AWAY AREAS/////////////////////////////////// - -/area/awaycontent - name = "space" - report_alerts = 0 - -/area/awaycontent/a1 - icon_state = "awaycontent1" - -/area/awaycontent/a2 - icon_state = "awaycontent2" - -/area/awaycontent/a3 - icon_state = "awaycontent3" - -/area/awaycontent/a4 - icon_state = "awaycontent4" - -/area/awaycontent/a5 - icon_state = "awaycontent5" - -/area/awaycontent/a6 - icon_state = "awaycontent6" - -/area/awaycontent/a7 - icon_state = "awaycontent7" - -/area/awaycontent/a8 - icon_state = "awaycontent8" - -/area/awaycontent/a9 - icon_state = "awaycontent9" - -/area/awaycontent/a10 - icon_state = "awaycontent10" - -/area/awaycontent/a11 - icon_state = "awaycontent11" - -/area/awaycontent/a11 - icon_state = "awaycontent12" - -/area/awaycontent/a12 - icon_state = "awaycontent13" - -/area/awaycontent/a13 - icon_state = "awaycontent14" - -/area/awaycontent/a14 - icon_state = "awaycontent14" - -/area/awaycontent/a15 - icon_state = "awaycontent15" - -/area/awaycontent/a16 - icon_state = "awaycontent16" - -/area/awaycontent/a17 - icon_state = "awaycontent17" - -/area/awaycontent/a18 - icon_state = "awaycontent18" - -/area/awaycontent/a19 - icon_state = "awaycontent19" - -/area/awaycontent/a20 - icon_state = "awaycontent20" - -/area/awaycontent/a21 - icon_state = "awaycontent21" - -/area/awaycontent/a22 - icon_state = "awaycontent22" - -/area/awaycontent/a23 - icon_state = "awaycontent23" - -/area/awaycontent/a24 - icon_state = "awaycontent24" - -/area/awaycontent/a25 - icon_state = "awaycontent25" - -/area/awaycontent/a26 - icon_state = "awaycontent26" - -/area/awaycontent/a27 - icon_state = "awaycontent27" - -/area/awaycontent/a28 - icon_state = "awaycontent28" - -/area/awaycontent/a29 - icon_state = "awaycontent29" - -/area/awaycontent/a30 - icon_state = "awaycontent30" - -////////////////////////VR AREAS/////////////////////////////////// - -/area/vr - name = "VR" - requires_power = 0 - dynamic_lighting = 0 - no_teleportlocs = 1 - - -/area/vr/lobby - name = "VR Lobby" - -/area/vr/roman - name = "Roman Arena" - - -///////////////////////////////////////////////////////////////////// -/* - Lists of areas to be used with is_type_in_list. - Used in gamemodes code at the moment. --rastaf0 -*/ - -// CENTCOM -var/list/centcom_areas = list ( - /area/centcom, - /area/shuttle/escape_pod1/centcom, - /area/shuttle/escape_pod2/centcom, - /area/shuttle/escape_pod3/centcom, - /area/shuttle/escape_pod5/centcom, - /area/shuttle/transport1, - /area/shuttle/administration/centcom, - /area/shuttle/specops/centcom, -) - -//SPACE STATION 13 -var/list/the_station_areas = list ( - /area/shuttle/arrival, - /area/shuttle/escape, - /area/shuttle/escape_pod1/station, - /area/shuttle/escape_pod2/station, - /area/shuttle/escape_pod3/station, - /area/shuttle/escape_pod5/station, - /area/shuttle/prison/station, - /area/shuttle/administration/station, - /area/shuttle/specops/station, - /area/atmos, - /area/maintenance, - /area/hallway, - /area/hallway/primary/fore, - /area/hallway/primary/starboard, - /area/hallway/primary/aft, - /area/hallway/primary/port, - /area/hallway/primary/central, - /area/bridge, - /area/crew_quarters, - /area/civilian, - /area/holodeck, - /area/library, - /area/chapel, - /area/escapepodbay, - /area/lawoffice, - /area/magistrateoffice, - /area/clownoffice, - /area/mimeoffice, - /area/engine, - /area/solar, - /area/assembly, - /area/teleporter, - /area/medical, - /area/security, - /area/prison, - /area/quartermaster, - /area/janitor, - /area/hydroponics, - /area/toxins, - /area/storage, - /area/construction, - /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0 - /area/ai_monitored/storage/secure, - /area/ai_monitored/storage/emergency, - /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0 - /area/turret_protected/ai_upload_foyer, - /area/turret_protected/ai, -) +/* + +### This file contains a list of all the areas in your station. Format is as follows: + +/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) + name = "NICE NAME" (not required but makes things really nice) + icon = "ICON FILENAME" (defaults to areas.dmi) + icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) + requires_power = FALSE (defaults to TRUE) + music = "music/music.ogg" (defaults to "music/music.ogg") + +NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 + +*/ + +/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ +/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ +var/list/teleportlocs = list() +/hook/startup/proc/process_teleport_locs() + for(var/area/AR in world) + if(AR.no_teleportlocs) continue + if(teleportlocs.Find(AR.name)) continue + var/turf/picked = safepick(get_area_turfs(AR.type)) + if(picked && is_station_level(picked.z)) + teleportlocs += AR.name + teleportlocs[AR.name] = AR + + teleportlocs = sortAssoc(teleportlocs) + + return 1 + +var/list/ghostteleportlocs = list() +/hook/startup/proc/process_ghost_teleport_locs() + for(var/area/AR in world) + if(ghostteleportlocs.Find(AR.name)) continue + var/list/turfs = get_area_turfs(AR.type) + if(turfs.len) + ghostteleportlocs += AR.name + ghostteleportlocs[AR.name] = AR + + ghostteleportlocs = sortAssoc(ghostteleportlocs) + + return 1 + +/*-----------------------------------------------------------------------------*/ + + +/area/admin + name = "\improper Admin Room" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + + +/area/adminconstruction + name = "\improper Admin Testing Area" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + +/area/space + icon_state = "space" + requires_power = TRUE + always_unpowered = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + valid_territory = FALSE + outdoors = TRUE + ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg') + +/area/space/nearstation + icon_state = "space_near" + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + +/area/space/atmosalert() + return + +/area/space/fire_alert() + return + +/area/space/fire_reset() + return + +/area/space/readyalert() + return + +/area/space/partyalert() + return + +//These are shuttle areas, they must contain two areas in a subgroup if you want to move a shuttle from one +//place to another. Look at escape shuttle for example. +//All shuttles show now be under shuttle since we have smooth-wall code. + +/area/shuttle + no_teleportlocs = TRUE + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/shuttle/arrival + name = "\improper Arrival Shuttle" + +/area/shuttle/arrival/pre_game + icon_state = "shuttle2" + +/area/shuttle/arrival/station + icon_state = "shuttle" + +/area/shuttle/auxillary_base + icon_state = "shuttle" + +/area/shuttle/escape + name = "\improper Emergency Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle2" + nad_allowed = TRUE + +/area/shuttle/pod_1 + name = "\improper Escape Pod One" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_2 + name = "\improper Escape Pod Two" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_3 + name = "\improper Escape Pod Three" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/pod_4 + name = "\improper Escape Pod Four" + music = "music/escape.ogg" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/escape_pod1 + name = "\improper Escape Pod One" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod1/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod1/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod1/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod2 + name = "\improper Escape Pod Two" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod2/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod2/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod2/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod3 + name = "\improper Escape Pod Three" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod3/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod3/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod3/transit + icon_state = "shuttle" + +/area/shuttle/escape_pod5 //Pod 4 was lost to meteors + name = "\improper Escape Pod Five" + music = "music/escape.ogg" + nad_allowed = TRUE + +/area/shuttle/escape_pod5/station + icon_state = "shuttle2" + +/area/shuttle/escape_pod5/centcom + icon_state = "shuttle" + +/area/shuttle/escape_pod5/transit + icon_state = "shuttle" + +/area/shuttle/mining + name = "\improper Mining Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/transport + icon_state = "shuttle" + name = "\improper Transport Shuttle" + +/area/shuttle/transport1 + icon_state = "shuttle" + name = "\improper Transport Shuttle" + +/area/shuttle/alien/base + icon_state = "shuttle" + name = "\improper Alien Shuttle Base" + requires_power = 1 + +/area/shuttle/alien/mine + icon_state = "shuttle" + name = "\improper Alien Shuttle Mine" + requires_power = 1 + +/area/shuttle/gamma/space + icon_state = "shuttle" + name = "\improper Gamma Armory" + +/area/shuttle/gamma/station + icon_state = "shuttle" + name = "\improper Gamma Armory Station" + +/area/shuttle/prison/ + name = "\improper Prison Shuttle" + +/area/shuttle/prison/station + icon_state = "shuttle" + +/area/shuttle/prison/prison + icon_state = "shuttle2" + +/area/shuttle/siberia + name = "\improper Labor Camp Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/specops + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered" + +/area/shuttle/specops/centcom + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered" + +/area/shuttle/specops/station + name = "\improper Special Ops Shuttle" + icon_state = "shuttlered2" + +/area/shuttle/syndicate_elite + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered" + nad_allowed = TRUE + +/area/shuttle/syndicate_elite/mothership + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered" + +/area/shuttle/syndicate_elite/station + name = "\improper Syndicate Elite Shuttle" + icon_state = "shuttlered2" + +/area/shuttle/syndicate_sit + name = "\improper Syndicate SIT Shuttle" + icon_state = "shuttlered" + nad_allowed = TRUE + +/area/shuttle/assault_pod + name = "Steel Rain" + icon_state = "shuttle" + +/area/shuttle/administration + name = "\improper Nanotrasen Vessel" + icon_state = "shuttlered" + +/area/shuttle/administration/centcom + name = "\improper Nanotrasen Vessel Centcom" + icon_state = "shuttlered" + +/area/shuttle/administration/station + name = "\improper Nanotrasen Vessel" + icon_state = "shuttlered2" + +/area/shuttle/thunderdome + name = "honk" + +/area/shuttle/thunderdome/grnshuttle + name = "\improper Thunderdome GRN Shuttle" + icon_state = "green" + +/area/shuttle/thunderdome/grnshuttle/dome + name = "\improper GRN Shuttle" + icon_state = "shuttlegrn" + +/area/shuttle/thunderdome/grnshuttle/station + name = "\improper GRN Station" + icon_state = "shuttlegrn2" + +/area/shuttle/thunderdome/redshuttle + name = "\improper Thunderdome RED Shuttle" + icon_state = "red" + +/area/shuttle/thunderdome/redshuttle/dome + name = "\improper RED Shuttle" + icon_state = "shuttlered" + +/area/shuttle/thunderdome/redshuttle/station + name = "\improper RED Station" + icon_state = "shuttlered2" +// === Trying to remove these areas: + +/area/shuttle/research + name = "\improper Research Shuttle" + music = "music/escape.ogg" + icon_state = "shuttle" + +/area/shuttle/research/station + icon_state = "shuttle2" + +/area/shuttle/research/outpost + icon_state = "shuttle" + +/area/shuttle/vox + name = "\improper Vox Skipjack" + icon_state = "shuttle" + +/area/shuttle/vox/station + name = "\improper Vox Skipjack" + icon_state = "yellow" + +/area/shuttle/salvage + name = "\improper Salvage Ship" + icon_state = "yellow" + +/area/shuttle/salvage/start + name = "\improper Middle of Nowhere" + icon_state = "yellow" + +/area/shuttle/salvage/arrivals + name = "\improper Space Station Auxiliary Docking" + icon_state = "yellow" + +/area/shuttle/salvage/derelict + name = "\improper Derelict Station" + icon_state = "yellow" + +/area/shuttle/salvage/djstation + name = "\improper Ruskie DJ Station" + icon_state = "yellow" + +/area/shuttle/salvage/north + name = "\improper North of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/east + name = "\improper East of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/south + name = "\improper South of the Station" + icon_state = "yellow" + +/area/shuttle/salvage/commssat + name = "\improper The Communications Satellite" + icon_state = "yellow" + +/area/shuttle/salvage/mining + name = "\improper South-West of the Mining Asteroid" + icon_state = "yellow" + +/area/shuttle/salvage/abandoned_ship + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/salvage/clown_asteroid + name = "\improper Clown Asteroid" + icon_state = "yellow" + +/area/shuttle/salvage/trading_post + name = "\improper Trading Post" + icon_state = "yellow" + +/area/shuttle/salvage/transit + name = "\improper hyperspace" + icon_state = "shuttle" + +/area/shuttle/supply + name = "Supply Shuttle" + icon_state = "shuttle3" + +/area/shuttle/abandoned + name = "Abandoned Ship" + icon_state = "shuttle" + +/area/shuttle/syndicate + name = "Syndicate Nuclear Team Shuttle" + icon_state = "shuttle" + nad_allowed = TRUE + +/area/shuttle/trade + name = "Trade Shuttle" + icon_state = "shuttle" + +/area/shuttle/trade/sol + name = "Sol Freighter" + +/area/shuttle/freegolem + name = "Free Golem Ship" + icon_state = "purple" + xenobiology_compatible = TRUE + +/area/airtunnel1/ // referenced in airtunnel.dm:759 + +/area/dummy/ // Referenced in engine.dm:261 + +/area/start // will be unused once kurper gets his login interface patch done + name = "start area" + icon_state = "start" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + has_gravity = TRUE + +// === end remove + +// CENTCOM + +/area/centcom + name = "\improper Centcom" + icon_state = "centcom" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + nad_allowed = TRUE + +/area/centcom/control + name = "\improper Centcom Control" + icon_state = "centcom_ctrl" + +/area/centcom/evac + name = "\improper Centcom Emergency Shuttle" + icon_state = "centcom_evac" + +/area/centcom/suppy + name = "\improper Centcom Supply Shuttle" + icon_state = "centcom_supply" + +/area/centcom/ferry + name = "\improper Centcom Transport Shuttle" + icon_state = "centcom_ferry" + +/area/centcom/shuttle + name = "\improper Centcom Administration Shuttle" + +/area/centcom/test + name = "\improper Centcom Testing Facility" + +/area/centcom/living + name = "\improper Centcom Living Quarters" + +/area/centcom/specops + name = "\improper Centcom Special Ops" + icon_state = "centcom_specops" + +/area/centcom/gamma + name = "\improper Centcom Gamma Armory" + icon_state = "centcom_gamma" + +/area/centcom/holding + name = "\improper Holding Facility" + +/area/centcom/bathroom + name = "\improper Centcom Emergency Shuttle Bathrooms" + +//SYNDICATES + +/area/syndicate_mothership + name = "\improper Syndicate Forward Base" + icon_state = "syndie-ship" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + nad_allowed = TRUE + +/area/syndicate_mothership/control + name = "\improper Syndicate Control Room" + icon_state = "syndie-control" + +/area/syndicate_mothership/elite_squad + name = "\improper Syndicate Elite Squad" + icon_state = "syndie-elite" + +/area/syndicate_mothership/infteam + name = "\improper Syndicate Infiltrators" + icon_state = "syndie-elite" + +//EXTRA + +/area/asteroid // -- TLE + name = "\improper Asteroid" + icon_state = "asteroid" + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/asteroid/cave // -- TLE + name = "\improper Asteroid - Underground" + icon_state = "cave" + requires_power = FALSE + outdoors = TRUE + +/area/asteroid/artifactroom + name = "\improper Asteroid - Artifact" + icon_state = "cave" + +/area/tdome + name = "\improper Thunderdome" + icon_state = "thunder" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + + +/area/tdome/arena_source + name = "\improper Thunderdome Arena Template" + icon_state = "thunder" + +/area/tdome/arena + name = "\improper Thunderdome Arena" + icon_state = "thunder" + +/area/tdome/tdome1 + name = "\improper Thunderdome (Team 1)" + icon_state = "green" + +/area/tdome/tdome2 + name = "\improper Thunderdome (Team 2)" + icon_state = "yellow" + +/area/tdome/tdomeadmin + name = "\improper Thunderdome (Admin.)" + icon_state = "purple" + +/area/tdome/tdomeobserve + name = "\improper Thunderdome (Observer.)" + icon_state = "purple" + +/area/exploration/methlab + name = "\improper Abandoned Drug Lab" + icon_state = "green" + +//Abductors +/area/abductor_ship + name = "\improper Abductor Ship" + icon_state = "yellow" + requires_power = FALSE + has_gravity = TRUE + +/area/wizard_station + name = "\improper Wizard's Den" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/ninja + name = "\improper Ninja Area Parent" + icon_state = "ninjabase" + requires_power = FALSE + no_teleportlocs = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/ninja/outpost + name = "\improper SpiderClan Outpost" + +/area/ninja/holding + name = "\improper SpiderClan Holding Facility" + +/area/vox_station + name = "\improper Vox Base" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + no_teleportlocs = TRUE + +/area/trader_station + name = "Trade Base" + icon_state = "yellow" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/trader_station/sol + name = "Jupiter Station 6" + +//Labor camp +/area/mine/laborcamp + name = "Labor Camp" + icon_state = "brig" + +/area/mine/laborcamp/security + name = "Labor Camp Security" + icon_state = "security" + +//STATION13 + +/area/atmos + name = "Atmospherics" + icon_state = "atmos" + +/area/atmos/control + name = "Atmospherics Control Room" + icon_state = "atmos" + +/area/atmos/distribution + name = "Atmospherics Distribution Loop" + icon_state = "atmos" + +//Maintenance +/area/maintenance + ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') + valid_territory = FALSE + +/area/maintenance/atmos_control + name = "Atmospherics Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fpmaint + name = "EVA Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fpmaint2 + name = "Arrivals North Maintenance" + icon_state = "fpmaint" + +/area/maintenance/fsmaint + name = "Dormitory Maintenance" + icon_state = "fsmaint" + +/area/maintenance/fsmaint2 + name = "Bar Maintenance" + icon_state = "fsmaint" + +/area/maintenance/asmaint + name = "Medbay Maintenance" + icon_state = "asmaint" + +/area/maintenance/asmaint2 + name = "Science Maintenance" + icon_state = "asmaint" + +/area/maintenance/apmaint + name = "Cargo Maintenance" + icon_state = "apmaint" + +/area/maintenance/maintcentral + name = "Bridge Maintenance" + icon_state = "maintcentral" + +/area/maintenance/fore + name = "Fore Maintenance" + icon_state = "fmaint" + +/area/maintenance/starboard + name = "Starboard Maintenance" + icon_state = "smaint" + +/area/maintenance/port + name = "Locker Room Maintenance" + icon_state = "pmaint" + +/area/maintenance/aft + name = "Engineering Maintenance" + icon_state = "amaint" + +/area/maintenance/engi_shuttle + name = "Engineering Shuttle Access" + icon_state = "maint_e_shuttle" + +/area/maintenance/storage + name = "Atmospherics Maintenance" + icon_state = "green" + +/area/maintenance/incinerator + name = "\improper Incinerator" + icon_state = "disposal" + +/area/maintenance/turbine + name = "\improper Turbine" + icon_state = "disposal" + +/area/maintenance/disposal + name = "Waste Disposal" + icon_state = "disposal" + +/area/maintenance/genetics + name = "Genetics Maintenance" + icon_state = "asmaint" + + +/area/maintenance/electrical + name = "Electrical Maintenance" + icon_state = "yellow" + +/area/maintenance/abandonedbar + name = "Maintenance Bar" + icon_state = "yellow" + power_equip = 0 + power_light = 0 + power_environ = 0 + +/area/maintenance/electrical_shop + name ="Electronics Den" + icon_state = "yellow" + +/area/maintenance/gambling_den + name = "Gambling Den" + icon_state = "yellow" + +/area/maintenance/consarea + name = "Alternate Construction Area" + icon_state = "yellow" + + +//Hallway + +/area/hallway/primary/fore + name = "\improper Fore Primary Hallway" + icon_state = "hallF" + +/area/hallway/primary/starboard + name = "\improper Starboard Primary Hallway" + icon_state = "hallS" + +/area/hallway/primary/starboard/west +/area/hallway/primary/starboard/east + +/area/hallway/primary/aft + name = "\improper Aft Primary Hallway" + icon_state = "hallA" + + +/area/hallway/primary/port + name = "\improper Port Primary Hallway" + icon_state = "hallP" + +/area/hallway/primary/port/west + name = "\improper Port West Hallway" + +/area/hallway/primary/port/east + name = "\improper Port East Hallway" + +/area/hallway/primary/central + name = "\improper Central Primary Hallway" + icon_state = "hallC" + +/area/hallway/primary/central/north +/area/hallway/primary/central/south +/area/hallway/primary/central/west +/area/hallway/primary/central/east +/area/hallway/primary/central/nw +/area/hallway/primary/central/ne +/area/hallway/primary/central/sw +/area/hallway/primary/central/se + +/area/hallway/secondary/exit + name = "\improper Escape Shuttle Hallway" + icon_state = "escape" + +/area/hallway/secondary/construction + name = "\improper Construction Area" + icon_state = "construction" + +/area/hallway/secondary/entry + name = "\improper Arrival Shuttle Hallway" + icon_state = "entry" + +/area/hallway/secondary/entry/north + +/area/hallway/secondary/entry/south + +/area/hallway/secondary/entry/louge + name = "\improper Arrivals Lounge" + + +//Command + +/area/bridge + name = "\improper Bridge" + icon_state = "bridge" + music = "signal" + +/area/bridge/meeting_room + name = "\improper Heads of Staff Meeting Room" + icon_state = "meeting" + music = null + +/area/crew_quarters/captain + name = "\improper Captain's Office" + icon_state = "captain" + +/area/crew_quarters/captain/bedroom + name = "\improper Captain's Bedroom" + icon_state = "captain" + +/area/crew_quarters/recruit + name = "\improper Recruitment Office" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hop + name = "\improper Head of Personnel's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hor + name = "\improper Research Director's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/chief + name = "\improper Chief Engineer's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/hos + name = "\improper Head of Security's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/heads/cmo + name = "\improper Chief Medical Officer's Quarters" + icon_state = "head_quarters" + +/area/crew_quarters/courtroom + name = "\improper Courtroom" + icon_state = "courtroom" + +/area/crew_quarters/heads + name = "\improper Head of Personnel's Office" + icon_state = "head_quarters" + +/area/crew_quarters/hor + name = "\improper Research Director's Office" + icon_state = "head_quarters" + +/area/crew_quarters/hos + name = "\improper Head of Security's Office" + icon_state = "head_quarters" + +/area/crew_quarters/chief + name = "\improper Chief Engineer's Office" + icon_state = "head_quarters" + +/area/mint + name = "\improper Mint" + icon_state = "green" + +/area/comms + name = "\improper Communications Relay" + icon_state = "tcomsatcham" + +/area/server + name = "\improper Messaging Server Room" + icon_state = "server" + +/area/ntrep + name = "\improper Nanotrasen Representative's Office" + icon_state = "bluenew" + +/area/blueshield + name = "\improper Blueshield's Office" + icon_state = "blueold" + +/area/centcomdocks + name = "\improper Central Command Docks" + icon_state = "centcom" + +//Crew + +/area/crew_quarters + name = "\improper Dormitories" + icon_state = "Sleep" + +/area/crew_quarters/toilet + name = "\improper Dormitory Toilets" + icon_state = "toilet" + +/area/crew_quarters/sleep + name = "\improper Dormitories" + icon_state = "Sleep" + valid_territory = FALSE + +/area/crew_quarters/sleep_male + name = "\improper Male Dorm" + icon_state = "Sleep" + +/area/crew_quarters/sleep_male/toilet_male + name = "\improper Male Toilets" + icon_state = "toilet" + +/area/crew_quarters/sleep_female + name = "\improper Female Dorm" + icon_state = "Sleep" + +/area/crew_quarters/sleep_female/toilet_female + name = "\improper Female Toilets" + icon_state = "toilet" + +/area/crew_quarters/locker + name = "\improper Locker Room" + icon_state = "locker" + +/area/crew_quarters/locker/locker_toilet + name = "\improper Locker Toilets" + icon_state = "toilet" + +/area/crew_quarters/fitness + name = "\improper Fitness Room" + icon_state = "fitness" + +/area/crew_quarters/dorms + name = "\improper Dorms" + icon_state = "dorms" + +/area/crew_quarters/arcade + name = "\improper Arcade" + icon_state = "arcade" + +/area/crew_quarters/cafeteria + name = "\improper Cafeteria" + icon_state = "cafeteria" + +/area/crew_quarters/kitchen + name = "\improper Kitchen" + icon_state = "kitchen" + +/area/crew_quarters/bar + name = "\improper Bar" + icon_state = "bar" + +/area/crew_quarters/bar/atrium + name = "Atrium" + icon_state = "bar" + +/area/crew_quarters/theatre + name = "\improper Theatre" + icon_state = "Theatre" + +/area/crew_quarters/mrchangs + name = "\improper Mr Chang's" + icon_state = "Theatre" + +/area/library + name = "\improper Library" + icon_state = "library" + +/area/library/abandoned + name = "\improper Abandoned Library" + icon_state = "library" + +/area/chapel/main + name = "\improper Chapel" + icon_state = "chapel" + ambientsounds = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') + +/area/chapel/office + name = "\improper Chapel Office" + icon_state = "chapeloffice" + +/area/escapepodbay + name = "\improper Escape Shuttle Hallway Podbay" + icon_state = "escape" + +/area/lawoffice + name = "\improper Law Office" + icon_state = "law" + +/area/magistrateoffice + name = "\improper Magistrate's Office" + icon_state = "magistrate" + +/area/clownoffice + name = "\improper Clown's Office" + icon_state = "clown_office" + +/area/mimeoffice + name = "\improper Mime's Office" + icon_state = "mime_office" + +/area/civilian/barber + name = "\improper Barber Shop" + icon_state = "barber" + +/area/civilian/clothing + name = "\improper Clothing Shop" + icon_state = "Theatre" + +/area/civilian/pet_store + name = "\improper Pet Store" + icon_state = "pet_store" + +/area/holodeck + name = "\improper Holodeck" + icon_state = "Holodeck" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + +/area/holodeck/alphadeck + name = "\improper Holodeck Alpha" + + +/area/holodeck/source_plating + name = "\improper Holodeck - Off" + icon_state = "Holodeck" + +/area/holodeck/source_emptycourt + name = "\improper Holodeck - Empty Court" + +/area/holodeck/source_boxingcourt + name = "\improper Holodeck - Boxing Court" + +/area/holodeck/source_basketball + name = "\improper Holodeck - Basketball Court" + +/area/holodeck/source_thunderdomecourt + name = "\improper Holodeck - Thunderdome Court" + +/area/holodeck/source_beach + name = "\improper Holodeck - Beach" + icon_state = "Holodeck" // Lazy. + +/area/holodeck/source_burntest + name = "\improper Holodeck - Atmospheric Burn Test" + +/area/holodeck/source_wildlife + name = "\improper Holodeck - Wildlife Simulation" + +/area/holodeck/source_meetinghall + name = "\improper Holodeck - Meeting Hall" + +/area/holodeck/source_theatre + name = "\improper Holodeck - Theatre" + +/area/holodeck/source_picnicarea + name = "\improper Holodeck - Picnic Area" + +/area/holodeck/source_snowfield + name = "\improper Holodeck - Snow Field" + +/area/holodeck/source_desert + name = "\improper Holodeck - Desert" + +/area/holodeck/source_space + name = "\improper Holodeck - Space" + +/area/holodeck/source_knightarena + name = "\improper Holodeck - Knight Arena" + + +//Embassies +/area/embassy/ + name = "\improper Embassy Hallway" + +/area/embassy/tajaran + name = "\improper Tajaran Embassy" + icon_state = "tajaran" + +/area/embassy/skrell + name = "\improper Skrell Embassy" + icon_state = "skrell" + +/area/embassy/unathi + name = "\improper Unathi Embassy" + icon_state = "unathi" + +/area/embassy/kidan + name = "\improper Kidan Embassy" + icon_state = "kidan" + +/area/embassy/diona + name = "\improper Diona Embassy" + icon_state = "diona" + +/area/embassy/slime + name = "\improper Slime Person Embassy" + icon_state = "slime" + +/area/embassy/grey + name = "\improper Grey Embassy" + icon_state = "grey" + +/area/embassy/vox + name = "\improper Vox Embassy" + icon_state = "vox" + + + +//Engineering +/area/engine + ambientsounds = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg','sound/ambience/ambisin4.ogg') + +/area/engine/engine_smes + name = "\improper Engineering SMES" + icon_state = "engine_smes" + requires_power = FALSE //This area only covers the batteries and they deal with their own power + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/engine/engineering + name = "Engineering" + icon_state = "engine_smes" + +/area/engine/break_room + name = "\improper Engineering Foyer" + icon_state = "engine" + +/area/engine/equipmentstorage + name = "\improper Engineering Equipment Storage" + icon_state = "storage" + +/area/engine/hardsuitstorage + name = "\improper Engineering Hardsuit Storage" + icon_state = "storage" + +/area/engine/controlroom + name = "\improper Engineering Control Room" + icon_state = "engine_control" + +/area/engine/gravitygenerator + name = "\improper Gravity Generator" + icon_state = "engine" + +/area/engine/chiefs_office + name = "\improper Chief Engineer's office" + icon_state = "engine_control" + +/area/engine/mechanic_workshop + name = "\improper Mechanic Workshop" + icon_state = "engine" + +/area/engine/mechanic_workshop/hanger + name = "\improper Hanger Bay" + icon_state = "engine" + +/area/engine/supermatter + name = "\improper Supermatter Engine" + icon_state = "engine" + +//Solars + +/area/solar + requires_power = FALSE + valid_territory = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + +/area/solar/auxport + name = "\improper Fore Port Solar Array" + icon_state = "panelsA" + +/area/solar/auxstarboard + name = "\improper Fore Starboard Solar Array" + icon_state = "panelsA" + +/area/solar/fore + name = "\improper Fore Solar Array" + icon_state = "yellow" + +/area/solar/aft + name = "\improper Aft Solar Array" + icon_state = "aft" + +/area/solar/starboard + name = "\improper Aft Starboard Solar Array" + icon_state = "panelsS" + +/area/solar/port + name = "\improper Aft Port Solar Array" + icon_state = "panelsP" + +/area/maintenance/auxsolarport + name = "\improper Fore Port Solar Maintenance" + icon_state = "SolarcontrolA" + +/area/maintenance/starboardsolar + name = "\improper Aft Starboard Solar Maintenance" + icon_state = "SolarcontrolS" + +/area/maintenance/portsolar + name = "\improper Aft Port Solar Maintenance" + icon_state = "SolarcontrolP" + +/area/maintenance/auxsolarstarboard + name = "\improper Fore Starboard Solar Maintenance" + icon_state = "SolarcontrolA" + + +/area/assembly/chargebay + name = "\improper Mech Bay" + icon_state = "mechbay" + +/area/assembly/showroom + name = "\improper Robotics Showroom" + icon_state = "showroom" + +/area/assembly/robotics + name = "\improper Robotics Lab" + icon_state = "ass_line" + +/area/assembly/assembly_line //Derelict Assembly Line + name = "\improper Assembly Line" + icon_state = "ass_line" + power_equip = 0 + power_light = 0 + power_environ = 0 + +//Teleporter + +/area/teleporter + name = "\improper Teleporter" + icon_state = "teleporter" + music = "signal" + +/area/gateway + name = "\improper Gateway" + icon_state = "teleporter" + music = "signal" + +/area/AIsattele + name = "\improper Abandoned Teleporter" + icon_state = "teleporter" + music = "signal" + ambientsounds = list('sound/ambience/ambimalf.ogg') + +/area/toxins/explab + name = "\improper E.X.P.E.R.I-MENTOR Lab" + icon_state = "toxmisc" + +/area/toxins/explab_chamber + name = "\improper E.X.P.E.R.I-MENTOR Chamber" + icon_state = "toxmisc" + +//MedBay + +/area/medical/medbay + name = "\improper Medbay" + icon_state = "medbay" + music = 'sound/ambience/signal.ogg' + +//Medbay is a large area, these additional areas help level out APC load. +/area/medical/medbay2 + name = "\improper Medbay" + icon_state = "medbay2" + music = 'sound/ambience/signal.ogg' + +/area/medical/medbay3 + name = "\improper Medbay" + icon_state = "medbay3" + music = 'sound/ambience/signal.ogg' + + +/area/medical/biostorage + name = "\improper Medical Storage" + icon_state = "medbaysecstorage" + music = 'sound/ambience/signal.ogg' + +/area/medical/reception + name = "\improper Medbay Reception" + icon_state = "medbay" + music = 'sound/ambience/signal.ogg' + +/area/medical/psych + name = "\improper Psych Room" + icon_state = "medbaypsych" + music = 'sound/ambience/signal.ogg' + +/area/medical/medbreak + name = "\improper Break Room" + icon_state = "medbaybreak" + music = 'sound/ambience/signal.ogg' + +/area/medical/patients_rooms + name = "\improper Patient's Rooms" + icon_state = "patients" + +/area/medical/ward + name = "\improper Medbay Patient Ward" + icon_state = "patientsward" + +/area/medical/patient_a + name = "\improper Isolation A" + icon_state = "medbayisoa" + +/area/medical/patient_b + name = "\improper Isolation B" + icon_state = "medbayisob" + +/area/medical/patient_c + name = "\improper Isolation C" + icon_state = "medbayisoc" + +/area/medical/iso_access + name = "\improper Isolation Access" + icon_state = "medbayisoaccess" + +/area/medical/cmo + name = "\improper Chief Medical Officer's office" + icon_state = "CMO" + +/area/medical/cmostore + name = "\improper Medical Secondary Storage" + icon_state = "medbaysecstorage" + +/area/medical/robotics + name = "\improper Robotics" + icon_state = "medresearch" + +/area/medical/research + name = "\improper Medical Research" + icon_state = "medresearch" + +/area/medical/research_shuttle_dock + name = "\improper Research Shuttle Dock" + icon_state = "medresearch" + +/area/medical/virology + name = "\improper Virology" + icon_state = "virology" + +/area/medical/virology/lab + name = "\improper Virology Laboratory" + icon_state = "virology" + +/area/medical/morgue + name = "\improper Morgue" + icon_state = "morgue" + ambientsounds = list('sound/ambience/ambimo1.ogg','sound/ambience/ambimo2.ogg') + +/area/medical/chemistry + name = "\improper Chemistry" + icon_state = "chem" + +/area/medical/surgery + name = "\improper Surgery" + icon_state = "surgery" + +/area/medical/surgery1 + name = "\improper Surgery 1" + icon_state = "surgery1" + +/area/medical/surgery2 + name = "\improper Surgery 2" + icon_state = "surgery2" + +/area/medical/surgeryobs + name = "\improper Surgery Observation" + icon_state = "surgery" + +/area/medical/cryo + name = "\improper Cryogenics" + icon_state = "cryo" + +/area/medical/exam_room + name = "\improper Exam Room" + icon_state = "exam_room" + +/area/medical/genetics + name = "\improper Genetics Lab" + icon_state = "genetics" + +/area/medical/genetics_cloning + name = "\improper Cloning Lab" + icon_state = "cloning" + +/area/medical/sleeper + name = "\improper Medical Treatment Center" + icon_state = "exam_room" + +/area/medical/paramedic + name = "\improper Paramedic" + icon_state = "medbay" + +//Security + +/area/security/main + name = "\improper Security Office" + icon_state = "securityoffice" + +/area/security/lobby + name = "\improper Security Lobby" + icon_state = "securitylobby" + +/area/security/brig + name = "\improper Brig" + icon_state = "brig" + +/area/security/brig/prison_break() + for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + +/area/security/permabrig + name = "\improper Prison Wing" + icon_state = "sec_prison_perma" + fast_despawn = TRUE + +/area/security/prison + name = "\improper Prison Wing" + icon_state = "sec_prison" + +/area/security/prison/prison_break() + for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + +/area/security/prison/cell_block + name = "\improper Prison Cell Block" + icon_state = "brig" + +/area/security/prison/cell_block/A + name = "\improper Prison Cell Block A" + icon_state = "brigcella" + +/area/security/prison/cell_block/B + name = "\improper Prison Cell Block B" + icon_state = "brigcellb" + +/area/security/prison/cell_block/C + name = "\improper Prison Cell Block C" + icon_state = "brig" + +/area/security/execution + name = "\improper Execution" + icon_state = "execution" + +/area/security/processing + name = "\improper Prisoner Processing" + icon_state = "prisonerprocessing" + +/area/security/interrogation + name = "\improper Interrogation" + icon_state = "interrogation" + +/area/security/seceqstorage + name = "\improper Security Equipment Storage" + icon_state = "securityequipmentstorage" + +/area/security/interrogationhallway + name = "\improper Interrogation Hallway" + icon_state = "interrogationhall" + +/area/security/courtroomdandp + name = "\improper Courtroom Defense and Prosecution" + icon_state = "seccourt" + +/area/security/interrogationobs + name = "\improper Interrogation Observation" + icon_state = "security" + +/area/security/evidence + name = "\improper Evidence Room" + icon_state = "evidence" + +/area/security/prisonlockers + name = "\improper Prisoner Lockers" + icon_state = "sec_prison_lockers" + +/area/security/medbay + name = "\improper Security Medbay" + icon_state = "security_medbay" + +/area/security/prisonershuttle + name = "\improper Security Prisoner Shuttle" + icon_state = "security" + +/area/security/warden + name = "\improper Warden's Office" + icon_state = "Warden" + +/area/security/armoury + name = "\improper Armory" + icon_state = "armory" + +/area/security/securearmoury + name = "\improper Secure Armory" + icon_state = "secarmory" + +/area/security/securehallway + name = "\improper Security Secure Hallway" + icon_state = "securehall" + +/area/security/hos + name = "\improper Head of Security's Office" + icon_state = "sec_hos" + +/area/security/podbay + name = "\improper Security Podbay" + icon_state = "securitypodbay" + +/area/security/detectives_office + name = "\improper Detective's Office" + icon_state = "detective" + +/area/security/range + name = "\improper Firing Range" + icon_state = "firingrange" + +/area/security/nuke_storage + name = "\improper Vault" + icon_state = "nuke_storage" + +/area/security/customs + name = "\improper Customs" + icon_state = "checkpoint1" + +/area/security/customs2 + name = "\improper Customs" + icon_state = "security" + +/area/security/checkpoint + name = "\improper Security Checkpoint" + icon_state = "checkpoint1" + +/area/security/checkpoint2 + name = "\improper Security Checkpoint" + icon_state = "security" + +/area/security/checkpoint/supply + name = "Security Post - Cargo Bay" + icon_state = "checkpoint1" + +/area/security/checkpoint/engineering + name = "Security Post - Engineering" + icon_state = "checkpoint1" + +/area/security/checkpoint/medical + name = "Security Post - Medbay" + icon_state = "checkpoint1" + +/area/security/checkpoint/science + name = "Security Post - Science" + icon_state = "checkpoint1" + +/area/security/vacantoffice + name = "\improper Vacant Office" + icon_state = "security" + +/area/security/vacantoffice2 + name = "\improper Vacant Office" + icon_state = "security" + +/area/quartermaster + name = "\improper Quartermasters" + icon_state = "quart" + +///////////WORK IN PROGRESS////////// + +/area/quartermaster/sorting + name = "\improper Delivery Office" + icon_state = "quartstorage" + +////////////WORK IN PROGRESS////////// + +/area/quartermaster/office + name = "\improper Cargo Office" + icon_state = "quartoffice" + +/area/quartermaster/storage + name = "\improper Cargo Bay" + icon_state = "quartstorage" + +/area/quartermaster/qm + name = "\improper Quartermaster's Office" + icon_state = "quart" + +/area/quartermaster/miningdock + name = "\improper Mining Dock" + icon_state = "mining" + +/area/quartermaster/miningstorage + name = "\improper Mining Storage" + icon_state = "green" + +/area/quartermaster/mechbay + name = "\improper Mech Bay" + icon_state = "yellow" + +/area/janitor + name = "\improper Custodial Closet" + icon_state = "janitor" + +/area/hydroponics + name = "\improper Hydroponics" + icon_state = "hydro" + +/area/hydroponics/abandoned_garden + name = "\improper Abandoned Garden" + icon_state = "hydro" + +//Toxins + +/area/toxins/lab + name = "\improper Research and Development" + icon_state = "toxlab" + +/area/toxins/hallway + name = "\improper Research Lab" + icon_state = "toxlab" + +/area/toxins/rdoffice + name = "\improper Research Director's Office" + icon_state = "head_quarters" + +/area/toxins/supermatter + name = "\improper Supermatter Lab" + icon_state = "toxlab" + +/area/toxins/xenobiology + name = "\improper Xenobiology Lab" + icon_state = "toxmix" + xenobiology_compatible = TRUE + +/area/toxins/xenobiology/xenoflora_storage + name = "\improper Xenoflora Storage" + icon_state = "toxlab" + +/area/toxins/xenobiology/xenoflora + name = "\improper Xenoflora Lab" + icon_state = "toxlab" + +/area/toxins/storage + name = "\improper Toxins Storage" + icon_state = "toxstorage" + +/area/toxins/test_area + name = "\improper Toxins Test Area" + icon_state = "toxtest" + valid_territory = FALSE + +/area/toxins/mixing + name = "\improper Toxins Mixing Room" + icon_state = "toxmix" + +/area/toxins/launch + name = "Toxins Launch Room" + icon_state = "toxlaunch" + +/area/toxins/misc_lab + name = "\improper Research Testing Lab" + icon_state = "toxmisc" + +/area/toxins/test_chamber + name = "\improper Research Testing Chamber" + icon_state = "toxtest" + +/area/toxins/server + name = "\improper Server Room" + icon_state = "server" + +/area/toxins/server_coldroom + name = "\improper Server Coldroom" + icon_state = "servercold" + +/area/toxins/explab + name = "\improper Experimentation Lab" + icon_state = "toxmisc" + +//Storage + +/area/storage/tools + name = "Auxiliary Tool Storage" + icon_state = "storage" + +/area/storage/primary + name = "Primary Tool Storage" + icon_state = "primarystorage" + +/area/storage/autolathe + name = "Autolathe Storage" + icon_state = "storage" + +/area/storage/art + name = "Art Supply Storage" + icon_state = "storage" + +/area/storage/auxillary + name = "Auxillary Storage" + icon_state = "auxstorage" + +/area/storage/eva + name = "EVA Storage" + icon_state = "eva" + +/area/storage/secure + name = "Secure Storage" + icon_state = "storage" + +/area/storage/emergency + name = "Starboard Emergency Storage" + icon_state = "emergencystorage" + +/area/storage/emergency2 + name = "Port Emergency Storage" + icon_state = "emergencystorage" + +/area/storage/tech + name = "Technical Storage" + icon_state = "auxstorage" + +/area/storage/office + name = "\improper Office Supplies" + icon_state = "office_supplies" + +// ENGIE OUTPOST + +/area/engiestation + name = "\improper Engineering Outpost" + icon_state = "construction" + +/area/engiestation/solars + name = "\improper Engineering Outpost Solars" + icon_state = "panelsP" + +//DJSTATION + +/area/djstation + name = "\improper Ruskie DJ Station" + icon_state = "DJ" + +/area/djstation/solars + name = "\improper Ruskie DJ Station Solars" + icon_state = "DJ" + +//DERELICT + +/area/derelict + name = "\improper Derelict Station" + icon_state = "storage" + +/area/derelict/hallway/primary + name = "\improper Derelict Primary Hallway" + icon_state = "hallP" + +/area/derelict/hallway/secondary + name = "\improper Derelict Secondary Hallway" + icon_state = "hallS" + +/area/derelict/arrival + name = "\improper Derelict Arrival Centre" + icon_state = "yellow" + +/area/derelict/storage/equipment + name = "Derelict Equipment Storage" + +/area/derelict/storage/storage_access + name = "Derelict Storage Access" + +/area/derelict/storage/engine_storage + name = "Derelict Engine Storage" + icon_state = "green" + +/area/derelict/bridge + name = "\improper Derelict Control Room" + icon_state = "bridge" + +/area/derelict/secret + name = "\improper Derelict Secret Room" + icon_state = "library" + +/area/derelict/bridge/access + name = "Derelict Control Room Access" + icon_state = "auxstorage" + +/area/derelict/bridge/ai_upload + name = "\improper Derelict Computer Core" + icon_state = "ai" + +/area/derelict/solar_control + name = "\improper Derelict Solar Control" + icon_state = "engine" + +/area/derelict/se_solar + name = "South East Solars" + icon_state = "engine" + +/area/derelict/crew_quarters + name = "\improper Derelict Crew Quarters" + icon_state = "fitness" + +/area/derelict/medical + name = "Derelict Medbay" + icon_state = "medbay" + +/area/derelict/medical/morgue + name = "\improper Derelict Morgue" + icon_state = "morgue" + +/area/derelict/medical/chapel + name = "\improper Derelict Chapel" + icon_state = "chapel" + +/area/derelict/teleporter + name = "\improper Derelict Teleporter" + icon_state = "teleporter" + +/area/derelict/eva + name = "Derelict EVA Storage" + icon_state = "eva" + +/area/shuttle/derelict/ship/start + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/derelict/ship/transit + name = "\improper Abandoned Ship" + icon_state = "yellow" + +/area/shuttle/derelict/ship/engipost + name = "\improper Engineering Outpost" + icon_state = "yellow" + +/area/shuttle/derelict/ship/station + name = "\improper North of SS13" + icon_state = "yellow" + +/area/solar/derelict_starboard + name = "\improper Derelict Starboard Solar Array" + icon_state = "panelsS" + +/area/solar/derelict_aft + name = "\improper Derelict Aft Solar Array" + icon_state = "aft" + +/area/derelict/singularity_engine + name = "\improper Derelict Singularity Engine" + icon_state = "engine" + +/area/derelict/gravity_generator + name = "\improper Derelict Gravity Generator Room" + icon_state = "red" + +/area/derelict/atmospherics + name = "Derelict Atmospherics" + icon_state = "red" + +//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM) + +/area/shuttle/constructionsite + name = "\improper Construction Site Shuttle" + icon_state = "yellow" + +/area/shuttle/constructionsite/station + name = "\improper Construction Site Shuttle" + +/area/shuttle/constructionsite/site + name = "\improper Construction Site Shuttle" + +/area/constructionsite + name = "\improper Construction Site" + icon_state = "storage" + +/area/constructionsite/storage + name = "\improper Construction Site Storage Area" + +/area/constructionsite/science + name = "\improper Construction Site Research" + icon_state = "medresearch" + +/area/constructionsite/bridge + name = "\improper Construction Site Bridge" + icon_state = "bridge" + +/area/constructionsite/hallway/center + name = "\improper Construction Site Central Hallway" + icon_state = "hallC" + +/area/constructionsite/hallway/engcore + name = "\improper Construction Site Eng Core" + icon_state = "green" + +/area/constructionsite/hallway/fore + name = "\improper Construction Site Fore" + icon_state = "green" + +/area/constructionsite/hallway/port + name = "\improper Construction Site Port" + icon_state = "hallP" + +/area/constructionsite/hallway/aft + name = "\improper Construction Site Aft" + icon_state = "hallA" + +/area/constructionsite/hallway/starboard + name = "\improper Construction Site Starboard" + icon_state = "hallS" + +/area/constructionsite/atmospherics + name = "\improper Construction Site Atmospherics" + icon_state = "atmos" + +/area/constructionsite/medical + name = "\improper Construction Site Medbay" + icon_state = "medbay" + +/area/constructionsite/ai + name = "\improper Construction Computer Core" + icon_state = "ai" + +/area/constructionsite/engineering + name = "\improper Construction Site Engine Bay" + icon_state = "engine" + +/area/solar/constructionsite + name = "\improper Construction Site Solars" + icon_state = "panelsA" + + +//Construction + +/area/construction + name = "\improper Construction Area" + icon_state = "yellow" + +/area/mining_construction + name = "Auxillary Base Construction" + icon_state = "yellow" + +/area/construction/supplyshuttle + name = "\improper Supply Shuttle" + icon_state = "yellow" + +/area/construction/quarters + name = "\improper Engineer's Quarters" + icon_state = "yellow" + +/area/construction/qmaint + name = "Maintenance" + icon_state = "yellow" + +/area/construction/hallway + name = "\improper Hallway" + icon_state = "yellow" + +/area/construction/solars + name = "\improper Solar Panels" + icon_state = "yellow" + +/area/construction/solarscontrol + name = "\improper Solar Panel Control" + icon_state = "yellow" + +/area/construction/Storage + name = "Construction Site Storage" + icon_state = "yellow" + + +//GAYBAR +/area/secret/gaybar + name = "\improper Dance Bar" + icon_state = "dancebar" + + +//Traitor Station +/area/traitor + name = "\improper Syndicate Base" + icon_state = "syndie_hall" + report_alerts = 0 + +/area/traitor/rnd + name = "\improper Syndicate Research and Development" + icon_state = "syndie_rnd" + +/area/traitor/chem + name = "\improper Syndicate Chemistry" + icon_state = "syndie_chem" + +/area/traitor/tox + name = "\improper Syndicate Toxins" + icon_state = "syndie_tox" + +/area/traitor/atmos + name = "\improper Syndicate Atmos" + icon_state = "syndie_atmo" + +/area/traitor/inter + name = "\improper Syndicate Interrogation" + icon_state = "syndie_inter" + +/area/traitor/radio + name = "\improper Syndicate Eavesdropping Booth" + icon_state = "syndie_radio" + +/area/traitor/surgery + name = "\improper Syndicate Surgery Theatre" + icon_state = "syndie_surgery" + +/area/traitor/hall + name = "\improper Syndicate Station" + icon_state = "syndie_hall" + +/area/traitor/kitchen + name = "\improper Syndicate Kitchen" + icon_state = "syndie_kitchen" + +/area/traitor/empty + name = "\improper Syndicate Project Room" + icon_state = "syndie_empty" + + +//AI + +/area/ai_monitored/storage/eva + name = "EVA Storage" + icon_state = "eva" + +/area/ai_monitored/storage/secure + name = "Secure Storage" + icon_state = "storage" + +/area/ai_monitored/storage/emergency + name = "Emergency Storage" + icon_state = "storage" + +/area/turret_protected/ + ambientsounds = list('sound/ambience/ambimalf.ogg') + +/area/turret_protected/ai_upload + name = "\improper AI Upload Chamber" + icon_state = "ai_upload" + +/area/turret_protected/ai_upload_foyer + name = "AI Upload Access" + icon_state = "ai_foyer" + +/area/turret_protected/ai + name = "\improper AI Chamber" + icon_state = "ai_chamber" + +/area/turret_protected/aisat + name = "\improper AI Satellite" + icon_state = "ai" + +/area/aisat + name = "\improper AI Satellite Exterior" + icon_state = "yellow" + +/area/aisat/entrance + name = "\improper AI Satellite Entrance" + icon_state = "ai_foyer" + +/area/aisat/maintenance + name = "\improper AI Satellite Maintenance" + icon_state = "storage" + +/area/turret_protected/aisat_interior + name = "\improper AI Satellite Antechamber" + icon_state = "ai" + + +//Misc + +/area/wreck/ai + name = "\improper AI Chamber" + icon_state = "ai" + +/area/wreck/main + name = "\improper Wreck" + icon_state = "storage" + +/area/wreck/engineering + name = "\improper Power Room" + icon_state = "engine" + +/area/wreck/bridge + name = "\improper Bridge" + icon_state = "bridge" + +/area/generic + name = "Unknown" + icon_state = "storage" + + + +// Telecommunications Satellite + +/area/tcommsat + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/tcommsat/entrance + name = "\improper Telecoms Teleporter" + icon_state = "tcomsatentrance" + +/area/tcommsat/chamber + name = "\improper Telecoms Central Compartment" + icon_state = "tcomsatcham" + +/area/turret_protected/tcomsat + name = "\improper Telecoms Satellite" + icon_state = "tcomsatlob" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomfoyer + name = "\improper Telecoms Foyer" + icon_state = "tcomsatentrance" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomwest + name = "\improper Telecoms West Wing" + icon_state = "tcomsatwest" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/turret_protected/tcomeast + name = "\improper Telecoms East Wing" + icon_state = "tcomsateast" + ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') + +/area/tcommsat/computer + name = "\improper Telecoms Control Room" + icon_state = "tcomsatcomp" + +/area/tcommsat/server + name = "\improper Telecoms Server Room" + icon_state = "tcomsatcham" + +/area/tcommsat/lounge + name = "\improper Telecoms Lounge" + icon_state = "tcomsatlounge" + +/area/tcommsat/powercontrol + name = "\improper Telecoms Power Control" + icon_state = "tcomsatwest" + +// Away Missions +/area/awaymission + name = "\improper Strange Location" + icon_state = "away" + report_alerts = 0 + +/area/awaymission/example + name = "\improper Strange Station" + icon_state = "away" + +/area/awaymission/desert + name = "Mars" + icon_state = "away" + +/area/awaymission/beach + name = "Beach" + icon_state = "beach" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + requires_power = FALSE + ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg') + +/area/awaymission/undersea + name = "Undersea" + icon_state = "undersea" + + +////////////////////////AWAY AREAS/////////////////////////////////// + +/area/awaycontent + name = "space" + report_alerts = 0 + +/area/awaycontent/a1 + icon_state = "awaycontent1" + +/area/awaycontent/a2 + icon_state = "awaycontent2" + +/area/awaycontent/a3 + icon_state = "awaycontent3" + +/area/awaycontent/a4 + icon_state = "awaycontent4" + +/area/awaycontent/a5 + icon_state = "awaycontent5" + +/area/awaycontent/a6 + icon_state = "awaycontent6" + +/area/awaycontent/a7 + icon_state = "awaycontent7" + +/area/awaycontent/a8 + icon_state = "awaycontent8" + +/area/awaycontent/a9 + icon_state = "awaycontent9" + +/area/awaycontent/a10 + icon_state = "awaycontent10" + +/area/awaycontent/a11 + icon_state = "awaycontent11" + +/area/awaycontent/a11 + icon_state = "awaycontent12" + +/area/awaycontent/a12 + icon_state = "awaycontent13" + +/area/awaycontent/a13 + icon_state = "awaycontent14" + +/area/awaycontent/a14 + icon_state = "awaycontent14" + +/area/awaycontent/a15 + icon_state = "awaycontent15" + +/area/awaycontent/a16 + icon_state = "awaycontent16" + +/area/awaycontent/a17 + icon_state = "awaycontent17" + +/area/awaycontent/a18 + icon_state = "awaycontent18" + +/area/awaycontent/a19 + icon_state = "awaycontent19" + +/area/awaycontent/a20 + icon_state = "awaycontent20" + +/area/awaycontent/a21 + icon_state = "awaycontent21" + +/area/awaycontent/a22 + icon_state = "awaycontent22" + +/area/awaycontent/a23 + icon_state = "awaycontent23" + +/area/awaycontent/a24 + icon_state = "awaycontent24" + +/area/awaycontent/a25 + icon_state = "awaycontent25" + +/area/awaycontent/a26 + icon_state = "awaycontent26" + +/area/awaycontent/a27 + icon_state = "awaycontent27" + +/area/awaycontent/a28 + icon_state = "awaycontent28" + +/area/awaycontent/a29 + icon_state = "awaycontent29" + +/area/awaycontent/a30 + icon_state = "awaycontent30" + +////////////////////////VR AREAS/////////////////////////////////// + +/area/vr + name = "VR" + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + no_teleportlocs = TRUE + +/area/vr/lobby + name = "VR Lobby" + +/area/vr/roman + name = "Roman Arena" + + +///////////////////////////////////////////////////////////////////// +/* + Lists of areas to be used with is_type_in_list. + Used in gamemodes code at the moment. --rastaf0 +*/ + +// CENTCOM +var/list/centcom_areas = list ( + /area/centcom, + /area/shuttle/escape_pod1/centcom, + /area/shuttle/escape_pod2/centcom, + /area/shuttle/escape_pod3/centcom, + /area/shuttle/escape_pod5/centcom, + /area/shuttle/transport1, + /area/shuttle/administration/centcom, + /area/shuttle/specops/centcom, +) + +//SPACE STATION 13 +var/list/the_station_areas = list ( + /area/shuttle/arrival, + /area/shuttle/escape, + /area/shuttle/escape_pod1/station, + /area/shuttle/escape_pod2/station, + /area/shuttle/escape_pod3/station, + /area/shuttle/escape_pod5/station, + /area/shuttle/prison/station, + /area/shuttle/administration/station, + /area/shuttle/specops/station, + /area/atmos, + /area/maintenance, + /area/hallway, + /area/hallway/primary/fore, + /area/hallway/primary/starboard, + /area/hallway/primary/aft, + /area/hallway/primary/port, + /area/hallway/primary/central, + /area/bridge, + /area/crew_quarters, + /area/civilian, + /area/holodeck, + /area/library, + /area/chapel, + /area/escapepodbay, + /area/lawoffice, + /area/magistrateoffice, + /area/clownoffice, + /area/mimeoffice, + /area/engine, + /area/solar, + /area/assembly, + /area/teleporter, + /area/medical, + /area/security, + /area/quartermaster, + /area/janitor, + /area/hydroponics, + /area/toxins, + /area/storage, + /area/construction, + /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0 + /area/ai_monitored/storage/secure, + /area/ai_monitored/storage/emergency, + /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0 + /area/turret_protected/ai_upload_foyer, + /area/turret_protected/ai, +) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index fcd2e912c44..8e9505095f2 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,9 +1,61 @@ -// Areas.dm - -// === /area + var/fire = null + var/atmosalm = ATMOS_ALARM_NONE + var/poweralm = TRUE + var/party = null + var/report_alerts = TRUE // Should atmos alerts notify the AI/computers + level = null + name = "Space" + icon = 'icons/turf/areas.dmi' + icon_state = "unknown" + layer = AREA_LAYER + plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. + luminosity = 0 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + invisibility = INVISIBILITY_LIGHTING + var/valid_territory = TRUE //used for cult summoning areas on station zlevel + var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints. + var/lightswitch = TRUE + + var/eject = null + + var/debug = 0 + var/requires_power = TRUE + var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() + + var/power_equip = TRUE + var/power_light = TRUE + var/power_environ = TRUE + var/music = null + var/used_equip = FALSE + var/used_light = FALSE + var/used_environ = FALSE + var/static_equip + var/static_light = FALSE + var/static_environ + + var/has_gravity = TRUE + var/list/apc = list() + var/no_air = null + + var/air_doors_activated = FALSE + + var/tele_proof = FALSE + var/no_teleportlocs = FALSE + + var/outdoors = FALSE //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) + var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default? + var/nad_allowed = FALSE //is the station NAD allowed on this area? + + // This var is used with the maploader (modules/awaymissions/maploader/reader.dm) + // if this is 1, when used in a map snippet, this will instantiate a unique + // area from any other instances already present (meaning you can have + // separate APCs, and so on) + var/there_can_be_many = FALSE + var/global/global_uid = 0 var/uid + var/list/ambientsounds = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg',\ 'sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg',\ 'sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg',\ @@ -11,42 +63,47 @@ 'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\ 'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') - // This var is used with the maploader (modules/awaymissions/maploader/reader.dm) - // if this is 1, when used in a map snippet, this will instantiate a unique - // area from any other instances already present (meaning you can have - // separate APCs, and so on) - var/there_can_be_many = 0 + var/fast_despawn = FALSE - -/area/New() - - ..() +/area/Initialize(mapload) + GLOB.all_areas += src icon_state = "" layer = AREA_LAYER uid = ++global_uid - GLOB.all_areas += src + map_name = name // Save the initial (the name set in the map) name of the area. - if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area - requires_power = 1 - always_unpowered = 1 - dynamic_lighting = 1 - power_light = 0 - power_equip = 0 - power_environ = 0 -// lighting_state = 4 - //has_gravity = 0 // Space has gravity. Because.. because. + if(requires_power) + luminosity = 0 + else + power_light = TRUE + power_equip = TRUE + power_environ = TRUE - if(requires_power != 0) - power_light = 0 //rastaf0 - power_equip = 0 //rastaf0 - power_environ = 0 //rastaf0 + if(dynamic_lighting == DYNAMIC_LIGHTING_FORCED) + dynamic_lighting = DYNAMIC_LIGHTING_ENABLED + luminosity = 0 + else if(dynamic_lighting != DYNAMIC_LIGHTING_IFSTARLIGHT) + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + if(dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) + dynamic_lighting = config.starlight ? DYNAMIC_LIGHTING_ENABLED : DYNAMIC_LIGHTING_DISABLED + + . = ..() blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor. -/area/Initialize() - . = ..() + if(!IS_DYNAMIC_LIGHTING(src)) + add_overlay(/obj/effect/fullbright) + reg_in_areas_in_z() + + return INITIALIZE_HINT_LATELOAD + +/area/LateInitialize() + . = ..() + power_change() // all machines set to current power level, also updates lighting icon + +/area/proc/reg_in_areas_in_z() if(contents.len) var/list/areas_in_z = space_manager.areas_in_z var/z @@ -63,12 +120,6 @@ areas_in_z["[z]"] = list() areas_in_z["[z]"] += src - return INITIALIZE_HINT_LATELOAD - -/area/LateInitialize() - . = ..() - power_change() // all machines set to current power level, also updates lighting icon - /area/proc/get_cameras() var/list/cameras = list() for(var/obj/machinery/camera/C in src) @@ -199,7 +250,6 @@ icon_state = "party" else icon_state = "blue-red" - invisibility = INVISIBILITY_LIGHTING else var/weather_icon for(var/V in SSweather.processing) @@ -209,12 +259,9 @@ weather_icon = TRUE if(!weather_icon) icon_state = null - invisibility = INVISIBILITY_MAXIMUM /area/space/updateicon() icon_state = null - invisibility = INVISIBILITY_MAXIMUM - /* #define EQUIP 1 @@ -317,9 +364,6 @@ M.lastarea = src - // /vg/ - EVENTS! - callHook("mob_area_change", list("mob" = M, "newarea" = newarea, "oldarea" = oldarea)) - if(!istype(A,/mob/living)) return var/mob/living/L = A diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 66124a9582e..83a4db07f8d 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -30,7 +30,9 @@ var/global/max_secret_rooms = 6 T.ChangeTurf(floor) room_turfs["floors"] += T + var/old_area = T.loc A.contents += T + T.change_area(old_area, A) return room_turfs diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0a1aa19bcf7..f49cf05197a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,5 +1,6 @@ /atom - layer = 2 + layer = TURF_LAYER + plane = GAME_PLANE var/level = 2 var/flags = NONE var/flags_2 = NONE @@ -144,9 +145,12 @@ alternate_appearances = null QDEL_NULL(reagents) - invisibility = 101 + invisibility = INVISIBILITY_MAXIMUM LAZYCLEARLIST(overlays) LAZYCLEARLIST(priority_overlays) + + QDEL_NULL(light) + return ..() //Hook for running code when a dir change occurs @@ -681,6 +685,7 @@ var/list/blood_splatter_icons = list() //the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) /atom/proc/update_remote_sight(mob/living/user) + user.sync_lighting_plane_alpha() return /atom/proc/checkpass(passflag) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2d3f01a139d..d1bee2bb62e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -185,11 +185,12 @@ . = 0 // Called after a successful Move(). By this point, we've already moved -/atom/movable/proc/Moved(atom/OldLoc, Dir) - if(!inertia_moving) +/atom/movable/proc/Moved(atom/OldLoc, Dir, Forced = FALSE) + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, OldLoc, Dir, Forced) + if (!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) - return 1 + return TRUE // Previously known as HasEntered() // This is automatically called when something enters your square @@ -219,7 +220,12 @@ destination.Entered(src) for(var/atom/movable/AM in destination) AM.Crossed(src) - + var/turf/oldturf = get_turf(old_loc) + var/turf/destturf = get_turf(destination) + var/old_z = (oldturf ? oldturf.z : null) + var/dest_z = (destturf ? destturf.z : null) + if(old_z != dest_z) + onTransitZ(old_z, dest_z) if(isturf(destination) && opacity) var/turf/new_loc = destination new_loc.reconsider_lights() @@ -232,6 +238,11 @@ return 1 +/atom/movable/proc/onTransitZ(old_z,new_z) + for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. + var/atom/movable/AM = item + AM.onTransitZ(old_z,new_z) + /mob/living/forceMove(atom/destination) if(buckled) addtimer(CALLBACK(src, .proc/check_buckled), 1, TIMER_UNIQUE) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 461de475b41..1370b64ecc7 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -218,7 +218,7 @@ /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered - if(!ticker) return //wait till the game starts or the monkeys runtime.... + if(!SSticker) return //wait till the game starts or the monkeys runtime.... if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 9ab851e86bf..506ef5714f8 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,9 +188,19 @@ ..() block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/activate(mob/user) + ..() + user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) + +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(mob/user) + ..() + for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) + if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) + user.RemoveSpell(S) + /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" - desc = "Make people understand your thoughts at any range!" + desc = "Make people understand your thoughts!" charge_max = 0 clothes_req = 0 @@ -242,6 +252,89 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") +/obj/effect/proc_holder/spell/targeted/mindscan + name = "Scan Mind" + desc = "Offer people a chance to share their thoughts!" + charge_max = 0 + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -2 + selection_type = "range" + action_icon_state = "genetic_mindscan" + var/list/available_targets = list() + +/obj/effect/proc_holder/spell/targeted/mindscan/choose_targets(mob/user = usr) + var/list/targets = new /list() + var/list/validtargets = new /list() + var/turf/T = get_turf(user) + for(var/mob/living/M in range(14, T)) + if(M && M.mind) + if(M == user) + continue + validtargets += M + + if(!validtargets.len) + to_chat(user, "There are no valid targets!") + start_recharge() + return + + targets += input("Choose the target to listen to.", "Targeting") as null|mob in validtargets + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + +/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) + if(!ishuman(user)) + return + for(var/mob/living/target in targets) + var/message = "You feel your mind expand briefly... (Click to send a message.)" + if(REMOTE_TALK in target.mutations) + message = "You feel [user.real_name] request a response from you... (Click here to project mind.)" + user.show_message("You offer your mind to [target.name].") + target.show_message("[message]") + available_targets += target + addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) + +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(mob/living/target) + if(target in available_targets) + available_targets -= target + if(!(target in available_targets)) + target.show_message("You feel the sensation fade...") + +/obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) + var/mob/living/user + if(href_list["user"]) + user = locateUID(href_list["user"]) + if(href_list["target"]) + if(!user) + return + var/mob/living/target = locateUID(href_list["target"]) + if(!(target in available_targets)) + return + available_targets -= target + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) + say = pencode_to_html(say, target, format = 0, fields = 0) + + log_say("(TPATH to [key_name(target)]) [say]", user) + if(REMOTE_TALK in target.mutations) + target.show_message("You project your mind into [user.name]: [say]") + else + target.show_message("You fill the space in your thoughts: [say]") + user.show_message("You hear [target.name]'s voice: [say]") + for(var/mob/dead/observer/G in GLOB.player_list) + G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") + +/obj/effect/proc_holder/spell/targeted/mindscan/Destroy() + available_targets.Cut() + return ..() + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 97371f6d35b..63f9d5fbaff 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -96,7 +96,8 @@ for(var/obj/item/implant/mindshield/I in H.contents) if(I && I.implanted) possible_traitors -= player - + if(!H.job) //Golems, special events stuff, etc. + possible_traitors -= player //message_admins("Live Players: [playercount]") //message_admins("Live Traitors: [traitorcount]") // message_admins("Potential Traitors:") diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index e6e9dfe4196..bf2143b9784 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -178,7 +178,8 @@ environment_smash = ENVIRONMENT_SMASH_RWALLS pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw - + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index bd934eefb44..0482a8e19ae 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -135,4 +135,9 @@ else log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") else - log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") + +/obj/structure/blob/core/onTransitZ(old_z, new_z) + if(overmind && is_station_level(new_z)) + overmind.forceMove(get_turf(src)) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 7ec1ec3b3f0..4489aaf707b 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -5,8 +5,8 @@ icon_state = "marker" see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM invisibility = INVISIBILITY_OBSERVER + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE pass_flags = PASSBLOB faction = list("blob") @@ -20,7 +20,6 @@ var/is_offspring = FALSE var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() var/list/blob_mobs = list() - var/ghostimage = null /mob/camera/blob/New() var/new_name = "[initial(name)] ([rand(1, 999)])" @@ -35,9 +34,6 @@ blob_core.adjustcolors(blob_reagent_datum.color) color = blob_reagent_datum.complementary_color - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage //so ghosts can see the blob cursor when they disable darkness - updateallghostimages() ..() /mob/camera/blob/Life(seconds, times_fired) @@ -45,13 +41,6 @@ qdel(src) ..() -/mob/camera/blob/Destroy() - if(ghostimage) - ghost_darkness_images -= ghostimage - QDEL_NULL(ghostimage) - updateallghostimages() - return ..() - /mob/camera/blob/Login() ..() sync_mind() diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 61196c9862f..5eb15759d99 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -378,8 +378,8 @@ new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) - if(ticker && ticker.mode.name == "blob") - var/datum/game_mode/blob/BL = ticker.mode + if(SSticker && SSticker.mode.name == "blob") + var/datum/game_mode/blob/BL = SSticker.mode BL.blobwincount += initial(BL.blobwincount) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 4b5560fe333..bed4c95ef86 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -132,15 +132,6 @@ throw_range = 0 throw_speed = 0 -/obj/item/melee/arm_blade/New() - ..() - if(ismob(loc)) - loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") - -/obj/item/melee/arm_blade/dropped(mob/user) - user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!", "We assimilate the blade back into our body.", "You hear organic matter ripping and tearing!") - . = ..() - /obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity) if(!proximity) return diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9e45cab4292..2b860756b45 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -5,7 +5,7 @@ var/global/list/all_cults = list() var/list/datum/mind/cult = list() /proc/iscultist(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.cult) /proc/is_convertable_to_cult(datum/mind/mind) @@ -30,8 +30,8 @@ var/global/list/all_cults = list() return 1 /proc/is_sacrifice_target(datum/mind/mind) - if(istype(ticker.mode.name, "cult")) - var/datum/game_mode/cult/cult_mode = ticker.mode + if(istype(SSticker.mode.name, "cult")) + var/datum/game_mode/cult/cult_mode = SSticker.mode if(mind == cult_mode.sacrifice_target) return 1 return 0 @@ -121,7 +121,7 @@ var/global/list/all_cults = list() var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) update_cult_icons_added(cult_mind) - to_chat(cult_mind.current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].") + to_chat(cult_mind.current, "You catch a glimpse of the Realm of [SSticker.cultdat.entity_name], [SSticker.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [SSticker.cultdat.entity_name].") first_phase() @@ -135,16 +135,16 @@ var/global/list/all_cults = list() if("survive") explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") if(sacrifice_target) explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune and three acolytes to do so." else explanation = "Free objective." if("eldergod") - explanation = "Summon [ticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] by invoking the 'Tear Reality' rune.The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" @@ -179,7 +179,7 @@ var/global/list/all_cults = list() /datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE if(!istype(cult_mind)) return 0 - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) cult += cult_mind cult_mind.current.faction |= "cult" @@ -314,10 +314,10 @@ var/global/list/all_cults = list() feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) - explanation = "Summon [ticker.cultdat.entity_name]. Success!" + explanation = "Summon [SSticker.cultdat.entity_name]. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon [ticker.cultdat.entity_name]. Fail." + explanation = "Summon [SSticker.cultdat.entity_name]. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") if("slaughter") if(demons_summoned) @@ -345,10 +345,10 @@ var/global/list/all_cults = list() if("harvest") if(harvested > harvest_target) - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Success!" feedback_add_details("cult_objective","cult_harvest|SUCCESS") else - explanation = "Offer [harvest_target] humans for [ticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" + explanation = "Offer [harvest_target] humans for [SSticker.cultdat.entity_name]'s first meal of the day. ([harvested] sacrificed) Fail!" feedback_add_details("cult_objective","cult_harvest|FAIL") if("hijack") @@ -375,7 +375,7 @@ var/global/list/all_cults = list() /datum/game_mode/proc/auto_declare_completion_cult() - if(cult.len || (ticker && GAMEMODE_IS_CULT)) + if(cult.len || (SSticker && GAMEMODE_IS_CULT)) var/text = "The cultists were:" for(var/datum/mind/cultist in cult) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f38958e0c2b..e4274d18d49 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -218,7 +218,7 @@ name = "zealot's blindfold" icon_state = "blindfold" item_state = "blindfold" - darkness_view = 8 + see_in_dark = 8 flash_protect = 1 /obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot) diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index beef75e103b..da4e190cb7f 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -19,10 +19,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -59,8 +59,8 @@ message_admins("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") log_admin("The Cult has already completed [prenarsie_objectives] objectives! Nar-Sie objective unlocked.") else - message_admins("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") - log_admin("There are less than 4 cultists! [ticker.cultdat.entity_name] objective unlocked.") + message_admins("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") + log_admin("There are less than 4 cultists! [SSticker.cultdat.entity_name] objective unlocked.") gtfo_phase() if(!sacrificed.len && (new_objective != "sacrifice")) @@ -76,10 +76,10 @@ switch(new_objective) if("convert") - explanation = "We must increase our influence before we can summon [ticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + explanation = "We must increase our influence before we can summon [SSticker.cultdat.entity_name]. Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." if("bloodspill") spilltarget = 100 + rand(0,GLOB.player_list.len * 3) - explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." + explanation = "We must prepare this place for [SSticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles." if("sacrifice") explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual." @@ -111,7 +111,7 @@ if(prob(40))//split the chance of this objectives += "eldergod" - explanation = "Summon [ticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." + explanation = "Summon [SSticker.cultdat.entity_name] on the Station via the use of the Tear Reality rune. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." else objectives += "slaughter" explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin." @@ -135,11 +135,11 @@ switch(last_objective) if("harvest") - explanation = "[ticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." + explanation = "[SSticker.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice." if("hijack") - explanation = "[ticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." + explanation = "[SSticker.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it." if("massacre") - explanation = "[ticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." + explanation = "[SSticker.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)." for(var/datum/mind/cult_mind in cult) if(cult_mind) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index d561291c19f..fb6bb95a4a8 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -11,7 +11,7 @@ return /obj/effect/rune/proc/check_icon() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way var/bits = make_bit_triplet() icon = get_rune(bits) else @@ -39,16 +39,16 @@ canbypass = 1 /obj/item/tome/New() - if(!ticker.mode) + if(!SSticker.mode) icon_state = "tome" else - icon_state = ticker.cultdat.tome_icon + icon_state = SSticker.cultdat.tome_icon ..() /obj/item/tome/examine(mob/user) ..() if(iscultist(user) || user.stat == DEAD) - to_chat(user, "The scriptures of [ticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [ticker.cultdat.entity_name].") + to_chat(user, "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name].") to_chat(user, "Striking another cultist with it will purge holy water from them.") to_chat(user, "Striking a noncultist, however, will sear their flesh.") @@ -91,7 +91,7 @@ /obj/item/tome/proc/read_tome(mob/user) var/text = list() - text += "
Archives of [ticker.cultdat.entity_title1]



" + text += "
Archives of [SSticker.cultdat.entity_title1]



" text += "A rune's name and effects can be revealed by examining the rune.<

" text += "Rite of Binding
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ @@ -102,7 +102,7 @@ text += "Rite of Enlightenment
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \ To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is mindshielded or a certain assignment, they will \ - be unable to be converted. People [ticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ + be unable to be converted. People [SSticker.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ Successful conversions will produce a tome for the new cultist.

" text += "Rite of Tribute
This rune is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ @@ -135,12 +135,12 @@ text += "Leeching
When invoked, this rune will transfer lifeforce from the victim to the invoker.

" - text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [ticker.cultdat.entity_title3]. \ + text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [SSticker.cultdat.entity_title3]. \ However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" text += "Ritual of Dimensional Rending
This rune is necessary to achieve your goals. On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \ - and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [ticker.cultdat.entity_title3], [ticker.cultdat.entity_name]. \ + and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [SSticker.cultdat.entity_title3], [SSticker.cultdat.entity_name]. \ This will complete your objectives.


" text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.

" @@ -201,12 +201,12 @@ return 1 /obj/item/tome/proc/finale_runes_ok(mob/living/user, obj/effect/rune/rune_to_scribe) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/area/A = get_area(src) if(GAMEMODE_IS_CULT) if(!canbypass)//not an admin-tome, check things if(!cult_mode.narsie_condition_cleared) - to_chat(user, "There is still more to do before unleashing [ticker.cultdat.entity_name] power!") + to_chat(user, "There is still more to do before unleashing [SSticker.cultdat.entity_name] power!") return 0 if(!cult_mode.eldergod) to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") @@ -215,19 +215,19 @@ to_chat(user, "\"We are already here. There is no need to try to summon us now.\"") return 0 if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives))) - to_chat(user, "[ticker.cultdat.entity_name]'s power does not wish to be unleashed!") + to_chat(user, "[SSticker.cultdat.entity_name]'s power does not wish to be unleashed!") return 0 if(!(A in summon_spots)) - to_chat(user, "[ticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") + to_chat(user, "[SSticker.cultdat.entity_name] can only be summoned where the veil is weak - in [english_list(summon_spots)]!") return 0 - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 else return 1 else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS - var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.cultdat.entity_name]!", "No") + var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [SSticker.cultdat.entity_name]!", "No") if(confirm_final == "No" || confirm_final == null) to_chat(user, "You decide to prepare further before scribing the rune.") return 0 @@ -296,7 +296,7 @@ var/mob/living/carbon/human/H = user var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.cultdat.entity_title3].") + user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [SSticker.cultdat.entity_title3].") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE , affecting) if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user))) for(var/V in shields) @@ -308,7 +308,7 @@ to_chat(user, "There is already a rune here.") return user.visible_message("[user] creates a strange circle in [user.p_their()] own blood.", \ - "You finish drawing the arcane markings of [ticker.cultdat.entity_title3].") + "You finish drawing the arcane markings of [SSticker.cultdat.entity_title3].") for(var/V in shields) var/obj/machinery/shield/S = V if(S && !QDELETED(S)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 1ed5e812989..ef2a970adb3 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -197,7 +197,7 @@ structure_check() searches for nearby cultist structures required for the invoca ..() for(var/M in invokers) var/mob/living/L = M - to_chat(L, "You feel your life force draining. [ticker.cultdat.entity_title3] is displeased.") + to_chat(L, "You feel your life force draining. [SSticker.cultdat.entity_title3] is displeased.") qdel(src) /mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes @@ -372,12 +372,12 @@ var/list/teleport_runes = list() new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ "AAAAAAAAAAAAAA-") - ticker.mode.add_cultist(new_cultist.mind, 1) + SSticker.mode.add_cultist(new_cultist.mind, 1) new /obj/item/tome(get_turf(src)) new_cultist.mind.special_role = "Cultist" to_chat(new_cultist, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ and something evil takes root.") - to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [ticker.cultdat.entity_title3] above all else. Bring it back.\ + to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [SSticker.cultdat.entity_title3] above all else. Bring it back.\ ") //Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. @@ -391,7 +391,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/New() ..() - cultist_desc = "sacrifices a crew member to [ticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." + cultist_desc = "sacrifices a crew member to [SSticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." /obj/effect/rune/sacrifice/invoke(var/list/invokers) if(rune_in_use) @@ -432,7 +432,7 @@ var/list/teleport_runes = list() /obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T) var/sacrifice_fulfilled - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(T) if(istype(T, /mob/living/simple_animal/pet/corgi)) for(var/M in invokers) @@ -445,7 +445,7 @@ var/list/teleport_runes = list() if(is_sacrifice_target(T.mind)) sacrifice_fulfilled = 1 new /obj/effect/temp_visual/cult/sac(loc) - if(ticker && ticker.mode && ticker.mode.name == "cult") + if(SSticker && SSticker.mode && SSticker.mode.name == "cult") cult_mode.harvested++ for(var/M in invokers) @@ -494,8 +494,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/New() ..() - cultist_name = "Summon [ticker.cultdat.entity_name]" - cultist_desc = "tears apart dimensional barriers, calling forth [ticker.cultdat.entity_title3]. Requires 9 invokers." + cultist_name = "Summon [SSticker.cultdat.entity_name]" + cultist_desc = "tears apart dimensional barriers, calling forth [SSticker.cultdat.entity_title3]. Requires 9 invokers." /obj/effect/rune/narsie/check_icon() @@ -508,7 +508,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_ELDERGOD in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summonn an eldritch horror when the objective was wrong") burn_invokers(invokers) @@ -521,7 +521,7 @@ var/list/teleport_runes = list() return if(!cult_mode.eldergod) for(var/M in invokers) - to_chat(M, "[ticker.cultdat.entity_name] is already on this plane!") + to_chat(M, "[SSticker.cultdat.entity_name] is already on this plane!") log_game("Summon god rune failed - already summoned") return //BEGIN THE SUMMONING @@ -594,7 +594,7 @@ var/list/teleport_runes = list() if(used) return var/mob/living/user = invokers[1] - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode if(!(CULT_SLAUGHTER in cult_mode.objectives)) message_admins("[key_name_admin(user)] tried to summon demons when the objective was wrong") burn_invokers(invokers) @@ -856,10 +856,10 @@ var/list/teleport_runes = list() /obj/effect/rune/summon/invoke(var/list/invokers) var/mob/living/user = invokers[1] var/list/cultists = list() - for(var/datum/mind/M in ticker.mode.cult) + for(var/datum/mind/M in SSticker.mode.cult) if(!(M.current in invokers) && M.current && M.current.stat != DEAD) cultists |= M.current - var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.cultdat.entity_title3]") as null|anything in cultists + var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [SSticker.cultdat.entity_title3]") as null|anything in cultists if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated()) return if(!cultist_to_summon) @@ -868,7 +868,7 @@ var/list/teleport_runes = list() log_game("Summon Cultist rune failed - no target") return if(!iscultist(cultist_to_summon)) - to_chat(user, "[cultist_to_summon] is not a follower of [ticker.cultdat.entity_title3]!") + to_chat(user, "[cultist_to_summon] is not a follower of [SSticker.cultdat.entity_title3]!") fail_invoke() log_game("Summon Cultist rune failed - no target") return @@ -977,7 +977,7 @@ var/list/teleport_runes = list() /obj/effect/rune/manifest/New(loc) ..() - cultist_desc = "manifests a spirit as a servant of [ticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + cultist_desc = "manifests a spirit as a servant of [SSticker.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." notify_ghosts("Manifest rune created in [get_area(src)].", ghost_sound='sound/effects/ghost2.ogg', source = src) @@ -1033,10 +1033,10 @@ var/list/teleport_runes = list() N.health = 20 N.mouse_opacity = MOUSE_OPACITY_TRANSPARENT new_human.key = ghost_to_spawn.key - ticker.mode.add_cultist(new_human.mind, 0) + SSticker.mode.add_cultist(new_human.mind, 0) summoned_guys |= new_human ghosts++ - to_chat(new_human, "You are a servant of [ticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.cultdat.entity_name], and you are to serve them at all costs.") + to_chat(new_human, "You are a servant of [SSticker.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [SSticker.cultdat.entity_name], and you are to serve them at all costs.") while(user in get_turf(src)) if(user.stat) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 875e8a3d1e9..92fc09490ec 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -41,7 +41,7 @@ invocation = "Ra'sha yoka!" /obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1) - to_chat(user, "You feel a pain in your head. [ticker.cultdat.entity_title3] is displeased.") + to_chat(user, "You feel a pain in your head. [SSticker.cultdat.entity_title3] is displeased.") if(iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(10, BRUTE, "head") diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index e11d31f7d98..419034a9e1f 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -300,9 +300,9 @@ var/global/list/lawlorify = list ( to_chat(world, "SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!") world << 'sound/hallucinations/veryfar_noise.ogg' sleep(50) - if(!ticker.mode.devil_ascended) + if(!SSticker.mode.devil_ascended) SSshuttle.emergency.request(null, 0.3) - ticker.mode.devil_ascended++ + SSticker.mode.devil_ascended++ /datum/devilinfo/proc/increase_arch_devil() if(!ascendable) diff --git a/code/game/gamemodes/devil/imp/imp.dm b/code/game/gamemodes/devil/imp/imp.dm index b012edc1930..e863eaf1f6a 100644 --- a/code/game/gamemodes/devil/imp/imp.dm +++ b/code/game/gamemodes/devil/imp/imp.dm @@ -29,7 +29,7 @@ melee_damage_lower = 10 melee_damage_upper = 15 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/boost var/playstyle_string = "You are an imp, a mischevious creature from hell. You are the lowest rank on the hellish totem pole \ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \ diff --git a/code/game/gamemodes/devil/objectives.dm b/code/game/gamemodes/devil/objectives.dm index 5214ab336ec..04d0217b599 100644 --- a/code/game/gamemodes/devil/objectives.dm +++ b/code/game/gamemodes/devil/objectives.dm @@ -68,7 +68,7 @@ explanation_text = "Ensure at least [target_amount] mortals are sintouched." /datum/objective/devil/sintouch/check_completion() - return target_amount <= ticker.mode.sintouched.len + return target_amount <= SSticker.mode.sintouched.len diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 18058b42279..a6c04c5dcc0 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -30,22 +30,6 @@ E.insert() ..() - -/mob/living/carbon/true_devil/update_sight() - if(stat == DEAD) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else - sight = (SEE_TURFS | SEE_OBJS) - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - - if(see_override) - see_invisible = see_override - // inventory system could use some love /mob/living/carbon/true_devil/put_in_hands(obj/item/W) if(!W) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 5f3ed489107..4f583abdfed 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -75,8 +75,8 @@ display_roundstart_logout_report() feedback_set_details("round_start","[time2text(world.realtime)]") - if(ticker && ticker.mode) - feedback_set_details("game_mode","[ticker.mode]") + if(SSticker && SSticker.mode) + feedback_set_details("game_mode","[SSticker.mode]") // if(revdata) // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index e8a3ff6c981..2b4d095b327 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -312,5 +312,5 @@ datum/game_mode/proc/auto_declare_completion_heist() message_admins("[key_name_admin(user)] has pressed the vox win button.") log_admin("[key_name(user)] pressed the vox win button during a vox round.") - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode H.win_button_triggered = 1 diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 5e8be8b1229..d1d176f797e 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -113,10 +113,10 @@ if(man.client && man.client.prefs.nanotrasen_relation == "Opposed") //don't include suspects who can't possibly be the antag based on their job (no suspecting the captain of being a damned dirty tator) if(man.mind && man.mind.assigned_role) - if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs)) + if((man.mind.assigned_role in SSticker.mode.protected_jobs) || (man.mind.assigned_role in SSticker.mode.restricted_jobs)) return //don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings) - if(man.dna.species.name in ticker.mode.protected_species) + if(man.dna.species.name in SSticker.mode.protected_species) return dudes += man for(var/i = 0, i < max(GLOB.player_list.len/10,2), i++) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index bfde102ca35..8eeee9e4f2a 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -111,7 +111,7 @@ to_chat(L, "The blast wave from [src] tears you atom from atom!") L.dust() to_chat(world, "The AI cleansed the station of life with the doomsday device!") - ticker.force_ending = 1 + SSticker.force_ending = 1 /datum/AI_Module/large/upgrade_turrets @@ -496,22 +496,22 @@ return var/upgradedcams = 0 - see_override = SEE_INVISIBLE_MINIMUM //Night-vision, without which X-ray would be very limited in power. + RegisterSignal(src, COMSIG_MOB_UPDATE_SIGHT, .proc/update_upgraded_cameras_sight) //Makes sure the AI has night vision, without which X-ray would be very limited in power. update_sight() for(var/obj/machinery/camera/C in cameranet.cameras) if(C.assembly) - var/upgraded = 0 + var/upgraded = FALSE if(!C.isXRay()) C.upgradeXRay() //Update what it can see. cameranet.updateVisibility(C, 0) - upgraded = 1 + upgraded = TRUE if(!C.isEmpProof()) C.upgradeEmpProof() - upgraded = 1 + upgraded = TRUE if(upgraded) upgradedcams++ @@ -519,6 +519,8 @@ to_chat(src, "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.") verbs -= /mob/living/silicon/ai/proc/upgrade_cameras +/mob/living/silicon/ai/proc/update_upgraded_cameras_sight() + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /datum/AI_Module/large/eavesdrop module_name = "Enhanced Surveillance" diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 587c2b3d476..aab75687df4 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -251,14 +251,14 @@ /datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind) if(abductor_mind in abductors) - ticker.mode.abductors -= abductor_mind + SSticker.mode.abductors -= abductor_mind abductor_mind.special_role = null abductor_mind.current.create_attack_log("No longer abductor") if(issilicon(abductor_mind.current)) to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.") else to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.") - ticker.mode.update_abductor_icons_removed(abductor_mind) + SSticker.mode.update_abductor_icons_removed(abductor_mind) /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index fbe1774525f..2b0162829e1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -320,69 +320,6 @@ for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. H.add_mob_blood(owner) -/obj/item/organ/internal/heart/gland/bodysnatch - cooldown_low = 600 - cooldown_high = 600 - human_only = 1 - uses = 1 - -/obj/item/organ/internal/heart/gland/bodysnatch/activate() - to_chat(owner, "You feel something moving around inside you...") - //spawn cocoon with clone greytide snpc inside - if(ishuman(owner)) - var/obj/effect/cocoon/abductor/C = new (get_turf(owner)) - C.Copy(owner) - C.Start() - owner.adjustBruteLoss(40) - owner.add_splatter_floor() - -/obj/effect/cocoon/abductor - name = "slimy cocoon" - desc = "Something is moving inside." - icon = 'icons/effects/effects.dmi' - icon_state = "cocoon_large3" - color = rgb(10,120,10) - density = 1 - var/hatch_time = 0 - -/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) - var/mob/living/carbon/human/interactive/greytide/clone = new(src) - var/datum/dna/owner_dna = H.dna - clone.rename_character(clone.name, owner_dna.real_name) - clone.set_species(owner_dna.species.type) - clone.dna = owner_dna.Clone() - clone.body_accessory = H.body_accessory - domutcheck(clone) - - for(var/obj/item/I in clone) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - - //There's no define for this / get all items ? - var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ - slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) - - for(var/slot in slots) - var/obj/item/I = H.get_item_by_slot(slot) - if(I) - clone.equip_to_slot_or_del(new I.type(clone), slot) - -/obj/effect/cocoon/abductor/proc/Start() - hatch_time = world.time + 600 - START_PROCESSING(SSobj, src) - -/obj/effect/cocoon/abductor/process() - if(world.time > hatch_time) - STOP_PROCESSING(SSobj, src) - for(var/mob/M in contents) - src.visible_message("[src] hatches!") - M.forceMove(get_turf(src)) - qdel(src) - /obj/item/organ/internal/heart/gland/plasma cooldown_low = 1200 diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 53969aaf7d1..db6f07c1d24 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -140,14 +140,14 @@ to_chat(H, "You can't remember how you got here...") var/objtype = pick(subtypesof(/datum/objective/abductee/)) var/datum/objective/abductee/O = new objtype() - ticker.mode.abductees += H.mind + SSticker.mode.abductees += H.mind H.mind.objectives += O var/obj_count = 1 to_chat(H, "Your current objectives:") for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ - ticker.mode.update_abductor_icons_added(H.mind) + SSticker.mode.update_abductor_icons_added(H.mind) for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs) G.Start() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm index f7ff2864608..697d173716a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -7,7 +7,8 @@ var/turf/teleport_target /obj/machinery/abductor/pad/proc/Warp(mob/living/target) - target.Move(src.loc) + if(!target.buckled) + target.forceMove(get_turf(src)) /obj/machinery/abductor/pad/proc/Send() if(teleport_target == null) diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 0979ed45a6c..3e57a059d10 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -16,7 +16,7 @@ ranged = 1 rapid = 1 range = 13 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE see_in_dark = 8 playstyle_string = "As a Ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." @@ -53,12 +53,24 @@ to_chat(src, "You have to be recalled to toggle modes!") /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() - if(see_invisible == SEE_INVISIBLE_MINIMUM) - to_chat(src, "You deactivate your night vision.") - see_invisible = SEE_INVISIBLE_LIVING - else - to_chat(src, "You activate your night vision.") - see_invisible = SEE_INVISIBLE_MINIMUM + var/msg + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + msg = "You activate your night vision." + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + msg = "You increase your night vision." + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + msg = "You maximize your night vision." + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + msg = "You deactivate your night vision." + + update_sight() + + to_chat(src, "[msg]") /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() set name = "Set Surveillance Trap" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 702007aef46..81e052a85d8 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -27,7 +27,7 @@ melee_damage_lower = 20 melee_damage_upper = 20 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE idle_vision_range = 1 // Only attack when target is close wander = 0 attacktext = "glomps" diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 4a1c8ebeb7e..e80374e2dca 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -21,7 +21,7 @@ player_mind.transfer_to(S) player_mind.assigned_role = SPECIAL_ROLE_MORPH player_mind.special_role = SPECIAL_ROLE_MORPH - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) S << 'sound/magic/mutate.ogg' message_admins("[key_of_morph] has been made into morph by an event.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 54b01ff38ce..740601f3798 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -20,7 +20,7 @@ health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE universal_understand = 1 response_help = "passes through" response_disarm = "swings at" @@ -53,7 +53,6 @@ var/draining = 0 //If the revenant is draining someone. var/list/drained_mobs = list() //Cannot harvest the same mob twice var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. - var/image/ghostimage = null //Visible to ghost with darkness off /mob/living/simple_animal/revenant/Life(seconds, times_fired) @@ -93,13 +92,6 @@ if(essence == 0) to_chat(src, "You feel your essence fraying!") -/mob/living/simple_animal/revenant/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - /mob/living/simple_animal/revenant/say(message) if(!message) return @@ -122,9 +114,6 @@ /mob/living/simple_animal/revenant/New() ..() - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage - updateallghostimages() remove_from_all_data_huds() random_revenant_name() @@ -182,7 +171,7 @@ objective2.owner = mind mind.objectives += objective2 to_chat(src, "Objective #2: [objective2.explanation_text]") - ticker.mode.traitors |= mind //Necessary for announcing + SSticker.mode.traitors |= mind //Necessary for announcing /mob/living/simple_animal/revenant/proc/giveSpells() mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) @@ -206,8 +195,6 @@ . = ..() if(!.) return FALSE - ghost_darkness_images -= ghostimage - updateallghostimages() to_chat(src, "NO! No... it's too late, you can feel your essence breaking apart...") notransform = 1 @@ -429,7 +416,7 @@ player_mind.transfer_to(R) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index cdb55aa1b31..34bf06f07f7 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -110,8 +110,6 @@ message = "You toggle your night vision." action_icon_state = "r_nightvision" action_background_icon_state = "bg_revenant" - non_night_vision = INVISIBILITY_REVENANT - night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob /obj/effect/proc_holder/spell/targeted/revenant_transmit diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 757fbe579a2..437e7637a77 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -45,7 +45,7 @@ player_mind.transfer_to(revvie) player_mind.assigned_role = SPECIAL_ROLE_REVENANT player_mind.special_role = SPECIAL_ROLE_REVENANT - ticker.mode.traitors |= player_mind + SSticker.mode.traitors |= player_mind message_admins("[key_of_revenant] has been made into a revenant by an event.") log_game("[key_of_revenant] was spawned as a revenant by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 488525c42a1..09d5fecb8a2 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -33,7 +33,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/boost = 0 bloodcrawl = BLOODCRAWL_EAT @@ -72,7 +72,7 @@ if(!(vialspawned)) var/datum/objective/slaughter/objective = new var/datum/objective/demonFluff/fluffObjective = new - ticker.mode.traitors |= mind + SSticker.mode.traitors |= mind objective.owner = mind fluffObjective.owner = mind //Paradise Port:I added the objective for one spawned like this @@ -174,7 +174,7 @@ S.mind.assigned_role = "Harbringer of the Slaughter" S.mind.special_role = "Harbringer of the Slaughter" to_chat(S, playstyle_string) - ticker.mode.add_cultist(S.mind) + SSticker.mode.add_cultist(S.mind) var/obj/effect/proc_holder/spell/targeted/sense_victims/SV = new AddSpell(SV) var/datum/objective/new_objective = new /datum/objective diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d19d2dd7cc5..4e9d507c9ea 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -4,7 +4,7 @@ var/list/datum/mind/syndicates = list() proc/issyndicate(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.syndicates) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.syndicates) /datum/game_mode/nuclear name = "nuclear emergency" @@ -64,7 +64,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/remove_operative(datum/mind/operative_mind) if(operative_mind in syndicates) - ticker.mode.syndicates -= operative_mind + SSticker.mode.syndicates -= operative_mind operative_mind.special_role = null for(var/datum/objective/nuclear/O in operative_mind.objectives) operative_mind.objectives -= O @@ -73,7 +73,7 @@ proc/issyndicate(mob/living/M as mob) to_chat(operative_mind.current, "You have been turned into a robot! You are no longer a Syndicate operative.") else to_chat(operative_mind.current, "You have been brainwashed! You are no longer a Syndicate operative.") - ticker.mode.update_synd_icons_removed(operative_mind) + SSticker.mode.update_synd_icons_removed(operative_mind) //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -208,7 +208,7 @@ proc/issyndicate(mob/living/M as mob) P.stamp(stamp) qdel(stamp) - if(ticker.mode.config_tag=="nuclear") + if(SSticker.mode.config_tag=="nuclear") P.loc = synd_mind.current.loc else var/mob/living/carbon/human/H = synd_mind.current @@ -437,7 +437,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ if(!M || !M.current) score_opkilled++ @@ -457,7 +457,7 @@ proc/issyndicate(mob/living/M as mob) var/turf/T = get_turf(nuke) var/area/A = T.loc - var/list/thousand_penalty = list(/area/syndicate_station, /area/wizard_station, /area/solar, /area) + var/list/thousand_penalty = list(/area/wizard_station, /area/solar, /area) var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2) if(is_type_in_list(A, thousand_penalty)) @@ -490,7 +490,7 @@ proc/issyndicate(mob/living/M as mob) var/diskdat = "" var/bombdat = null - for(var/datum/mind/M in ticker.mode.syndicates) + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ for(var/mob/living/C in world) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 45711bb52fc..35c26408c5b 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -21,7 +21,7 @@ return declaring_war = TRUE - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No") declaring_war = FALSE if(!check_allowed(user)) @@ -88,7 +88,7 @@ if(!is_admin_level(user.z)) to_chat(user, "You have to be at your base to use this.") return FALSE - if((world.time - round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started + if((world.time - SSticker.round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") return FALSE for(var/obj/machinery/computer/shuttle/syndicate/S in GLOB.machines) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 2e36488cc8a..09de3f917bd 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -354,8 +354,8 @@ var/bomb_set if(!lighthack) icon_state = "nuclearbomb3" playsound(src,'sound/machines/alarm.ogg',100,0,5) - if(ticker && ticker.mode) - ticker.mode.explosion_in_progress = 1 + if(SSticker && SSticker.mode) + SSticker.mode.explosion_in_progress = 1 sleep(100) enter_allowed = 0 @@ -368,17 +368,17 @@ var/bomb_set else off_station = 2 - if(ticker) - if(ticker.mode && ticker.mode.name == "nuclear emergency") + if(SSticker) + if(SSticker.mode && SSticker.mode.name == "nuclear emergency") var/obj/docking_port/mobile/syndie_shuttle = SSshuttle.getShuttle("syndicate") if(syndie_shuttle) - ticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) - ticker.mode:nuke_off_station = off_station - ticker.station_explosion_cinematic(off_station,null) - if(ticker.mode) - ticker.mode.explosion_in_progress = 0 - if(ticker.mode.name == "nuclear emergency") - ticker.mode:nukes_left -- + SSticker.mode:syndies_didnt_escape = is_station_level(syndie_shuttle.z) + SSticker.mode:nuke_off_station = off_station + SSticker.station_explosion_cinematic(off_station,null) + if(SSticker.mode) + SSticker.mode.explosion_in_progress = 0 + if(SSticker.mode.name == "nuclear emergency") + SSticker.mode:nukes_left -- else if(off_station == 1) to_chat(world, "A nuclear device was set off, but the explosion was out of reach of the station!") else if(off_station == 2) @@ -386,10 +386,10 @@ var/bomb_set else to_chat(world, "The station was destoyed by the nuclear blast!") - ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. + SSticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. - if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is + if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") return return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 61986b34f94..d221c94d39f 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -273,7 +273,7 @@ var/mob/living/carbon/nearest_op = null /obj/item/pinpointer/operative/attack_self() - if(!usr.mind || !(usr.mind in ticker.mode.syndicates)) + if(!usr.mind || !(usr.mind in SSticker.mode.syndicates)) to_chat(usr, "AUTHENTICATION FAILURE. ACCESS DENIED.") return 0 if(!active) @@ -290,7 +290,7 @@ nearest_op = null //Resets nearest_op every time it scans var/closest_distance = 1000 for(var/mob/living/carbon/M in GLOB.mob_list) - if(M.mind && (M.mind in ticker.mode.syndicates)) + if(M.mind && (M.mind in SSticker.mode.syndicates)) if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to nearest_op = M diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 210b1bb786e..7c358ba951d 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -43,7 +43,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/proc/find_target() var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(is_invalid_target(possible_target)) continue @@ -263,9 +263,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu return 0 if(!owner.current || owner.current.stat == DEAD) return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith return 1 - if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win + if(SSticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win return 1 if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) return 0 @@ -287,7 +287,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/escape/escape_with_identity/find_target() var/list/possible_targets = list() //Copypasta because NO_DNA races, yay for snowflakes. - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client) var/mob/living/carbon/human/H = possible_target.current if(!(NO_DNA in H.dna.species.species_traits)) @@ -452,19 +452,19 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu /datum/objective/absorb /datum/objective/absorb/proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) target_amount = rand (lowbound,highbound) - if(ticker) + if(SSticker) var/n_p = 1 //autowin - if(ticker.current_state == GAME_STATE_SETTING_UP) + if(SSticker.current_state == GAME_STATE_SETTING_UP) for(var/mob/new_player/P in GLOB.player_list) if(P.client && P.ready && P.mind != owner) if(P.client.prefs && (P.client.prefs.species == "Machine")) // Special check for species that can't be absorbed. No better solution. continue n_p++ - else if(ticker.current_state == GAME_STATE_PLAYING) + else if(SSticker.current_state == GAME_STATE_PLAYING) for(var/mob/living/carbon/human/P in GLOB.player_list) if(NO_DNA in P.dna.species.species_traits) continue - if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner) + if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p++ target_amount = min(target_amount, n_p) @@ -531,7 +531,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/list/possible_targets = list() var/list/priority_targets = list() - for(var/datum/mind/possible_target in ticker.minds) + for(var/datum/mind/possible_target in SSticker.minds) if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role)) possible_targets += possible_target for(var/role in roles) @@ -627,7 +627,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(total_amount >= target_amount) return 1 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/O in raider.current.get_contents()) @@ -697,7 +697,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu S = I total_amount += S.get_amount() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) if(raider.current) for(var/obj/item/O in raider.current.get_contents()) @@ -714,7 +714,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Do not leave any Vox behind, alive or dead." /datum/objective/heist/inviolate_crew/check_completion() - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode if(H.is_raider_crew_safe()) return 1 return 0 @@ -726,7 +726,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu var/vox_allowed_kills = 3 // The number of people the vox can accidently kill. Mostly a counter to people killing themselves if a raider touches them to force fail. var/vox_total_kills = 0 - var/datum/game_mode/heist/H = ticker.mode + var/datum/game_mode/heist/H = SSticker.mode for(var/datum/mind/raider in H.raiders) vox_total_kills += raider.kills.len // Kills are listed in the mind; uses this to calculate vox kills diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 7cab3de5aa1..9f7e14ccef2 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -87,7 +87,7 @@ if(check_counter >= 5) if(!finished) check_heads() - ticker.mode.check_win() + SSticker.mode.check_win() check_counter = 0 return FALSE @@ -369,7 +369,7 @@ /datum/game_mode/revolution/set_scoreboard_gvars() var/foecount = 0 - for(var/datum/mind/M in ticker.mode.head_revolutionaries) + for(var/datum/mind/M in SSticker.mode.head_revolutionaries) foecount++ if(!M || !M.current) score_opkilled++ @@ -408,10 +408,10 @@ var/comcount = 0 var/revcount = 0 var/loycount = 0 - for(var/datum/mind/M in ticker.mode:head_revolutionaries) + for(var/datum/mind/M in SSticker.mode:head_revolutionaries) if(M.current && M.current.stat != DEAD) foecount++ - for(var/datum/mind/M in ticker.mode:revolutionaries) + for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ for(var/mob/living/carbon/human/player in world) @@ -421,7 +421,7 @@ if(player.stat != DEAD) comcount++ else - if(player.mind in ticker.mode.revolutionaries) continue + if(player.mind in SSticker.mode.revolutionaries) continue loycount++ for(var/mob/living/silicon/X in world) diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 35284594b46..216c946fc97 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -67,32 +67,32 @@ datum/hSB P.wear_suit.plane = initial(P.wear_suit.plane) P.wear_suit = null P.wear_suit = new/obj/item/clothing/suit/space(P) - P.wear_suit.layer = 20 - P.wear_suit.plane = HUD_PLANE + P.wear_suit.layer = ABOVE_HUD_LAYER + P.wear_suit.plane = ABOVE_HUD_PLANE if(P.head) P.head.loc = P.loc P.head.layer = initial(P.head.layer) P.head.plane = initial(P.head.plane) P.head = null P.head = new/obj/item/clothing/head/helmet/space(P) - P.head.layer = 20 - P.head.plane = HUD_PLANE + P.head.layer = ABOVE_HUD_LAYER + P.head.plane = ABOVE_HUD_PLANE if(P.wear_mask) P.wear_mask.loc = P.loc P.wear_mask.layer = initial(P.wear_mask.layer) P.wear_mask.plane = initial(P.wear_mask.plane) P.wear_mask = null P.wear_mask = new/obj/item/clothing/mask/gas(P) - P.wear_mask.layer = 20 - P.wear_mask.plane = HUD_PLANE + P.wear_mask.layer = ABOVE_HUD_LAYER + P.wear_mask.plane = ABOVE_HUD_PLANE if(P.back) P.back.loc = P.loc P.back.layer = initial(P.back.layer) P.back.plane = initial(P.back.plane) P.back = null P.back = new/obj/item/tank/jetpack(P) - P.back.layer = 20 - P.back.plane = HUD_PLANE + P.back.layer = ABOVE_HUD_LAYER + P.back.plane = ABOVE_HUD_PLANE P.internal = P.back if("hsbmetal") var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index bd17175eaa2..379b4fbdcd9 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -1,9 +1,9 @@ -/datum/controller/gameticker/proc/scoreboard() +/datum/controller/subsystem/ticker/proc/scoreboard() //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) + for(var/datum/mind/Mind in SSticker.minds) var/temprole = Mind.special_role if(temprole) //if they are an antagonist of some sort. if(temprole in total_antagonists) //If the role exists already, add the name to it @@ -66,8 +66,8 @@ score_dmgestjob = E.job score_dmgestkey = E.key - if(ticker && ticker.mode) - ticker.mode.set_scoreboard_gvars() + if(SSticker && SSticker.mode) + SSticker.mode.set_scoreboard_gvars() // Check station's power levels @@ -147,7 +147,7 @@ E.scorestats() // A recursive function to properly determine the wealthiest escapee -/datum/controller/gameticker/proc/get_score_container_worth(atom/C, level=0) +/datum/controller/subsystem/ticker/proc/get_score_container_worth(atom/C, level=0) if(level >= 5) // in case the containers recurse or something return 0 @@ -171,8 +171,8 @@ /mob/proc/scorestats() var/dat = "Round Statistics and Score

" - if(ticker && ticker.mode) - dat += ticker.mode.get_scoreboard_stats() + if(SSticker && SSticker.mode) + dat += SSticker.mode.get_scoreboard_stats() dat += {" General Statistics
@@ -208,7 +208,7 @@ else dat += "No-one escaped!
" - dat += ticker.mode.declare_job_completion() + dat += SSticker.mode.declare_job_completion() dat += {"

diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 0c16e88279b..78e6cea4987 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -142,12 +142,12 @@ qdel(F) continue else - ticker.factions.Add(F) - ticker.availablefactions.Add(F) + SSticker.factions.Add(F) + SSticker.availablefactions.Add(F) // Populate the syndicate coalition: - for(var/datum/faction/syndicate/S in ticker.factions) - ticker.syndicate_coalition.Add(S) + for(var/datum/faction/syndicate/S in SSticker.factions) + SSticker.syndicate_coalition.Add(S) /proc/setupcult() var/static/datum/cult_info/picked_cult // Only needs to get picked once diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm index 51f4d147bba..9eeadeaba0f 100644 --- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm +++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm @@ -12,7 +12,7 @@ speed = 0 var/phasing = 0 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE universal_speak = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 230f797626d..b580f88c0b7 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -56,15 +56,15 @@ Made by Xhuis var/thrall_ratio = 1 /proc/is_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadowling_thralls) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadowling_thralls) /proc/is_shadow_or_thrall(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.shadowling_thralls) || (M.mind in ticker.mode.shadows)) + return istype(M) && M.mind && SSticker && SSticker.mode && ((M.mind in SSticker.mode.shadowling_thralls) || (M.mind in SSticker.mode.shadows)) /proc/is_shadow(var/mob/living/M) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.shadows) /datum/game_mode/shadowling diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index ea95f62af57..2515de135fa 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -216,11 +216,11 @@ /obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/ling = user - listclearnulls(ticker.mode.shadowling_thralls) - if(!(ling.mind in ticker.mode.shadows)) + listclearnulls(SSticker.mode.shadowling_thralls) + if(!(ling.mind in SSticker.mode.shadows)) return if(!isshadowling(ling)) - if(ticker.mode.shadowling_thralls.len >= 5) + if(SSticker.mode.shadowling_thralls.len >= 5) charge_counter = charge_max return for(var/mob/living/carbon/human/target in targets) @@ -291,7 +291,7 @@ target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor @@ -345,7 +345,7 @@ return for(var/mob/living/target in targets) var/thralls = 0 - var/victory_threshold = ticker.mode.required_thralls + var/victory_threshold = SSticker.mode.required_thralls var/mob/M to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") @@ -359,24 +359,24 @@ to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") return - if(thralls >= CEILING(3 * ticker.mode.thrall_ratio, 1) && !screech_acquired) + if(thralls >= CEILING(3 * SSticker.mode.thrall_ratio, 1) && !screech_acquired) screech_acquired = 1 to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) - if(thralls >= CEILING(5 * ticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) + if(thralls >= CEILING(5 * SSticker.mode.thrall_ratio, 1) && !blind_smoke_acquired) blind_smoke_acquired = 1 to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \ It will create a choking cloud that will blind any non-thralls who enter.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) - if(thralls >= CEILING(7 * ticker.mode.thrall_ratio, 1) && !nullChargeAcquired) + if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !nullChargeAcquired) nullChargeAcquired = 1 to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \ or sending power until repaired.") target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/null_charge(null)) - if(thralls >= CEILING(9 * ticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) + if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired) reviveThrallAcquired = 1 to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \ This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") @@ -578,7 +578,7 @@ charge_counter = charge_max return var/empowered_thralls = 0 - for(var/datum/mind/M in ticker.mode.shadowling_thralls) + for(var/datum/mind/M in SSticker.mode.shadowling_thralls) if(!ishuman(M.current)) return var/mob/living/carbon/human/H = M.current @@ -767,7 +767,7 @@ to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing [target.p_them()] into a thrall.") to_chat(target, "An agonizing spike of pain drives into your mind, and--") - ticker.mode.add_thrall(target.mind) + SSticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL target.add_language("Shadowling Hivemind") diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm index 500c3ee25c5..69f5688829c 100644 --- a/code/game/gamemodes/shadowling/shadowling_items.dm +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -81,4 +81,5 @@ unacidable = 1 flash_protect = -1 vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE flags = ABSTRACT | NODROP \ No newline at end of file diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 29a2c9aadca..514a16174b1 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -107,6 +107,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle(null)) + + QDEL_NULL(H.hud_used) H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) H.hud_used.show_hud(H.hud_used.hud_version) @@ -179,9 +181,9 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly H.loc = A sleep(50) - if(!ticker.mode.shadowling_ascended) + if(!SSticker.mode.shadowling_ascended) SSshuttle.emergency.request(null, 0.3) SSshuttle.emergency.canRecall = FALSE - ticker.mode.shadowling_ascended = 1 + SSticker.mode.shadowling_ascended = 1 A.mind.RemoveSpell(src) qdel(H) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index de7ce59eaa2..c2855f5c338 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -208,11 +208,11 @@ /datum/game_mode/proc/give_codewords(mob/living/traitor_mob) to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [syndicate_code_response]") + to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") + to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") - traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") + traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") + traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") @@ -348,14 +348,14 @@ /datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind) if(traitor_mind in traitors) - ticker.mode.traitors -= traitor_mind + SSticker.mode.traitors -= traitor_mind traitor_mind.special_role = null traitor_mind.current.create_attack_log("De-traitored") if(issilicon(traitor_mind.current)) to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor.") else to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor.") - ticker.mode.update_traitor_icons_removed(traitor_mind) + SSticker.mode.update_traitor_icons_removed(traitor_mind) /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 18d36ad57f3..9dec5b573e2 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -288,7 +288,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else H.LAssailant = owner while(do_mob(owner, H, 50)) - if(!(owner.mind in ticker.mode.vampires)) + if(!(owner.mind in SSticker.mode.vampires)) to_chat(owner, "Your fangs have disappeared!") return old_bloodtotal = bloodtotal @@ -337,7 +337,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha /datum/game_mode/proc/remove_vampire(datum/mind/vampire_mind) if(vampire_mind in vampires) - ticker.mode.vampires -= vampire_mind + SSticker.mode.vampires -= vampire_mind vampire_mind.special_role = null vampire_mind.current.create_attack_log("De-vampired") if(vampire_mind.vampire) @@ -347,7 +347,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") else to_chat(vampire_mind.current, "You have been brainwashed! You are no longer a vampire.") - ticker.mode.update_vampire_icons_removed(vampire_mind) + SSticker.mode.update_vampire_icons_removed(vampire_mind) //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 5e7b8f9a237..c9524458975 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -276,7 +276,7 @@ /proc/isvampirethrall(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.vampire_enthralled) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.vampire_enthralled) /obj/effect/proc_holder/spell/vampire/targetted/enthrall name = "Enthrall (300)" @@ -315,11 +315,11 @@ if(!C.mind) to_chat(user, "[C.name]'s mind is not there for you to enthrall.") return 0 - if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) + if(enthrall_safe || ( C.mind in SSticker.mode.vampires )||( C.mind.vampire )||( C.mind in SSticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") return 0 if(!affects(C)) - C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") + C.visible_message("[C] seems to resist the takeover!", "Your faith of [SSticker.Bible_deity_name] has kept your mind clear of all evil.") return 0 if(!ishuman(C)) to_chat(user, "You can only enthrall humans!") @@ -330,21 +330,21 @@ if(!istype(H)) return 0 var/ref = "\ref[user.mind]" - if(!(ref in ticker.mode.vampire_thralls)) - ticker.mode.vampire_thralls[ref] = list(H.mind) + if(!(ref in SSticker.mode.vampire_thralls)) + SSticker.mode.vampire_thralls[ref] = list(H.mind) else - ticker.mode.vampire_thralls[ref] += H.mind + SSticker.mode.vampire_thralls[ref] += H.mind - ticker.mode.update_vampire_icons_added(H.mind) - ticker.mode.update_vampire_icons_added(user.mind) + SSticker.mode.update_vampire_icons_added(H.mind) + SSticker.mode.update_vampire_icons_added(user.mind) var/datum/mindslaves/slaved = user.mind.som H.mind.som = slaved slaved.serv += H slaved.add_serv_hud(user.mind, "vampire")//handles master servent icons slaved.add_serv_hud(H.mind, "vampthrall") - ticker.mode.vampire_enthralled.Add(H.mind) - ticker.mode.vampire_enthralled[H.mind] = user.mind + SSticker.mode.vampire_enthralled.Add(H.mind) + SSticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") @@ -438,9 +438,6 @@ steam.start() sleep(jaunt_duration) var/mobloc = get_turf(user.loc) - if(get_area(mobloc) == /area/security/armoury/gamma) - to_chat(user, "A strange energy repels you!") - mobloc = originalloc animation.loc = mobloc steam.location = mobloc steam.start() diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 243f4e3a3fa..1eedc354f5e 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -99,9 +99,9 @@ new_objective:target = H:mind new_objective.explanation_text = "Protect [H.real_name], the wizard." M.mind.objectives += new_objective - ticker.mode.traitors += M.mind + SSticker.mode.traitors += M.mind M.mind.special_role = SPECIAL_ROLE_WIZARD_APPRENTICE - ticker.mode.update_wiz_icons_added(M.mind) + SSticker.mode.update_wiz_icons_added(M.mind) M.faction = list("wizard") else used = 0 @@ -283,7 +283,7 @@ var/global/list/multiverse = list() usr.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!" to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]") - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = TRUE else @@ -293,7 +293,7 @@ var/global/list/multiverse = list() new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." to_chat(usr, "Objective #[1]: [new_objective.explanation_text]") usr.mind.objectives += new_objective - ticker.mode.traitors += usr.mind + SSticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = FALSE else @@ -637,9 +637,9 @@ var/global/list/multiverse = list() if(M.stat != DEAD) to_chat(user, "This artifact can only affect the dead!") return - - if(!M.mind || !M.client) - to_chat(user, "There is no soul connected to this body...") + + if((!M.mind || !M.client) && !M.grab_ghost()) + to_chat(user,"There is no soul connected to this body...") return check_spooky()//clean out/refresh the list @@ -652,6 +652,7 @@ var/global/list/multiverse = list() else M.set_species(/datum/species/skeleton) M.visible_message(" A massive amount of flesh sloughs off [M] and a skeleton rises up!") + M.grab_ghost() // yoinks the ghost if its not in the body M.revive() equip_skeleton(M) spooky_scaries |= M @@ -732,9 +733,8 @@ var/global/list/multiverse = list() H.update_dna() H.update_body() - + H.grab_ghost() H.revive() - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl(H), slot_w_uniform) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index aff40200c6b..deb054f6d3e 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -146,7 +146,8 @@ H.mutations.Add(XRAY) H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + H.update_sight() to_chat(H, "The walls suddenly disappear.") if("voodoo") new /obj/item/voodoo(get_turf(H)) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 3e22f3f84df..a71b51c58f0 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -273,11 +273,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -289,11 +289,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -305,11 +305,11 @@ Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(Z.mind) else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) + SSticker.mode.cult+=Z.mind + SSticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).") to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.") @@ -326,11 +326,11 @@ newstruct.faction |= "\ref[stoner]" newstruct.key = target.key if(stoner && iscultist(stoner) || cultoverride) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(newstruct.mind) + if(SSticker.mode.name == "cult") + SSticker.mode:add_cultist(newstruct.mind) else - ticker.mode.cult+=newstruct.mind - ticker.mode.update_cult_icons_added(newstruct.mind) + SSticker.mode.cult+=newstruct.mind + SSticker.mode.update_cult_icons_added(newstruct.mind) if(stoner && iswizard(stoner)) to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") else if(stoner && iscultist(stoner)) @@ -357,7 +357,7 @@ if(U) S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation if(U && iscultist(U)) - ticker.mode.add_cultist(S.mind, 0) + SSticker.mode.add_cultist(S.mind, 0) S.cancel_camera() name = "soulstone: Shade of [T.real_name]" icon_state = "soulstone2" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 42b07e14c73..7d941a41bde 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -230,7 +230,7 @@ category = "Defensive" /datum/spellbook_entry/lichdom/IsAvailible() - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return FALSE else return TRUE @@ -339,7 +339,7 @@ user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_LEVEL_TWO + user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE to_chat(user, "The walls suddenly disappear.") return 1 @@ -474,9 +474,9 @@ log_name = "SGH" /datum/spellbook_entry/summon/ghosts/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map + if(!SSticker.mode) // In case spellbook is placed on map return FALSE - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return FALSE else return TRUE @@ -495,9 +495,9 @@ log_name = "SG" /datum/spellbook_entry/summon/guns/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map + if(!SSticker.mode) // In case spellbook is placed on map return FALSE - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return FALSE else return TRUE @@ -517,9 +517,9 @@ log_name = "SU" /datum/spellbook_entry/summon/magic/IsAvailible() - if(!ticker.mode) // In case spellbook is placed on map + if(!SSticker.mode) // In case spellbook is placed on map return FALSE - if(ticker.mode.name == "ragin' mages") + if(SSticker.mode.name == "ragin' mages") return FALSE else return TRUE diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 2c900808652..e1f9ac2725d 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -55,7 +55,7 @@ /datum/game_mode/proc/remove_wizard(datum/mind/wizard_mind) if(wizard_mind in wizards) - ticker.mode.wizards -= wizard_mind + SSticker.mode.wizards -= wizard_mind wizard_mind.special_role = null wizard_mind.current.create_attack_log("De-wizarded") wizard_mind.current.spellremove(wizard_mind.current) @@ -64,7 +64,7 @@ to_chat(wizard_mind.current, "You have been turned into a robot! You can feel your magical powers fading away...") else to_chat(wizard_mind.current, "You have been brainwashed! You are no longer a wizard.") - ticker.mode.update_wiz_icons_removed(wizard_mind) + SSticker.mode.update_wiz_icons_removed(wizard_mind) /datum/game_mode/proc/update_wiz_icons_added(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] @@ -271,4 +271,4 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 1 /proc/iswizard(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.wizards) + return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.wizards) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 7e3013658c8..394fe3d0908 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -126,7 +126,7 @@ var/const/access_free_golems = 300 var/acc = M.get_access() //see mob.dm - if(acc == IGNORE_ACCESS) + if(acc == IGNORE_ACCESS || M.can_admin_interact()) return 1 //Mob ignores access else diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 710835ca873..3208e9d3533 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -24,7 +24,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) /datum/job/captain/announce(mob/living/carbon/human/H) . = ..() captain_announcement.Announce("All hands, Captain [H.real_name] on deck!") - callHook("captain_spawned", list("captain" = H)) + updateDisplaycase(H) /datum/outfit/job/captain name = "Captain" diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 73ec2483af1..ac393e277a8 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -158,11 +158,11 @@ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.") accepted = 1 - if(ticker) - ticker.Bible_icon_state = B.icon_state - ticker.Bible_item_state = B.item_state - ticker.Bible_name = B.name - ticker.Bible_deity_name = B.deity_name + if(SSticker) + SSticker.Bible_icon_state = B.icon_state + SSticker.Bible_item_state = B.item_state + SSticker.Bible_name = B.name + SSticker.Bible_deity_name = B.deity_name feedback_set_details("religion_deity", "[new_deity]") feedback_set_details("religion_book", "[new_book_style]") diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 7c228ba554f..359981ded4f 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -257,7 +257,12 @@ var/global/list/role_playtime_requirements = list( play_records[rtype] = text2num(read_records[rtype]) else play_records[rtype] = 0 - var/myrole = mob.mind.playtime_role ? mob.mind.playtime_role : mob.mind.assigned_role + var/myrole + if(mob.mind) + if(mob.mind.playtime_role) + myrole = mob.mind.playtime_role + else if(mob.mind.assigned_role) + myrole = mob.mind.assigned_role if(mob.stat == CONSCIOUS && myrole) play_records[EXP_TYPE_LIVING] += minutes if(announce_changes) @@ -287,12 +292,3 @@ var/global/list/role_playtime_requirements = list( log_game("SQL ERROR during exp_update_client write. Error : \[[err]\]\n") message_admins("SQL ERROR during exp_update_client write. Error : \[[err]\]\n") return - -/hook/roundstart/proc/exptimer() - if(!config.sql_enabled || !config.use_exp_tracking) - return 1 - spawn(0) - while(TRUE) - sleep(5 MINUTES) - update_exp(5,0) - return 1 diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm index 90bac6d8383..4456bb571e5 100644 --- a/code/game/jobs/job_objective.dm +++ b/code/game/jobs/job_objective.dm @@ -44,7 +44,7 @@ /datum/game_mode/proc/declare_job_completion() var/text = "
Job Completion" - for(var/datum/mind/employee in ticker.minds) + for(var/datum/mind/employee in SSticker.minds) if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this. continue diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 8a65da977ae..48b64e8c589 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/device.dmi' icon_state = "motion3" layer = 3 + plane = FLOOR_PLANE anchored = 1.0 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0) var/uses = 20 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 1faf99daec0..7680eb5f67b 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -375,38 +375,6 @@ if(ATMOS_ALARM_DANGER) icon_state = "alarm1" -/obj/machinery/alarm/receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN) || !alarm_area) - return - if(alarm_area.master_air_alarm != src) - if(master_is_operating()) - return - elect_master() - if(alarm_area.master_air_alarm != src) - return - if(!signal || signal.encryption) - return - var/id_tag = signal.data["tag"] - if(!id_tag) - return - if(signal.data["area"] != area_uid) - return - if(signal.data["sigtype"] != "status") - return - - var/dev_type = signal.data["device"] - if(!(id_tag in alarm_area.air_scrub_names) && !(id_tag in alarm_area.air_vent_names)) - register_env_machine(id_tag, dev_type) - var/got_update=0 - if(dev_type == "AScr") - alarm_area.air_scrub_info[id_tag] = signal.data - got_update=1 - else if(dev_type == "AVP") - alarm_area.air_vent_info[id_tag] = signal.data - got_update=1 - if(got_update && waiting_on_device==id_tag) - waiting_on_device=null - /obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) var/new_name if(device_type=="AVP") diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 453d5cdee1e..4777cdcc5f2 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -3,6 +3,9 @@ desc = "It measures something." icon = 'icons/obj/meter.dmi' icon_state = "meterX" + + layer = GAS_PUMP_LAYER + var/obj/machinery/atmospherics/pipe/target = null anchored = TRUE armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 0eb627d1e62..5028db8f0c6 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -382,14 +382,17 @@ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) - user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras if(isXRay()) user.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) user.see_in_dark = max(user.see_in_dark, 8) + user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE else - user.sight = 0 - user.see_in_dark = 2 - return 1 + user.sight = initial(user.sight) + user.see_in_dark = initial(user.see_in_dark) + user.lighting_alpha = initial(user.lighting_alpha) + + ..() + return TRUE /obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets. var/turf/prev_turf diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 7ce515365ae..1d05204e381 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -416,25 +416,24 @@ /obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H) // Check to see if the clone's mind is an antagonist of any kind and handle them accordingly to make sure they get their spells, HUD/whatever else back. - callHook("clone", list(H)) - if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries)) - ticker.mode.update_rev_icons_added() //So the icon actually appears - if(H.mind in ticker.mode.syndicates) - ticker.mode.update_synd_icons_added() - if(H.mind in ticker.mode.cult) - ticker.mode.add_cultist(occupant.mind) - ticker.mode.update_cult_icons_added() //So the icon actually appears - ticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears - if((H.mind in ticker.mode.implanter) || (H.mind in ticker.mode.implanted)) - ticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears + if((H.mind in SSticker.mode:revolutionaries) || (H.mind in SSticker.mode:head_revolutionaries)) + SSticker.mode.update_rev_icons_added() //So the icon actually appears + if(H.mind in SSticker.mode.syndicates) + SSticker.mode.update_synd_icons_added() + if(H.mind in SSticker.mode.cult) + SSticker.mode.add_cultist(occupant.mind) + SSticker.mode.update_cult_icons_added() //So the icon actually appears + SSticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears + if((H.mind in SSticker.mode.implanter) || (H.mind in SSticker.mode.implanted)) + SSticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears if(H.mind.vampire) H.mind.vampire.update_owner(H) - if((H.mind in ticker.mode.vampire_thralls) || (H.mind in ticker.mode.vampire_enthralled)) - ticker.mode.update_vampire_icons_added(H.mind) - if(H.mind in ticker.mode.changelings) - ticker.mode.update_change_icons_added(H.mind) - if((H.mind in ticker.mode.shadowling_thralls) || (H.mind in ticker.mode.shadows)) - ticker.mode.update_shadow_icons_added(H.mind) + if((H.mind in SSticker.mode.vampire_thralls) || (H.mind in SSticker.mode.vampire_enthralled)) + SSticker.mode.update_vampire_icons_added(H.mind) + if(H.mind in SSticker.mode.changelings) + SSticker.mode.update_change_icons_added(H.mind) + if((H.mind in SSticker.mode.shadowling_thralls) || (H.mind in SSticker.mode.shadows)) + SSticker.mode.update_shadow_icons_added(H.mind) //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(message) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 67f1dba85f0..38cc0b56866 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -134,8 +134,8 @@ return if(P:brainmob.mind) - ticker.mode.remove_cultist(P:brainmob.mind, 1) - ticker.mode.remove_revolutionary(P:brainmob.mind, 1) + SSticker.mode.remove_cultist(P:brainmob.mind, 1) + SSticker.mode.remove_revolutionary(P:brainmob.mind, 1) user.drop_item() P.loc = src diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index f4d21cbd125..86515e5ddea 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -431,9 +431,6 @@ var/time_last_changed_position = 0 modify.rank = t1 modify.assignment = t1 - - callHook("reassign_employee", list(modify)) - if("reg") if(is_authenticated(usr) && !target_dept) var/t2 = modify @@ -511,7 +508,6 @@ var/time_last_changed_position = 0 SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() - callHook("terminate_employee", list(modify)) if("demote") if(is_authenticated(usr)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index e369b203759..d064dbda743 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -439,7 +439,7 @@ to_chat(user, "The emergency shuttle may not be called while returning to Central Command.") return - if(ticker.mode.name == "blob") + if(SSticker.mode.name == "blob") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -464,7 +464,7 @@ to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again.") return - if(ticker.mode.name == "epidemic") + if(SSticker.mode.name == "epidemic") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") return @@ -481,7 +481,7 @@ /proc/cancel_call_proc(var/mob/user) - if(ticker.mode.name == "meteor") + if(SSticker.mode.name == "meteor") return if(SSshuttle.cancelEvac(user)) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 3dad2e66f7d..b45a8331188 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -5,7 +5,8 @@ icon_state = "pod0" density = 1 anchored = 1.0 - layer = 2.8 + layer = ABOVE_WINDOW_LAYER + plane = GAME_PLANE interact_offline = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) var/on = 0 @@ -324,7 +325,6 @@ overlays += "lid[on]" //if no occupant, just put the lid overlay on, and ignore the rest return - if(occupant) var/image/pickle = image(occupant.icon, occupant.icon_state) pickle.overlays = occupant.overlays diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 9674a60c7d4..0ab3d01ddf1 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -53,7 +53,7 @@ var/dat - if(!( ticker )) + if(!( SSticker )) return dat += "

[storage_name]
" @@ -364,13 +364,13 @@ // Skip past any cult sacrifice objective using this person if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind)) - var/datum/game_mode/cult/cult_mode = ticker.mode + var/datum/game_mode/cult/cult_mode = SSticker.mode var/list/p_s_t = cult_mode.get_possible_sac_targets() if(p_s_t.len) cult_mode.sacrifice_target = pick(p_s_t) - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if(H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...
") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...") else cult_mode.bypass_phase() @@ -403,8 +403,8 @@ occupant.mind.objectives.Cut() occupant.mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(occupant) // Delete them from datacore. diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 5a53381ef07..3b12c6f554a 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -255,10 +255,15 @@ return ..() +/obj/machinery/access_button/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + return attack_hand(user) + /obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) - if(!allowed(user)) - to_chat(user, "Access Denied") + + if(!allowed(user) && !user.can_advanced_admin_interact()) + to_chat(user, "Access denied.") else if(radio_connection) var/datum/signal/signal = new diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 21ff909796f..549b5be3929 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -77,7 +77,7 @@ else do_animate("deny") return - if(!ticker) + if(!SSticker) return var/mob/living/M = AM if(!M.restrained() && M.mob_size > MOB_SIZE_TINY && (!(isrobot(M) && M.stat))) @@ -87,10 +87,7 @@ if(operating || !density) return add_fingerprint(user) - if(!requiresID()) - user = null - - if(allowed(user)) + if(!requiresID() || allowed(user)) open_and_close() else do_animate("deny") @@ -217,7 +214,7 @@ return attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user) - return attackby(user, user) + return try_to_activate_door(user) /obj/machinery/door/window/emag_act(mob/user, obj/weapon) if(!operating && density && !emagged) @@ -231,7 +228,6 @@ return 1 /obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params) - //If it's in the process of opening/closing, ignore the click if(operating) return diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 49a05371050..e6d967c8eb4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -44,6 +44,7 @@ var/list/holopads = list() idle_power_usage = 5 active_power_usage = 100 layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. + plane = FLOOR_PLANE armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0) var/list/masters = list()//List of living mobs that use the holopad var/list/holorays = list()//Holoray-mob link. diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 3c36edb1685..20d15a29e1f 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -3,6 +3,7 @@ desc = "It's useful for igniting plasma." icon = 'icons/obj/stationobjs.dmi' icon_state = "igniter1" + plane = FLOOR_PLANE armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0) var/id = null var/on = 1.0 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f278ee2adda..d4175b10ae1 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -72,7 +72,7 @@ // called when turf state changes // hide the object if turf is intact /obj/machinery/navbeacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : SEE_INVISIBLE_MINIMUM + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 updateicon() // update the icon_state diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index e98c4e90c30..e77eef869dc 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -183,8 +183,8 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 - H.plane = HUD_PLANE + H.layer = ABOVE_HUD_LAYER + H.plane = ABOVE_HUD_PLANE usr.mapobjs += H #else diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e3ba1e642a9..8f542a2ea3c 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -977,6 +977,7 @@ var/list/turret_icons /atom/movable/porta_turret_cover icon = 'icons/obj/turrets.dmi' + anchored = TRUE // Syndicate turrets /obj/machinery/porta_turret/syndicate diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 6422e94dc74..1a63371915b 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -57,8 +57,8 @@ return if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/N = M - ticker.mode.equip_traitor(N) - ticker.mode.traitors += N.mind + SSticker.mode.equip_traitor(N) + SSticker.mode.traitors += N.mind N.mind.special_role = SPECIAL_ROLE_TRAITOR var/objective = "Free Objective" switch(rand(1,100)) diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index 604fcdfbe7e..04f85750516 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -9,6 +9,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) * as well as allowing users to save and load configurations. */ /datum/nttc_configuration + var/regex/word_blacklist = new("(EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags!") + log_admin("EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags") + return FALSE var/list/var_list = json_decode(text) for(var/variable in var_list) if(variable in to_serialize) // Don't just accept any random vars jesus christ! @@ -236,6 +241,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) variable_value = nttc_sanitize(variable_value, sanitize_method) if(variable_value != null) vars[variable] = variable_value + return TRUE // Sanitizing user input. Don't blindly trust the JSON. /datum/nttc_configuration/proc/nttc_sanitize(variable, sanitize_method) @@ -245,7 +251,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) switch(sanitize_method) if("bool") return variable ? TRUE : FALSE - if("table", "array") + // if("table", "array") + if("array") if(!islist(variable)) return list() // Insert html filtering for the regexes here if you're boring @@ -350,14 +357,14 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) S.speaking = GLOB.all_languages[setting_language] // Regex replacements - if(islist(regex) && regex.len > 0) - for(var/datum/multilingual_say_piece/S in message_pieces) - var/new_message = S.message - for(var/reg in regex) - var/replacePattern = pencode_to_html(regex[reg]) - var/regex/start = regex("[reg]", "gi") - new_message = start.Replace(new_message, replacePattern) - S.message = new_message + // if(islist(regex) && regex.len > 0) + // for(var/datum/multilingual_say_piece/S in message_pieces) + // var/new_message = S.message + // for(var/reg in regex) + // var/replacePattern = pencode_to_html(regex[reg]) + // var/regex/start = regex("[reg]", "gi") + // new_message = start.Replace(new_message, replacePattern) + // S.message = new_message // Make sure the message is valid after we tinkered with it, otherwise reject it if(signal.data["message"] == "" || !signal.data["message"]) @@ -398,29 +405,34 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) log_action(user, new_language == "--DISABLE--" ? "disabled NTTC language conversion" : "set NTTC language conversion to [new_language]", TRUE) // Tables - if(href_list["create_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null - if(!new_key) - return - var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null - if(new_value == null) - return - var/list/table = vars[href_list["table"]] - table[new_key] = new_value - to_chat(user, "Added row [new_key] -> [new_value].") - log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") + // if(href_list["create_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/new_key = input(user, "Provide a key for the new row.", "New Row") as text|null + // if(!new_key) + // return + // var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null + // if(new_value == null) + // return + // if(word_blacklist.Find(new_value)) //uh oh, they tried to be naughty + // message_admins("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags!") + // log_admin("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags") + // to_chat(user, "ERROR: Regex contained bad strings. Upload cancelled.") + // return + // var/list/table = vars[href_list["table"]] + // table[new_key] = new_value + // to_chat(user, "Added row [new_key] -> [new_value].") + // log_action(user, "updated [href_list["table"]] - new row [new_key] -> [new_value]") - if(href_list["delete_row"]) - if(href_list["table"] && href_list["table"] in tables) - if(requires_unlock[href_list["table"]] && !source.unlocked) - return - var/list/table = vars[href_list["table"]] - table.Remove(href_list["delete_row"]) - to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") - log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") + // if(href_list["delete_row"]) + // if(href_list["table"] && href_list["table"] in tables) + // if(requires_unlock[href_list["table"]] && !source.unlocked) + // return + // var/list/table = vars[href_list["table"]] + // table.Remove(href_list["delete_row"]) + // to_chat(user, "Removed row [href_list["delete_row"]] from [href_list["table"]]") + // log_action(user, "updated [href_list["table"]] - removed row [href_list["delete_row"]]") // Arrays if(href_list["create_item"]) @@ -450,8 +462,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) if(href_list["load_config"]) var/json = input(user, "Provide configuration JSON below.", "Load Config", nttc_serialize()) as message - nttc_deserialize(json, source) - log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE) + if(nttc_deserialize(json, source, user.ckey)) + log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE) user << output(list2params(list(nttc_serialize())), "[window_id].browser:updateConfig") @@ -470,7 +482,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) "tab_hack.html" = 'html/nttc/dist/tab_hack.html', "tab_filtering.html" = 'html/nttc/dist/tab_filtering.html', "tab_firewall.html" = 'html/nttc/dist/tab_firewall.html', - "tab_regex.html" = 'html/nttc/dist/tab_regex.html', + // "tab_regex.html" = 'html/nttc/dist/tab_regex.html', "uiTitleFluff.png" = 'html/nttc/dist/uiTitleFluff.png' ) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d0872fa8f93..dc4b9124d77 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -741,6 +741,8 @@ throw_item.throw_at(target, 16, 3, src) visible_message("[src] launches [throw_item.name] at [target.name]!") +/obj/machinery/vending/onTransitZ() + return /* * Vending machine types */ diff --git a/code/game/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm index 1a242594bfe..e0621db3d9b 100644 --- a/code/game/magic/Uristrunes.dm +++ b/code/game/magic/Uristrunes.dm @@ -1,7 +1,7 @@ /proc/get_rune_cult(word) var/animated - if(word && !(ticker.cultdat.theme == "fire" || ticker.cultdat.theme == "death")) + if(word && !(SSticker.cultdat.theme == "fire" || SSticker.cultdat.theme == "death")) animated = 1 else animated = 0 @@ -18,11 +18,11 @@ var/runetype = "rune" var/lookup = "[symbol_bits]-[animated]" - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way runetype = "rune" - else if(ticker.cultdat.theme == "fire") + else if(SSticker.cultdat.theme == "fire") runetype = "fire-rune" - else if(ticker.cultdat.theme == "death") + else if(SSticker.cultdat.theme == "death") runetype = "death-rune" diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 35b94e2eed2..d9d9d5dd261 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1518,6 +1518,8 @@ if(user == occupant) user.sight |= occupant_sight_flags + ..() + /obj/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y) if(!no_effect) if(selected) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 7cfd8bbec45..45bfb37f035 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -28,7 +28,7 @@ var/global/list/image/splatter_cache = list() . = ..() update_icon() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z)))//F I V E T I L E S if(!(T in mode_ticker.bloody_floors)) @@ -48,7 +48,7 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/Destroy() if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/mode_ticker = ticker.mode + var/datum/game_mode/cult/mode_ticker = SSticker.mode var/turf/T = get_turf(src) if(T && (is_station_level(T.z))) mode_ticker.bloody_floors -= T diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 1231c8136fa..04ea1dc0841 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -14,11 +14,11 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/particle_effect/New() ..() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) return ..() diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 07c7137d719..5feec285408 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -16,6 +16,7 @@ return FALSE /obj/effect/decal + plane = FLOOR_PLANE var/no_scoop = FALSE //if it has this, don't let it be scooped up var/no_clear = FALSE //if it has this, don't delete it when its' scooped up var/list/scoop_reagents = null diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 3ea1fc0c3d6..191f776d01c 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -92,4 +92,36 @@ name = "horrific experiment" desc = "Some sort of pod filled with blood and vicerea. You swear you can see it moving..." icon = 'icons/obj/cloning.dmi' - icon_state = "pod_g" \ No newline at end of file + icon_state = "pod_g" + + +//Makes a tile fully lit no matter what +/obj/effect/fullbright + icon = 'icons/effects/alphacolors.dmi' + icon_state = "white" + plane = LIGHTING_PLANE + layer = LIGHTING_LAYER + blend_mode = BLEND_ADD + + +/obj/effect/dummy/lighting_obj + name = "lighting fx obj" + desc = "Tell a coder if you're seeing this." + icon_state = "nothing" + light_color = "#FFFFFF" + light_range = MINIMUM_USEFUL_LIGHT_RANGE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/dummy/lighting_obj/Initialize(mapload, _color, _range, _power, _duration) + . = ..() + set_light(_range ? _range : light_range, _power ? _power : light_power, _color ? _color : light_color) + if(_duration) + QDEL_IN(src, _duration) + +/obj/effect/dummy/lighting_obj/moblight + name = "mob lighting fx" + +/obj/effect/dummy/lighting_obj/moblight/Initialize(mapload, _color, _range, _power, _duration) + . = ..() + if(!ismob(loc)) + return INITIALIZE_HINT_QDEL \ No newline at end of file diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 057c52a2a4c..b7311519f7a 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -140,8 +140,8 @@ /obj/item/suppressor = 4, /obj/item/clothing/under/chameleon = 2, /obj/item/stamp/chameleon = 2, - /obj/item/clothing/shoes/syndigaloshes = 5, - /obj/item/clothing/mask/gas/voice = 2, + /obj/item/clothing/shoes/chameleon/noslip = 5, + /obj/item/clothing/mask/chameleon = 2, /obj/item/dnascrambler = 1, /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 510e5b90380..03e49c56a50 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -214,7 +214,7 @@ /obj/item/storage/pill_bottle/zoom = 1, /obj/item/storage/pill_bottle/random_drug_bottle = 2, /obj/item/storage/backpack/duffel/syndie/surgery = 1, - /obj/item/clothing/shoes/syndigaloshes = 1, + /obj/item/clothing/shoes/chameleon/noslip = 1, /obj/item/storage/belt/military = 1, /obj/item/clothing/under/chameleon = 1, /obj/item/storage/backpack/satchel_flat = 1, diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index 8edb88a7e79..7a12caf6b10 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -37,4 +37,5 @@ /obj/effect/temp_visual/cult/turf/open/floor icon_state = "floorglow" - duration = 5 \ No newline at end of file + duration = 5 + plane = FLOOR_PLANE \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9d199a404d0..23509a06f63 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -593,10 +593,16 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/MouseEntered(location, control, params) if(in_inventory) - var/timedelay = 5 + var/timedelay = 8 var/user = usr tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) /obj/item/MouseExited() deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + +/obj/item/proc/update_slot_icon() + if(!ismob(loc)) + return + var/mob/owner = loc + owner.regenerate_icons() diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 3ce114bde9b..0c7e4a509f3 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -174,14 +174,10 @@ var/list/SPECIALS = list( /area/shuttle, /area/admin, - /area/arrival, /area/centcom, /area/asteroid, /area/tdome, - /area/syndicate_station, - /area/wizard_station, - /area/prison - // /area/derelict //commented out, all hail derelict-rebuilders! + /area/wizard_station ) for(var/type in SPECIALS) if( istype(A,type) ) @@ -211,23 +207,21 @@ return var/area/A = new A.name = str - //var/ma - //ma = A.master ? "[A.master]" : "(null)" -// to_chat(world, "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]") - A.power_equip = 0 - A.power_light = 0 - A.power_environ = 0 - A.always_unpowered = 0 - move_turfs_to_area(turfs, A) + A.power_equip = FALSE + A.power_light = FALSE + A.power_environ = FALSE + A.always_unpowered = FALSE + A.set_dynamic_lighting() + + for(var/i in 1 to turfs.len) + var/turf/thing = turfs[i] + var/area/old_area = thing.loc + A.contents += thing + thing.change_area(old_area, A) interact() return - -/obj/item/areaeditor/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A) - A.contents.Add(turfs) - - /obj/item/areaeditor/proc/edit_area() var/area/A = get_area() var/prevname = "[sanitize(A.name)]" diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 3125c24837a..a975a0b4d06 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -37,7 +37,7 @@ visible_message("[src] swells up!") // Animation - icon = 'icons/mob/animal.dmi' + icon = 'icons/mob/carp.dmi' flick("carp_swell", src) // Wait for animation to end sleep(6) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 2fb1aae8ff0..a618383a819 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -155,14 +155,14 @@ /obj/item/flash/proc/terrible_conversion_proc(mob/M, mob/user) if(ishuman(M) && ishuman(user) && M.stat != DEAD) - if(user.mind && (user.mind in ticker.mode.head_revolutionaries)) + if(user.mind && (user.mind in SSticker.mode.head_revolutionaries)) if(M.client) if(M.stat == CONSCIOUS) M.mind_initialize() //give them a mind datum if they don't have one. var/resisted if(!ismindshielded(M)) - if(user.mind in ticker.mode.head_revolutionaries) - if(ticker.mode.add_revolutionary(M.mind)) + if(user.mind in SSticker.mode.head_revolutionaries) + if(SSticker.mode.add_revolutionary(M.mind)) times_used -- //Flashes less likely to burn out for headrevs when used for conversion else resisted = 1 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e65c9a683a7..cd8050abcd8 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -51,7 +51,7 @@ if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") //don't have dexterity to_chat(user, "You don't have the dexterity to do this!") return @@ -76,7 +76,7 @@ var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind to_chat(user, "[M]'s pupils are unresponsive to the light!") - else if((XRAY in M.mutations) || eyes.get_dark_view() >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms). + else if((XRAY in M.mutations) || eyes.see_in_dark >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms). to_chat(user, "[M]'s pupils glow eerily!") else //they're okay! if(M.flash_eyes(visual = 1)) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 59a7a650383..941e90a31ef 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -35,7 +35,7 @@ return if(H.mind) span = H.mind.speech_span - if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown)) + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 83a8c9304a1..00efc83668b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -397,7 +397,6 @@ var/global/list/default_medbay_channels = list( var/mob/living/carbon/human/H = M displayname = H.voice if(H.voice != real_name) - jobname = "Unknown" voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index e5bbeef7686..c6cfe03a151 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -31,8 +31,8 @@ var/list/world_uplinks = list() /obj/item/uplink/New() ..() - welcome = ticker.mode.uplink_welcome - uses = ticker.mode.uplink_uses + welcome = SSticker.mode.uplink_welcome + uses = SSticker.mode.uplink_uses uplink_items = get_uplink_items() world_uplinks += src diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm new file mode 100644 index 00000000000..339271cdcca --- /dev/null +++ b/code/game/objects/items/devices/voice.dm @@ -0,0 +1,44 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "A voice scrambling module." + icon = 'icons/obj/device.dmi' + icon_state = "voice_changer_off" + + actions_types = list(/datum/action/item_action/voice_changer/toggle, /datum/action/item_action/voice_changer/voice) + + var/obj/item/parent + + var/voice + var/active + +/obj/item/voice_changer/New() + . = ..() + + if(isitem(loc)) + parent = loc + parent.actions |= actions + +/obj/item/voice_changer/Destroy() + if(isitem(parent)) + parent.actions -= actions + + return ..() + +/obj/item/voice_changer/attack_self(mob/user) + active = !active + icon_state = "voice_changer_[active ? "on" : "off"]" + to_chat(user, "You toggle [src] [active ? "on" : "off"].") + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/voice_changer/proc/set_voice(mob/user) + var/chosen_voice = input(user, "What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice) as text + if(!chosen_voice) + voice = null + to_chat(user, "You are now mimicking the voice on your ID card.") + return + + voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN)) + to_chat(user, "You are now mimicking [voice].") \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 65f504b4ae0..6ce10294940 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -245,7 +245,7 @@ to_chat(user, "Sticking a dead [M] into the frame would sort of defeat the purpose.") return - if(M.brainmob.mind in ticker.mode.head_revolutionaries) + if(M.brainmob.mind in SSticker.mode.head_revolutionaries) to_chat(user, "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].") return @@ -306,7 +306,6 @@ O.Namepick() feedback_inc("cyborg_birth",1) - callHook("borgify", list(O)) forceMove(O) O.robot_suit = src diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index abc328a8bf1..2c1222154b0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -240,6 +240,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \ var/global/list/datum/stack_recipe/cardboard_recipes = list ( new /datum/stack_recipe("box", /obj/item/storage/box), new /datum/stack_recipe("large box", /obj/item/storage/box/large, 4), + new /datum/stack_recipe("patch pack", /obj/item/storage/pill_bottle/patch_pack, 2), new /datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), new /datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), new /datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 19864e0ba18..393ca1f3c0b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1066,6 +1066,32 @@ obj/item/toy/cards/deck/syndicate/black name = "tuxedo cat plushie" icon_state = "tuxedocat" +//New generation TG plushies + +/obj/item/toy/plushie/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + +/obj/item/toy/plushie/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + +/obj/item/toy/plushie/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + +/obj/item/toy/plushie/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + /* * Foam Armblade */ diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d2f2ed2c54d..c7627688b5e 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -668,4 +668,27 @@ /obj/item/dnainjector/m2h/Initialize() block = MONKEYBLOCK + ..() + + +/obj/item/dnainjector/comic + name = "DNA-Injector (Comic)" + desc = "Honk!" + datatype = DNA2_BUF_SE + value = 0xFFF + forcedmutation = TRUE + +/obj/item/dnainjector/comic/Initialize() + block = COMICBLOCK + ..() + +/obj/item/dnainjector/anticomic + name = "DNA-Injector (Ant-Comic)" + desc = "Honk...?" + datatype = DNA2_BUF_SE + value = 0x001 + forcedmutation = TRUE + +/obj/item/dnainjector/anticomic/Initialize() + block = COMICBLOCK ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index a20dd86c897..68e731b8c44 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -443,15 +443,15 @@ return ..() if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(praying) to_chat(user, "You are already using [src].") return - user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].", \ - "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].") + user.visible_message("[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [SSticker.Bible_deity_name].", \ + "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [SSticker.Bible_deity_name].") praying = 1 if(do_after(user, 150, target = M)) @@ -460,18 +460,18 @@ if(target.mind) if(iscultist(target)) - ticker.mode.remove_cultist(target.mind) // This proc will handle message generation. + SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation. praying = 0 return if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration. target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has interfered with your power!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!") praying = 0 return if(prob(25)) - to_chat(target, "[user]'s prayer to [ticker.Bible_deity_name] has eased your pain!") + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has eased your pain!") target.adjustToxLoss(-5) target.adjustOxyLoss(-5) target.adjustBruteLoss(-5) @@ -480,7 +480,7 @@ praying = 0 else - to_chat(user, "Your prayer to [ticker.Bible_deity_name] was interrupted.") + to_chat(user, "Your prayer to [SSticker.Bible_deity_name] was interrupted.") praying = 0 /obj/item/nullrod/rosary/process() @@ -506,13 +506,13 @@ /obj/item/nullrod/salt/attack_self(mob/user) if(!user.mind || !user.mind.isholy) - to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].") + to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") return if(!(ghostcall_CD > world.time)) ghostcall_CD = world.time + 3000 //deciseconds..5 minutes - user.visible_message("[user] kneels and begins to utter a prayer to [ticker.Bible_deity_name] while drawing a circle with salt!", \ - "You kneel and begin a prayer to [ticker.Bible_deity_name] while drawing a circle!") + user.visible_message("[user] kneels and begins to utter a prayer to [SSticker.Bible_deity_name] while drawing a circle with salt!", \ + "You kneel and begin a prayer to [SSticker.Bible_deity_name] while drawing a circle!") notify_ghosts("The Chaplain is calling ghosts to [get_area(src)] with [name]!", source = src) else to_chat(user, "You need to wait before using [src] again.") diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm index 68c8e111520..d27d6dd5f7e 100644 --- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -3,7 +3,7 @@ desc = "An alarm which monitors host vital signs and transmits a radio message upon death." var/mobname = "Will Robinson" activated = 0 - var/static/list/stealth_areas = typecacheof(list(/area/syndicate_station, /area/syndicate_mothership, /area/shuttle/syndicate_elite)) + var/static/list/stealth_areas = typecacheof(list(/area/syndicate_mothership, /area/shuttle/syndicate_elite)) /obj/item/implant/death_alarm/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm index 739fe2827e4..bc942b73d81 100644 --- a/code/game/objects/items/weapons/implants/implant_mindshield.dm +++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm @@ -19,14 +19,14 @@ /obj/item/implant/mindshield/implant(mob/target) if(..()) - if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) + if(target.mind in SSticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") removed(target, 1) qdel(src) return -1 - if(target.mind in ticker.mode.revolutionaries) - ticker.mode.remove_revolutionary(target.mind) - if(target.mind in ticker.mode.cult) + if(target.mind in SSticker.mode.revolutionaries) + SSticker.mode.remove_revolutionary(target.mind) + if(target.mind in SSticker.mode.cult) to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") else to_chat(target, "Your mind feels hardened - more resistant to brainwashing.") diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 58f78a7be4e..16d8943567d 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -45,15 +45,15 @@ return -1 H.implanting = 1 to_chat(H, "You feel completely loyal to [user.name].") - if(!(user.mind in ticker.mode.implanter)) - ticker.mode.implanter[ref] = list() - implanters = ticker.mode.implanter[ref] + if(!(user.mind in SSticker.mode.implanter)) + SSticker.mode.implanter[ref] = list() + implanters = SSticker.mode.implanter[ref] implanters.Add(H.mind) - ticker.mode.implanted.Add(H.mind) - ticker.mode.implanted[H.mind] = user.mind - //ticker.mode.implanter[user.mind] += H.mind - ticker.mode.implanter[ref] = implanters - ticker.mode.traitors += H.mind + SSticker.mode.implanted.Add(H.mind) + SSticker.mode.implanted[H.mind] = user.mind + //SSticker.mode.implanter[user.mind] += H.mind + SSticker.mode.implanter[ref] = implanters + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.") var/datum/objective/protect/mindslave/MS = new @@ -64,8 +64,8 @@ for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(user.mind) - ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds + SSticker.mode.update_traitor_icons_added(user.mind) + SSticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... var/datum/mindslaves/slaved = user.mind.som @@ -77,12 +77,12 @@ log_admin("[key_name(user)] has mind-slaved [key_name(H)].") activated = 1 if(jobban_isbanned(M, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) return 1 return 0 /obj/item/implant/traitor/removed(mob/target) if(..()) - ticker.mode.remove_traitor_mind(target.mind) + SSticker.mode.remove_traitor_mind(target.mind) return 1 return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 54ef5f06f85..15b0b914391 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -27,7 +27,7 @@ if(user) user.update_inv_l_hand() user.update_inv_r_hand() - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) user.flying = wielded ? 1 : 0 if(wielded) to_chat(user, "You hold \the [src] between your legs.") diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e5ee3562228..56ae2864071 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -112,7 +112,7 @@ ..() new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/magboots/clown(src) - new /obj/item/clothing/mask/gas/voice/clown(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/radio/headset/headset_service(src) new /obj/item/pda/clown(src) new /obj/item/storage/box/survival(src) @@ -124,6 +124,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/instrument/bikehorn(src) new /obj/item/bikehorn(src) + new /obj/item/dnainjector/comic(src) /obj/item/storage/backpack/mime name = "Parcel Parceaux" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index e406b097bee..9b1e89769cb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,23 +4,22 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") var/use_item_overlays = 0 // Do we have overlays for items held inside the belt? - /obj/item/storage/belt/update_icon() if(use_item_overlays) overlays.Cut() for(var/obj/item/I in contents) overlays += "[I.name]" - ..() /obj/item/storage/belt/proc/can_use() return is_equipped() - /obj/item/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if(!istype(over_object, /obj/screen)) @@ -68,7 +67,7 @@ new /obj/item/weldingtool(src) new /obj/item/crowbar(src) new /obj/item/wirecutters(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) update_icon() /obj/item/storage/belt/utility/full/multitool/New() @@ -99,7 +98,7 @@ new /obj/item/crowbar/power(src) new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) new /obj/item/extinguisher/mini(src) new /obj/item/analyzer(src) update_icon() @@ -184,7 +183,6 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) update_icon() - /obj/item/storage/belt/botany name = "botanist belt" desc = "Can hold various botanical supplies." @@ -207,7 +205,6 @@ /obj/item/wrench, ) - /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -472,7 +469,6 @@ ..() update_icon() - /obj/item/storage/belt/holster name = "shoulder holster" desc = "A holster to conceal a carried handgun. WARNING: Badasses only." @@ -510,7 +506,6 @@ W.charges = W.max_charges update_icon() - /obj/item/storage/belt/fannypack name = "fannypack" desc = "A dorky fannypack for keeping small items in." @@ -599,7 +594,6 @@ // Bluespace Belt // ------------------------------------- - /obj/item/storage/belt/bluespace name = "Belt of Holding" desc = "The greatest in pants-supporting technology." @@ -632,8 +626,6 @@ var/bolacount = 0 var/cooldown = 0 - - /obj/item/storage/belt/bluespace/owlman/New() ..() new /obj/item/grenade/smokebomb(src) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index dfa1bf97358..eb778b6a280 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -45,7 +45,7 @@ else M.LAssailant = user - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if(!(istype(user, /mob/living/carbon/human) || SSticker) && SSticker.mode.name != "monkey") to_chat(user, "You don't have the dexterity to do this!") return if(!user.mind || !user.mind.isholy) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 507d6fdb9f3..53f93775cad 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -151,8 +151,8 @@ src.boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in src.contents) O.screen_loc = "[cx],[cy]" - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE cx++ if(cx > mx) cx = tx @@ -171,8 +171,8 @@ ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 - ND.sample_object.plane = HUD_PLANE + ND.sample_object.layer = ABOVE_HUD_LAYER + ND.sample_object.plane = ABOVE_HUD_PLANE cx++ if(cx > (4+cols)) cx = 4 @@ -182,8 +182,8 @@ O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE cx++ if(cx > (4+cols)) cx = 4 @@ -312,6 +312,7 @@ if(usr.s_active) usr.s_active.show_to(usr) W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt + W.in_inventory = TRUE update_icon() return 1 @@ -332,8 +333,8 @@ if(ismob(loc)) W.dropped(usr) if(ismob(new_location)) - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE else W.layer = initial(W.layer) W.plane = initial(W.plane) @@ -447,17 +448,18 @@ else verbs -= /obj/item/storage/verb/toggle_gathering_mode - src.boxes = new /obj/screen/storage( ) - src.boxes.name = "storage" - src.boxes.master = src - src.boxes.icon_state = "block" - src.boxes.screen_loc = "7,7 to 10,8" - src.boxes.layer = 19 - src.closer = new /obj/screen/close( ) - src.closer.master = src - src.closer.icon_state = "x" - src.closer.layer = 20 - src.closer.plane = HUD_PLANE + boxes = new /obj/screen/storage( ) + boxes.name = "storage" + boxes.master = src + boxes.icon_state = "block" + boxes.screen_loc = "7,7 to 10,8" + boxes.layer = HUD_LAYER + boxes.plane = HUD_PLANE + closer = new /obj/screen/close( ) + closer.master = src + closer.icon_state = "x" + closer.layer = ABOVE_HUD_LAYER + closer.plane = ABOVE_HUD_PLANE orient2hud() /obj/item/storage/Destroy() @@ -469,7 +471,7 @@ return ..() /obj/item/storage/emp_act(severity) - if(!istype(src.loc, /mob/living)) + if(!istype(loc, /mob/living)) for(var/obj/O in contents) O.emp_act(severity) ..() diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index ecf1acd701e..56db11ad058 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -5,7 +5,7 @@ if("bloodyspai") // 28TC new /obj/item/twohanded/garrote(src) new /obj/item/pinpointer/advpinpointer(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/card/id/syndicate(src) new /obj/item/flashlight/emp(src) @@ -19,7 +19,7 @@ new /obj/item/chameleon(src) new /obj/item/clothing/gloves/color/black/thief(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/storage/box/syndie_kit/safecracking(src) return @@ -83,14 +83,14 @@ new /obj/item/dnainjector/telemut/darkbundle(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) + new /obj/item/clothing/mask/chameleon(src) return if("gadgets") // 30TC new /obj/item/clothing/gloves/color/yellow/power(src) new /obj/item/pen/sleepy(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/flashlight/emp(src) new /obj/item/stamp/chameleon(src) @@ -340,4 +340,21 @@ To apply, hold the injector a short distance away from the outer thigh before ap new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/mask/balaclava(src) new /obj/item/clothing/accessory/stethoscope(src) - new /obj/item/book/manual/engineering_hacking(src) \ No newline at end of file + new /obj/item/book/manual/engineering_hacking(src) + +/obj/item/storage/box/syndie_kit/chameleon + name = "chameleon kit" + +/obj/item/storage/box/syndie_kit/chameleon/New() + ..() + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/suit/chameleon(src) + new /obj/item/clothing/gloves/chameleon(src) + new /obj/item/clothing/shoes/chameleon(src) + new /obj/item/clothing/glasses/chameleon(src) + new /obj/item/clothing/head/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/backpack/chameleon(src) + new /obj/item/radio/headset/chameleon(src) + new /obj/item/stamp/chameleon(src) + new /obj/item/pda/chameleon(src) \ No newline at end of file diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index faf86394dba..58a2d0464fc 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -31,17 +31,17 @@ /obj/structure/New() ..() if(smooth) - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) queue_smooth_neighbors(src) icon_state = "" if(climbable) verbs += /obj/structure/proc/climb_on - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /obj/structure/Destroy() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) if(smooth) var/turf/T = get_turf(src) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 90e32882087..d23f4c9d606 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -113,6 +113,7 @@ anchored = TRUE density = FALSE layer = TURF_LAYER + plane = FLOOR_PLANE icon_state = "weeds" max_integrity = 15 var/obj/structure/alien/weeds/node/linked_node = null diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index ffaff75288d..50d9b056e96 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -44,6 +44,10 @@ name = "cow crate" content_mob = /mob/living/simple_animal/cow +/obj/structure/closet/critter/pig + name = "pig crate" + content_mob = /mob/living/simple_animal/pig + /obj/structure/closet/critter/goat name = "goat crate" content_mob = /mob/living/simple_animal/hostile/retaliate/goat diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 543ebd7af91..6b54f61537e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -2,17 +2,15 @@ #define DISPLAYCASE_FRAME_SCREWDRIVER 1 // List and hook used to set up the captain's print on their display case -var/global/list/captain_display_cases = list() +GLOBAL_LIST_INIT(captain_display_cases, list()) -/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain) - if(!captain_display_cases.len) - return 1 +/proc/updateDisplaycase(mob/living/carbon/human/captain) + if(!GLOB.captain_display_cases.len) + return var/fingerprint = captain.get_full_print() - for(var/obj/structure/displaycase/D in captain_display_cases) - if(istype(D)) - D.ue = fingerprint - - return 1 + for(var/item in GLOB.captain_display_cases) + var/obj/structure/displaycase/CASE = item + CASE.ue = fingerprint /obj/structure/displaycase_frame name = "display case frame" @@ -123,6 +121,10 @@ var/global/list/captain_display_cases = list() req_access = list(access_captain) start_showpiece_type = /obj/item/gun/energy/laser/captain +/obj/structure/displaycase/captains_laser/Initialize(mapload) + . = ..() + GLOB.captain_display_cases += src + /obj/structure/displaycase/stechkin name = "officer's display case" desc = "A display case containing a humble stechkin pistol. Never forget your roots." @@ -136,7 +138,7 @@ var/global/list/captain_display_cases = list() return ..() /obj/structure/displaycase/captains_laser/Destroy() - captain_display_cases -= src + GLOB.captain_display_cases -= src return ..() /obj/structure/displaycase/examine(mob/user) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 936c94f5c4f..d88600fe4e7 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -7,6 +7,7 @@ anchored = 1.0 armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) layer = 2.3 //under pipes + plane = FLOOR_PLANE // flags = CONDUCT /obj/structure/lattice/New() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 3001b52f399..2953744a824 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -484,14 +484,4 @@ if(istype(C)) //We found our corpse, is it inside a morgue? morgue = get(C.loc, /obj/structure/morgue) if(morgue) - morgue.update() - -/hook/mob_login/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on login - mob.update_morgue() - return 1 - -/hook/mob_logout/proc/update_morgue(var/client/client, var/mob/mob) - //Update morgues on logout - mob.update_morgue() - return 1 + morgue.update() \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 98da892a00f..903ee22c683 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -80,7 +80,7 @@ /obj/structure/chair/proc/handle_layer() if(buckled_mob && dir == NORTH) - layer = FLY_LAYER + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ad655a39b64..e63451de8b6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -4,7 +4,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/proc/color_windows(obj/W) var/list/wcBarAreas = list(/area/crew_quarters/bar) - var/list/wcBrigAreas = list(/area/security,/area/prison,/area/shuttle/gamma) + var/list/wcBrigAreas = list(/area/security, /area/shuttle/gamma) var/newcolor var/turf/T = get_turf(W) diff --git a/code/game/sound.dm b/code/game/sound.dm index 3846e2edeaa..d27239ae4e7 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -108,10 +108,10 @@ SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) /client/proc/playtitlemusic() - if(!ticker || !ticker.login_music || config.disable_lobby_music) + if(!SSticker || !SSticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) - SEND_SOUND(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 07c2bb8a8d6..78103a4b441 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -17,7 +17,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," name = "floor" icon = 'icons/turf/floors.dmi' icon_state = "dont_use_this_floor" - + plane = FLOOR_PLANE var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" thermal_conductivity = 0.040 diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 6cfea0cb8f6..06fdcdca18f 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -60,7 +60,9 @@ /turf/simulated/floor/beach/water/New() ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = "water5", layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/simulated/floor/beach/water/Entered(atom/movable/AM, atom/OldLoc) . = ..() diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index f1172435b1b..069fefe8103 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -144,8 +144,8 @@ /turf/simulated/floor/engine/cult/New() ..() - if(ticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. - icon_state = ticker.cultdat.cult_floor_icon_state + if(SSticker.mode)//only do this if the round is going..otherwise..fucking asteroid.. + icon_state = SSticker.cultdat.cult_floor_icon_state /turf/simulated/floor/engine/cult/narsie_act() return diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 18492da2d00..d738b13b07f 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -12,9 +12,9 @@ /turf/simulated/wall/cult/New() ..() - if(ticker.mode)//game hasn't started offically don't do shit.. + if(SSticker.mode)//game hasn't started offically don't do shit.. new /obj/effect/temp_visual/cult/turf(src) - icon_state = ticker.cultdat.cult_wall_icon_state + icon_state = SSticker.cultdat.cult_wall_icon_state /turf/simulated/wall/cult/artificer name = "runed stone wall" diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f007aebfff1..77e8b400bfb 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -2,26 +2,35 @@ icon = 'icons/turf/space.dmi' name = "\proper space" icon_state = "0" - dynamic_lighting = 0 - luminosity = 1 temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = HEAT_CAPACITY_VACUUM + plane = PLANE_SPACE + layer = SPACE_LAYER + light_power = 0.25 + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + var/destination_z var/destination_x var/destination_y -/turf/space/New() - . = ..() - +/turf/space/Initialize(mapload) if(!istype(src, /turf/space/transit)) icon_state = SPACE_ICON_STATE - if(update_starlight() && is_station_level(z)) - // before you ask: Yes, this is fucking stupid, but looping through turf/space in world is how you make the server freeze - // so I don't see a better way of doing this - LAZYADD(GLOB.station_level_space_turfs, src) + + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if (light_power && light_range) + update_light() + + if (opacity) + has_opaque_atom = TRUE + + return INITIALIZE_HINT_NORMAL /turf/space/Destroy(force) if(force) @@ -29,7 +38,6 @@ else return QDEL_HINT_LETMELIVE - /turf/space/BeforeChange() ..() var/datum/space_level/S = space_manager.get_zlev(z) @@ -44,14 +52,14 @@ S.apply_transition(src) /turf/space/proc/update_starlight() - if(!config.starlight) - return FALSE - if(locate(/turf/simulated) in orange(src,1)) - set_light(config.starlight) - return TRUE - else + if(config.starlight) + for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm + if(isspaceturf(t)) + //let's NOT update this that much pls + continue + set_light(2) + return set_light(0) - return FALSE /turf/space/attackby(obj/item/C as obj, mob/user as mob, params) ..() @@ -91,17 +99,17 @@ /turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() + if((!(A) || !(src in A.locs))) + return - if(destination_z && A && (src in A.locs)) - A.x = destination_x - A.y = destination_y - A.z = destination_z + if(destination_z && destination_x && destination_y) + A.forceMove(locate(destination_x, destination_y, destination_z)) if(isliving(A)) var/mob/living/L = A if(L.pulling) var/turf/T = get_step(L.loc,turn(A.dir, 180)) - L.pulling.loc = T + L.pulling.forceMove(T) //now we're on the new z_level, proceed the space drifting sleep(0)//Let a diagonal move finish, if necessary diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 677357cf170..5e214e87d80 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -38,9 +38,22 @@ ..() for(var/atom/movable/AM in src) Entered(AM) - if(smooth && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(smooth && SSticker && SSticker.current_state == GAME_STATE_PLAYING) queue_smooth(src) +/turf/Initialize(mapload) + . = ..() + + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if(light_power && light_range) + update_light() + + if (opacity) + has_opaque_atom = TRUE + /hook/startup/proc/smooth_world() var/watch = start_watch() log_startup_progress("Smoothing atoms...") @@ -173,11 +186,12 @@ return if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed return src + set_light(0) var/old_opacity = opacity var/old_dynamic_lighting = dynamic_lighting var/old_affecting_lights = affecting_lights - var/old_lighting_overlay = lighting_overlay + var/old_lighting_object = lighting_object var/old_blueprint_data = blueprint_data var/old_obscured = obscured var/old_corners = corners @@ -191,23 +205,26 @@ W.blueprint_data = old_blueprint_data - for(var/turf/space/S in range(W,1)) - S.update_starlight() - recalc_atom_opacity() - if(lighting_overlays_initialised) - lighting_overlay = old_lighting_overlay + if(SSlighting.initialized) + recalc_atom_opacity() + lighting_object = old_lighting_object + affecting_lights = old_affecting_lights corners = old_corners - if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting)) + if(old_opacity != opacity || dynamic_lighting != old_dynamic_lighting) reconsider_lights() + if(dynamic_lighting != old_dynamic_lighting) - if(dynamic_lighting) + if(IS_DYNAMIC_LIGHTING(src)) lighting_build_overlay() else lighting_clear_overlay() + for(var/turf/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm + S.update_starlight() + obscured = old_obscured return W @@ -403,7 +420,7 @@ return(2) /turf/proc/visibilityChanged() - if(ticker) + if(SSticker) cameranet.updateVisibility(src) /turf/attackby(obj/item/I, mob/user, params) @@ -456,7 +473,7 @@ blueprint_data += I /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) add_blueprints(AM) /turf/proc/empty(turf_type=/turf/space) @@ -470,6 +487,8 @@ continue if(istype(A, /obj/docking_port)) continue + if(istype(A, /atom/movable/lighting_object)) + continue if(!A.simulated) continue qdel(A, force=TRUE) diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index b7c76359c46..15650c1f00e 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -7,7 +7,9 @@ /turf/unsimulated/beach/New() ..() if(water_overlay_image) - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"= water_overlay_image,"layer"=MOB_LAYER+0.1) + var/image/overlay_image = image('icons/misc/beach.dmi', icon_state = water_overlay_image, layer = ABOVE_MOB_LAYER) + overlay_image.plane = GAME_PLANE + overlays += overlay_image /turf/unsimulated/beach/sand name = "Sand" diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 9325d3a08b5..5a2807e8379 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -11,7 +11,7 @@ var/global/admin_ooc_colour = "#b82e00" /client/verb/ooc(msg = "" as text) set name = "OOC" set category = "OOC" - + if(!mob) return if(IsGuestKey(key)) @@ -28,10 +28,10 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return - + if(!msg) msg = typing_input(src.mob, "", "ooc \"text\"") - + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) if(!msg) return @@ -76,7 +76,7 @@ var/global/admin_ooc_colour = "#b82e00" var/icon/byond = icon('icons/member_content.dmi', "blag") display_name = "[bicon(byond)][display_name]" - if(donator_level >= DONATOR_LEVEL_ONE) + if(donator_level > 0) if((prefs.toggles & DONATOR_PUBLIC)) var/icon/donator = icon('icons/ooc_tag_16x.dmi', "donator") display_name = "[bicon(donator)][display_name]" diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 46d5c4e36ba..8febe20e840 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -59,7 +59,7 @@ to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return @@ -116,7 +116,7 @@ to_chat(src, "You're already dead!") return - if(!ticker) + if(!SSticker) to_chat(src, "You can't commit suicide before the game starts!") return diff --git a/code/game/world.dm b/code/game/world.dm index 86ca6d883bd..0341699a254 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -32,26 +32,9 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG processScheduler = new spawn(1) - processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() - if(!syndicate_code_phrase) - syndicate_code_phrase = generate_code_phrase() - if(!syndicate_code_response) - syndicate_code_response = generate_code_phrase() - if(using_map && using_map.name) - map_name = "[using_map.name]" - else - map_name = "Unknown" - - - if(config && config.server_name) - name = "[config.server_name]: [station_name()]" - else - name = station_name() - - #undef RECOMMENDED_VERSION return @@ -119,13 +102,13 @@ var/world_topic_spam_protect_time = world.timeofday player_count++ s["players"] = player_count s["admins"] = admin_count - s["map_name"] = map_name ? map_name : "Unknown" + s["map_name"] = GLOB.map_name ? GLOB.map_name : "Unknown" if(key_valid) - if(ticker && ticker.mode) - s["real_mode"] = ticker.mode.name + if(SSticker && SSticker.mode) + s["real_mode"] = SSticker.mode.name s["security_level"] = get_security_level() - s["ticker_state"] = ticker.current_state + s["ticker_state"] = SSticker.current_state if(SSshuttle && SSshuttle.emergency) // Shuttle status, see /__DEFINES/stat.dm @@ -301,8 +284,8 @@ var/world_topic_spam_protect_time = world.timeofday if(!isnull(time)) delay = max(0,time) else - delay = ticker.restart_timeout - if(ticker.delay_end) + delay = SSticker.restart_timeout + if(SSticker.delay_end) to_chat(world, "An admin has delayed the round end.") return to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") @@ -311,12 +294,12 @@ var/world_topic_spam_protect_time = world.timeofday var/sound_length = GLOB.round_end_sounds[round_end_sound] if(delay > sound_length) // If there's time, play the round-end sound before rebooting spawn(delay - sound_length) - if(!ticker.delay_end) + if(!SSticker.delay_end) world << round_end_sound sleep(delay) if(blackbox) blackbox.save_all_data_to_sql() - if(ticker.delay_end) + if(SSticker.delay_end) to_chat(world, "Reboot was cancelled by an admin.") return feedback_set_details("[feedback_c]","[feedback_r]") @@ -394,7 +377,7 @@ var/world_topic_spam_protect_time = world.timeofday s += "
" var/list/features = list() - if(ticker) + if(SSticker) if(master_mode && master_mode != "secret") features += master_mode else diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4fcf95dbfd2..2a981e8b9c4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -572,7 +572,7 @@ var/global/nologevent = 0 delay = delay * 10 message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds") log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds") - ticker.delay_end = 0 + SSticker.delay_end = 0 feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay) @@ -672,21 +672,26 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker) + if(!SSticker) alert("Unable to start the game as it is not set up.") return - if(ticker.current_state == GAME_STATE_PREGAME) - if(config.start_now_confirmation) - if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") - return - ticker.current_state = GAME_STATE_SETTING_UP - log_admin("[key_name(usr)] has started the game.") - message_admins("[key_name_admin(usr)] has started the game.") + + if(config.start_now_confirmation) + if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") + return + + if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP) + SSticker.force_start = TRUE + log_admin("[usr.key] has started the game.") + var/msg = "" + if(SSticker.current_state == GAME_STATE_STARTUP) + msg = " (The server is still setting up, but the round will be started as soon as possible.)" + message_admins("[usr.key] has started the game.[msg]") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.") - return 0 + return /datum/admins/proc/toggleenter() set category = "Server" @@ -763,10 +768,10 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER)) return - if(!ticker || ticker.current_state != GAME_STATE_PREGAME) - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + if(!SSticker || SSticker.current_state != GAME_STATE_PREGAME) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if(!( going )) @@ -780,32 +785,32 @@ var/global/nologevent = 0 ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS /proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) return 0 if(!istype(M)) return 0 - if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries)) - if(ticker.mode.config_tag == "revolution") + if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries)) + if(SSticker.mode.config_tag == "revolution") return 2 return 1 - if(M.mind in ticker.mode.cult) - if(ticker.mode.config_tag == "cult") + if(M.mind in SSticker.mode.cult) + if(SSticker.mode.config_tag == "cult") return 2 return 1 - if(M.mind in ticker.mode.syndicates) - if(ticker.mode.config_tag == "nuclear") + if(M.mind in SSticker.mode.syndicates) + if(SSticker.mode.config_tag == "nuclear") return 2 return 1 - if(M.mind in ticker.mode.wizards) - if(ticker.mode.config_tag == "wizard") + if(M.mind in SSticker.mode.wizards) + if(SSticker.mode.config_tag == "wizard") return 2 return 1 - if(M.mind in ticker.mode.changelings) - if(ticker.mode.config_tag == "changeling") + if(M.mind in SSticker.mode.changelings) + if(SSticker.mode.config_tag == "changeling") return 2 return 1 - if(M.mind in ticker.mode.abductors) - if(ticker.mode.config_tag == "abduction") + if(M.mind in SSticker.mode.abductors) + if(SSticker.mode.config_tag == "abduction") return 2 return 1 if(isrobot(M)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6b4072a800b..4a455cd8e5d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,7 +72,6 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ /client/proc/debug_variables, - /client/proc/show_snpc_verbs, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ @@ -216,11 +215,6 @@ var/list/admin_verbs_proccall = list( /client/proc/callproc_datum, /client/proc/SDQL2_query ) -var/list/admin_verbs_snpc = list( - /client/proc/resetSNPC, - /client/proc/customiseSNPC, - /client/proc/hide_snpc_verbs -) var/list/admin_verbs_ticket = list( /client/proc/openAdminTicketUI, /client/proc/toggleticketlogs, @@ -291,8 +285,6 @@ var/list/admin_verbs_ticket = list( admin_verbs_proccall, admin_verbs_show_debug_verbs, /client/proc/readmin, - admin_verbs_snpc, - /client/proc/hide_snpc_verbs, admin_verbs_ticket ) @@ -1013,28 +1005,6 @@ var/list/admin_verbs_ticket = list( log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") -/client/proc/show_snpc_verbs() - set name = "Show SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs += admin_verbs_snpc - verbs -= /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled on.") - -/client/proc/hide_snpc_verbs() - set name = "Hide SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs -= admin_verbs_snpc - verbs += /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled off.") - /client/proc/toggle_advanced_interaction() set name = "Toggle Advanced Admin Interaction" set category = "Admin" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 36c0e5cf90d..9203477c7f9 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -390,10 +390,7 @@ /datum/admins/proc/check_antagonists_line(mob/M, caption = "", close = 1) var/logout_status - if(istype(M, /mob/living/carbon/human/interactive)) - logout_status = " (snpc)" - else - logout_status = M.client ? "" : " (logged out)" + logout_status = M.client ? "" : " (logged out)" var/dname = M.real_name if(!dname) dname = M @@ -403,9 +400,9 @@ /datum/admins/proc/check_antagonists() if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state >= GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

Round Status

" - dat += "Current Game Mode: [ticker.mode.name]
" + dat += "Current Game Mode: [SSticker.mode.name]
" dat += "Round Duration: [round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]
" dat += "Emergency shuttle
" if(SSshuttle.emergency.mode < SHUTTLE_CALL) @@ -418,10 +415,10 @@ else dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" - dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
" - if(ticker.mode.syndicates.len) + dat += "[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]
" + if(SSticker.mode.syndicates.len) dat += "
" - for(var/datum/mind/N in ticker.mode.syndicates) + for(var/datum/mind/N in SSticker.mode.syndicates) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -442,20 +439,20 @@ dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])" dat += "
Syndicates
" - if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len) + if(SSticker.mode.head_revolutionaries.len || SSticker.mode.revolutionaries.len) dat += "
" - for(var/datum/mind/N in ticker.mode.head_revolutionaries) + for(var/datum/mind/N in SSticker.mode.head_revolutionaries) var/mob/M = N.current if(!M) dat += "" else dat += check_antagonists_line(M, "(leader)") - for(var/datum/mind/N in ticker.mode.revolutionaries) + for(var/datum/mind/N in SSticker.mode.revolutionaries) var/mob/M = N.current if(M) dat += check_antagonists_line(M) dat += "
Revolutionaries
Head Revolutionary not found!
" - for(var/datum/mind/N in ticker.mode.get_living_heads()) + for(var/datum/mind/N in SSticker.mode.get_living_heads()) var/mob/M = N.current if(M) dat += check_antagonists_line(M) @@ -466,7 +463,7 @@ dat += "
Target(s)Location
" if(GAMEMODE_IS_BLOB) - var/datum/game_mode/blob/mode = ticker.mode + var/datum/game_mode/blob/mode = SSticker.mode dat += "
" dat += "" @@ -479,67 +476,67 @@ dat += "" dat += "
Blob
Progress: [blobs.len]/[mode.blobwincount]
Blob not found!
" - if(ticker.mode.blob_overminds.len) - dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds) + if(SSticker.mode.blob_overminds.len) + dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds) - if(ticker.mode.changelings.len) - dat += check_role_table("Changelings", ticker.mode.changelings) + if(SSticker.mode.changelings.len) + dat += check_role_table("Changelings", SSticker.mode.changelings) - if(ticker.mode.wizards.len) - dat += check_role_table("Wizards", ticker.mode.wizards) + if(SSticker.mode.wizards.len) + dat += check_role_table("Wizards", SSticker.mode.wizards) - if(ticker.mode.raiders.len) - dat += check_role_table("Raiders", ticker.mode.raiders) + if(SSticker.mode.raiders.len) + dat += check_role_table("Raiders", SSticker.mode.raiders) /*if(ticker.mode.ninjas.len) dat += check_role_table("Ninjas", ticker.mode.ninjas)*/ - if(ticker.mode.cult.len) - dat += check_role_table("Cultists", ticker.mode.cult, 0) + if(SSticker.mode.cult.len) + dat += check_role_table("Cultists", SSticker.mode.cult, 0) dat += "
use Cult Mindspeak" if(GAMEMODE_IS_CULT) - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode if(!cult_round.narsie_condition_cleared) dat += "
complete objective (debug)" - if(ticker.mode.traitors.len) - dat += check_role_table("Traitors", ticker.mode.traitors) + if(SSticker.mode.traitors.len) + dat += check_role_table("Traitors", SSticker.mode.traitors) - if(ticker.mode.shadows.len) - dat += check_role_table("Shadowlings", ticker.mode.shadows) + if(SSticker.mode.shadows.len) + dat += check_role_table("Shadowlings", SSticker.mode.shadows) - if(ticker.mode.shadowling_thralls.len) - dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls) + if(SSticker.mode.shadowling_thralls.len) + dat += check_role_table("Shadowling Thralls", SSticker.mode.shadowling_thralls) - if(ticker.mode.abductors.len) - dat += check_role_table("Abductors", ticker.mode.abductors) + if(SSticker.mode.abductors.len) + dat += check_role_table("Abductors", SSticker.mode.abductors) - if(ticker.mode.abductees.len) - dat += check_role_table("Abductees", ticker.mode.abductees) + if(SSticker.mode.abductees.len) + dat += check_role_table("Abductees", SSticker.mode.abductees) - if(ticker.mode.vampires.len) - dat += check_role_table("Vampires", ticker.mode.vampires) + if(SSticker.mode.vampires.len) + dat += check_role_table("Vampires", SSticker.mode.vampires) - if(ticker.mode.vampire_enthralled.len) - dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled) + if(SSticker.mode.vampire_enthralled.len) + dat += check_role_table("Vampire Thralls", SSticker.mode.vampire_enthralled) - if(ticker.mode.devils.len) - dat += check_role_table("Devils", ticker.mode.devils) + if(SSticker.mode.devils.len) + dat += check_role_table("Devils", SSticker.mode.devils) - if(ticker.mode.xenos.len) - dat += check_role_table("Xenos", ticker.mode.xenos) + if(SSticker.mode.xenos.len) + dat += check_role_table("Xenos", SSticker.mode.xenos) - if(ticker.mode.superheroes.len) - dat += check_role_table("Superheroes", ticker.mode.superheroes) + if(SSticker.mode.superheroes.len) + dat += check_role_table("Superheroes", SSticker.mode.superheroes) - if(ticker.mode.supervillains.len) - dat += check_role_table("Supervillains", ticker.mode.supervillains) + if(SSticker.mode.supervillains.len) + dat += check_role_table("Supervillains", SSticker.mode.supervillains) - if(ticker.mode.greyshirts.len) - dat += check_role_table("Greyshirts", ticker.mode.greyshirts) + if(SSticker.mode.greyshirts.len) + dat += check_role_table("Greyshirts", SSticker.mode.greyshirts) - if(ticker.mode.eventmiscs.len) - dat += check_role_table("Event Roles", ticker.mode.eventmiscs) + if(SSticker.mode.eventmiscs.len) + dat += check_role_table("Event Roles", SSticker.mode.eventmiscs) if(ts_spiderlist.len) var/list/spider_minds = list() @@ -559,8 +556,8 @@ count_spiderlings += 1 dat += "
Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""].
" - if(ticker.mode.ert.len) - dat += check_role_table("ERT", ticker.mode.ert) + if(SSticker.mode.ert.len) + dat += check_role_table("ERT", SSticker.mode.ert) dat += "" usr << browse(dat, "window=roundstatus;size=400x500") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 88d10abde98..f2be4898209 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -6,7 +6,7 @@ message_admins("[key_name_admin(usr)] has attempted to override the admin panel!") return - if(ticker.mode && ticker.mode.check_antagonists_topic(href, href_list)) + if(SSticker.mode && SSticker.mode.check_antagonists_topic(href, href_list)) check_antagonists() return @@ -315,9 +315,9 @@ else if(href_list["delay_round_end"]) if(!check_rights(R_SERVER)) return - ticker.delay_end = !ticker.delay_end - log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + SSticker.delay_end = !SSticker.delay_end + log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("[key_name_admin(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -1085,7 +1085,7 @@ else if(href_list["c_mode"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) var/dat = {"What mode do you wish to play?
"} for(var/mode in config.modes) @@ -1098,7 +1098,7 @@ else if(href_list["f_secret"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1112,7 +1112,7 @@ else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") @@ -1125,7 +1125,7 @@ else if(href_list["f_secret2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) return alert(usr, "The game has already started.", null, null, null, null) if(master_mode != "secret") return alert(usr, "The game mode has to be secret!", null, null, null, null) @@ -1559,25 +1559,25 @@ alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!") return - var/datum/game_mode/cult/cult_round = ticker.mode + var/datum/game_mode/cult/cult_round = SSticker.mode cult_round.bypass_phase() message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") else if(href_list["cult_mindspeak"]) - var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.cultdat.entity_name]", "Voice of [ticker.cultdat.entity_name]", "") + var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]", "") if(!input) return - for(var/datum/mind/H in ticker.mode.cult) + for(var/datum/mind/H in SSticker.mode.cult) if (H.current) - to_chat(H.current, "[ticker.cultdat.entity_name] murmurs, [input]") + to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [input]") for(var/mob/dead/observer/O in GLOB.player_list) - to_chat(O, "[ticker.cultdat.entity_name] murmurs, [input]") + to_chat(O, "[SSticker.cultdat.entity_name] murmurs, [input]") - message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.cultdat.entity_name].") - log_admin("[key_name(usr)] Voice of [ticker.cultdat.entity_name]: [input]") + message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [SSticker.cultdat.entity_name].") + log_admin("[key_name(usr)] Voice of [SSticker.cultdat.entity_name]: [input]") else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN)) return @@ -1958,8 +1958,8 @@ kill_objective.target = H.mind kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]." newtraitormind.objectives += kill_objective - ticker.mode.equip_traitor(newtraitor) - ticker.mode.traitors |= newtraitor.mind + SSticker.mode.equip_traitor(newtraitor) + SSticker.mode.traitors |= newtraitor.mind to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") to_chat(newtraitor, "You are now a traitor.") to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]"); @@ -2341,7 +2341,7 @@ else if(href_list["traitor"]) if(!check_rights(R_ADMIN|R_MOD)) return - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) alert("The game hasn't started yet!") return @@ -2484,7 +2484,7 @@ else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) return - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/afkonly = text2num(href_list["afkonly"]) if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby?","Confirmation","Yes","Cancel") != "Yes") return @@ -2573,7 +2573,7 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","TriAI") if("gravity") - if(!(ticker && ticker.mode)) + if(!(SSticker && SSticker.mode)) to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") return gravity_is_on = !gravity_is_on @@ -2609,7 +2609,7 @@ message_admins("[key_name_admin(usr)] made all SMESs powered", 1) power_restore_quick() if("prisonwarp") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!", null, null, null, null, null) return feedback_inc("admin_secrets_fun_used",1) @@ -2651,7 +2651,7 @@ H.loc = pick(prisonsecuritywarp) prisonwarped += H if("traitor_all") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return var/objective = sanitize(copytext(input("Enter an objective"),1,MAX_MESSAGE_LEN)) @@ -2663,24 +2663,24 @@ if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue //traitorize(H, objective, 0) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = H new_objective.explanation_text = objective H.mind.objectives += new_objective - ticker.mode.greet_traitor(H.mind) + SSticker.mode.greet_traitor(H.mind) //ticker.mode.forge_traitor_objectives(H.mind) - ticker.mode.finalize_traitor(H.mind) + SSticker.mode.finalize_traitor(H.mind) for(var/mob/living/silicon/A in GLOB.player_list) - ticker.mode.traitors += A.mind + SSticker.mode.traitors += A.mind A.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/new_objective = new new_objective.owner = A new_objective.explanation_text = objective A.mind.objectives += new_objective - ticker.mode.greet_traitor(A.mind) - ticker.mode.finalize_traitor(A.mind) + SSticker.mode.greet_traitor(A.mind) + SSticker.mode.finalize_traitor(A.mind) message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") @@ -2946,10 +2946,10 @@ if("showailaws") output_ai_laws() if("showgm") - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") - else if(ticker.mode) - alert("The game mode is [ticker.mode.name]") + else if(SSticker.mode) + alert("The game mode is [SSticker.mode.name]") else alert("For some reason there's a ticker, but not a game mode") if("manifest") var/dat = "Showing Crew Manifest.
" @@ -3284,7 +3284,7 @@ return G.report_message = description message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.") - ticker.mode.station_goals += G + SSticker.mode.station_goals += G modify_goals() else if(href_list["showdetails"]) @@ -3408,7 +3408,7 @@ protect_objective.target = H.mind protect_objective.explanation_text = "Protect [H.real_name], the [H.mind.assigned_role]." hunter_mind.objectives += protect_objective - ticker.mode.traitors |= hunter_mob.mind + SSticker.mode.traitors |= hunter_mob.mind to_chat(hunter_mob, "ATTENTION: You are now on a mission!") to_chat(hunter_mob, "Goal: [killthem ? "MURDER" : "PROTECT"] [H.real_name], currently in [get_area(H.loc)]. "); if(killthem) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 3449350e11f..63ebd52d09b 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -3,7 +3,7 @@ set category = "Debug" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = 1 - if(!ticker) + if(!SSticker) return switch(cinematic) if("explosion") @@ -14,4 +14,4 @@ override = input(src, "mode = ?","Enter Parameter", null) as anything in list("nuclear emergency", "fake", "no override") if(0) override = input(src, "mode = ?","Enter Parameter", null) as anything in list("blob", "nuclear emergency", "AI malfunction", "no override") - ticker.station_explosion_cinematic(parameter, override) \ No newline at end of file + SSticker.station_explosion_cinematic(parameter, override) \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3492061f1f6..2aabeba57e9 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -215,7 +215,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -233,7 +233,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return @@ -293,7 +293,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -313,7 +313,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -333,7 +333,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(ishuman(M)) @@ -405,7 +405,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon/human)) @@ -818,7 +818,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_SPAWN)) return - if(!ticker) + if(!SSticker) alert("Wait until the game starts") return if(istype(M, /mob/living/carbon)) diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm index 081c820aaee..cad93e8b880 100644 --- a/code/modules/admin/verbs/gimmick_team.dm +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -7,7 +7,7 @@ set desc = "Spawns a group of players in the specified outfit." if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No") @@ -82,7 +82,7 @@ H.mind.store_memory("[themission]

") if(is_syndicate) - ticker.mode.traitors |= H.mind //Adds them to extra antag list + SSticker.mode.traitors |= H.mind //Adds them to extra antag list players_spawned++ if(players_spawned >= teamsize) diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index b4c0e6a05eb..f4013edbe1e 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -4,7 +4,7 @@ var/const/honksquad_possible = 6 //if more Commandos are needed in the future var/global/sent_honksquad = 0 /client/proc/honksquad() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(world.time < 6000) @@ -95,7 +95,7 @@ var/global/sent_honksquad = 0 new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD new_honksquad.mind.offstation_role = TRUE new_honksquad.add_language("Clownish") - ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_honksquad.equip_honksquad(honk_leader_selected) return new_honksquad diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..a7da1553ec0 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -10,7 +10,7 @@ var/global/sent_syndicate_infiltration_team = 0 if(!check_rights(R_ADMIN)) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(alert("Do you want to send in the Syndicate Infiltration Team?",,"Yes","No")=="No") @@ -132,7 +132,7 @@ var/global/sent_syndicate_infiltration_team = 0 new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator" new_syndicate_infiltrator.mind.offstation_role = TRUE //they can flee to z2 so make them inelligible as antag targets - ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list + SSticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt) return new_syndicate_infiltrator @@ -170,7 +170,7 @@ var/global/sent_syndicate_infiltration_team = 0 equip_or_collect(new /obj/item/pda(src), slot_in_backpack) // Other gear - equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/noslip(src), slot_shoes) var/obj/item/card/id/syndicate/W = new(src) if (flag_mgmt) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 4b3905f37e2..170b93a50f6 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -175,7 +175,7 @@ client/proc/one_click_antag() for(var/i = 0, iYou are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: [input]") to_chat(new_vox, "Don't forget to turn on your nitrogen internals!") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index c2260a051eb..3db8f102320 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -1,5 +1,5 @@ /client/proc/only_one() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -14,7 +14,7 @@ var/datum/preferences/A = new() // Randomize appearance A.copy_to(H) - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = SPECIAL_ROLE_TRAITOR var/datum/objective/hijack/hijack_objective = new @@ -58,7 +58,7 @@ world << sound('sound/music/thunderdome.ogg') /client/proc/only_me() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return @@ -66,7 +66,7 @@ if(H.stat == 2 || !(H.client)) continue if(is_special_character(H)) continue - ticker.mode.traitors += H.mind + SSticker.mode.traitors += H.mind H.mind.special_role = "[H.real_name] Prime" var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index d2490cdf9c3..846a77c508a 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -1,5 +1,5 @@ /client/proc/only_one_team() - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 1c75421f4b7..b6986f4960f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -18,8 +18,8 @@ var/prayer_type = "PRAYER" var/deity if(usr.job == "Chaplain") - if(ticker && ticker.Bible_deity_name) - deity = ticker.Bible_deity_name + if(SSticker && SSticker.Bible_deity_name) + deity = SSticker.Bible_deity_name cross = image('icons/obj/storage.dmi',"kingyellow") font_color = "blue" prayer_type = "CHAPLAIN PRAYER" @@ -27,7 +27,7 @@ cross = image('icons/obj/storage.dmi',"tome") font_color = "red" prayer_type = "CULTIST PRAYER" - deity = ticker.cultdat.entity_name + deity = SSticker.cultdat.entity_name log_say("(PRAYER) [msg]", usr) msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 15ee321656c..65ea0b17dbc 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -437,11 +437,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if("traitor") SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1) - ticker.mode.equip_traitor(new_character) + SSticker.mode.equip_traitor(new_character) if("Wizard") new_character.loc = pick(wizardstart) //ticker.mode.learn_basic_spells(new_character) - ticker.mode.equip_wizard(new_character) + SSticker.mode.equip_wizard(new_character) if("Syndicate") var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") if(synd_spawn) @@ -858,7 +858,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Toggle Deny Shuttle" - if(!ticker) + if(!SSticker) return if(!check_rights(R_ADMIN)) @@ -891,12 +891,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_SERVER|R_EVENT)) return - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") return - if(ticker.random_players) - ticker.random_players = 0 + if(SSticker.random_players) + SSticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1) to_chat(usr, "Disabled.") return @@ -914,7 +914,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") - ticker.random_players = 1 + SSticker.random_players = 1 feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_random_events() @@ -1009,13 +1009,13 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_EVENT)) return - if(ticker.mode.ert_disabled) - ticker.mode.ert_disabled = 0 + if(SSticker.mode.ert_disabled) + SSticker.mode.ert_disabled = 0 to_chat(usr, "ERT has been Enabled.") log_admin("Admin [key_name(src)] has enabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1) else - ticker.mode.ert_disabled = 1 + SSticker.mode.ert_disabled = 1 to_chat(usr, "ERT has been Disabled.") log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) @@ -1033,14 +1033,14 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!input) return - if(!ticker) + if(!SSticker) return - ticker.selected_tip = input + SSticker.selected_tip = input // If we've already tipped, then send it straight away. - if(ticker.tipped) - ticker.send_tip_of_the_round() + if(SSticker.tipped) + SSticker.send_tip_of_the_round() message_admins("[key_name_admin(usr)] sent a Tip of the round.") log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") @@ -1055,12 +1055,12 @@ Traitors and the like can also be revived with the previous role mostly intact. holder.modify_goals() /datum/admins/proc/modify_goals() - if(!ticker || !ticker.mode) + if(!SSticker || !SSticker.mode) to_chat(usr, "This verb can only be used if the round has started.") return var/dat = "" - for(var/datum/station_goal/S in ticker.mode.station_goals) + for(var/datum/station_goal/S in SSticker.mode.station_goals) dat += "[S.name] - Announce | Remove
" dat += "
Add New Goal" usr << browse(dat, "window=goals;size=400x400") diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index a23e6eea69c..4b555bc724a 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -4,7 +4,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/global/sent_strike_team = 0 /client/proc/strike_team() - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return if(sent_strike_team == 1) @@ -86,9 +86,9 @@ var/global/sent_strike_team = 0 R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD R.mind.offstation_role = TRUE - if(!(R.mind in ticker.minds)) - ticker.minds += R.mind - ticker.mode.traitors += R.mind + if(!(R.mind in SSticker.minds)) + SSticker.minds += R.mind + SSticker.mode.traitors += R.mind R.key = ghost_mob.key if(nuke_code) R.mind.store_memory("Nuke Code: [nuke_code].") @@ -150,7 +150,7 @@ var/global/sent_strike_team = 0 new_commando.mind_initialize() new_commando.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD - ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. new_commando.equip_death_commando(is_leader) return new_commando diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index bf20d2b5503..7e77fe17df7 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -9,7 +9,7 @@ var/global/sent_syndicate_strike_team = 0 if(!src.holder) to_chat(src, "Only administrators may use this command.") return - if(!ticker) + if(!SSticker) alert("The game hasn't started yet!") return if(sent_syndicate_strike_team == 1) @@ -117,7 +117,7 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD new_syndicate_commando.mind.offstation_role = TRUE - ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. new_syndicate_commando.equip_syndicate_commando(is_leader) qdel(spawn_location) return new_syndicate_commando diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 10ad3f07020..98a4bf82e98 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -2,21 +2,21 @@ set category = "Event" set name = "Create AI Triumvirate" - if(ticker.current_state > GAME_STATE_PREGAME) + if(SSticker.current_state > GAME_STATE_PREGAME) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.") return - if(SSjobs && ticker) + if(SSjobs && SSticker) var/datum/job/job = SSjobs.GetJob("AI") if(!job) to_chat(usr, "Unable to locate the AI job") return - if(ticker.triai) - ticker.triai = 0 + if(SSticker.triai) + SSticker.triai = 0 to_chat(usr, "Only one AI will be spawned at round start.") message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else - ticker.triai = 1 + SSticker.triai = 1 to_chat(usr, "There will be an AI Triumvirate at round start.") message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 17ab0cb40a0..d52507bee1d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -18,6 +18,7 @@ icon_state = "locator" var/borg_to_spawn var/checking = FALSE + var/rolename = "Syndicate Operative" /obj/item/antag_spawner/nuke_ops/proc/before_candidate_search(user) return TRUE @@ -26,7 +27,7 @@ if(used) to_chat(user, "[src] is out of power!") return FALSE - if(!(user.mind in ticker.mode.syndicates)) + if(!(user.mind in SSticker.mode.syndicates)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE if(checking) @@ -45,7 +46,7 @@ checking = TRUE to_chat(user, "You activate [src] and wait for confirmation.") - var/list/nuke_candidates = pollCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg" : "operative"]?", ROLE_OPERATIVE, TRUE, 150) + var/list/nuke_candidates = pollCandidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 150) if(LAZYLEN(nuke_candidates)) checking = FALSE if(QDELETED(src) || !check_usability(user)) @@ -62,27 +63,27 @@ /obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - var/agent_number = LAZYLEN(ticker.mode.syndicates) + var/agent_number = LAZYLEN(SSticker.mode.syndicates) - 1 M.real_name = "[syndicate_name()] Operative #[agent_number]" set_syndicate_values(C, M) - ticker.mode.create_syndicate(M.mind) - ticker.mode.equip_syndicate(M, 0) - ticker.mode.update_syndicate_id(M.mind, FALSE) + SSticker.mode.create_syndicate(M.mind) + SSticker.mode.equip_syndicate(M, 0) + SSticker.mode.update_syndicate_id(M.mind, FALSE) /obj/item/antag_spawner/nuke_ops/proc/set_syndicate_values(client/C, mob/living/M) M.key = C.key - ticker.mode.syndicates += M.mind - ticker.mode.update_synd_icons_added(M.mind) + SSticker.mode.syndicates += M.mind + SSticker.mode.update_synd_icons_added(M.mind) M.mind.assigned_role = SPECIAL_ROLE_NUKEOPS M.mind.special_role = SPECIAL_ROLE_NUKEOPS M.mind.offstation_role = TRUE M.faction = list("syndicate") - ticker.mode.forge_syndicate_objectives(M.mind) - ticker.mode.greet_syndicate(M.mind) + SSticker.mode.forge_syndicate_objectives(M.mind) + SSticker.mode.greet_syndicate(M.mind) //////SYNDICATE BORG /obj/item/antag_spawner/nuke_ops/borg_tele @@ -109,13 +110,15 @@ if(switch_roles_choice == "Syndicate Cyborg") switch_roles = TRUE + rolename = initial(rolename) else switch_roles = FALSE + rolename = "Syndicate [borg_to_spawn] Cyborg" return TRUE /obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, datum/mind/user) - if(!(user in ticker.mode.syndicates)) + if(!(user in SSticker.mode.syndicates)) used = FALSE return @@ -147,7 +150,7 @@ set_syndicate_values(user.current.client, R) L.key = C.key - ticker.mode.greet_syndicate(L.mind) + SSticker.mode.greet_syndicate(L.mind) ///////////SLAUGHTER DEMON @@ -198,7 +201,7 @@ S.key = C.key S.mind.assigned_role = S.name S.mind.special_role = S.name - ticker.mode.traitors += S.mind + SSticker.mode.traitors += S.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = S.mind KillDaWiz.target = user.mind @@ -266,7 +269,7 @@ M.mind.assigned_role = SPECIAL_ROLE_MORPH M.mind.special_role = SPECIAL_ROLE_MORPH to_chat(M, M.playstyle_string) - ticker.mode.traitors += M.mind + SSticker.mode.traitors += M.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = M.mind KillDaWiz.target = user.mind diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 94c265848b7..a91e392e125 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -42,8 +42,8 @@ possible_contents = list(/obj/random/carp_plushie) /obj/item/toy/prizeball/plushie - name = "animal plushie capsule" - desc = "Contains one cuddly animal plushie!" + name = "plushie capsule" + desc = "Contains one cuddly plushie!" possible_contents = list(/obj/random/plushie) /obj/item/toy/prizeball/figure diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index a68071f8f44..4d2e062677a 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -157,8 +157,8 @@ var/global/datum/prizes/global_prizes = new cost = 65 /datum/prize_item/plushie - name = "Random Animal Plushie" - desc = "A colorful animal-shaped plush toy." + name = "Random Plushie" + desc = "A colorful plush toy." typepath = /obj/item/toy/prizeball/plushie cost = 75 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 33e12abe788..e213843df8c 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -34,7 +34,7 @@ /obj/effect/mob_spawn/attack_ghost(mob/user) var/mob/dead/observer/O = user - if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) + if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable) return if(!uses) to_chat(user, "This spawner is out of charges!") diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm index 6da42a682fa..7d045f0afcb 100644 --- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm +++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm @@ -1,44 +1,44 @@ /area/awaymission/UO71 name = "UO71" icon_state = "away" - report_alerts = 0 - tele_proof = 1 + report_alerts = FALSE + tele_proof = TRUE /area/awaymission/UO71/plaza name = "UO71 Plaza" icon_state = "awaycontent1" - fire = 1 + fire = TRUE /area/awaymission/UO71/centralhall name = "UO71 Central" icon_state = "awaycontent2" - fire = 1 + fire = TRUE /area/awaymission/UO71/eng name = "UO71 Engineering" icon_state = "awaycontent3" - fire = 1 + fire = TRUE /area/awaymission/UO71/mining name = "UO71 Mining" icon_state = "awaycontent4" - fire = 1 + fire = TRUE /area/awaymission/UO71/science name = "UO71 Science" icon_state = "awaycontent5" - fire = 1 + fire = TRUE /area/awaymission/UO71/medical name = "UO71 Medical" icon_state = "awaycontent6" - fire = 1 + fire = TRUE /area/awaymission/UO71/gateway name = "UO71 Gateway" icon_state = "awaycontent7" - fire = 1 + fire = TRUE /area/awaymission/UO71/outside name = "UO71 Outside" @@ -47,36 +47,41 @@ /area/awaymission/UO71/bridge name = "UO71 Bridge" icon_state = "awaycontent21" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/queen name = "UO71 Queen Lair" icon_state = "awaycontent9" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/prince name = "UO71 Prince Containment" icon_state = "awaycontent10" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/mother name = "UO71 Mother Containment" icon_state = "awaycontent10" - fire = 1 - requires_power = 0 - tele_proof = 1 + fire = TRUE + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/UO71/loot name = "UO71 Loot Vault" icon_state = "awaycontent11" - requires_power = 0 - tele_proof = 1 + requires_power = FALSE + tele_proof = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /obj/item/paper/terrorspiders1 name = "paper - 'Sealed Facility'" diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index c2d10d7c97d..73e288b56ed 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -3,25 +3,24 @@ /area/awaymission/BMPship name = "\improper BMP Asteroids" icon_state = "away" - luminosity = 0 - report_alerts = 0 + report_alerts = FALSE /area/awaymission/BMPship/Aft name = "\improper Aft Block" icon_state = "away1" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Midship name = "\improper Midship Block" icon_state = "away2" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Fore name = "\improper Fore Block" icon_state = "away3" - requires_power = 1 + requires_power = TRUE /area/awaymission/BMPship/Gate name = "\improper Gateway Block" icon_state = "away4" - requires_power = 1 \ No newline at end of file + requires_power = TRUE \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index b0a092b7e7d..15dac122c54 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -3,7 +3,7 @@ /area/awaymission/challenge name = "Challenge" icon_state = "away" - report_alerts = 0 + report_alerts = FALSE /area/awaymission/challenge/start name = "Where Am I?" @@ -12,12 +12,14 @@ /area/awaymission/challenge/main name = "\improper Danger Room" icon_state = "away1" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /area/awaymission/challenge/end name = "Administration" icon_state = "away2" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /obj/machinery/power/emitter/energycannon diff --git a/code/modules/awaymissions/mission_code/clownplanet.dm b/code/modules/awaymissions/mission_code/clownplanet.dm deleted file mode 100644 index 8d64d3074d2..00000000000 --- a/code/modules/awaymissions/mission_code/clownplanet.dm +++ /dev/null @@ -1,21 +0,0 @@ -//Clown Planet Areas - -/area/planet/clown - name = "\improper Clown Planet" - icon_state = "honk" - luminosity = 1 - dynamic_lighting = 0 - requires_power = 0 - report_alerts = 0 - -/area/awaymission/clownplanet/miningtown - name = "\improper Clown Planet - Bananium-o-Rama" - icon_state = "away1" - luminosity = 1 - requires_power = 0 - -/area/awaymission/clownplanet/mine - name = "\improper Clown Planet - Bananium-o-Rama Mines" - icon_state = "away2" - luminosity = 1 - requires_power = 0 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/ruins/oldstation.dm b/code/modules/awaymissions/mission_code/ruins/oldstation.dm index 1886aba02ab..7150d0c74c4 100644 --- a/code/modules/awaymissions/mission_code/ruins/oldstation.dm +++ b/code/modules/awaymissions/mission_code/ruins/oldstation.dm @@ -307,6 +307,7 @@ name = "Powered Tile" icon_state = "teleporter" requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/ruin/space/ancientstation/space name = "Exposed To Space" diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index 3f9c9925772..146597fe457 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -3,8 +3,9 @@ /area/awaymission/spacebattle name = "\improper Space Battle" icon_state = "away" - requires_power = 0 - report_alerts = 0 + requires_power = FALSE + report_alerts = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED /area/awaymission/spacebattle/cruiser name = "\improper Nanotrasen Cruiser" diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 0328dea5b53..d2fda046d7e 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -2,7 +2,8 @@ /area/awaymission/spacehotel name = "Deep Space Hotel 419" - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/spacehotel/kitchen name = "Hotel Kitchen" @@ -152,14 +153,6 @@ /obj/machinery/door/unpowered/hotel_door/autoclose() if(!density && !operating && autoclose) close() - -/obj/machinery/door/unpowered/hotel_door/emag_act(mob/user) - if(isliving(user) && density) - var/obj/effect/hotel_controller/H - if(H.controller) - H.controller.deploy_sec(user) - ..() - /obj/item/card/hotel_card name = "Key Card" icon_state = "guest" @@ -283,20 +276,4 @@ spawn(300) if(D.occupant == deadbeat) // they still haven't checked out... - deploy_sec(deadbeat) - checkout(roomid) - -/obj/effect/hotel_controller/proc/deploy_sec(mob/living/target) - if(!istype(target) || !istype(get_area(target), /area/awaymission/spacehotel)) - return - - var/list/secs[0] - for(var/mob/living/carbon/human/interactive/away/hotel/guard/M in get_area(src)) - if(!M.retal) - secs += M - var/mob/living/carbon/human/interactive/away/hotel/guard/S = safepick(secs) - if(!S) - return - - S.retal_target = target - S.retal = 1 + checkout(roomid) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm deleted file mode 100644 index 2a524ab738c..00000000000 --- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm +++ /dev/null @@ -1,132 +0,0 @@ -/mob/living/carbon/human/interactive/away/hotel - away_area = /area/awaymission/spacehotel - override_under = /obj/item/clothing/under/mafia - chattyness = SNPC_CHANCE_TALK / 4 - -/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload) - . = ..(mapload, /datum/species/skrell) - -/mob/living/carbon/human/interactive/away/hotel/doSetup() - ..() - MYID.access = list(access_syndicate) - RPID.access = list(access_syndicate) - -/mob/living/carbon/human/interactive/away/hotel/guard - default_job = /datum/job/officer - -/mob/living/carbon/human/interactive/away/hotel/guard/doSetup() - ..("Guard") - - // anti-pinata cheese - var/obj/item/implant/dust/D = new /obj/item/implant/dust(src) - D.implant(src) - - for(var/obj/item/I in get_all_slots()) - I.flags |= NODROP - -/mob/living/carbon/human/interactive/away/hotel/guard/KnockOut() - // you'll never take me alive (this triggers the implant) - emote("deathgasp") - if(stat != DEAD) - // mission failed. we'll get em next time - ..() - -/mob/living/carbon/human/interactive/away/hotel/chef - default_job = /datum/job/chef - away_area = /area/awaymission/spacehotel/kitchen - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/bartender - default_job = /datum/job/bartender - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/concierge - override_under = /obj/item/clothing/under/mafia/white - away_area = /area/awaymission/spacehotel/reception - var/list/known_guests[0] - var/obj/effect/hotel_controller/hotel - var/obj/item/card/id/last_seen_id = null - -/mob/living/carbon/human/interactive/away/hotel/concierge/random() - ..() - equip_or_collect(new /obj/item/clipboard(src), slot_l_hand) - -/mob/living/carbon/human/interactive/away/hotel/concierge/doSetup() - ..("Concierge") - -/mob/living/carbon/human/interactive/away/hotel/concierge/setup_job() - favoured_types = list(/obj/item/paper, /obj/item/clipboard) - functions += list("stamping", "concierge") - restrictedJob = 1 - -/mob/living/carbon/human/interactive/away/hotel/concierge/proc/concierge() - if(!hotel) - hotel = hotel.controller - if(!hotel) - return - - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/found = 0 - for(var/mob/living/carbon/human/H in nearby - known_guests) - pointed(H) - known_guests += H - found = 1 - if(found) - say("Welcome to [hotel], [nouns_generic]! Please check in by [ing_verb(verbs_move)] and [ing_verb(verbs_use)] your [adjective_objects] ID onto the table.") - return - - var/obj/item/card/id - var/id_seen = 0 - for(var/obj/item/card/id/I in get_area(src)) - id_seen = 1 - if(I != last_seen_id) - id = I - if(!id_seen) - last_seen_id = null - return - if(!id) - return - var/turf/idloc = get_turf(id) - if(!Adjacent(idloc)) - tryWalk(idloc) - else - // is the last jerk that touched it over here? - var/mob/id_owner - for(var/mob/living/carbon/human/H in nearby) - if(H.ckey == id.fingerprintslast) - id_owner = H - break - - if(!id_owner) - say("Whose card is this?") - pointed(id) - return - - last_seen_id = id - // Checking in or out? - if(id_owner in hotel.guests) - // Check out - say ("Hope you enjoyed your [adjective_objects] stay at our [adjective_generic] hotel!") - hotel.checkout(hotel.guests[id_owner]) - else - // pick a room - var/obj/machinery/door/unpowered/hotel_door/D = safepick(hotel.vacant_rooms) - if(!D) - say("Sorry, all the [adjective_objects] are occupied currently.") - else - // Check in - say("$100 per 10 minutes. The cost will be automatically [past_verb(verbs_touch)] while you're checked in.") - - var/obj/item/card/hotel_card/K = hotel.checkin(D.id, id_owner, id) - if(K) - K.forceMove(idloc) - else - say("Your [adjective_insult] [curse_words] card was rejected.") diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 17ece10d71a..8e7b267f2d3 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -161,7 +161,7 @@ var/sc_safecode5 = "[rand(0,9)]" desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible." move_self = 0 //Contianed narsie does not move! grav_pull = 0 //Contained narsie does not pull stuff in! - var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/hostile/construct) + var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_object, /mob/living/simple_animal/hostile/construct) //Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment /obj/singularity/narsie/sc_Narsie/admin_investigate_setup() diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 91c09d15f30..ef576760ada 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -9,31 +9,30 @@ /area/awaymission/wwmines name = "\improper Wild West Mines" icon_state = "away1" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwgov name = "\improper Wild West Mansion" icon_state = "away2" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwrefine name = "\improper Wild West Refinery" icon_state = "away3" - luminosity = 1 - requires_power = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/awaymission/wwvault name = "\improper Wild West Vault" icon_state = "away3" - luminosity = 0 /area/awaymission/wwvaultdoors name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power icon_state = "away2" - requires_power = 0 - luminosity = 0 + requires_power = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /* * Wish Granter diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm deleted file mode 100644 index 8d65aa44a92..00000000000 --- a/code/modules/awaymissions/snpc.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/carbon/human/interactive/away - var/away_area = /area/awaymission // their overriden job area - var/override_under = null // optional type for uniform, else default for job - var/squad_member = 0 // was spawned by squad - var/home_z - -/mob/living/carbon/human/interactive/away/Initialize(mapload) - . = ..() - TRAITS |= TRAIT_ROBUST - faction += "away" - -/mob/living/carbon/human/interactive/away/random() - ..() - // a little hacky but it should prevent doubled uniforms - if(ispath(override_under, /obj/item/clothing/under)) - var/old_under = w_uniform - w_uniform = null - equip_to_slot(new override_under(src), slot_w_uniform) - qdel(old_under) - -/mob/living/carbon/human/interactive/away/doSetup() - ..() - var/datum/data/pda/app/messenger/M = MYPDA.find_program(/datum/data/pda/app/messenger) - M.toff = 1 - -/mob/living/carbon/human/interactive/away/job2area() - return away_area - -/mob/living/carbon/human/interactive/away/doProcess() - if(!home_z) - home_z = get_turf(z) - if(home_z != get_turf(z)) - gib() - ..() - -/obj/effect/spawner/snpc_squad - name = "squad spawner" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - density = 0 - opacity = 0 - invisibility = 101 - var/squad_type = /mob/living/carbon/human/interactive/away - var/squad_size = 3 - - var/global/list/squads[0] - var/list/squad - -/obj/effect/spawner/snpc_squad/New() - START_PROCESSING(SSobj, src) - - squad = squads[squad_type] - if(!squad) - squad = list() - squads[squad_type] = squad - squad += src - -/obj/effect/spawner/snpc_squad/Destroy() - squad = null - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/spawner/snpc_squad/process() - // check squad memebers - var/living = 0 - for(var/mob/living/carbon/human/interactive/away/A in squad) - if(!A.stat) - living++ - else - // see if anyone's looking, if not, despawn - var/can_despawn = 1 - for(var/mob/living/M in viewers(A, world.view + 1)) - if(M.client) - living++ // dead guy that can be seen still takes up a slot - can_despawn = 0 - break - if(can_despawn) - squad -= A - qdel(A) - - // spawn new ones - if(living < squad_size && !length(viewers(src, world.view))) - var/mob/living/carbon/human/interactive/away/A = new squad_type(loc) - squad += A - A.squad_member = 1 diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm index 3697a4678df..de60531e590 100644 --- a/code/modules/awaymissions/zvis.dm +++ b/code/modules/awaymissions/zvis.dm @@ -1,8 +1,8 @@ /area/awaymission/upperlevel name = "Open Space" color = "#888" - dynamic_lighting = 0 - requires_power = 0 + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + requires_power = FALSE // Used by /turf/unsimulated/floor/upperlevel as a reference for where the other floor is /obj/effect/levelref @@ -84,9 +84,14 @@ /obj/effect/portal_sensor/proc/check_light() var/turf/T = loc - if(istype(T) && T.lighting_overlay && !T.lighting_overlay.needs_update) - var/atom/movable/lighting_overlay/O = T.lighting_overlay - var/hash = O.lum_r + O.lum_g + O.lum_b + if(istype(T) && T.lighting_object && !T.lighting_object.needs_update) + var/atom/movable/lighting_object/O = T.lighting_object + var/hash = 0 + + for(var/lighting_corner in O) + var/datum/lighting_corner/C = lighting_corner + hash = hash + C.lum_r + C.lum_g + C.lum_b + if(hash != light_hash) light_hash = hash trigger() @@ -365,4 +370,4 @@ screen_loc = "CENTER[ox >= 0 ? "+" : ""][ox],CENTER[oy >= 0 ? "+" : ""][oy]" /obj/effect/view_portal_dummy/attack_ghost(mob/user) - owner.attack_ghost(user) + owner.attack_ghost(user) \ No newline at end of file diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 1d26a013986..c15ea50c93e 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -81,7 +81,7 @@ var/datum/chatOutput/chatOutput // Donator stuff. - var/donator_level = DONATOR_LEVEL_NONE + var/donator_level = 0 // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction var/advanced_admin_interaction = FALSE diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 4ecb8fea741..00a9137fe05 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -74,7 +74,7 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - + if(!C) // Might be a stealthmin ID, so pass it in straight C = href_list["priv_msg"] else if(C.UID() != href_list["priv_msg"]) @@ -328,13 +328,13 @@ GLOB.admins += src holder.owner = src - donator_check() - //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) prefs = preferences_datums[ckey] if(!prefs) prefs = new /datum/preferences(src) preferences_datums[ckey] = prefs + else + prefs.parent = src prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps) @@ -343,12 +343,6 @@ spawn() // Goonchat does some non-instant checks in start() chatOutput.start() - if(custom_event_msg && custom_event_msg != "") - to_chat(src, "

Custom Event

") - to_chat(src, "

A custom event is taking place. OOC Info:

") - to_chat(src, "[html_encode(custom_event_msg)]") - to_chat(src, "
") - if( (world.address == address || !address) && !host ) host = key world.update_status() @@ -376,6 +370,7 @@ to_chat(src, message) clientmessages.Remove(ckey) + donator_check() send_resources() @@ -395,10 +390,14 @@ if(establish_db_connection()) to_chat(src,"You have enabled karma gains.") - if(!void) - void = new() + generate_clickcatcher() + apply_clickcatcher() - screen += void + if(custom_event_msg && custom_event_msg != "") + to_chat(src, "

Custom Event

") + to_chat(src, "

A custom event is taking place. OOC Info:

") + to_chat(src, "[html_encode(custom_event_msg)]") + to_chat(src, "
") if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") @@ -431,17 +430,27 @@ if(!dbcon.IsConnected()) return + if(check_rights(R_ADMIN, 0, mob)) // Yes, the mob is required, regardless of other examples in this file, it won't work otherwise + donator_level = DONATOR_LEVEL_MAX + donor_loadout_points() + return + //Donator stuff. var/DBQuery/query_donor_select = dbcon.NewQuery("SELECT ckey, tier, active FROM `[format_table_name("donators")]` WHERE ckey = '[ckey]'") query_donor_select.Execute() while(query_donor_select.NextRow()) if(!text2num(query_donor_select.item[3])) // Inactive donator. - donator_level = DONATOR_LEVEL_NONE + donator_level = 0 return donator_level = text2num(query_donor_select.item[2]) + donor_loadout_points() break +/client/proc/donor_loadout_points() + if(donator_level > 0 && prefs) + prefs.max_gear_slots = config.max_loadout_points + 5 + /client/proc/log_client_to_db(connectiontopic) if(IsGuestKey(key)) return @@ -775,6 +784,15 @@ else winset(src, "rpane.changelog", "background-color=none;text-color=#000000") +/client/proc/generate_clickcatcher() + if(!void) + void = new() + screen += void + +/client/proc/apply_clickcatcher() + generate_clickcatcher() + var/list/actualview = getviewsize(view) + void.UpdateGreed(actualview[1],actualview[2]) /client/proc/send_ssd_warning(mob/M) if(!config.ssd_warning) @@ -786,4 +804,4 @@ to_chat(src, "Interacting with SSD players is against server rules unless you've ahelped first for permission. If you have, confirm that and proceed.") return TRUE -#undef SSD_WARNING_TIMER \ No newline at end of file +#undef SSD_WARNING_TIMER diff --git a/code/modules/client/preference/loadout/loadout.dm b/code/modules/client/preference/loadout/loadout.dm index b42c5d5abf1..63825cc1237 100644 --- a/code/modules/client/preference/loadout/loadout.dm +++ b/code/modules/client/preference/loadout/loadout.dm @@ -4,7 +4,6 @@ var/list/gear_datums = list() /datum/loadout_category var/category = "" var/list/gear = list() - var/donor_only = FALSE /datum/loadout_category/New(cat) category = cat @@ -34,8 +33,6 @@ var/list/gear_datums = list() if(!loadout_categories[use_category]) loadout_categories[use_category] = new /datum/loadout_category(use_category) var/datum/loadout_category/LC = loadout_categories[use_category] - if(initial(G.donor_only)) - LC.donor_only = TRUE gear_datums[use_name] = new geartype LC.gear[use_name] = gear_datums[use_name] @@ -57,7 +54,7 @@ var/list/gear_datums = list() var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned. var/subtype_path = /datum/gear //for skipping organizational subtypes (optional) var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time - var/donor_only = FALSE // if it's only available to donors + var/donator_tier = 0 /datum/gear/New() ..() diff --git a/code/modules/client/preference/loadout/loadout_donor.dm b/code/modules/client/preference/loadout/loadout_donor.dm index 9e13662a7d8..5558a988209 100644 --- a/code/modules/client/preference/loadout/loadout_donor.dm +++ b/code/modules/client/preference/loadout/loadout_donor.dm @@ -1,5 +1,5 @@ /datum/gear/donor - donor_only = TRUE + donator_tier = 2 sort_category = "Donor" subtype_path = /datum/gear/donor @@ -77,6 +77,26 @@ display_name = "Guy Fawkes mask" path = /obj/item/clothing/mask/fawkes -/datum/gear/donor/noble_clothes - display_name = "Noble Clothes" - path = /obj/item/clothing/under/noble_clothes +/datum/gear/donor/id_decal_silver + display_name = "Silver ID Decal" + path = /obj/item/id_decal/silver + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_prisoner + display_name = "Prisoner ID Decal" + path = /obj/item/id_decal/prisoner + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_emag + display_name = "Emag ID Decal" + path = /obj/item/id_decal/emag + donator_tier = 3 + cost = 2 + +/datum/gear/donor/id_decal_gold + display_name = "Gold ID Decal" + path = /obj/item/id_decal/gold + donator_tier = 4 + cost = 4 \ No newline at end of file diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 22894aaa691..632c5053b48 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -183,7 +183,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // 0 = character settings, 1 = game preferences var/current_tab = TAB_CHAR - // OOC Metadata: + // OOC Metadata: var/metadata = "" var/slot_name = "" @@ -211,8 +211,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts unlock_content = C.IsByondMember() if(unlock_content) max_save_slots = MAX_SAVE_SLOTS_MEMBER - if(C.donator_level >= DONATOR_LEVEL_ONE) - max_gear_slots += 5 loaded_preferences_successfully = load_preferences(C) // Do not call this with no client/C, it generates a runtime / SQL error if(loaded_preferences_successfully) @@ -448,10 +446,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += " - Color: [UI_style_color]    
" dat += " - UI Style: [UI_style]
" dat += "Deadchat Anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
" - if(user.client.donator_level >= DONATOR_LEVEL_ONE) + if(user.client.donator_level > 0) dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]
" dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" dat += "FPS: [clientfps]
" + dat += "Ambient Occlusion: [toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]
" dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" dat += "Ghost Radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" @@ -508,10 +507,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/firstcat = 1 for(var/category in loadout_categories) - var/datum/loadout_category/LC = loadout_categories[category] - if(LC.donor_only) - if(user.client.donator_level < DONATOR_LEVEL_TWO) // level two donators get the donator loadout, so don't show it to anyone with less than that - continue if(firstcat) firstcat = 0 else @@ -529,7 +524,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts for(var/gear_name in LC.gear) var/datum/gear/G = LC.gear[gear_name] var/ticked = (G.display_name in gear) - dat += "[G.display_name]" + if(G.donator_tier > user.client.donator_level) + dat += "[G.display_name]" + else + dat += "[G.display_name]" dat += "[G.cost]" if(G.allowed_roles) dat += "Restrictions: " @@ -1147,10 +1145,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(TG.display_name in gear) gear -= TG.display_name else - if(TG.donor_only) - if(user.client.donator_level < DONATOR_LEVEL_TWO) // donator items are locked to > tier 2 - //they normally can't even get this far- but just in case of href exploits, we check them here - return + if(TG.donator_tier && user.client.donator_level < TG.donator_tier) + to_chat(user, "That gear is only available at a higher donation tier than you are on.") + return var/total_cost = 0 var/list/type_blacklist = list() for(var/gear_name in gear) @@ -1921,22 +1918,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(world.byond_version >= 511 && user.client && user.client.byond_version >= 511) parent.fps = clientfps -/* - if("skin_style") - var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") - if(!skin_style_name) return -*/ - -/* if("spawnpoint") - var/list/spawnkeys = list() - for(var/S in spawntypes) - spawnkeys += S - var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys - if(!choice || !spawntypes[choice]) - spawnpoint = "Arrivals Shuttle" - return - spawnpoint = choice */ - else switch(href_list["preference"]) if("publicity") @@ -1944,7 +1925,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts toggles ^= MEMBER_PUBLIC if("donor_public") - if(user.client.donator_level >= DONATOR_LEVEL_ONE) + if(user.client.donator_level > 0) toggles ^= DONATOR_PUBLIC if("gender") @@ -2081,6 +2062,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(href_list["tab"]) current_tab = text2num(href_list["tab"]) + if("ambientocclusion") + toggles ^= AMBIENT_OCCLUSION + if(parent && parent.screen && parent.screen.len) + var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen + PM.filters -= FILTER_AMBIENT_OCCLUSION + if(toggles & AMBIENT_OCCLUSION) + PM.filters += FILTER_AMBIENT_OCCLUSION + ShowChoices(user) return 1 diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index b355d921016..6b72d71bc9b 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -55,7 +55,7 @@ ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 2097151, initial(toggles)) + toggles = sanitize_integer(toggles, 0, TOGGLES_TOTAL, initial(toggles)) sound = sanitize_integer(sound, 0, 65535, initial(sound)) UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) @@ -87,7 +87,7 @@ UI_style_alpha='[UI_style_alpha]', be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', - toggles='[toggles]', + toggles='[num2text(toggles, 7)]', atklog='[atklog]', sound='[sound]', randomslot='[randomslot]', diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index 703de37468e..c4d7599d2de 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -230,7 +230,6 @@ to_chat(usr, "You have disabled karma gains.") else to_chat(usr, "You have enabled karma gains.") - return /client/verb/toggle_popup_limiter() set name = "Toggle Text Popup Limiter" @@ -242,4 +241,4 @@ to_chat(usr, "You have enabled text popup limiting.") else to_chat(usr, "You have disabled text popup limiting.") - return + diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9613ce173af..2cc570ded70 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -151,14 +151,16 @@ slot_flags = SLOT_EYES materials = list(MAT_GLASS = 250) var/vision_flags = 0 - var/darkness_view = 0 //Base human is 2 + var/see_in_dark = 0 //Base human is 2 var/invis_view = SEE_INVISIBLE_LIVING var/invis_override = 0 + var/lighting_alpha var/emagged = 0 var/list/color_view = null//overrides client.color while worn var/prescription = 0 var/prescription_upgradable = 0 + var/over_mask = FALSE //Whether or not the eyewear is rendered above the mask. Purely cosmetic. strip_delay = 20 // but seperated to allow items to protect but not impair vision, like space helmets put_on_delay = 25 burn_state = FIRE_PROOF @@ -173,6 +175,28 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ +/obj/item/clothing/glasses/verb/adjust_eyewear() //Adjust eyewear to be worn above or below the mask. + set name = "Adjust Eyewear" + set category = "Object" + set desc = "Adjust your eyewear to be worn over or under a mask." + set src in usr + + var/mob/living/carbon/human/user = usr + if(!istype(user)) + return + if(user.incapacitated()) //Dead spessmen adjust no glasses. Resting/buckled ones do, though + return + + var/action_fluff = "You adjust \the [src]" + if(user.glasses == src) + if(!user.canUnEquip(src)) + to_chat(usr, "[src] is stuck to you!") + return + if(attack_hand(user)) //Remove the glasses for this action. Prevents logic-defying instances where glasses phase through your mask as it ascends/descends to another plane of existence. + action_fluff = "You remove \the [src] and adjust it" + + over_mask = !over_mask + to_chat(user, "[action_fluff] to be worn [over_mask ? "over" : "under"] a mask.") //Gloves /obj/item/clothing/gloves @@ -281,9 +305,11 @@ BLIND // can't see anything slot_flags = SLOT_HEAD var/blockTracking // Do we block AI tracking? var/HUDType = null - var/darkness_view = 0 - var/helmet_goggles_invis_view = 0 + var/vision_flags = 0 + var/see_in_dark = 0 + var/lighting_alpha + var/can_toggle = null //Mask @@ -574,8 +600,9 @@ BLIND // can't see anything "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) - var/has_sensor = 1//For the crew computer 2 = unable to change mode - var/sensor_mode = 0 + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode + var/sensor_mode = SENSOR_OFF + var/random_sensor = TRUE /* 1 = Report living/dead 2 = Report detailed damages @@ -587,7 +614,8 @@ BLIND // can't see anything var/basecolor /obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) + if(random_sensor) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_VITALS, SENSOR_COORDS) ..() /obj/item/clothing/under/Destroy() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index b527bb2717d..032792063be 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -37,7 +37,7 @@ item_state = "glasses" origin_tech = "magnets=1;engineering=2" vision_flags = SEE_TURFS - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 1 species_fit = list("Vox") sprite_sheets = list( @@ -52,7 +52,8 @@ icon_state = "nvgmeson" item_state = "glasses" origin_tech = "magnets=4;engineering=5;plasmatech=4" - darkness_view = 8 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/meson/prescription @@ -103,8 +104,8 @@ desc = "Now you can science in darkness." icon_state = "nvpurple" item_state = "glasses" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these /obj/item/clothing/glasses/janitor name = "Janitorial Goggles" @@ -122,8 +123,8 @@ icon_state = "night" item_state = "glasses" origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', @@ -177,6 +178,15 @@ flags = NODROP flags_cover = null +/obj/item/clothing/glasses/material/lighting + name = "Neutron Goggles" + desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness." + origin_tech = null + vision_flags = 0 + + flags = NODROP + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + /obj/item/clothing/glasses/regular name = "prescription glasses" desc = "Made by Nerd. Co." @@ -223,7 +233,7 @@ name = "sunglasses" icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 prescription_upgradable = 1 @@ -237,7 +247,7 @@ /obj/item/clothing/glasses/sunglasses/fake desc = "Cheap, plastic sunglasses. They don't even have UV protection." name = "cheap sunglasses" - darkness_view = 0 + see_in_dark = 0 flash_protect = 0 tint = 0 @@ -285,7 +295,7 @@ name = "sunglasses" icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 species_fit = list("Vox") @@ -382,6 +392,7 @@ item_state = "glasses" origin_tech = "magnets=3" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE flash_protect = -1 species_fit = list("Vox") sprite_sheets = list( @@ -389,18 +400,18 @@ "Grey" = 'icons/mob/species/grey/eyes.dmi' ) - emp_act(severity) - if(istype(src.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = src.loc - to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") - if(M.glasses == src) - M.EyeBlind(3) - M.EyeBlurry(5) - if(!(M.disabilities & NEARSIGHTED)) - M.BecomeNearsighted() - spawn(100) - M.CureNearsighted() - ..() +/obj/item/clothing/glasses/thermal/emp_act(severity) + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") + if(M.glasses == src) + M.EyeBlind(3) + M.EyeBlurry(5) + if(!(M.disabilities & NEARSIGHTED)) + M.BecomeNearsighted() + spawn(100) + M.CureNearsighted() + ..() /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete name = "Optical Meson Scanner" @@ -503,11 +514,11 @@ icon_state = "godeye" item_state = "godeye" vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS - darkness_view = 8 + see_in_dark = 8 scan_reagents = 1 flags = NODROP flags_cover = null - invis_view = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index d778ea5e63a..7f5d73acb1d 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -50,8 +50,8 @@ icon_state = "healthhudnight" item_state = "glasses" origin_tech = "magnets=4;biotech=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/diagnostic @@ -72,8 +72,8 @@ icon_state = "diagnostichudnight" item_state = "glasses" origin_tech = "magnets=4;powerstorage=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security @@ -105,14 +105,15 @@ icon_state = "jensenshades" item_state = "jensenshades" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/clothing/glasses/hud/security/night name = "\improper Night Vision Security HUD" desc = "An advanced heads-up display which provides id data and vision in complete darkness." icon_state = "securityhudnight" origin_tech = "magnets=4;combat=4;plasmatech=4;engineering=5" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security/sunglasses/read_only @@ -123,7 +124,7 @@ desc = "Sunglasses with a HUD." icon_state = "sunhud" origin_tech = "magnets=3;combat=3;engineering=3" - darkness_view = 1 + see_in_dark = 1 flash_protect = 1 tint = 1 prescription_upgradable = 1 @@ -153,8 +154,8 @@ desc = "A hydroponic HUD fitted with a light amplifier." icon_state = "hydroponichudnight" item_state = "glasses" - darkness_view = 8 - invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 0 /obj/item/clothing/glasses/hud/security/tajblind diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 35b4b6a75e0..6e3a0302cbc 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -50,6 +50,7 @@ desc = "A helmet with a built-in thermal scanning visor." icon_state = "helmetthermals" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/clothing/head/helmet/meson name = "meson visor helmet" @@ -67,7 +68,7 @@ name = "night-vision helmet" desc = "A helmet with a built-in pair of night vision goggles." icon_state = "helmetNVG" - helmet_goggles_invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these /obj/item/clothing/head/helmet/alt name = "bulletproof helmet" diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0c4dba9ae49..1bd53217770 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -162,11 +162,6 @@ item_state = "sexymime" burn_state = FLAMMABLE -/obj/item/clothing/mask/gas/death_commando - name = "Death Commando Mask" - icon_state = "death_commando_mask" - item_state = "death_commando_mask" - /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm deleted file mode 100644 index b5b6298dcb2..00000000000 --- a/code/modules/clothing/masks/voice.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/voice_changer - name = "voice changer" - desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." - var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. - var/active - -/obj/item/clothing/mask/gas/voice - name = "gas mask" -// desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." - var/obj/item/voice_changer/changer - burn_state = FIRE_PROOF - -/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() - set category = "Object" - set src in usr - - changer.active = !changer.active - to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - -/obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) - set category = "Object" - set src in usr - - var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) - if(!voice || !length(voice)) return - changer.voice = voice - to_chat(usr, "You are now mimicking [changer.voice].") - -/obj/item/clothing/mask/gas/voice/New() - ..() - changer = new(src) - -/obj/item/clothing/mask/gas/voice/clown - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - icon_state = "clown" - item_state = "clown_hat" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index ed4471d7b7c..1805d911caa 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -83,7 +83,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team /obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user) if(user) - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint set_light(0) else diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f3a2efed260..d4411fbdbe6 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,21 +1,3 @@ -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." - name = "brown shoes" - icon_state = "brown" - item_state = "brown" - permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=2" - burn_state = FIRE_PROOF - var/list/clothing_choices = list() - silence_steps = 1 - -/obj/item/clothing/shoes/syndigaloshes/black - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes. They seem to have extra grip." - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 8a79b192d0c..91b28ad3206 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -47,7 +47,8 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT unacidable = 1 vision_flags = SEE_MOBS - helmet_goggles_invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these + see_in_dark = 8 HUDType = MEDHUD strip_delay = 130 diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index aa62763a6d3..bfb326eae1d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -269,14 +269,13 @@ /obj/item/rig_module/voice/New() ..() voice_holder = new(src) - voice_holder.active = 0 + voice_holder.active = FALSE /obj/item/rig_module/voice/installed() ..() holder.speech = src /obj/item/rig_module/voice/engage() - if(!..()) return 0 @@ -287,17 +286,17 @@ switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 + active = TRUE + voice_holder.active = TRUE to_chat(usr, "You enable the speech synthesiser.") if("Disable") - active = 0 - voice_holder.active = 0 + active = FALSE + voice_holder.active = FALSE to_chat(usr, "You disable the speech synthesiser.") if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") return 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 13ef3e074da..0903710ddc8 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -345,7 +345,7 @@ name = "winter coat" desc = "A heavy jacket made from 'synthetic' animal furs." icon_state = "wintercoat" - item_state = "labcoat" + item_state = "coatwinter" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -369,6 +369,7 @@ /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" icon_state = "wintercoat_captain" + item_state = "coatcaptain" armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) hoodtype = /obj/item/clothing/head/winterhood/captain @@ -379,6 +380,7 @@ /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" icon_state = "wintercoat_sec" + item_state = "coatsecurity" armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0) allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic) hoodtype = /obj/item/clothing/head/winterhood/security @@ -389,6 +391,7 @@ /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" icon_state = "wintercoat_med" + item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/medical @@ -399,6 +402,7 @@ /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" icon_state = "wintercoat_sci" + item_state = "coatscience" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/science @@ -409,6 +413,7 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "wintercoat_engi" + item_state = "coatengineer" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd) hoodtype = /obj/item/clothing/head/winterhood/engineering @@ -419,6 +424,7 @@ /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" icon_state = "wintercoat_atmos" + item_state = "coatatmos" hoodtype = /obj/item/clothing/head/winterhood/engineering/atmos /obj/item/clothing/head/winterhood/engineering/atmos @@ -427,6 +433,7 @@ /obj/item/clothing/suit/hooded/wintercoat/hydro name = "hydroponics winter coat" icon_state = "wintercoat_hydro" + item_state = "coathydro" allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants) hoodtype = /obj/item/clothing/head/winterhood/hydro @@ -436,6 +443,7 @@ /obj/item/clothing/suit/hooded/wintercoat/cargo name = "cargo winter coat" icon_state = "wintercoat_cargo" + item_state = "coatcargo" hoodtype = /obj/item/clothing/head/winterhood/cargo /obj/item/clothing/head/winterhood/cargo @@ -444,6 +452,7 @@ /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" icon_state = "wintercoat_miner" + item_state = "coatminer" allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) hoodtype = /obj/item/clothing/head/winterhood/miner diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index b1da17677de..9d2c29e2679 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -630,7 +630,7 @@ var/area/t = get_area(M) var/obj/item/radio/headset/a = new /obj/item/radio/headset(src) - if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) + if(istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite)) //give the syndicats a bit of stealth a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm") else diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index b320237996e..b08a1ce72c9 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -1,86 +1,478 @@ +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + target.name = initial(picked_item.name) + target.desc = initial(picked_item.desc) + target.icon_state = initial(picked_item.icon_state) + if(isitem(target)) + var/obj/item/I = target + I.item_state = initial(picked_item.item_state) + I.item_color = initial(picked_item.item_color) + if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = picked_item + CL.flags_cover = initial(PCL.flags_cover) + target.icon = initial(picked_item.icon) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value + +/datum/action/item_action/chameleon/change/process() + if(world.time > emp_timer) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + /obj/item/clothing/under/chameleon //starts off as black name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" item_color = "black" - desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=2" - var/list/clothing_choices = list() - burn_state = FIRE_PROOF - armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - New() - ..() - var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list. - for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V + var/datum/action/item_action/chameleon/change/chameleon_action - for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - return +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) - ..() - if(istype(U, /obj/item/clothing/under/chameleon)) - to_chat(user, "Nothing happens.") - return - if(istype(U, /obj/item/clothing/under)) - if(src.clothing_choices.Find(U)) - to_chat(user, "Pattern is already recognised by the suit.") - return - src.clothing_choices += U - to_chat(user, "Pattern absorbed by the suit.") +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_color = "psyche" - usr.update_inv_w_uniform() - spawn(200) - name = initial(name) - icon_state = initial(icon_state) - item_color = initial(item_color) - desc = initial(desc) - usr.update_inv_w_uniform() - ..() + var/datum/action/item_action/chameleon/change/chameleon_action +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() - verb/change() - set name = "Change Color" - set category = "Object" - set src in usr +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - if(icon_state == "psyche") - to_chat(usr, "Your suit is malfunctioning") - return +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) - var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices - if(!A) - return +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - desc = null - permeability_coefficient = 0.90 + var/datum/action/item_action/chameleon/change/chameleon_action - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - item_color = A.item_color - usr.update_inv_w_uniform() //so our overlays update. +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() +/obj/item/clothing/glasses/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/under/chameleon/all/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) - //to prevent an infinite loop - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/gloves/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/head/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/obj/item/clothing/mask/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/obj/item/storage/backpack/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6ad3bd70d55..1cce81c12c2 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -802,6 +802,7 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + flags_size = ONESIZEFITSALL has_sensor = 0 // HUNKE /obj/item/clothing/under/victdress diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index d2b32f720cf..6181644ffc8 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1785,4 +1785,4 @@ item_state = "voxbodysuit" item_color = "voxbodysuit" body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - species_fit = list("Vox") \ No newline at end of file + species_fit = list("Vox") diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index e99367cb8fd..16b1162e074 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -154,7 +154,6 @@ var/global/current_date_string if("toggle_suspension") if(detailed_account_view) detailed_account_view.suspended = !detailed_account_view.suspended - callHook("change_account_status", list(detailed_account_view)) if("finalise_create_account") var/account_name = href_list["holder_name"] diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 18d75f3ef30..3c7dcc6496b 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -13,11 +13,11 @@ if(candidates.len >= 2) //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 + var/number = SSticker.mode.abductor_teams + 1 var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode + if(SSticker.mode.config_tag == "abduction") + temp = SSticker.mode else temp = new @@ -42,10 +42,10 @@ temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) temp.post_setup_team(number) - ticker.mode.abductor_teams++ + SSticker.mode.abductor_teams++ - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors + if(SSticker.mode.config_tag != "abduction") + SSticker.mode.abductors |= temp.abductors processing = 1 //So it will get gc'd return 1 else diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 7e4473cb0d2..590ff374ad6 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -27,8 +27,8 @@ GLOB.respawnable_list -= C.client var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind spawncount-- successSpawn = 1 diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 29baf834bb5..a8f11681577 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -58,7 +58,8 @@ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" blueeffect.icon = 'icons/effects/effects.dmi' blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = 17 + blueeffect.layer = FLASH_LAYER + blueeffect.plane = FULLSCREEN_PLANE blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT M.client.screen += blueeffect sleep(20) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 58302950b5e..62de79a19cb 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -17,10 +17,11 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/ M.playsound_local(null, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE) /datum/event/aurora_caelus/start() - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - S.set_light(S.light_range * 3, S.light_power * 0.5, aurora_colors[1]) - CHECK_TICK + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + S.set_light(S.light_range * 3, S.light_power * 0.5) /datum/event/aurora_caelus/tick() if(aurora_progress >= aurora_colors.len) @@ -28,15 +29,18 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/ if(activeFor % 5 == 0) aurora_progress++ var/aurora_color = aurora_colors[aurora_progress] - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - S.set_light(l_color = aurora_color) - CHECK_TICK + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + S.set_light(l_color = aurora_color) /datum/event/aurora_caelus/end() - for(var/s in GLOB.station_level_space_turfs) - var/turf/space/S = s - fade_to_black(S) + for(var/area in GLOB.all_areas) + var/area/A = area + if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) + for(var/turf/space/S in A) + fade_to_black(S) event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \ When this has concluded, please return to your workplace and continue work as normal. \ Have a pleasant shift, [station_name()], and thank you for watching with us.", diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 9b1588e1161..29b0b44e721 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -23,7 +23,7 @@ "atrazine","banana","charcoal","space_drugs","methamphetamine","holywater","ethanol","hot_coco","facid", "blood","morphine","ether","fluorine","mutadone","mutagen","hydrocodone","fuel", "haloperidol","lsd","syndicate_nanites","lipolicide","frostoil","salglu_solution","beepskysmash", - "omnizine", "amanitin", "neurotoxin", "synaptizine") + "omnizine", "amanitin", "neurotoxin", "synaptizine", "rotatium") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = vent R.add_reagent(pick(gunk), 50) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e937ec25ef9..6be1d3bcf70 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -671,8 +671,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ /obj/item/gun/energy/kinetic_accelerator/crossbow,\ /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ /obj/item/chameleon, /obj/item/card/emag,\ /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 107ec3c4f3f..57063b0d743 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -59,7 +59,7 @@ var/list/karma_spenders = list() if(config.disable_karma) to_chat(src, "Karma is disabled.") return FALSE - if(!ticker || !GLOB.player_list.len || (ticker.current_state == GAME_STATE_PREGAME)) + if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME)) to_chat(src, "You can't award karma until the game has started.") return FALSE if(client.karma_spent || (ckey in karma_spenders)) diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index 10e747b4e31..638aaeee7c3 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -320,11 +320,11 @@ if(!bibledelay) var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc) - if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) ) - B.icon_state = ticker.Bible_icon_state - B.item_state = ticker.Bible_item_state - B.name = ticker.Bible_name - B.deity_name = ticker.Bible_deity_name + if(SSticker && ( SSticker.Bible_icon_state && SSticker.Bible_item_state) ) + B.icon_state = SSticker.Bible_icon_state + B.item_state = SSticker.Bible_item_state + B.name = SSticker.Bible_name + B.deity_name = SSticker.Bible_deity_name bibledelay = 1 spawn(60) diff --git a/code/modules/lighting/__lighting_docs.dm b/code/modules/lighting/__lighting_docs.dm index 8ef93935e9c..18041989910 100644 --- a/code/modules/lighting/__lighting_docs.dm +++ b/code/modules/lighting/__lighting_docs.dm @@ -54,7 +54,7 @@ turf: (lighting_turf.dm) - Create lighting overlays for this turf -atom/movable/lighting_overlay: (lighting_overlay.dm) +atom/movable/lighting_object: (lighting_object.dm) - var/lum_r, var/lum_g, var/lum_b; lumcounts of each colour - var/needs_update; set on update_lumcount, checked by lighting process diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 92923e6b0d5..77e955d10a6 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -1,9 +1,30 @@ /area luminosity = TRUE - var/dynamic_lighting = TRUE + var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED -/area/New() - . = ..() +/area/proc/set_dynamic_lighting(var/new_dynamic_lighting = DYNAMIC_LIGHTING_ENABLED) + if(new_dynamic_lighting == dynamic_lighting) + return FALSE - if(dynamic_lighting) - luminosity = FALSE \ No newline at end of file + dynamic_lighting = new_dynamic_lighting + + if(IS_DYNAMIC_LIGHTING(src)) + cut_overlay(/obj/effect/fullbright) + for (var/turf/T in src) + if(IS_DYNAMIC_LIGHTING(T)) + T.lighting_build_overlay() + + else + add_overlay(/obj/effect/fullbright) + for (var/turf/T in src) + if(T.lighting_object) + T.lighting_clear_overlay() + + return TRUE + +/area/vv_edit_var(var_name, var_value) + switch(var_name) + if("dynamic_lighting") + set_dynamic_lighting(var_value) + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 646fe0ba15d..ff4bc517979 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -1,14 +1,18 @@ + /atom - var/light_power = 1 // intensity of the light - var/light_range = 0 // range in tiles of the light - var/light_color // Hexadecimal RGB string representing the colour of the light + var/light_power = 1 // Intensity of the light. + var/light_range = 0 // Range in tiles of the light. + var/light_color // Hexadecimal RGB string representing the colour of the light. - var/datum/light_source/light - var/list/light_sources + var/tmp/datum/light_source/light // Our light source. Don't fuck with this directly unless you have a good reason! + var/tmp/list/light_sources // Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list. -// Nonsensical value for l_color default, so we can detect if it gets set to null. +// The proc you should always use to set the light of this atom. +// Nonesensical value for l_color default, so we can detect if it gets set to null. #define NONSENSICAL_VALUE -99999 -/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE) +/atom/proc/set_light(var/l_range, var/l_power, var/l_color = NONSENSICAL_VALUE) + if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) + l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. if(l_power != null) light_power = l_power @@ -18,59 +22,48 @@ if(l_color != NONSENSICAL_VALUE) light_color = l_color + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) + update_light() #undef NONSENSICAL_VALUE +// Will update the light (duh). +// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() set waitfor = FALSE + if(QDELETED(src)) + return - if(!light_power || !light_range) - if(light) - light.destroy() - light = null + if(!light_power || !light_range) // We won't emit light anyways, destroy the light source. + QDEL_NULL(light) else - if(!istype(loc, /atom/movable)) + if(!ismovableatom(loc)) // We choose what atom should be the top atom of the light here. . = src else . = loc - if(light) + if(light) // Update the light or create it if it does not exist. light.update(.) else - light = new /datum/light_source(src, .) + light = new/datum/light_source(src, .) /atom/proc/extinguish_light() return -/atom/Destroy() - if(light) - light.destroy() - light = null - return ..() - +// If we have opacity, make sure to tell (potentially) affected light sources. /atom/movable/Destroy() var/turf/T = loc - if(opacity && istype(T)) - T.reconsider_lights() - return ..() - -/atom/movable/Move() - var/turf/old_loc = loc . = ..() + if(opacity && istype(T)) + var/old_has_opaque_atom = T.has_opaque_atom + T.recalc_atom_opacity() + if(old_has_opaque_atom != T.has_opaque_atom) + T.reconsider_lights() - if(loc != old_loc) - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() - - var/turf/new_loc = loc - if(istype(old_loc) && opacity) - old_loc.reconsider_lights() - - if(istype(new_loc) && opacity) - new_loc.reconsider_lights() - -/atom/proc/set_opacity(new_opacity) +// Should always be used to change the opacity of an atom. +// It notifies (potentially) affected light sources so they can update (if needed). +/atom/proc/set_opacity(var/new_opacity) if(new_opacity == opacity) return @@ -88,14 +81,54 @@ if(old_has_opaque_atom != T.has_opaque_atom) T.reconsider_lights() -/obj/item/equipped() - . = ..() - update_light() -/obj/item/pickup() +/atom/movable/Moved(atom/OldLoc, Dir) . = ..() - update_light() + var/datum/light_source/L + var/thing + for (thing in light_sources) // Cycle through the light sources on this atom and tell them to update. + L = thing + L.source_atom.update_light() -/obj/item/dropped() - . = ..() - update_light() +/atom/vv_edit_var(var_name, var_value) + switch (var_name) + if("light_range") + set_light(l_range=var_value) + return TRUE + + if("light_power") + set_light(l_power=var_value) + return TRUE + + if("light_color") + set_light(l_color=var_value) + return TRUE + + return ..() + + +/atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + return + +/turf/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + if(!_duration) + stack_trace("Lighting FX obj created on a turf without a duration") + new /obj/effect/dummy/lighting_obj (src, _color, _range, _power, _duration) + +/obj/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + var/temp_color + var/temp_power + var/temp_range + if(!_reset_lighting) //incase the obj already has a lighting color that you don't want cleared out after, ie computer monitors. + temp_color = light_color + temp_power = light_power + temp_range = light_range + set_light(_range, _power, _color) + addtimer(CALLBACK(src, /atom/proc/set_light, _reset_lighting ? initial(light_range) : temp_range, _reset_lighting ? initial(light_power) : temp_power, _reset_lighting ? initial(light_color) : temp_color), _duration, TIMER_OVERRIDE|TIMER_UNIQUE) + +/mob/living/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE) + mob_light(_color, _range, _power, _duration) + +/mob/living/proc/mob_light(_color, _range, _power, _duration) + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _color, _range, _power, _duration) + return mob_light_obj diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 907e7aab8b5..d8b05d0c17f 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -1,15 +1,13 @@ -/var/total_lighting_corners = 0 -/var/datum/lighting_corner/dummy/dummy_lighting_corner = new -// Because we can control each corner of every lighting overlay. +// Because we can control each corner of every lighting object. // And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't). // For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting. // This list is what the code that assigns corners listens to, the order in this list is the order in which corners are added to the /turf/corners list. -/var/list/LIGHTING_CORNER_DIAGONAL = list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST) +GLOBAL_LIST_INIT(LIGHTING_CORNER_DIAGONAL, list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST)) /datum/lighting_corner - var/list/turf/masters = list() - var/list/datum/light_source/affecting = list() // Light sources affecting us. + var/list/turf/masters + var/list/datum/light_source/affecting // Light sources affecting us. var/active = FALSE // TRUE if one of our masters has dynamic lighting. var/x = 0 @@ -27,13 +25,9 @@ var/cache_b = LIGHTING_SOFT_THRESHOLD var/cache_mx = 0 - var/update_gen = 0 - /datum/lighting_corner/New(var/turf/new_turf, var/diagonal) . = ..() - - total_lighting_corners++ - + masters = list() masters[new_turf] = turn(diagonal, 180) z = new_turf.z @@ -51,75 +45,99 @@ // Diagonal one is easy. T = get_step(new_turf, diagonal) - if (T) // In case we're on the map's border. - if (!T.corners) + if(T) // In case we're on the map's border. + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = diagonal - i = LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) T.corners[i] = src // Now the horizontal one. T = get_step(new_turf, horizontal) - if (T) // Ditto. - if (!T.corners) + if(T) // Ditto. + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) T.corners[i] = src // And finally the vertical one. T = get_step(new_turf, vertical) - if (T) - if (!T.corners) + if(T) + if(!T.corners) T.corners = list(null, null, null, null) masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. - i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) + i = GLOB.LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) T.corners[i] = src update_active() /datum/lighting_corner/proc/update_active() active = FALSE - for (var/turf/T in masters) - if (T.lighting_overlay) + var/turf/T + var/thing + for (thing in masters) + T = thing + if(T.lighting_object) active = TRUE // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b) + + if((abs(delta_r)+abs(delta_g)+abs(delta_b)) == 0) + return + lum_r += delta_r lum_g += delta_g lum_b += delta_b - if (!needs_update) + if(!needs_update) needs_update = TRUE - lighting_update_corners += src + GLOB.lighting_update_corners += src -/datum/lighting_corner/proc/update_overlays() - - // Cache these values a head of time so 4 individual lighting overlays don't all calculate them individually. - var/mx = max(lum_r, lum_g, lum_b) // Scale it so 1 is the strongest lum, if it is above 1. +/datum/lighting_corner/proc/update_objects() + // Cache these values a head of time so 4 individual lighting objects don't all calculate them individually. + var/lum_r = src.lum_r + var/lum_g = src.lum_g + var/lum_b = src.lum_b + var/mx = max(lum_r, lum_g, lum_b) // Scale it so one of them is the strongest lum, if it is above 1. . = 1 // factor - if (mx > 1) + if(mx > 1) . = 1 / mx - else if (mx < LIGHTING_SOFT_THRESHOLD) + #if LIGHTING_SOFT_THRESHOLD != 0 + else if(mx < LIGHTING_SOFT_THRESHOLD) . = 0 // 0 means soft lighting. - cache_r = lum_r * . || LIGHTING_SOFT_THRESHOLD - cache_g = lum_g * . || LIGHTING_SOFT_THRESHOLD - cache_b = lum_b * . || LIGHTING_SOFT_THRESHOLD - cache_mx = mx + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + #else + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) + #endif + cache_mx = round(mx, LIGHTING_ROUND_VALUE) for (var/TT in masters) var/turf/T = TT - if (T.lighting_overlay) - if (!T.lighting_overlay.needs_update) - T.lighting_overlay.needs_update = TRUE - lighting_update_overlays += T.lighting_overlay + if(T.lighting_object) + if(!T.lighting_object.needs_update) + T.lighting_object.needs_update = TRUE + GLOB.lighting_update_objects += T.lighting_object /datum/lighting_corner/dummy/New() return + + +/datum/lighting_corner/Destroy(var/force) + if(!force) + return QDEL_HINT_LETMELIVE + + stack_trace("Attempted qdel of a lighting corner.") + + return ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm new file mode 100644 index 00000000000..930e953d5eb --- /dev/null +++ b/code/modules/lighting/lighting_object.dm @@ -0,0 +1,148 @@ +/atom/movable/lighting_object + name = "" + + anchored = TRUE + + icon = LIGHTING_ICON + icon_state = "transparent" + color = LIGHTING_BASE_MATRIX + plane = LIGHTING_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = LIGHTING_LAYER + invisibility = INVISIBILITY_LIGHTING + simulated = FALSE + + var/needs_update = FALSE + var/turf/myturf + +/atom/movable/lighting_object/Initialize(mapload) + . = ..() + verbs.Cut() + + myturf = loc + if(myturf.lighting_object) + qdel(myturf.lighting_object, force = TRUE) + myturf.lighting_object = src + myturf.luminosity = 0 + + for(var/turf/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm + S.update_starlight() + + needs_update = TRUE + GLOB.lighting_update_objects += src + +/atom/movable/lighting_object/Destroy(var/force) + if(force) + GLOB.lighting_update_objects -= src + if(loc != myturf) + var/turf/oldturf = get_turf(myturf) + var/turf/newturf = get_turf(loc) + stack_trace("A lighting object was qdeleted with a different loc then it is suppose to have ([COORD(oldturf)] -> [COORD(newturf)])") + if(isturf(myturf)) + myturf.lighting_object = null + myturf.luminosity = 1 + myturf = null + + return ..() + + else + return QDEL_HINT_LETMELIVE + +/atom/movable/lighting_object/proc/update() + if(loc != myturf) + if(loc) + var/turf/oldturf = get_turf(myturf) + var/turf/newturf = get_turf(loc) + warning("A lighting object realised it's loc had changed in update() ([myturf]\[[myturf ? myturf.type : "null"]]([COORD(oldturf)]) -> [loc]\[[ loc ? loc.type : "null"]]([COORD(newturf)]))!") + + qdel(src, TRUE) + return + + // To the future coder who sees this and thinks + // "Why didn't he just use a loop?" + // Well my man, it's because the loop performed like shit. + // And there's no way to improve it because + // without a loop you can make the list all at once which is the fastest you're gonna get. + // Oh it's also shorter line wise. + // Including with these comments. + + // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. + var/static/datum/lighting_corner/dummy/dummy_lighting_corner = new + + var/list/corners = myturf.corners + var/datum/lighting_corner/cr = dummy_lighting_corner + var/datum/lighting_corner/cg = dummy_lighting_corner + var/datum/lighting_corner/cb = dummy_lighting_corner + var/datum/lighting_corner/ca = dummy_lighting_corner + if(corners) //done this way for speed + cr = corners[3] || dummy_lighting_corner + cg = corners[2] || dummy_lighting_corner + cb = corners[4] || dummy_lighting_corner + ca = corners[1] || dummy_lighting_corner + + var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) + + var/rr = cr.cache_r + var/rg = cr.cache_g + var/rb = cr.cache_b + + var/gr = cg.cache_r + var/gg = cg.cache_g + var/gb = cg.cache_b + + var/br = cb.cache_r + var/bg = cb.cache_g + var/bb = cb.cache_b + + var/ar = ca.cache_r + var/ag = ca.cache_g + var/ab = ca.cache_b + + #if LIGHTING_SOFT_THRESHOLD != 0 + var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD + #else + // Because of floating pointsâ„¢?, it won't even be a flat 0. + // This number is mostly arbitrary. + var/set_luminosity = max > 1e-6 + #endif + + if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) + //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case + icon_state = "transparent" + color = null + else if(!set_luminosity) + icon_state = "dark" + color = null + else + icon_state = null + color = list( + rr, rg, rb, 00, + gr, gg, gb, 00, + br, bg, bb, 00, + ar, ag, ab, 00, + 00, 00, 00, 01 + ) + + luminosity = set_luminosity + +// Variety of overrides so the overlays don't get affected by weird things. + +/atom/movable/lighting_object/ex_act(severity) + return 0 + +/atom/movable/lighting_object/singularity_act() + return + +/atom/movable/lighting_object/singularity_pull() + return + +/atom/movable/lighting_object/blob_act() + return + +/atom/movable/lighting_object/onTransitZ() + return + +// Override here to prevent things accidentally moving around overlays. +/atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE) + if(harderforce) + . = ..() \ No newline at end of file diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm deleted file mode 100644 index a8f87338ae8..00000000000 --- a/code/modules/lighting/lighting_overlay.dm +++ /dev/null @@ -1,89 +0,0 @@ -/var/total_lighting_overlays = 0 -/atom/movable/lighting_overlay - name = "" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - simulated = 0 - anchored = 1 - icon = LIGHTING_ICON - layer = LIGHTING_LAYER - plane = LIGHTING_PLANE - invisibility = INVISIBILITY_LIGHTING - color = LIGHTING_BASE_MATRIX - icon_state = "light1" - blend_mode = BLEND_MULTIPLY - - var/lum_r = 0 - var/lum_g = 0 - var/lum_b = 0 - - var/needs_update = FALSE - -/atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE) - . = ..() - verbs.Cut() - total_lighting_overlays++ - - var/turf/T = loc //If this runtimes atleast we'll know what's creating overlays outside of turfs. - T.lighting_overlay = src - T.luminosity = 0 - if(no_update) - return - update_overlay() - -/atom/movable/lighting_overlay/proc/update_overlay() - set waitfor = FALSE - var/turf/T = loc - - if(!istype(T)) - if(loc) - log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!") - else - log_debug("A lighting overlay realised it was in nullspace in update_overlay() and got pooled!") - qdel(src) - return - - // To the future coder who sees this and thinks - // "Why didn't he just use a loop?" - // Well my man, it's because the loop performed like shit. - // And there's no way to improve it because - // without a loop you can make the list all at once which is the fastest you're gonna get. - // Oh it's also shorter line wise. - // Including with these comments. - - // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. - // No I seriously cannot think of a more efficient method, fuck off Comic. - var/datum/lighting_corner/cr = T.corners[3] || dummy_lighting_corner - var/datum/lighting_corner/cg = T.corners[2] || dummy_lighting_corner - var/datum/lighting_corner/cb = T.corners[4] || dummy_lighting_corner - var/datum/lighting_corner/ca = T.corners[1] || dummy_lighting_corner - - var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) - - color = list( - cr.cache_r, cr.cache_g, cr.cache_b, 0, - cg.cache_r, cg.cache_g, cg.cache_b, 0, - cb.cache_r, cb.cache_g, cb.cache_b, 0, - ca.cache_r, ca.cache_g, ca.cache_b, 0, - 0, 0, 0, 1 - ) - luminosity = max > LIGHTING_SOFT_THRESHOLD - - - -/atom/movable/lighting_overlay/singularity_act() - return - -/atom/movable/lighting_overlay/singularity_pull() - return - -/atom/movable/lighting_overlay/Destroy() - total_lighting_overlays-- - global.lighting_update_overlays -= src - global.lighting_update_overlays_old -= src - - var/turf/T = loc - if(istype(T)) - T.lighting_overlay = null - T.luminosity = 1 - - return ..() diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 981de658649..ed8b7e71d6c 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,16 +1,12 @@ -/proc/create_all_lighting_overlays() - for(var/zlevel = 1 to world.maxz) - create_lighting_overlays_zlevel(zlevel) - -/proc/create_lighting_overlays_zlevel(var/zlevel) - ASSERT(zlevel) - - for(var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel))) - if(!T.dynamic_lighting) +/proc/create_all_lighting_objects() + for(var/area/A in GLOB.all_areas) + if(!IS_DYNAMIC_LIGHTING(A)) continue - var/area/A = T.loc - if(!A.dynamic_lighting) - continue + for(var/turf/T in A) + if(!IS_DYNAMIC_LIGHTING(T)) + continue - new /atom/movable/lighting_overlay(T, TRUE) + new/atom/movable/lighting_object(T) + CHECK_TICK + CHECK_TICK \ No newline at end of file diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index d878d8c4b6e..207a91d58b4 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -1,12 +1,12 @@ -/var/total_lighting_sources = 0 // This is where the fun begins. // These are the main datums that emit light. /datum/light_source - var/atom/top_atom // The atom we're emitting light from(for example a mob if we're from a flashlight that's being held). + var/atom/top_atom // The atom we're emitting light from (for example a mob if we're from a flashlight that's being held). var/atom/source_atom // The atom that we belong to. var/turf/source_turf // The turf under the above. + var/turf/pixel_turf // The turf the top_atom appears to over. var/light_power // Intensity of the emitter light. var/light_range // The range of the emitted light. var/light_color // The colour of the light, string, decomposed by parse_light_color() @@ -26,133 +26,80 @@ var/applied = FALSE // Whether we have applied our light yet or not. - var/vis_update // Whether we should smartly recalculate visibility. and then only update tiles that became(in)visible to us. - var/needs_update // Whether we are queued for an update. - var/destroyed // Whether we are destroyed and need to stop emitting light. - var/force_update + var/needs_update = LIGHTING_NO_UPDATE // Whether we are queued for an update. + /datum/light_source/New(var/atom/owner, var/atom/top) - total_lighting_sources++ source_atom = owner // Set our new owner. - if(!source_atom.light_sources) - source_atom.light_sources = list() - - source_atom.light_sources += src // Add us to the lights of our owner. + LAZYADD(source_atom.light_sources, src) top_atom = top if(top_atom != source_atom) - if(!top.light_sources) - top.light_sources = list() - - top_atom.light_sources += src + LAZYADD(top_atom.light_sources, src) source_turf = top_atom + pixel_turf = get_turf_pixel(top_atom) || source_turf + light_power = source_atom.light_power light_range = source_atom.light_range light_color = source_atom.light_color parse_light_color() - effect_str = list() - affecting_turfs = list() - update() - return ..() -// Kill ourselves. -/datum/light_source/proc/destroy() - total_lighting_sources-- - destroyed = TRUE - force_update() +/datum/light_source/Destroy(force) + remove_lum() if(source_atom) - if(!source_atom.light_sources) - log_runtime(EXCEPTION("Atom [source_atom] was a light source, but lacked a light source list!\n"), source_atom) - else - source_atom.light_sources -= src + LAZYREMOVE(source_atom.light_sources, src) if(top_atom) - top_atom.light_sources -= src + LAZYREMOVE(top_atom.light_sources, src) + + if(needs_update) + GLOB.lighting_update_lights -= src + + . = ..() + +// Yes this doesn't align correctly on anything other than 4 width tabs. +// If you want it to go switch everybody to elastic tab stops. +// Actually that'd be great if you could! +#define EFFECT_UPDATE(level) \ + if(needs_update == LIGHTING_NO_UPDATE) \ + GLOB.lighting_update_lights += src; \ + if(needs_update < level) \ + needs_update = level; \ -// Call it dirty, I don't care. -// This is here so there's no performance loss on non-instant updates from the fact that the engine can also do instant updates. -// If you're wondering what's with the "BYOND" argument: BYOND won't let me have a() macro that has no arguments :|. -#define effect_update(BYOND) \ - if(!needs_update) \ - { \ - lighting_update_lights += src; \ - needs_update = TRUE; \ - } // This proc will cause the light source to update the top atom, and add itself to the update queue. /datum/light_source/proc/update(var/atom/new_top_atom) // This top atom is different. if(new_top_atom && new_top_atom != top_atom) - if(top_atom != source_atom) // Remove ourselves from the light sources of that top atom. - top_atom.light_sources -= src + if(top_atom != source_atom && top_atom.light_sources) // Remove ourselves from the light sources of that top atom. + LAZYREMOVE(top_atom.light_sources, src) top_atom = new_top_atom if(top_atom != source_atom) - if(!top_atom.light_sources) - top_atom.light_sources = list() + LAZYADD(top_atom.light_sources, src) // Add ourselves to the light sources of our new top atom. - top_atom.light_sources += src // Add ourselves to the light sources of our new top atom. - - effect_update(null) + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) // Will force an update without checking if it's actually needed. /datum/light_source/proc/force_update() - force_update = 1 - - effect_update(null) + EFFECT_UPDATE(LIGHTING_FORCE_UPDATE) // Will cause the light source to recalculate turfs that were removed or added to visibility only. /datum/light_source/proc/vis_update() - vis_update = 1 - - effect_update(null) - -// Will check if we actually need to update, and update any variables that may need to be updated. -/datum/light_source/proc/check() - if(!source_atom || !light_range || !light_power) - destroy() - return 1 - - if(!top_atom) - top_atom = source_atom - . = 1 - - if(isturf(top_atom)) - if(source_turf != top_atom) - source_turf = top_atom - . = 1 - else if(top_atom.loc != source_turf) - source_turf = top_atom.loc - . = 1 - - if(source_atom.light_power != light_power) - light_power = source_atom.light_power - . = 1 - - if(source_atom.light_range != light_range) - light_range = source_atom.light_range - . = 1 - - if(light_range && light_power && !applied) - . = 1 - - if(source_atom.light_color != light_color) - light_color = source_atom.light_color - parse_light_color() - . = 1 + EFFECT_UPDATE(LIGHTING_VIS_UPDATE) // Decompile the hexadecimal colour into lumcounts of each perspective. /datum/light_source/proc/parse_light_color() if(light_color) - lum_r = GetRedPart (light_color) / 255 - lum_g = GetGreenPart(light_color) / 255 - lum_b = GetBluePart (light_color) / 255 + lum_r = GetRedPart (light_color) / 255 + lum_g = GetGreenPart (light_color) / 255 + lum_b = GetBluePart (light_color) / 255 else lum_r = 1 lum_g = 1 @@ -163,128 +110,189 @@ // If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. // As such this all gets counted as a single line. // The braces and semicolons are there to be able to do this on a single line. +#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) -#define APPLY_CORNER(C) \ - . = LUM_FALLOFF(C, source_turf); \ - \ - . *= light_power; \ - \ - effect_str[C] = .; \ - \ - C.update_lumcount \ - ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ +#define APPLY_CORNER(C) \ + . = LUM_FALLOFF(C, pixel_turf); \ + . *= light_power; \ + var/OLD = effect_str[C]; \ + effect_str[C] = .; \ + \ + C.update_lumcount \ + ( \ + (. * lum_r) - (OLD * applied_lum_r), \ + (. * lum_g) - (OLD * applied_lum_g), \ + (. * lum_b) - (OLD * applied_lum_b) \ ); -// I don't need to explain what this does, do I? -#define REMOVE_CORNER(C) \ - . = -effect_str[C]; \ - C.update_lumcount \ - ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ +#define REMOVE_CORNER(C) \ + . = -effect_str[C]; \ + C.update_lumcount \ + ( \ + . * applied_lum_r, \ + . * applied_lum_g, \ + . * applied_lum_b \ ); // This is the define used to calculate falloff. -#define LUM_FALLOFF(C, T)(1 - CLAMP01(sqrt((C.x - T.x) ** 2 +(C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) -/datum/light_source/proc/apply_lum() - var/static/update_gen = 1 - applied = 1 +/datum/light_source/proc/remove_lum() + applied = FALSE + var/thing + for (thing in affecting_turfs) + var/turf/T = thing + LAZYREMOVE(T.affecting_lights, src) + + affecting_turfs = null + + var/datum/lighting_corner/C + for (thing in effect_str) + C = thing + REMOVE_CORNER(C) + + LAZYREMOVE(C.affecting, src) + + effect_str = null + +/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) + LAZYINITLIST(effect_str) + if(effect_str[C]) // Already have one. + REMOVE_CORNER(C) + effect_str[C] = 0 + + APPLY_CORNER(C) + UNSETEMPTY(effect_str) + +/datum/light_source/proc/update_corners() + var/update = FALSE + var/atom/source_atom = src.source_atom + + if(QDELETED(source_atom)) + qdel(src) + return + + if(source_atom.light_power != light_power) + light_power = source_atom.light_power + update = TRUE + + if(source_atom.light_range != light_range) + light_range = source_atom.light_range + update = TRUE + + if(!top_atom) + top_atom = source_atom + update = TRUE + + if(!light_range || !light_power) + qdel(src) + return + + if(isturf(top_atom)) + if(source_turf != top_atom) + source_turf = top_atom + pixel_turf = source_turf + update = TRUE + else if(top_atom.loc != source_turf) + source_turf = top_atom.loc + pixel_turf = get_turf_pixel(top_atom) + update = TRUE + else + var/P = get_turf_pixel(top_atom) + if(P != pixel_turf) + pixel_turf = P + update = TRUE + + if(!isturf(source_turf)) + if(applied) + remove_lum() + return + + if(light_range && light_power && !applied) + update = TRUE + + if(source_atom.light_color != light_color) + light_color = source_atom.light_color + parse_light_color() + update = TRUE + + else if(applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b) + update = TRUE + + if(update) + needs_update = LIGHTING_CHECK_UPDATE + applied = TRUE + else if(needs_update == LIGHTING_CHECK_UPDATE) + return //nothing's changed + + var/list/datum/lighting_corner/corners = list() + var/list/turf/turfs = list() + var/thing + var/datum/lighting_corner/C + var/turf/T + if(source_turf) + var/oldlum = source_turf.luminosity + source_turf.luminosity = CEILING(light_range, 1) + for(T in view(CEILING(light_range, 1), source_turf)) + for (thing in T.get_corners(source_turf)) + C = thing + corners[C] = 0 + turfs += T + source_turf.luminosity = oldlum + + LAZYINITLIST(affecting_turfs) + var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. + affecting_turfs += L + for (thing in L) + T = thing + LAZYADD(T.affecting_lights, src) + + L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. + affecting_turfs -= L + for (thing in L) + T = thing + LAZYREMOVE(T.affecting_lights, src) + + LAZYINITLIST(effect_str) + if(needs_update == LIGHTING_VIS_UPDATE) + for (thing in corners - effect_str) // New corners + C = thing + LAZYADD(C.affecting, src) + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + else + L = corners - effect_str + for (thing in L) // New corners + C = thing + LAZYADD(C.affecting, src) + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + for (thing in corners - L) // Existing corners + C = thing + if(!C.active) + effect_str[C] = 0 + continue + APPLY_CORNER(C) + + L = effect_str - corners + for (thing in L) // Old, now gone, corners. + C = thing + REMOVE_CORNER(C) + LAZYREMOVE(C.affecting, src) + effect_str -= L - // Keep track of the last applied lum values so that the lighting can be reversed applied_lum_r = lum_r applied_lum_g = lum_g applied_lum_b = lum_b - FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING) - if(!T.lighting_corners_initialised) - T.generate_missing_corners() + UNSETEMPTY(effect_str) + UNSETEMPTY(affecting_turfs) - for(var/datum/lighting_corner/C in T.get_corners()) - if(C.update_gen == update_gen) - continue - - C.update_gen = update_gen - C.affecting += src - - if(!C.active) - effect_str[C] = 0 - continue - - APPLY_CORNER(C) - - if(!T.affecting_lights) - T.affecting_lights = list() - - T.affecting_lights += src - affecting_turfs += T - - update_gen++ - -/datum/light_source/proc/remove_lum() - applied = FALSE - - for(var/turf/T in affecting_turfs) - if(!T.affecting_lights) - T.affecting_lights = list() - else - T.affecting_lights -= src - - affecting_turfs.Cut() - - for(var/datum/lighting_corner/C in effect_str) - REMOVE_CORNER(C) - - C.affecting -= src - - effect_str.Cut() - -/datum/light_source/proc/recalc_corner(var/datum/lighting_corner/C) - if(effect_str.Find(C)) // Already have one. - REMOVE_CORNER(C) - - APPLY_CORNER(C) - -/datum/light_source/proc/smart_vis_update() - var/list/datum/lighting_corner/corners = list() - var/list/turf/turfs = list() - FOR_DVIEW(var/turf/T, light_range, source_turf, 0) - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - corners |= T.get_corners() - turfs += T - - var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them. - affecting_turfs += L - for(var/turf/T in L) - if(!T.affecting_lights) - T.affecting_lights = list(src) - else - T.affecting_lights += src - - L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights. - affecting_turfs -= L - for(var/turf/T in L) - T.affecting_lights -= src - - for(var/datum/lighting_corner/C in corners - effect_str) // New corners - C.affecting += src - if(!C.active) - effect_str[C] = 0 - continue - - APPLY_CORNER(C) - - for(var/datum/lighting_corner/C in effect_str - corners) // Old, now gone, corners. - REMOVE_CORNER(C) - C.affecting -= src - effect_str -= C - -#undef effect_update +#undef EFFECT_UPDATE #undef LUM_FALLOFF #undef REMOVE_CORNER -#undef APPLY_CORNER +#undef APPLY_CORNER \ No newline at end of file diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index ddb934aed61..c2198cea650 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -5,98 +5,131 @@ var/tmp/lighting_corners_initialised = FALSE var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. - var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay. + var/tmp/atom/movable/lighting_object/lighting_object // Our lighting object. var/tmp/list/datum/lighting_corner/corners var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. -/turf/New() - . = ..() - - if(opacity) - has_opaque_atom = TRUE - // Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() - for(var/datum/light_source/L in affecting_lights) + var/datum/light_source/L + var/thing + for (thing in affecting_lights) + L = thing L.vis_update() /turf/proc/lighting_clear_overlay() - if(lighting_overlay) - qdel(lighting_overlay) + if(lighting_object) + qdel(lighting_object, TRUE) - for(var/datum/lighting_corner/C in corners) + var/datum/lighting_corner/C + var/thing + for (thing in corners) + if(!thing) + continue + C = thing C.update_active() -// Builds a lighting overlay for us, but only if our area is dynamic. +// Builds a lighting object for us, but only if our area is dynamic. /turf/proc/lighting_build_overlay() - if(lighting_overlay) - return + if(lighting_object) + qdel(lighting_object,force=TRUE) //Shitty fix for lighting objects persisting after death var/area/A = loc - if(A.dynamic_lighting) - if(!lighting_corners_initialised) - generate_missing_corners() + if(!IS_DYNAMIC_LIGHTING(A) && !light_sources) + return - new /atom/movable/lighting_overlay(src) + if(!lighting_corners_initialised) + generate_missing_corners() - for(var/datum/lighting_corner/C in corners) - if(!C.active) // We would activate the corner, calculate the lighting for it. - for(var/L in C.affecting) - var/datum/light_source/S = L - S.recalc_corner(C) + new/atom/movable/lighting_object(src) - C.active = TRUE + var/thing + var/datum/lighting_corner/C + var/datum/light_source/S + for (thing in corners) + if(!thing) + continue + C = thing + if(!C.active) // We would activate the corner, calculate the lighting for it. + for (thing in C.affecting) + S = thing + S.recalc_corner(C) + C.active = TRUE // Used to get a scaled lumcount. /turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1) - if(!lighting_overlay) + if(!lighting_object) return 1 var/totallums = 0 - for(var/datum/lighting_corner/L in corners) - totallums += max(L.lum_r, L.lum_g, L.lum_b) + var/thing + var/datum/lighting_corner/L + for (thing in corners) + if(!thing) + continue + L = thing + totallums += L.lum_r + L.lum_b + L.lum_g - totallums /= 4 // 4 corners, max channel selected, return the average + totallums /= 12 // 4 corners, each with 3 channels, get the average. - totallums =(totallums - minlum) /(maxlum - minlum) + totallums = (totallums - minlum) / (maxlum - minlum) return CLAMP01(totallums) +// Returns a boolean whether the turf is on soft lighting. +// Soft lighting being the threshold at which point the overlay considers +// itself as too dark to allow sight and see_in_dark becomes useful. +// So basically if this returns true the tile is unlit black. +/turf/proc/is_softly_lit() + if(!lighting_object) + return FALSE + + return !lighting_object.luminosity + // Can't think of a good name, this proc will recalculate the has_opaque_atom variable. /turf/proc/recalc_atom_opacity() - has_opaque_atom = FALSE - for(var/atom/A in src.contents + src) // Loop through every movable atom on our tile PLUS ourselves (we matter too...) - if(A.opacity) - has_opaque_atom = TRUE + has_opaque_atom = opacity + if(!has_opaque_atom) + for (var/atom/A in src.contents) // Loop through every movable atom on our tile PLUS ourselves (we matter too...) + if(A.opacity) + has_opaque_atom = TRUE + break -// If an opaque movable atom moves around we need to potentially update visibility. -/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc) - . = ..() - - if(Obj && Obj.opacity) - has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. - reconsider_lights() - -/turf/Exited(var/atom/movable/Obj, var/atom/newloc) +/turf/Exited(atom/movable/Obj, atom/newloc) . = ..() if(Obj && Obj.opacity) recalc_atom_opacity() // Make sure to do this before reconsider_lights(), incase we're on instant updates. reconsider_lights() +/turf/proc/change_area(var/area/old_area, var/area/new_area) + if(SSlighting.initialized) + if(new_area.dynamic_lighting != old_area.dynamic_lighting) + if(new_area.dynamic_lighting) + lighting_build_overlay() + else + lighting_clear_overlay() + /turf/proc/get_corners() + if(!IS_DYNAMIC_LIGHTING(src) && !light_sources) + return null + if(!lighting_corners_initialised) + generate_missing_corners() if(has_opaque_atom) return null // Since this proc gets used in a for loop, null won't be looped though. return corners /turf/proc/generate_missing_corners() + if(!IS_DYNAMIC_LIGHTING(src) && !light_sources) + return lighting_corners_initialised = TRUE if(!corners) corners = list(null, null, null, null) - for(var/i = 1 to 4) + for (var/i = 1 to 4) if(corners[i]) // Already have a corner on this direction. continue - corners[i] = new /datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i]) + corners[i] = new/datum/lighting_corner(src, GLOB.LIGHTING_CORNER_DIAGONAL[i]) + diff --git a/code/modules/lighting/~lighting_undefs.dm b/code/modules/lighting/~lighting_undefs.dm deleted file mode 100644 index 2de3f9dbe26..00000000000 --- a/code/modules/lighting/~lighting_undefs.dm +++ /dev/null @@ -1,7 +0,0 @@ -#undef LIGHTING_FALLOFF -#undef LIGHTING_LAMBERTIAN -#undef LIGHTING_HEIGHT - -#undef LIGHTING_ICON - -#undef LIGHTING_BASE_MATRIX diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index d7c6232121f..5bfd1104fb6 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -38,7 +38,7 @@ /obj/machinery/smartfridge/black_box/process() ..() - if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED) + if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED) WriteMemory() /obj/machinery/smartfridge/black_box/proc/WriteMemory() diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 878a3951202..3c154e351c7 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -184,42 +184,52 @@ generic_pixel_x = 1 vehicle_move_delay = 1 -// Wisp Lantern +//Wisp Lantern /obj/item/wisp_lantern name = "spooky lantern" desc = "This lantern gives off no light, but is home to a friendly wisp." icon = 'icons/obj/lighting.dmi' icon_state = "lantern-blue" + item_state = "lantern" + light_range = 7 var/obj/effect/wisp/wisp + var/sight_flags = SEE_MOBS + var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE /obj/item/wisp_lantern/attack_self(mob/user) if(!wisp) to_chat(user, "The wisp has gone missing!") - return - if(wisp.loc == src) - to_chat(user, "You release the wisp. It begins to bob around your head.") - user.sight |= SEE_MOBS icon_state = "lantern" - wisp.orbit(user, 20, forceMove = TRUE) + return + + if(wisp.loc == src) + RegisterSignal(user, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight) + + to_chat(user, "You release the wisp. It begins to bob around your head.") + icon_state = "lantern" + wisp.orbit(user, 20) + set_light(0) + + user.update_sight() + to_chat(user, "The wisp enhances your vision.") + feedback_add_details("wisp_lantern","F") // freed - else + UnregisterSignal(user, COMSIG_MOB_UPDATE_SIGHT) + to_chat(user, "You return the wisp to the lantern.") - - if(wisp.orbiting) - var/atom/A = wisp.orbiting - if(isliving(A)) - var/mob/living/M = A - M.sight &= ~SEE_MOBS - to_chat(M, "Your vision returns to normal.") - wisp.stop_orbit() - wisp.loc = src + wisp.forceMove(src) + set_light(initial(light_range)) + + user.update_sight() + to_chat(user, "Your vision returns to normal.") + icon_state = "lantern-blue" feedback_add_details("wisp_lantern","R") // returned -/obj/item/wisp_lantern/New() - ..() +/obj/item/wisp_lantern/Initialize(mapload) + . = ..() wisp = new(src) /obj/item/wisp_lantern/Destroy() @@ -230,17 +240,20 @@ wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes.") return ..() +/obj/item/wisp_lantern/proc/update_user_sight(mob/user) + user.sight |= sight_flags + if(!isnull(lighting_alpha)) + user.lighting_alpha = min(user.lighting_alpha, lighting_alpha) + /obj/effect/wisp name = "friendly wisp" desc = "Happy to light your way." icon = 'icons/obj/lighting.dmi' icon_state = "orb" - layer = ABOVE_ALL_MOB_LAYER - light_power = 1 light_range = 7 + layer = ABOVE_ALL_MOB_LAYER //Red/Blue Cubes - /obj/item/warp_cube name = "blue cube" desc = "A mysterious blue cube." diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c3c276a5766..e21a3ab2db6 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -273,8 +273,9 @@ /area/survivalpod name = "\improper Emergency Shelter" icon_state = "away" - requires_power = 0 - has_gravity = 1 + requires_power = FALSE + has_gravity = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /obj/item/survivalcapsule name = "bluespace shelter capsule" diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cf8b897104c..4f0196473c7 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -69,7 +69,7 @@ visible_message("[src] crackles and buzzes violently!") /mob/living/simple_animal/hostile/mining_drone/sentience_act() - AIStatus = AI_OFF + ..() check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) @@ -184,28 +184,6 @@ mode = MINEDRONE_COLLECT SetCollectBehavior() - -/mob/living/simple_animal/hostile/mining_drone/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - if(mesons_active) - sight |= SEE_TURFS - see_invisible = SEE_INVISIBLE_MINIMUM - else - sight &= ~SEE_TURFS - see_invisible = SEE_INVISIBLE_LIVING - - see_in_dark = initial(see_in_dark) - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - //Actions for sentient minebots /datum/action/innate/minedrone @@ -232,10 +210,16 @@ /datum/action/innate/minedrone/toggle_meson_vision/Activate() var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.mesons_active = !user.mesons_active - user.update_sight() + if(user.sight & SEE_TURFS) + user.sight &= ~SEE_TURFS + user.lighting_alpha = initial(user.lighting_alpha) + else + user.sight |= SEE_TURFS + user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - to_chat(user, "You toggle your meson vision [(user.mesons_active) ? "on" : "off"].") + user.sync_lighting_plane_alpha() + + to_chat(user, "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].") /datum/action/innate/minedrone/toggle_mode name = "Toggle Mode" diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 0edb81c8321..43bc1b57226 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -83,6 +83,9 @@ obj/structure/ore_box/ex_act(severity, target) O.forceMove(loc) CHECK_TICK +/obj/structure/ore_box/onTransitZ() + return + /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" set category = "Object" diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index bfeecdef055..df6fd57423d 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -7,7 +7,7 @@ move_resist = INFINITY status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT - see_in_dark = 7 + see_in_dark = 8 invisibility = 101 // No one can see us sight = SEE_SELF move_on_shuttle = 0 diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 922f3181c27..f34aa75cd5e 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -1,23 +1,4 @@ /mob/dead/forceMove(atom/destination) - // Overriden from code/game/atoms_movable.dm#141 to prevent things like mice squeaking when ghosts walk on them. - // Same as parent, except that it does not include Uncrossed or Crossed calls. - var/turf/old_loc = loc + var/oldloc = loc loc = destination - - if(old_loc) - old_loc.Exited(src, destination) - - if(destination) - destination.Entered(src) - - if(isturf(destination) && opacity) - var/turf/new_loc = destination - new_loc.reconsider_lights() - - if(isturf(old_loc) && opacity) - old_loc.reconsider_lights() - - for(var/datum/light_source/L in light_sources) - L.source_atom.update_light() - - return 1 + Moved(oldloc, NONE, TRUE) \ No newline at end of file diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index aa72e364aa0..93094d5ff30 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -1,6 +1,6 @@ /mob/dead/observer/Logout() if(client) - client.images -= ghost_darkness_images + client.images -= ghost_images ..() spawn(0) if(src && !key) //we've transferred to another mob. This ghost should be deleted. diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 84b2031aa55..3f30580f5c0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,7 +1,7 @@ #define GHOST_CAN_REENTER 1 #define GHOST_IS_OBSERVER 2 -var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness +var/list/image/ghost_images = list() GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) @@ -10,7 +10,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = 4 + layer = GHOST_LAYER stat = DEAD density = 0 canmove = 0 @@ -74,7 +74,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) ghostimage.appearance_flags |= KEEP_TOGETHER ghostimage.alpha = alpha appearance_flags |= KEEP_TOGETHER - ghost_darkness_images |= ghostimage + ghost_images |= ghostimage updateallghostimages() if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position forceMove(T) @@ -90,7 +90,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) M.following_mobs -= src following = null if(ghostimage) - ghost_darkness_images -= ghostimage + ghost_images -= ghostimage QDEL_NULL(ghostimage) updateallghostimages() return ..() @@ -231,31 +231,31 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp P.despawn_occupant() return +// Ghosts have no momentum, being massless ectoplasm +/mob/dead/observer/Process_Spacemove(movement_dir) + return 1 + /mob/dead/observer/Move(NewLoc, direct) following = null - dir = direct - ghostimage.dir = dir + setDir(direct) + ghostimage.setDir(dir) + + var/oldloc = loc + if(NewLoc) forceMove(NewLoc) - return - forceMove(get_turf(src)) //Get out of closets and such as a ghost - if((direct & NORTH) && y < world.maxy) - y++ - else if((direct & SOUTH) && y > 1) - y-- - if((direct & EAST) && x < world.maxx) - x++ - else if((direct & WEST) && x > 1) - x-- + else + forceMove(get_turf(src)) //Get out of closets and such as a ghost + if((direct & NORTH) && y < world.maxy) + y++ + else if((direct & SOUTH) && y > 1) + y-- + if((direct & EAST) && x < world.maxx) + x++ + else if((direct & WEST) && x > 1) + x-- - for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb - S.Crossed(src) - - var/area/A = get_area(src) - if(A) - A.Entered(src) - - ..() + Moved(oldloc, direct) /mob/dead/observer/can_use_hands() return 0 @@ -404,7 +404,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A = input("Area to jump to", "BOOYEA") as null|anything in ghostteleportlocs var/area/thearea = ghostteleportlocs[A] - + if(!thearea) return @@ -681,14 +681,32 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" set category = "Ghost" ghostvision = !(ghostvision) - updateghostsight() + update_sight() to_chat(usr, "You [(ghostvision?"now":"no longer")] have ghost vision.") /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" set category = "Ghost" - seedarkness = !(seedarkness) - updateghostsight() + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + + update_sight() + +/mob/dead/observer/update_sight() + if (!ghostvision) + see_invisible = SEE_INVISIBLE_LIVING + else + see_invisible = SEE_INVISIBLE_OBSERVER + + updateghostimages() + . = ..() /mob/dead/observer/proc/updateghostsight() if(!seedarkness) @@ -696,7 +714,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else see_invisible = SEE_INVISIBLE_OBSERVER if(!ghostvision) - see_invisible = SEE_INVISIBLE_LIVING; + see_invisible = SEE_INVISIBLE_LIVING + updateghostimages() /proc/updateallghostimages() @@ -706,11 +725,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/updateghostimages() if(!client) return - if(seedarkness || !ghostvision) - client.images -= ghost_darkness_images + if(!ghostvision) + client.images -= ghost_images else //add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now - client.images |= ghost_darkness_images + client.images |= ghost_images if(ghostimage) client.images -= ghostimage //remove ourself diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 471f82c1511..d412d604ec2 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -38,8 +38,8 @@ if(!l_hand && has_left_hand()) W.forceMove(src) //TODO: move to equipped? l_hand = W - W.layer = 20 //TODO: move to equipped? - W.plane = HUD_PLANE //TODO: move to equipped? + W.layer = ABOVE_HUD_LAYER //TODO: move to equipped? + W.plane = ABOVE_HUD_PLANE //TODO: move to equipped? W.equipped(src,slot_l_hand) if(pulling == W) stop_pulling() @@ -54,8 +54,8 @@ if(!r_hand && has_right_hand()) W.forceMove(src) r_hand = W - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE W.equipped(src,slot_r_hand) if(pulling == W) stop_pulling() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 9c87b04b0e5..ee858138f70 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -5,18 +5,21 @@ icon = 'icons/mob/alien.dmi' gender = NEUTER dna = null - alien_talk_understand = 1 - nightvision = 1 + alien_talk_understand = TRUE + + var/nightvision = FALSE + see_in_dark = 4 + var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie - var/has_fine_manipulation = 0 - var/move_delay_add = 0 // movement delay to add + var/has_fine_manipulation = FALSE + var/move_delay_add = FALSE // movement delay to add status_flags = CANPARALYSE|CANPUSH var/heal_rate = 5 - var/large = 0 + var/large = FALSE var/heat_protection = 0.5 - var/leaping = 0 + var/leaping = FALSE ventcrawler = 2 var/list/alien_organs = list() var/death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -149,15 +152,17 @@ if(!nightvision) see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - nightvision = 1 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + nightvision = TRUE usr.hud_used.nightvisionicon.icon_state = "nightvision1" - else if(nightvision == 1) - see_in_dark = 4 - see_invisible = 45 - nightvision = 0 + else if(nightvision) + see_in_dark = initial(see_in_dark) + lighting_alpha = initial(lighting_alpha) + nightvision = FALSE usr.hud_used.nightvisionicon.icon_state = "nightvision0" + update_sight() + /mob/living/carbon/alien/assess_threat(var/mob/living/simple_animal/bot/secbot/judgebot, var/lasercolor) if(judgebot.emagged == 2) @@ -264,3 +269,36 @@ Des: Removes all infected images from the alien. return pick("xltrails_1", "xltrails_2") else return pick("xttrails_1", "xttrails_2") + +/mob/living/carbon/alien/update_sight() + if(!client) + return + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + sight = SEE_MOBS + if(nightvision) + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + else + see_in_dark = initial(see_in_dark) + lighting_alpha = initial(lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) + sight |= E.vision_flags + if(E.see_in_dark) + see_in_dark = max(see_in_dark, E.see_in_dark) + if(E.see_invisible) + see_invisible = min(see_invisible, E.see_invisible) + if(!isnull(E.lighting_alpha)) + lighting_alpha = min(lighting_alpha, E.lighting_alpha) + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index ec2d96ed880..5eb8f5766e4 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -6,7 +6,7 @@ As such, they can either help or harm other aliens. Help works like the human he In all, this is a lot like the monkey code. /N */ /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a6454111397..982c606b629 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -159,7 +159,7 @@ Doesn't work on other aliens/AI.*/ for(var/mob/M in src) if(M in stomach_contents) stomach_contents.Remove(M) - M.loc = loc + M.forceMove(loc) //Paralyse(10) src.visible_message("[src] hurls out the contents of [p_their()] stomach!") return diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index f1076721cf1..27837dc7cf5 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -7,8 +7,8 @@ if(stat != CONSCIOUS) return - if(layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 + if(layer != ABOVE_NORMAL_TURF_LAYER) + layer = ABOVE_NORMAL_TURF_LAYER visible_message("[src] scurries to the ground!", "You are now hiding.") else layer = MOB_LAYER diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index d3ecc9e3e1c..a584f66dc97 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -28,33 +28,3 @@ //BREATH TEMPERATURE handle_breath_temperature(breath) - -/mob/living/carbon/alien/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - sight = SEE_MOBS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.dark_view) - see_in_dark = max(see_in_dark, E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 3a752e61619..0addea8d4b6 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -93,8 +93,8 @@ spawn(6) var/mob/living/carbon/alien/larva/new_xeno = new(owner.drop_location()) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind new_xeno.mind.name = new_xeno.name new_xeno.mind.assigned_role = SPECIAL_ROLE_XENOMORPH new_xeno.mind.special_role = SPECIAL_ROLE_XENOMORPH diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 2e4d3e8efd6..6b194315f1d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -44,7 +44,7 @@ visible_message("[user] sticks \a [O] into \the [src].") brainmob = B.brainmob B.brainmob = null - brainmob.loc = src + brainmob.forceMove(src) brainmob.container = src brainmob.stat = CONSCIOUS GLOB.respawnable_list -= brainmob @@ -152,7 +152,7 @@ held_brain.name = "\the [brainmob.name]'s [initial(held_brain.name)]" brainmob.container = null//Reset brainmob mmi var. - brainmob.loc = held_brain//Throw mob into brain. + brainmob.forceMove(held_brain) //Throw mob into brain. GLOB.respawnable_list += brainmob GLOB.living_mob_list -= brainmob//Get outta here held_brain.brainmob = brainmob//Set the brain to use the brainmob diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 0f7d4230587..df0afa62f49 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -67,10 +67,10 @@ /mob/living/carbon/brain/on_forcemove(atom/newloc) if(container) - container.loc = newloc + container.forceMove(newloc) else //something went very wrong. CRASH("Brainmob without container.") - loc = container + forceMove(container) /* This will return true if the brain has a container that leaves it less helpless than a naked brain diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 04f5cd53d00..af1d7680aca 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -48,7 +48,6 @@ H.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [initial(src.name)].") - callHook("debrain", list(brainmob)) /obj/item/organ/internal/brain/examine(mob/user) // -- TLE ..(user) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 77373021727..31788ecc8cf 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -72,7 +72,7 @@ if(prob(src.getBruteLoss() - 50)) for(var/atom/movable/A in stomach_contents) - A.loc = loc + A.forceMove(drop_location()) stomach_contents.Remove(A) src.gib() @@ -323,8 +323,8 @@ return var/extra_darkview = 0 - if(E.dark_view) - extra_darkview = max(E.dark_view - 2, 0) + if(E.see_in_dark) + extra_darkview = max(E.see_in_dark - 2, 0) extra_damage = extra_darkview var/light_amount = 10 // assume full brightness @@ -833,7 +833,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "You successfully remove [I].") if(I == handcuffed) - handcuffed.loc = loc + handcuffed.forceMove(drop_location()) handcuffed.dropped(src) handcuffed = null if(buckled && buckled.buckle_requires_restraints) @@ -841,7 +841,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_handcuffed() return if(I == legcuffed) - legcuffed.loc = loc + legcuffed.forceMove(drop_location()) legcuffed.dropped() legcuffed = null update_inv_legcuffed() @@ -935,7 +935,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -947,7 +947,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(client) client.screen -= W if(W) - W.loc = loc + W.forceMove(drop_location()) W.dropped(src) if(W) W.layer = initial(W.layer) @@ -1129,4 +1129,39 @@ so that different stomachs can handle things in different ways VB*/ /mob/living/carbon/proc/shock_internal_organs(intensity) for(var/obj/item/organ/O in internal_organs) - O.shock_organ(intensity) \ No newline at end of file + O.shock_organ(intensity) + +/mob/living/carbon/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) + sight |= E.vision_flags + if(E.see_in_dark) + see_in_dark = max(see_in_dark, E.see_in_dark) + if(E.see_invisible) + see_invisible = min(see_invisible, E.see_invisible) + if(!isnull(E.lighting_alpha)) + lighting_alpha = min(lighting_alpha, E.lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + if(XRAY in mutations) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6d245674fd1..64d06dac4db 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -112,7 +112,7 @@ if(H.mind) H.mind.kills += "[key_name(src)]" - if(ticker && ticker.mode) + if(SSticker && SSticker.mode) // log_world("k") sql_report_death(src) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index aa714f0d527..475b7079444 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -30,6 +30,7 @@ msg += "[name]" var/displayed_species = dna.species.name + var/examine_color = dna.species.flesh_color for(var/obj/item/clothing/C in src) //Disguise checks if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back) if(C.species_disguise) @@ -37,11 +38,11 @@ if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //either obscured or on the nospecies list msg += "!\n" //omit the species when examining else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural - msg += ", a slime person!\n" + msg += ", a slime person!\n" else if(displayed_species == "Unathi") //DAMN YOU, VOWELS - msg += ", a unathi!\n" + msg += ", a unathi!\n" else - msg += ", \a [lowertext(displayed_species)]!\n" + msg += ", a [lowertext(displayed_species)]!\n" //uniform if(w_uniform && !skipjumpsuit && !(w_uniform.flags & ABSTRACT)) @@ -315,15 +316,7 @@ msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n" if(get_int_organ(/obj/item/organ/internal/brain)) - if(istype(src, /mob/living/carbon/human/interactive)) - var/mob/living/carbon/human/interactive/auto = src - if(auto.showexaminetext) - msg += "[p_they(TRUE)] [p_are()] appears to be some sort of sick automaton, [p_their()] eyes are glazed over and [p_their()] mouth is slightly agape.\n" - if(auto.debugexamine) - var/dodebug = auto.doing2string(auto.doing) - var/interestdebug = auto.interest2string(auto.interest) - msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n" - else if(dna.species.show_ssd) + if(dna.species.show_ssd) if(!key) msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bd5817e8867..e497fd04814 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -414,8 +414,22 @@ if(has_breathable_mask && istype(belt, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "" - dat += " ↳Pockets:[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" + // Pockets + dat += " ↳Pockets:" + if(l_store && internal && l_store == internal) + dat += "[l_store]" + else if(l_store && !(l_store.flags&ABSTRACT)) + dat += "Left (Full)" + else + dat += "Left (Empty)" + dat += " " + if(r_store && internal && r_store == internal) + dat += "[r_store]" + else if(r_store && !(r_store.flags&ABSTRACT)) + dat += "Right (Full)" + else + dat += "Right (Empty)" + dat += "" dat += " ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]" dat += " ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]" @@ -545,11 +559,14 @@ /mob/living/carbon/human/update_sight() if(!client) return + if(stat == DEAD) grant_death_vision() return dna.species.update_sight(src) + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() //Added a safety check in case you want to shock a human mob directly through electrocute_act. /mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE) @@ -1317,11 +1334,13 @@ var/list/thing_to_check = list(slot_wear_mask, slot_head, slot_shoes, slot_gloves, slot_l_ear, slot_r_ear, slot_glasses, slot_l_hand, slot_r_hand) var/list/kept_items[0] - + var/list/item_flags[0] for(var/thing in thing_to_check) var/obj/item/I = get_item_by_slot(thing) if(I) kept_items[I] = thing + item_flags[I] = I.flags + I.flags = 0 // Temporary set the flags to 0 if(retain_damage) //Create a list of body parts which are damaged by burn or brute and save them to apply after new organs are generated. First we just handle external organs. @@ -1387,8 +1406,9 @@ else dna.species.create_organs(src) - for(var/thing in kept_items) + for(var/obj/item/thing in kept_items) equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0) + thing.flags = item_flags[thing] // Reset the flags to the origional ones //Handle default hair/head accessories for created mobs. var/obj/item/organ/external/head/H = get_organ("head") @@ -1427,11 +1447,7 @@ dna.species.on_species_gain(src) - see_in_dark = dna.species.get_resultant_darksight(src) - if(see_in_dark > 2) - see_invisible = SEE_INVISIBLE_LEVEL_ONE - else - see_invisible = SEE_INVISIBLE_LIVING + update_sight() dna.species.handle_dna(src) //Give them whatever special dna business they got. @@ -1961,7 +1977,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X if(7) // Pride log_game("[src] was influenced by the sin of pride.") O = new /datum/objective/sintouched/pride - ticker.mode.sintouched += src.mind + SSticker.mode.sintouched += src.mind src.mind.objectives += O var/obj_count = 1 to_chat(src, " 0) - considered[tester] += 5 - if(tester.pestlevel > 0) - considered[tester] += 5 - if(tester.nutrilevel < tester.maxnutri) - considered[tester] += 15 - if(tester.waterlevel < tester.maxwater) - considered[tester] += 15 - if(tester.harvest || tester.dead) - considered[tester] += 100 - considered[tester] = max(1, considered[tester] - get_dist(src,tester)) - - var/index = 0 - for(var/A in considered) - ++index - if(considered[A] > considered[HP] || !HP) - HP = considered[index] - - if(HP) - TARGET = HP - if(!Adjacent(HP)) - tryWalk(get_turf(HP)) - else - if(HP.harvest || HP.dead) - HP.attack_hand(src) - else if(!HP.myseed) - var/obj/item/seeds/SEED = new /obj/item/seeds/random(src) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!") - HP.attackby(SEED, src) - else - var/change = 0 - if(HP.weedlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("atrazine", 10)) - internalBeaker.reagents.add_reagent("atrazine", 10) - if(HP.pestlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("diethylamine", 10)) - internalBeaker.reagents.add_reagent("diethylamine", 10) - if(HP.nutrilevel < HP.maxnutri) - change = 1 - if(!internalBeaker.reagents.has_reagent("eznutriment", 15)) - internalBeaker.reagents.add_reagent("eznutriment", 15) - if(!internalBeaker.reagents.has_reagent("diethylamine", 15)) - internalBeaker.reagents.add_reagent("diethylamine", 15) - if(HP.waterlevel < HP.maxwater) - change = 1 - if(!internalBeaker.reagents.has_reagent("holywater", 50)) - internalBeaker.reagents.add_reagent("holywater", 50) - if(change) - HP.attackby(internalBeaker,src) - - var/obj/item/reagent_containers/food/snacks/grown/GF = locate(/obj/item/reagent_containers/food/snacks/grown) in view(12,src) - if(GF) - if(!Adjacent(GF)) - tryWalk(get_turf(GF)) - else - GF.attackby(internalBag,src) - - if(internalBag.contents.len) - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in range(12, src) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], upending the [internalBag]'s contents all over the [SF]!") - //smartfridges call updateUsrDialog when you call attackby, so we're going to have to cheese-magic-space this - for(var/obj/toLoad in internalBag.contents) - if(contents.len >= SF.max_n_of_items) - break - if(SF.accept_check(toLoad)) - SF.load(toLoad, src) - else - qdel(toLoad) // destroy everything we dont need - -/mob/living/carbon/human/interactive/proc/bartend(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/rangeCheck = oview(6,src) - var/obj/structure/table/RT - - var/mob/living/carbon/human/serveTarget - - for(var/mob/living/carbon/human/H in rangeCheck) - if(!locate(/obj/item/reagent_containers/food/drinks) in orange(1, H)) - serveTarget = H - - - if(serveTarget) - RT = locate(/obj/structure/table) in orange(1, serveTarget) - - if(RT && serveTarget) - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - var/drinkChoice = pick(typesof(/obj/item/reagent_containers/food/drinks) - /obj/item/reagent_containers/food/drinks) - if(drinkChoice) - var/obj/item/reagent_containers/food/drinks/D = new drinkChoice(get_turf(src)) - RT.attackby(D,src) - say("[pick("Something to wet your whistle!","Down the hatch, a tasty beverage!","One drink, coming right up!","Tasty liquid for your oral intake!","Enjoy!")]") - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], serving up a [D]!") - -/mob/living/carbon/human/interactive/proc/shitcurity(obj) - var/list/allContents = getAllContents() - - if(retal && TARGET) - if(Adjacent(TARGET)) - var/obj/item/restraints/R = locate() in allContents - if(R) - R.attack(TARGET, src) // go go bluespace restraint launcher! - else if(TARGET in oview(7, src)) - var/obj/item/gun/G = locate() in allContents - if(G) - G.afterattack(TARGET, src) - -/mob/living/carbon/human/interactive/proc/clowning(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - var/list/rangeCheck = oview(12, src) - - var/mob/living/carbon/human/clownTarget - var/list/clownPriority = list() - - var/obj/item/reagent_containers/spray/S - if(!locate(/obj/item/reagent_containers/spray) in allContents) - new/obj/item/reagent_containers/spray(src) - else - S = locate(/obj/item/reagent_containers/spray) in allContents - - for(var/mob/living/carbon/human/C in rangeCheck) - var/pranksNearby = 100 - for(var/turf/simulated/T in orange(1, C)) - for(var/obj/item/A in T) - if(istype(A,/obj/item/soap) || istype(A,/obj/item/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/grown/bananapeel)) - pranksNearby-- - if(T.wet) - pranksNearby -= 10 - clownPriority[C] = pranksNearby - - for(var/A in clownPriority) - if(!clownTarget) - clownTarget = A - else - if(clownPriority[A] > clownPriority[clownTarget]) - clownTarget = clownPriority[A] - - if(clownTarget) - if(!Adjacent(clownTarget)) - tryWalk(clownTarget) - else - var/hasPranked = 0 - for(var/A in allContents) - if(prob(smartness/2) && !hasPranked) - if(istype(A,/obj/item/soap)) - npcDrop(A) - hasPranked = 1 - if(istype(A,/obj/item/reagent_containers/food/snacks/grown/banana)) - var/obj/item/reagent_containers/food/snacks/B = A - B.attack(src, src) - if(istype(A,/obj/item/grown/bananapeel)) - npcDrop(A) - hasPranked = 1 - if(!hasPranked) - if(S.reagents.total_volume <= 5) - S.reagents.add_reagent("water", 25) - S.afterattack(get_turf(pick(orange(1, clownTarget))),src) - - -/mob/living/carbon/human/interactive/proc/healpeople(obj) - var/shouldTryHeal = 0 - var/obj/item/stack/medical/M - - var/list/allContents = getAllContents() - - for(var/A in allContents) - if(istype(A,/obj/item/stack/medical)) - shouldTryHeal = 1 - M = A - - var/obj/item/reagent_containers/hypospray/HPS - - if(!locate(/obj/item/reagent_containers/hypospray) in allContents) - new/obj/item/reagent_containers/hypospray(src) - else - HPS = locate(/obj/item/reagent_containers/hypospray) in allContents - if(!shouldTryHeal) - shouldTryHeal = 2 // we have no stackables to use, lets use our internal hypospray instead - - if(shouldTryHeal == 1) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) //I haven't the foggiest clue why this is turning up non-carbons but sure here whatever - if(C.health <= 75) - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - M.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - else if(shouldTryHeal == 2) - if(HPS) - if(HPS.reagents.total_volume <= 0) - HPS.reagents.add_reagent("omnizine",30) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) - if(C.health <= 75 && C.reagents.get_reagent_amount("omnizine") <= 0) // make sure they wont be overdosing - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - HPS.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - - -/mob/living/carbon/human/interactive/proc/dojanitor(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - //now with bluespace magic! - var/obj/item/reagent_containers/spray/SP = locate() in allContents - if(!SP) - SP = new /obj/item/reagent_containers/spray(src) - var/obj/item/soap/SO = locate() in allContents - if(!SO) - SO = new /obj/item/soap(src) - - if(SP.reagents.total_volume <= 5) - SP.reagents.add_reagent("cleaner", 25) // bluespess water delivery for AI - - var/obj/effect/decal/cleanable/TC - TC = locate(/obj/effect/decal/cleanable) in view(6, src) - - if(TC) - if(!Adjacent(TC)) - tryWalk(TC) - else - var/turf/T = get_turf(TC) - if(T && !T.density) - SP.afterattack(TC, src, 1) - else - SO.afterattack(TC, src, 1) - qdel(TC) - -// START COOKING MODULE -/mob/living/carbon/human/interactive/proc/refundrecipe(list/ingredients) - for(var/obj/I in ingredients) - I.loc = contents - -// Ingredients may be in the rangeCheck or inside the chef's inventory. -// As they are checked off, they are moved to a seperate list as to not be counted twice -// If the recipe fails (eg somebody else took an ingredient before it was picked up) the ingredients are dumped back to inventory -// That way, the chef has a better chance of making a recipe next ptick, if he has more stuff on him -/mob/living/carbon/human/interactive/proc/makerecipe(datum/recipe/R, allContents, rangeCheck) - set background = 1 - - var/list/ingredients[0] - - for(var/P in R.items) - var/obj/item/I = locate(P) in allContents - if(I) - ingredients += I - I.forceMove(null) - continue - - I = locate(P) in rangeCheck - TARGET = I - if(I && !Adjacent(I)) - tryWalk(get_turf(I)) - sleep(get_dist(src, I)) - if(!I || !(I in rangeCheck)) - refundrecipe(ingredients) - return 0 - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].") - ingredients += I - I.forceMove(null) - - // cheaply cook the ingredients into result - sleep(R.time) - for(var/obj/I in ingredients) - qdel(I) - ingredients.Cut() - var/result = new R.result(get_turf(src)) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and, with a bang, \a [result] is cooked!") - return 1 - -/mob/living/carbon/human/interactive/proc/souschef(obj) - if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_HIGH) || prob(SNPC_FUZZY_CHANCE_HIGH)) - return - - if(doing & SNPC_SPECIAL) - return - doing |= SNPC_SPECIAL - - var/static/list/customableTypes = list(/obj/item/reagent_containers/food/snacks/customizable,/obj/item/reagent_containers/food/snacks/breadslice,/obj/item/reagent_containers/food/snacks/bun,/obj/item/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/reagent_containers/food/snacks/boiledspaghetti,/obj/item/trash/plate,/obj/item/trash/bowl) - - var/static/list/rawtypes = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/rawcutlet, /obj/item/reagent_containers/food/snacks/rawsticks, /obj/item/reagent_containers/food/snacks/salmonmeat, /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/catfishmeat, /obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/meat, /obj/item/reagent_containers/food/snacks/boiledrice, /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/raw_bacon) - - try - var/list/allContents = getAllContents() - var/list/rangeCheck = view(6, src) - - //Bluespace in some inbuilt tools - var/obj/item/kitchen/rollingpin/RP = locate() in allContents - if(!RP) - RP = new /obj/item/kitchen/rollingpin(src) - - var/obj/item/kitchen/knife/KK = locate() in allContents - if(!KK) - KK = new /obj/item/kitchen/knife(src) - - var/global/list/available_recipes - if(!available_recipes) - available_recipes = list() - for(var/type in subtypesof(/datum/recipe)) - var/datum/recipe/recipe = new type - if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe - else - qdel(recipe) - - var/foundCookable = 0 - - //Make some basic custom food - var/foundCustom - for(var/customType in customableTypes) - var/A = locate(customType) in rangeCheck - var/obj/item/reagent_containers/food/snacks/customizable/I = A - if(A && (!istype(I) || I.ingredients.len <= 3)) - foundCustom = A // this will eventually wittle down to 0 - break - - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in rangeCheck - if(SF) - if(SF.contents.len > 0) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in its mouth!") - for(var/obj/item/A in SF.contents) - if(prob(smartness/2)) - var/count = SF.item_quants[A.name] - if(count) - SF.item_quants[A.name] = count - 1 - A.forceMove(src) - - if(foundCustom) - var/obj/item/reagent_containers/food/snacks/FC = foundCustom - for(var/obj/item/reagent_containers/food/snacks/toMake in allContents) - if(prob(smartness)) - if(FC.reagents) - if(toMake.reagents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toMake, type)) - raw = 1 - break - if(!raw) - npcDrop(toMake) - FC.attackby(toMake, src) - allContents -= toMake - break - else - qdel(FC) // this food is usless, toss it - - // Process tool-based ingredients - var/obj/item/reagent_containers/food/snacks/dough/D = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/flatdough/FD = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/rawcutlet/RC = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/CW = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/grown/potato/PO = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/meat/ME = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/raw_bacon/RB = locate() in rangeCheck - - if(D) - TARGET = D - if(prob(50)) - tryWalk(get_turf(D)) - sleep(get_dist(src, D)) - D.attackby(RP, src) - foundCookable = 1 - else if(FD) - TARGET = FD - if(prob(50)) - tryWalk(get_turf(FD)) - sleep(get_dist(src, FD)) - FD.attackby(KK, src) - foundCookable = 1 - else if(RC) - TARGET = RC - if(prob(50)) - tryWalk(get_turf(RC)) - sleep(get_dist(src, RC)) - RC.attackby(KK, src) - foundCookable = 1 - else if(CW) - TARGET = CW - if(prob(50)) - tryWalk(get_turf(CW)) - sleep(get_dist(src, CW)) - CW.attackby(KK, src) - foundCookable = 1 - else if(PO) - TARGET = PO - if(prob(50)) - tryWalk(get_turf(PO)) - sleep(get_dist(src, PO)) - PO.attackby(KK, src) - foundCookable = 1 - else if(ME) - TARGET = ME - if(prob(50)) - tryWalk(get_turf(ME)) - sleep(get_dist(src, ME)) - ME.attackby(KK, src) - foundCookable = 1 - else if(RB) - TARGET = RB - if(prob(50)) - tryWalk(get_turf(RB)) - sleep(get_dist(src, RB)) - RB.attackby(KK, src) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // Find most complex recipe we can cook - var/ingredientZone = rangeCheck + allContents - var/highest_count = 0 - var/datum/recipe/winner = null - for(var/datum/recipe/R in available_recipes) - if(R.check_items(ingredientZone) >= 0) - var/count = (R.items ? R.items.len : 0) - if(count > highest_count) - highest_count = count - winner = R - - // make winner - if(winner) - if(makerecipe(winner, allContents, rangeCheck)) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // dont display our ingredients - var/list/finishedList = list() - for(var/obj/item/reagent_containers/food/snacks/toDisplay in allContents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toDisplay, type)) - raw = 1 - break - if(!raw) - finishedList += toDisplay - - for(var/obj/item/reagent_containers/food/snacks/toGrab in rangeCheck) - if(!(locate(/obj/structure/table/reinforced) in get_turf(toGrab))) //it's not being displayed - var/raw = 0 - for(var/type in rawtypes) - if(istype(toGrab, type)) - raw = 1 - break - if(!raw) - foundCookable = 1 - if(!Adjacent(toGrab)) - tryWalk(toGrab) - else - finishedList += toGrab - toGrab.forceMove(src) - - if(finishedList.len) - var/obj/structure/table/reinforced/RT - - for(var/obj/structure/table/reinforced/toCheck in rangeCheck) - var/counted = 0 - for(var/obj/item/reagent_containers/food/snacks/S in get_turf(toCheck)) - ++counted - if(counted < 12) // make sure theres not too much food here - RT = toCheck - break - - if(RT) - foundCookable = 1 - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - for(var/obj/item/reagent_containers/food/snacks/toPlop in finishedList) - RT.attackby(toPlop,src) - - if(!foundCookable) - var/chosenType = pick(rawtypes) - - var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) - TARGET = newSnack - newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "synthetic [newSnack.name]" - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") - catch(var/exception/e) - log_runtime(e, src, "Caught in SNPC cooking module") - doing &= ~SNPC_SPECIAL -// END COOKING MODULE - -/mob/living/carbon/human/interactive/proc/combat(obj) - set background = 1 - enforce_hands() - if(canmove) - if((graytide || (TRAITS & TRAIT_MEAN)) || retal) - interest += targetInterestShift - a_intent = INTENT_HARM - zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head") - doing |= SNPC_FIGHTING - if(retal) - TARGET = retal_target - else - var/mob/living/M = locate(/mob/living) in oview(7, src) - if(!M) - doing = doing & ~SNPC_FIGHTING - else if(M != src && !compareFaction(M.faction)) - TARGET = M - - //no infighting - if(retal) - if(retal_target) - if(compareFaction(retal_target.faction)) - retal = 0 - retal_target = null - TARGET = null - doing = 0 - - //ensure we're using the best object possible - - var/obj/item/best - var/foundFav = 0 - var/list/allContents = getAllContents() - for(var/test in allContents) - for(var/a in favoured_types) - if(ispath(test,a) && !(doing & SNPC_FIGHTING)) // if we're not in combat and we find our favourite things, use them (for people like janitor and doctors) - best = test - foundFav = 1 - return - if(!foundFav) - if(istype(test,/obj/item)) - var/obj/item/R = test - if(R.force > 2) // make sure we don't equip any non-weaponlike items, ie bags and stuff - if(!best) - best = R - else - if(best.force < R.force) - best = R - if(istype(R, /obj/item/gun)) - var/obj/item/gun/G = R - if(G.can_shoot()) - best = R - break // gun with ammo? screw the rest - if(best && best != main_hand) - take_to_slot(best,1) - - if(TARGET && (doing & SNPC_FIGHTING)) // this is a redundancy check - var/mob/living/M = TARGET - if(istype(M,/mob/living)) - if(M.health > 1 && (M in oview(src, 6))) - //THROWING OBJECTS - for(var/A in allContents) - if(istype(A,/obj/item/gun)) // guns are for shooting, not throwing. - continue - if(prob(robustness)) - if(istype(A,/obj/item)) - var/obj/item/W = A - if(W.throwforce > 19) // Only throw worthwile stuff, no more lobbing wrenches at wenches - npcDrop(W, 1) - throw_item(TARGET) - if(istype(A,/obj/item/grenade)) // Allahu ackbar! ALLAHU ACKBARR!! - var/obj/item/grenade/G = A - G.attack_self(src) - if(prob(smartness)) - npcDrop(G, 1) - sleep(15) - throw_item(TARGET) - - if(!main_hand && other_hand) - swap_hands() - if(main_hand) - if(main_hand.force != 0) - if(istype(main_hand,/obj/item/gun)) - var/obj/item/gun/G = main_hand - if(G.can_trigger_gun(src)) - var/shouldFire = 1 - if(istype(main_hand, /obj/item/gun/energy)) - var/obj/item/gun/energy/P = main_hand - var/stunning = 0 - for(var/A in P.ammo_type) - if(ispath(A,/obj/item/ammo_casing/energy/electrode)) - stunning = 1 - var/mob/stunCheck = TARGET - if(stunning && stunCheck.stunned) - shouldFire = 0 - if(shouldFire) - if(!G.can_shoot()) - G.shoot_with_empty_chamber(src) - npcDrop(G, 1) - else - G.process_fire(TARGET, src) - else - if(get_dist(src,TARGET) > 6) - if(!walk2derpless(TARGET)) - timeout++ - else - var/obj/item/W = main_hand - W.attack(TARGET, src) - else - npcDrop(G, 1) - else - if(targetRange(TARGET) > 2) - tryWalk(TARGET) - else - if(Adjacent(TARGET)) - a_intent = pick(INTENT_DISARM, INTENT_HARM) - M.attack_hand(src) - timeout++ - else if(timeout >= 10 || !(targetRange(M) > 14)) - doing = doing & ~SNPC_FIGHTING - timeout = 0 - TARGET = null - retal = 0 - retal_target = null - else - timeout++ - -/mob/living/carbon/human/interactive/proc/past_verb(word) - if(copytext(word, length(word)) == "e") - return "[word]d" - else - return "[word]ed" - -/mob/living/carbon/human/interactive/proc/ing_verb(word) - if(copytext(word, length(word)) == "e") - return "[copytext(word, 1, length(word))]ing" - else - return "[word]ing" - -/mob/living/carbon/human/interactive/proc/paperwork_sentence() - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - var/result = pick("fired", "promoted", "demoted", "terminated", "incinerated", "sent to CentCom", "borged") - - return pick( - "The [adjective_insult] [pick(command_positions)] [past_verb(verbs_touch)] the [adjective_objects] [nouns_objects] and was [result].", - "The [adjective_generic] [pick(engineering_positions)] [past_verb(verbs_touch)] the [adjective_insult] [nouns_objects]. [capitalize(curse_words)], the [nouns_insult] was [result].", - "The [adjective_insult] [pick(security_positions)] [past_verb(verbs_touch)] the [adjective_generic] [nouns_insult] [pick(support_positions)]'s [nouns_body] and had to be [result].", - "Medical had to [verbs_use] the [adjective_generic] [pick(command_positions)]'s [adjective_objects] [nouns_body] after the incident.", - "I demand that [nouns_generic] respond with a [adjective_generic] update ASAP.", - "Would like an update from [nouns_generic] regarding the [adjective_insult] [pick(command_positions)] being [result].", - "The [pick(medical_positions)] needs to [verbs_move] faster when the crew's [adjective_objects] [nouns_body]s are injured, or they will be [result].", - "[capitalize(curse_words)] [adjective_insult] [curse_words].", - "

") - -/mob/living/carbon/human/interactive/proc/pickStamp(allContents) - var/list/stamps[0] - for(var/obj/item/stamp/S in allContents) - stamps += S - if(stamps.len) - return pick(stamps) - - // just make one, maybe - if(prob(SNPC_FUZZY_CHANCE_LOW / 2)) - for(var/p in favoured_types) - if(ispath(p, /obj/item/stamp)) - return new p(src) - return null - -/mob/living/carbon/human/interactive/proc/paperwork(obj) - set background = 1 - - if(shouldModulePass() || !prob(SNPC_FUZZY_CHANCE_LOW / 4)) - return - - var/list/allContents = getAllContents() - - var/obj/item/paper/P = locate() in allContents - var/obj/item/stamp/S = pickStamp(allContents) - var/mob/living/carbon/human/H = locate() in nearby - - if(!P) - P = new /obj/item/paper(src) - - if(P && S && H) - if(!P.stamped || !P.stamped.len) - // generate form - P.name = pick("Inspection Report", "Re: Crew", "Complaint", "To: CentCom") - P.info = {"

[paperwork_sentence()]
"} - for(var/I in 1 to rand(10, 20)) - P.info += "[paperwork_sentence()] " - P.info += {"

[pick("Signed", "Sincerely", "Regards")], [real_name]"} - P.update_icon() - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and throws [P] on the ground!") - npcDrop(P) - P.throw_at(H, P.throw_range, P.throw_speed, src) - -/mob/living/carbon/human/interactive/proc/stamping(obj) - if(shouldModulePass()) - return - - var/list/allContents = getAllContents() - var/list/rangeCheck = view(7, src) - - var/obj/item/stamp/S = pickStamp(allContents) - if(!S) - return - - // stamp a paper we're holding, and drop it - var/obj/item/paper/P = locate() in allContents - if(P) - if(!P.stamped || !P.stamped.len) - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [P] with \a [S]!") - npcDrop(P, 1) - return - - // stamp a paper in the world - for(var/obj/item/paper/A in rangeCheck) - if(!A.stamped || !A.stamped.len) - if(!Adjacent(A)) - tryWalk(A) - else - A.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!") - return diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm deleted file mode 100644 index 69dfa740b09..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ /dev/null @@ -1,960 +0,0 @@ -/* - NPC VAR EXPLANATIONS (for modules and other things) - - doing = their current action, SNPC_INTERACTING, SNPC_TRAVEL or SNPC_FIGHTING - interest = how interested the NPC is in the situation, if they are idle, this drops - timeout = this is internal - TARGET = their current target - LAST_TARGET = their last target - nearby = a list of nearby mobs - best_force = the highest force object, used for checking when to swap items - retal = this is internal - retal_target = this is internal - update_hands = this is a bool (1/0) to determine if the NPC should update what is in his hands - - MYID = their ID card - MYPDA = their PDA - main_hand = what is in their "main" hand (chosen from left > right) - TRAITS = the traits assigned to this npc - mymjob = the job assigned to the npc - - robustness = the chance for the npc to hit something - smartness = the inverse chance for an npc to do stupid things - attitude = the chance for an npc to do rude or mean things - slyness = the chance for an npc to do naughty things ie thieving - - functions = the list of procs that the npc will use for modules - - graytide = shitmin var to make them go psycho -*/ -/mob/living/carbon/human/interactive - name = "interactive station member" - var/doing = 0 - var/interest = 10 - var/maxInterest = 10 - var/timeout = 0 - var/inactivity_period = 0 - var/atom/TARGET = null - var/atom/LAST_TARGET = null - var/list/nearby = list() - var/best_force = 0 - var/retal = 0 - var/mob/retal_target = null - var/update_hands = 0 - var/list/blacklistItems = list() // items we should be ignoring - var/maxStepsTick = 6 // step as many times as we can per frame - //Job and mind data - var/obj/item/card/id/MYID - var/obj/item/card/id/RPID // the "real" idea they use - var/obj/item/pda/MYPDA - var/obj/item/main_hand - var/obj/item/other_hand - var/TRAITS = 0 - var/obj/item/card/id/Path_ID - var/default_job = /datum/job/civilian // the type for the default job - var/datum/job/myjob - var/list/myPath = list() - faction = list("synth") - //trait vars - var/robustness = 50 - var/smartness = 50 - var/attitude = 50 - var/slyness = 50 - var/graytide = 0 - var/list/favoured_types = list() // allow a mob to favour a type, and hold onto them - var/chattyness = SNPC_CHANCE_TALK - var/targetInterestShift = 5 // how much a good action should "reward" the npc - //modules - var/list/functions = list("nearbyscan","combat","shitcurity","chatter") - var/restrictedJob = 0 - var/forceProcess = 0 - var/speak_file = "npc_chatter.json" - var/debugexamine = FALSE //If we show debug info in our examine - var/showexaminetext = TRUE //If we show our telltale examine text - - var/voice_saved = FALSE - - var/list/knownStrings = list() - - //snpc traitor variables - - var/isTraitor = 0 - var/traitorTarget - var/traitorScale = 0 // our ability as a traitor - var/traitorType = 0 - - -/// SNPC voice handling - -/mob/living/carbon/human/interactive/proc/loadVoice() - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] >> knownStrings - - if(isnull(knownStrings)) - knownStrings = list() - -/mob/living/carbon/human/interactive/proc/saveVoice() - if(voice_saved) - return - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings - -//botPool funcs -/mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) - change_eye_color(255, 0, 0) - if(from == src) - return FALSE - TARGET = from.TARGET - LAST_TARGET = from.LAST_TARGET - retal = from.retal - retal_target = from.retal_target - doing = from.doing - // - timeout = 0 - inactivity_period = 0 - interest = maxInterest - // - update_icons() - if(doReset) - from.TARGET = null - from.LAST_TARGET = null - from.retal = 0 - from.retal_target = null - from.doing = 0 - return TRUE - -//end pool funcs - -/mob/living/carbon/human/interactive/proc/random() - //this is here because this has no client/prefs/brain whatever. - age = rand(AGE_MIN, AGE_MAX) - change_gender(pick("male", "female")) - rename_character(real_name, dna.species.get_random_name(gender)) - //job handling - myjob = new default_job() - job = myjob.title - mind.assigned_role = job - myjob.equip(src) - -/mob/living/carbon/human/interactive/proc/reset() - walk(src, 0) - timeout = 100 - retal = 0 - doing = 0 - inactivity_period = 0 - -/client/proc/resetSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Reset SNPC" - set desc = "Reset the SNPC" - set category = "Debug" - - if(!holder) - return - - if(istype(T)) - T.reset() - -/client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Customize SNPC" - set desc = "Customize the SNPC" - set category = "Debug" - - if(!holder) - return - - if(!istype(T)) - return - - var/list/jobs[0] - for(var/datum/job/j in SSjobs.occupations) - if(j.title != "AI" && j.title != "Cyborg") - jobs[j.title] = j - jobs = sortAssoc(jobs) - var/job_name = input("Choose Job") as null|anything in jobs - - if(job_name) - var/datum/job/cjob = jobs[job_name] - var/alt_title = input("Choose Alt Title") in (list(job_name) + cjob.alt_titles) - - T.myjob = cjob - T.job = cjob.title - T.mind.assigned_role = cjob.title - for(var/obj/item/I in T) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - T.myjob.equip(T) - T.doSetup(alt_title) - - var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No") - if(shouldDoppel == "Yes") - var/list/validchoices = list() - for(var/mob/living/carbon/human/M in GLOB.mob_list) - validchoices += M - - var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices - - if(chosen) - var/datum/dna/toDoppel = chosen.dna - - T.real_name = toDoppel.real_name - T.set_species(chosen.dna.species.type) - T.dna = toDoppel.Clone() - T.body_accessory = chosen.body_accessory - T.UpdateAppearance() - domutcheck(T) - - var/doTrait = input("Do you want the SNPC to be a traitor?") as anything in list("Yes", "No") - if(doTrait == "Yes") - var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) - var/cType = input("Choose the traitor personality.") as null|anything in tType - if(cType) - var/value = tType[cType] - T.makeTraitor(value) - - var/doTele = input("Place the SNPC in their department?") as anything in list("Yes", "No") - if(doTele == "Yes") - T.loc = pick(get_area_turfs(T.job2area(T.myjob))) - - T.revive() - -/mob/living/carbon/human/interactive/proc/doSetup(alt_title = null) - Path_ID = new /obj/item/card/id(src) - - var/datum/job/captain/C = new/datum/job/captain - Path_ID.access = C.get_access() - - if(!alt_title) - alt_title = job - - MYID = new(src) - MYID.name = "[real_name]'s ID Card ([alt_title])" - MYID.assignment = "[alt_title]" - MYID.rank = job - MYID.sex = capitalize(gender) - MYID.age = age - MYID.registered_name = real_name - MYID.photo = get_id_photo(src) - MYID.access = Path_ID.access.Copy() // Automatons have strange powers... strange indeed - - RPID = new(src) - RPID.name = "[real_name]'s ID Card ([alt_title])" - RPID.assignment = "[alt_title]" - RPID.rank = job - RPID.sex = capitalize(gender) - RPID.age = age - RPID.registered_name = real_name - RPID.photo = get_id_photo(src) - RPID.access = myjob.get_access() - - if(wear_id) - qdel(wear_id) - if(!equip_to_slot_or_del(MYID, slot_wear_id)) - create_attack_log("Deleted ID due to slot contention") - if(wear_pda) - MYPDA = wear_pda - else - MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_wear_pda) - MYPDA.owner = real_name - MYPDA.ownjob = alt_title - MYPDA.ownrank = job - MYPDA.name = "PDA-[real_name] ([alt_title])" - zone_sel.selecting = "chest" - //arms - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] - if(L) - L.robotize(make_tough = 1) - //legs - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] - if(L) - L.robotize(make_tough = 1) - UpdateDamageIcon() - regenerate_icons() - - hand = 0 - functions = list("nearbyscan", "combat", "shitcurity", "chatter") // stop customize adding multiple copies of a function - setup_job(job) - - if(TRAITS & TRAIT_ROBUST) - robustness = 75 - else if(TRAITS & TRAIT_UNROBUST) - robustness = 25 - - //modifiers are prob chances, lower = smarter - if(TRAITS & TRAIT_SMART) - smartness = 75 - else if(TRAITS & TRAIT_DUMB) - disabilities |= CLUMSY - smartness = 25 - - if(TRAITS & TRAIT_MEAN) - attitude = 75 - else if(TRAITS & TRAIT_FRIENDLY) - attitude = 1 - - if(TRAITS & TRAIT_THIEVING) - slyness = 75 - -/mob/living/carbon/human/interactive/proc/InteractiveProcess() - if(ticker.current_state == GAME_STATE_FINISHED) - saveVoice() - voice_saved = TRUE - doProcess() - -/mob/living/carbon/human/interactive/proc/setup_job(thejob) - switch(thejob) - if("Civilian") - favoured_types = list(/obj/item/clothing, /obj/item) - if("Captain", "Head of Personnel") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/captain,/obj/item/disk/nuclear) - if("Nanotrasen Representative") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/centcom, /obj/item/paper, /obj/item/melee/classic_baton/ntcane) - functions += "paperwork" - if("Magistrate", "Internal Affairs Agent") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/law, /obj/item/paper) - functions += "paperwork" - if("Quartermaster", "Cargo Technician") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/paper, /obj/item/clipboard) - functions += "stamping" - if("Chef") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "souschef" - restrictedJob = 1 - if("Bartender") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "bartend" - restrictedJob = 1 - if("Station Engineer", "Chief Engineer", "Life Support Specialist", "Mechanic") - favoured_types = list(/obj/item/stack, /obj/item, /obj/item/clothing) - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Geneticist", "Psychiatrist", "Paramedic", "Brig Physician") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/storage/firstaid, /obj/item/stack/medical, /obj/item/reagent_containers/syringe) - functions += "healpeople" - if("Research Director", "Scientist", "Roboticist") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/stack, /obj/item/reagent_containers) - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Blueshield") - favoured_types = list(/obj/item/clothing, /obj/item, /obj/item/restraints) - if("Janitor") - favoured_types = list(/obj/item/mop, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable) - functions += "dojanitor" - if("Clown") - favoured_types = list(/obj/item/soap, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/item/grown/bananapeel) - functions += "clowning" - if("Botanist") - favoured_types = list(/obj/machinery/hydroponics, /obj/item/reagent_containers, /obj/item) - functions += "botany" - restrictedJob = 1 - else - favoured_types = list(/obj/item/clothing) - -/mob/living/carbon/human/interactive/proc/makeTraitor(var/inPers) - isTraitor = 1 - traitorScale = (slyness + smartness) + rand(-10,10) - traitorType = inPers - - ticker.mode.traitors += mind - mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/mindslaves/slaved = new() - slaved.masters += mind - mind.som = slaved - ticker.mode.update_traitor_icons_added(mind) - - switch(traitorType) - if(SNPC_BRUTE) // SMASH KILL RAAARGH - var/datum/objective/assassinate/A = new - A.owner = mind - A.find_target() - mind.objectives += A - traitorTarget = A.target.current - if(SNPC_STEALTH) // Shhh we is sneekies - var/datum/objective/steal/S = new - S.owner = mind - S.find_target() - mind.objectives += S - traitorTarget = locate(S.steal_target.typepath) in world - if(SNPC_MARTYR) // MY LIFE FOR SPESZUL - var/targetType = pick(/obj/structure/particle_accelerator, /obj/machinery/gravity_generator/main, /obj/machinery/power/smes) - traitorTarget = locate(targetType) in world - var/datum/objective/O = new("Destroy \the [traitorTarget].") - O.owner = mind - mind.objectives += O - if(SNPC_PSYCHO) // YOU'RE LIKE A FLESH BICYLE AND I WANT TO DISMANTLE YOU - var/datum/objective/hijack/H = new - H.owner = mind - mind.objectives += H - traitorTarget = null - - functions += "traitor" - faction -= "neutral" - faction += "hostile" - -/mob/living/carbon/human/interactive/create_mob_hud() - if(!hud_used) - hud_used = new /datum/hud/human(src) - -/mob/living/carbon/human/interactive/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/mob/living/carbon/human/interactive/LateInitialize() - . = ..() - GLOB.snpc_list += src - - create_mob_hud() - - sync_mind() - random() - doSetup() - START_PROCESSING(SSnpcpool, src) - loadVoice() - GLOB.hear_radio_list += src - - // a little bit of variation to make individuals more unique - robustness += rand(-10, 10) - smartness += rand(-10, 10) - attitude += rand(-10, 10) - slyness += rand(-10, 10) - - doProcess() - -/mob/living/carbon/human/interactive/Destroy() - SSnpcpool.stop_processing(src) - return ..() - -/mob/living/carbon/human/interactive/proc/retalTarget(mob/living/target) - var/mob/living/M = target - if(istype(M)) - if(health > 0) - if(M.a_intent == INTENT_HELP && !incapacitated()) - chatter() - if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW)) - var/mob/living/carbon/C = target - if(!Adjacent(target)) - tryWalk(target) - else - C.help_shake_act(src) - if(M.a_intent == INTENT_HARM) - retal = 1 - retal_target = target - -//Retaliation clauses - -/mob/living/carbon/human/interactive/attacked_by(obj/item/I, mob/living/user, def_zone) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked) - ..() - var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src) - if(C) - retalTarget(C) - -/mob/living/carbon/human/interactive/bullet_act(obj/item/projectile/P) - ..() - retalTarget(P.firer) - -/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M) - ..() - retalTarget(M) - -/mob/living/carbon/human/interactive/show_inv(mob/user) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0) - ..() - retalTarget(user) - -//THESE EXIST FOR DEBUGGING OF THE DOING/INTEREST SYSTEM EASILY -/mob/living/carbon/human/interactive/proc/doing2string(doin) - var/toReturn = "" - if(!doin) - toReturn = "not doing anything" - if(doin & SNPC_INTERACTING) - toReturn += "interacting with something, " - if(doin & SNPC_FIGHTING) - toReturn += "engaging in combat, " - if(doin & SNPC_TRAVEL) - toReturn += "and going somewhere" - return toReturn - -/mob/living/carbon/human/interactive/proc/interest2string(inter) - var/toReturn = "Flatlined" - if(inter >= 0 && inter <= 25) - toReturn = "Very Bored" - if(inter >= 26 && inter <= 50) - toReturn = "Bored" - if(inter >= 51 && inter <= 75) - toReturn = "Content" - if(inter >= 76) - toReturn = "Excited" - return toReturn -//END DEBUG - -/mob/living/carbon/human/interactive/proc/IsDeadOrIncap(checkDead = TRUE) - if(!canmove) - return 1 - if(health <= 0 && checkDead) - return 1 - if(restrained()) - return 1 - if(paralysis) - return 1 - if(stunned) - return 1 - if(stat) - return 1 - if(inactivity_period > 0) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/enforce_hands() - if(main_hand) - if(main_hand.loc != src) - main_hand = null - if(other_hand) - if(other_hand.loc != src) - other_hand = null - if(hand) - if(!l_hand) - main_hand = null - if(r_hand) - swap_hands() - else - if(!r_hand) - main_hand = null - if(l_hand) - swap_hands() - -/mob/living/carbon/human/interactive/proc/swap_hands() - hand = !hand - var/obj/item/T = other_hand - main_hand = other_hand - other_hand = T - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/take_to_slot(obj/item/G, var/hands=0) - var/list/slots = list("left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand) - if(hands) - slots = list("left hand" = slot_l_hand, "right hand" = slot_r_hand) - G.loc = src - if(G.force && G.force > best_force) - best_force = G.force - equip_in_one_of_slots(G, slots) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/insert_into_backpack() - var/list/slots = list(slot_l_store, slot_r_store, slot_l_hand, slot_r_hand) - var/obj/item/I = get_item_by_slot(pick(slots)) - var/obj/item/storage/BP = get_item_by_slot(slot_back) - if(back && BP && I) - // hack to allow SNPCs to "sticky grab" items without losing their inventorying - var/oldnodrop = I.flags | NODROP - I.flags &= ~NODROP - if(BP.can_be_inserted(I)) - BP.handle_item_insertion(I) - I.flags |= oldnodrop - else - unEquip(I,TRUE) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/targetRange(towhere) - return get_dist(get_turf(towhere), get_turf(src)) - -/mob/living/carbon/human/interactive/death() - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - saveVoice() - -/mob/living/carbon/human/interactive/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/proc/doProcess() - set waitfor = FALSE - if(IsDeadOrIncap()) - reset() - return - //--------------------------- - //---- interest flow control - if(interest < 0 || inactivity_period < 0) - if(interest < 0) - interest = 0 - if(inactivity_period < 0) - inactivity_period = 0 - if(interest > maxInterest) - interest = maxInterest - //--------------------------- - //VIEW FUNCTIONS - - //doorscan is now integrated into life and runs before all other procs - var/mistake_chance = (100 - smartness) / 2 - spawn(0) - for(var/dir in alldirs) - var/turf/T = get_step(src, dir) - if(T) - for(var/obj/machinery/door/D in T.contents) - if(!istype(D,/obj/machinery/door/poddoor) && D.density) - spawn(0) - if(istype(D,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = D - if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through - inactivity_period = 20 - AL.panel_open = 1 - AL.update_icon() - AL.shock(src, mistake_chance) - sleep(5) - if(QDELETED(AL)) - return - AL.unlock() - if(prob(mistake_chance)) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS) - else - if(AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS, 1) - if(AL.locked) - AL.wires.UpdatePulsed(AIRLOCK_WIRE_DOOR_BOLTS) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER1) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_SAFETY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_SAFETY) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY) - sleep(5) - if(QDELETED(AL)) - return - AL.panel_open = 0 - AL.update_icon() - D.open() - - if(update_hands) - if(l_hand || r_hand) - if(l_hand) - hand = 1 - main_hand = l_hand - if(r_hand) - other_hand = r_hand - else if(r_hand) - hand = 0 - main_hand = r_hand - if(l_hand) //this technically shouldnt occur, but its a redundancy - other_hand = l_hand - update_icons() - update_hands = 0 - - if(grabbed_by.len > 0) - for(var/obj/item/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = INTENT_DISARM - G.assailant.attack_hand(src) - inactivity_period = 10 - - if(buckled) - resist() - inactivity_period = 10 - - //proc functions - for(var/Proc in functions) - if(!IsDeadOrIncap()) - INVOKE_ASYNC(src, Proc) - - - //target interaction stays hardcoded - - if(TARGET && (TARGET in blacklistItems)) // don't use blacklisted items - TARGET = null - - if(TARGET && Adjacent(TARGET)) - doing |= SNPC_INTERACTING - //--------DOORS - if(istype(TARGET, /obj/machinery/door)) - var/obj/machinery/door/D = TARGET - if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor)) - inactivity_period = 10 - D.open() - var/turf/T = get_step(get_step(D.loc, dir), dir) //recursion yo - tryWalk(T) - //THIEVING SKILLS - insert_into_backpack() // dump random item into backpack to make space - //---------ITEMS - if(istype(TARGET, /obj/item)) - var/obj/item/I = TARGET - if(I.anchored) - TARGET = null - else if(istype(TARGET, /obj/item)) - var/obj/item/W = TARGET - if(W.force >= best_force || prob((SNPC_FUZZY_CHANCE_LOW + SNPC_FUZZY_CHANCE_HIGH) / 2) || favouredObjIn(list(W))) - if(!l_hand || !r_hand) - put_in_hands(W) - else - insert_into_backpack() - else - if(!l_hand || !r_hand) - put_in_hands(TARGET) - else - insert_into_backpack() - //---------FASHION - if(istype(TARGET, /obj/item/clothing)) - drop_item() - dressup(TARGET) - update_hands = 1 - if(MYPDA in loc) - equip_to_appropriate_slot(MYPDA) - if(MYID in loc) - equip_to_appropriate_slot(MYID) - //THIEVING SKILLS END - //-------------TOUCH ME - if(istype(TARGET, /obj/structure)) - var/obj/structure/STR = TARGET - if(main_hand) - var/obj/item/W = main_hand - STR.attackby(W, src) - else - STR.attack_hand(src) - interest += targetInterestShift - doing = doing & ~SNPC_INTERACTING - timeout = 0 - TARGET = null - else - if(TARGET) - tryWalk(TARGET) - timeout++ - - if(doing == 0) - interest-- - else - interest++ - - if(inactivity_period > 0) - inactivity_period-- - - if(interest <= 0 || timeout >= 10) // facilitate boredom functions - TARGET = null - doing = 0 - timeout = 0 - myPath = list() - - //this is boring, lets move - if(!doing && !IsDeadOrIncap() && !TARGET) - doing |= SNPC_TRAVEL - if(!isTraitor || !traitorTarget || get_dist(src, traitorTarget) >= SNPC_MAX_RANGE_FIND || get_dist(src, traitorTarget) <= 1) - var/choice = rand(1,50) - switch(choice) - if(1 to 30) - //chance to chase an item - TARGET = locate(/obj/item) in favouredObjIn(oview(SNPC_MIN_RANGE_FIND, src)) - if(31 to 40) - TARGET = safepick(get_area_turfs(job2area(myjob))) - if(41 to 45) - TARGET = pick(target_filter(favouredObjIn(urange(SNPC_MAX_RANGE_FIND, src, 1)))) - if(46 to 50) - TARGET = pick(target_filter(oview(SNPC_MIN_RANGE_FIND, src))) - else - TARGET = traitorTarget - tryWalk(TARGET) - LAST_TARGET = TARGET - -/mob/living/carbon/human/interactive/proc/dressup(obj/item/clothing/C) - set waitfor = FALSE - inactivity_period = 12 - sleep(5) - if(!QDELETED(C) && !QDELETED(src)) - take_to_slot(C,1) - if(!equip_to_appropriate_slot(C)) - var/obj/item/I = get_item_by_slot(C) - unEquip(I) - sleep(5) - if(!QDELETED(src) && !QDELETED(C)) - equip_to_appropriate_slot(C) - -/mob/living/carbon/human/interactive/proc/favouredObjIn(list/inList) - var/list/outList = list() - for(var/i in inList) - for(var/path in favoured_types) - if(istype(i, path)) - outList += i - if(!outList.len) - outList = inList - return outList - -/mob/living/carbon/human/interactive/proc/tryWalk(turf/inTarget) - if(restrictedJob) // we're a job that has to stay in our home - if(!(get_turf(inTarget) in get_area_turfs(job2area(myjob)))) - TARGET = null - return - - if(!IsDeadOrIncap()) - if(!walk2derpless(inTarget)) - timeout++ - else - timeout++ - -/mob/living/carbon/human/interactive/proc/getGoodPath(target, maxtries=512) - set background = 1 - var/turf/end = get_turf(target) - - var/turf/current = get_turf(src) - - var/list/path = list() - var/tries = 0 - while(current != end && tries < maxtries) - var/turf/shortest = current - for(var/turf/T in view(current,1)) - var/foundDense = 0 - for(var/atom/A in T) - if(A.density) - foundDense = 1 - if(T.density == 0 && !foundDense) - if(get_dist(T, target) < get_dist(shortest,target)) - shortest = T - else - tries++ - else - tries++ - current = shortest - path += shortest - return path - -/mob/living/carbon/human/interactive/proc/walk2derpless(target) - set background = 1 - if(!target) - return 0 - - if(myPath.len <= 0) - myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID, simulated_only = 0) - - if(myPath) - if(myPath.len > 0) - doing = doing & ~SNPC_TRAVEL - for(var/i = 0; i < maxStepsTick; ++i) - if(!IsDeadOrIncap()) - if(myPath.len >= 1) - walk_to(src,myPath[1],0,5) - myPath -= myPath[1] - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/job2area(target) - var/datum/job/T = target - switch(T.title) - if("Civilian", "Paramedic") - return /area/hallway/primary - if("Captain", "Head of Personnel", "Blueshield") - return /area/bridge - if("Bartender") - return /area/crew_quarters/bar - if("Chef") - return /area/crew_quarters/kitchen - if("Station Engineer", "Chief Engineer", "Mechanic") - return /area/engine - if("Life Support Specialist") - return /area/atmos - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Psychiatrist") - return /area/medical - if("Geneticist") - return /area/medical/genetics - if("Research Director", "Scientist") - return /area/toxins - if("Roboticist") - return /area/assembly/robotics - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Brig Physician", "Magistrate", "Internal Affairs Agent") - return /area/security - if("Botanist") - return /area/hydroponics - else - return pick(/area/hallway, /area/crew_quarters) - -/mob/living/carbon/human/interactive/proc/target_filter(target) - var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/lighting_overlay, /obj/structure/cable, /obj/machinery/atmospherics, /obj/item/radio/intercom) - var/list/L = target - for(var/atom/A in target) // added a bunch of "junk" that clogs up the general find procs - if(is_type_in_list(A,filtered_targets)) - L -= A - return L - -/mob/living/carbon/human/interactive/proc/shouldModulePass() // returns 1 if the npc is in anything "primary" - if(doing & (SNPC_FIGHTING | SNPC_SPECIAL)) - return 1 - if(retal) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/getAllContents() - var/list/allContents = list() - for(var/atom/A in contents) - allContents += A - if(A.contents.len) - for(var/atom/B in A) - allContents += B - return allContents - -/mob/living/carbon/human/interactive/proc/enforceHome() - var/list/validHome = get_area_turfs(job2area(myjob)) - - if(TARGET) - var/atom/tcheck = TARGET - if(tcheck) - if(!(get_turf(tcheck) in validHome)) - TARGET = null - return 1 - - if(!(get_turf(src) in validHome) && validHome.len) - tryWalk(pick(get_area_turfs(job2area(myjob)))) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/npcDrop(obj/item/A, blacklist = 0) - if(blacklist) - blacklistItems += A - unEquip(A) - enforce_hands() - update_icons() - -/mob/living/carbon/human/interactive/proc/compareFaction(list/targetFactions) - var/hasSame = 0 - - for(var/A in targetFactions) - if(A in faction) - hasSame = 1 - - return hasSame - -/mob/living/carbon/human/interactive/proc/nearbyscan(obj) - nearby = list() - for(var/mob/living/M in view(4,src)) - if(M != src) - nearby += M - -/mob/living/carbon/human/interactive/rename_character(oldname, newname) - if(!..()) - return 0 - - if(oldname) - if(MYID) - MYID.registered_name = newname - MYID.name = "[newname]'s ID Card ([MYID.assignment])" - if(RPID) - RPID.registered_name = MYID.registered_name - RPID.name = MYID.name - return 1 diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm deleted file mode 100644 index cee716b66ec..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/carbon/human/interactive/angry/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - faction += "bot_angry" - return ..() - -/mob/living/carbon/human/interactive/friendly/Initialize(mapload) - TRAITS |= TRAIT_FRIENDLY - TRAITS |= TRAIT_UNROBUST - faction += "bot_friendly" - faction += "neutral" - functions -= "combat" - return ..() - -/mob/living/carbon/human/interactive/greytide/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - TRAITS |= TRAIT_THIEVING - TRAITS |= TRAIT_DUMB - maxInterest = 5 // really short attention span - targetInterestShift = 2 // likewise - faction += "bot_grey" - graytide = 1 - return ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 79b41e47cc3..e68f5652b01 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -115,7 +115,7 @@ update_tint() if(G.prescription) update_nearsighted_effects() - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view) + if(G.vision_flags || G.see_in_dark || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses() update_client_colour() @@ -128,7 +128,7 @@ // Bandanas and paper hats go on the head but are not head clothing if(istype(I,/obj/item/clothing/head)) var/obj/item/clothing/head/hat = I - if(hat.vision_flags || hat.darkness_view || hat.helmet_goggles_invis_view) + if(hat.vision_flags || hat.see_in_dark || !isnull(hat.lighting_alpha)) update_sight() head_update(I) update_inv_head() @@ -187,134 +187,136 @@ //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. -/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) - if(!slot) return - if(!istype(W)) return - if(!has_organ_for_slot(slot)) return +/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1) + if(!slot) + return + if(!istype(I)) + return + if(!has_organ_for_slot(slot)) + return - if(W == src.l_hand) + if(I == src.l_hand) src.l_hand = null update_inv_l_hand() //So items actually disappear from hands. - else if(W == src.r_hand) + else if(I == src.r_hand) src.r_hand = null update_inv_r_hand() - W.screen_loc = null - W.loc = src - W.equipped(src, slot) - W.layer = 20 - W.plane = HUD_PLANE + I.screen_loc = null + I.forceMove(src) + I.equipped(src, slot) + I.layer = ABOVE_HUD_LAYER + I.plane = ABOVE_HUD_PLANE switch(slot) if(slot_back) - back = W + back = I update_inv_back(redraw_mob) if(slot_wear_mask) - wear_mask = W + wear_mask = I if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) if(hud_list.len) sec_hud_set_ID() - wear_mask_update(W, toggle_off = TRUE) + wear_mask_update(I, toggle_off = TRUE) update_inv_wear_mask(redraw_mob) if(slot_handcuffed) - handcuffed = W + handcuffed = I update_inv_handcuffed(redraw_mob) if(slot_legcuffed) - legcuffed = W + legcuffed = I update_inv_legcuffed(redraw_mob) if(slot_l_hand) - l_hand = W + l_hand = I update_inv_l_hand(redraw_mob) if(slot_r_hand) - r_hand = W + r_hand = I update_inv_r_hand(redraw_mob) if(slot_belt) - belt = W + belt = I update_inv_belt(redraw_mob) if(slot_wear_id) - wear_id = W + wear_id = I if(hud_list.len) sec_hud_set_ID() update_inv_wear_id(redraw_mob) if(slot_wear_pda) - wear_pda = W + wear_pda = I update_inv_wear_pda(redraw_mob) if(slot_l_ear) - l_ear = W + l_ear = I if(l_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) r_ear = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_r_ear) - r_ear = W + r_ear = I if(r_ear.slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + var/obj/item/clothing/ears/offear/O = new(I) + O.forceMove(src) l_ear = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE update_inv_ears(redraw_mob) if(slot_glasses) - glasses = W - var/obj/item/clothing/glasses/G = W + glasses = I + var/obj/item/clothing/glasses/G = I if(G.tint) update_tint() if(G.prescription) update_nearsighted_effects() - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view) + if(G.vision_flags || G.see_in_dark || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses(redraw_mob) update_client_colour() if(slot_gloves) - gloves = W + gloves = I update_inv_gloves(redraw_mob) if(slot_head) - head = W + head = I if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_fhair(redraw_mob) update_head_accessory(redraw_mob) // paper + bandanas - if(istype(W, /obj/item/clothing/head)) - var/obj/item/clothing/head/hat = W - if(hat.vision_flags || hat.darkness_view || hat.helmet_goggles_invis_view) + if(istype(I, /obj/item/clothing/head)) + var/obj/item/clothing/head/hat = I + if(hat.vision_flags || hat.see_in_dark || !isnull(hat.lighting_alpha)) update_sight() - head_update(W) + head_update(I) update_inv_head(redraw_mob) if(slot_shoes) - shoes = W + shoes = I update_inv_shoes(redraw_mob) if(slot_wear_suit) - wear_suit = W + wear_suit = I update_inv_wear_suit(redraw_mob) if(slot_w_uniform) - w_uniform = W + w_uniform = I update_inv_w_uniform(redraw_mob) if(slot_l_store) - l_store = W + l_store = I update_inv_pockets(redraw_mob) if(slot_r_store) - r_store = W + r_store = I update_inv_pockets(redraw_mob) if(slot_s_store) - s_store = W + s_store = I update_inv_s_store(redraw_mob) if(slot_in_backpack) - if(get_active_hand() == W) - unEquip(W) - W.loc = back + if(get_active_hand() == I) + unEquip(I) + I.forceMove(back) if(slot_tie) var/obj/item/clothing/under/uniform = src.w_uniform - uniform.attackby(W,src) + uniform.attackby(I, src) else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") - return /mob/living/carbon/human/put_in_hands(obj/item/W) if(!W) return 0 diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1be6fc60a25..2f181d77077 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -62,27 +62,38 @@ return ..() /mob/living/carbon/human/proc/HasVoiceChanger() - if(istype(back,/obj/item/rig)) + if(istype(back, /obj/item/rig)) var/obj/item/rig/rig = back if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice) return rig.speech.voice_holder.voice - for(var/obj/item/gear in list(wear_mask,wear_suit,head)) + for(var/obj/item/gear in list(wear_mask, wear_suit, head)) if(!gear) continue + var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - return changer.voice - return 0 + if(changer && changer.active) + if(changer.voice) + return changer.voice + else if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return FALSE /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() + if(has_changer) return has_changer + if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing + if(GetSpecialVoice()) return GetSpecialVoice() + return real_name /mob/living/carbon/human/IsVocal() @@ -124,7 +135,6 @@ span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ - || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \ || GetComponent(/datum/component/jestosterone)) span = "sans" diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index d9a501d2251..7dc6c042e0c 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -39,8 +39,6 @@ var/siemens_coeff = 1 //base electrocution coefficient - var/invis_sight = SEE_INVISIBLE_LIVING - var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. @@ -80,7 +78,7 @@ var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods var/blood_color = "#A10808" //Red. - var/flesh_color = "#FFC896" //Pink. + var/flesh_color = "#d1aa2e" //Gold. var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts var/base_color //Used when setting species. @@ -333,11 +331,11 @@ /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) //Vampire code - if(user.mind && user.mind.vampire && (user.mind in ticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user) + if(user.mind && user.mind.vampire && (user.mind in SSticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user) if((NO_BLOOD in target.dna.species.species_traits) || target.dna.species.exotic_blood || !target.blood_volume) to_chat(user, "They have no blood!") return - if(target.mind && target.mind.vampire && (target.mind in ticker.mode.vampires)) + if(target.mind && target.mind.vampire && (target.mind in SSticker.mode.vampires)) to_chat(user, "Your fangs fail to pierce [target.name]'s cold flesh") return if(SKELETON in target.mutations) @@ -630,22 +628,19 @@ It'll return null if the organ doesn't correspond, so include null checks when u return null return has_organ[organ_slot] -/datum/species/proc/get_resultant_darksight(mob/living/carbon/human/H) //Returns default value of 2 if the mob doesn't have eyes, otherwise it grabs the eyes darksight. - var/resultant_darksight = 2 - var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) - if(eyes) - resultant_darksight = eyes.get_dark_view() - return resultant_darksight - /datum/species/proc/update_sight(mob/living/carbon/human/H) H.sight = initial(H.sight) - H.see_in_dark = get_resultant_darksight(H) - H.see_invisible = invis_sight - if(H.see_in_dark > 2) //Preliminary see_invisible handling as per set_species() in code\modules\mob\living\carbon\human\human.dm. - H.see_invisible = SEE_INVISIBLE_LEVEL_ONE + var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes) + if(eyes) + H.sight |= eyes.vision_flags + H.see_in_dark = eyes.see_in_dark + H.see_invisible = eyes.see_invisible + H.lighting_alpha = eyes.lighting_alpha else - H.see_invisible = SEE_INVISIBLE_LIVING + H.see_in_dark = initial(H.see_in_dark) + H.see_invisible = initial(H.see_invisible) + H.lighting_alpha = initial(H.lighting_alpha) if(H.client && H.client.eye != H) var/atom/A = H.client.eye @@ -656,39 +651,43 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE else if(H.mind.vampire.get_ability(/datum/vampire_passive/vision)) H.sight |= SEE_MOBS + H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE for(var/obj/item/organ/internal/cyberimp/eyes/E in H.internal_organs) H.sight |= E.vision_flags - if(E.dark_view) - H.see_in_dark = E.dark_view + if(E.see_in_dark) + H.see_in_dark = max(H.see_in_dark, E.see_in_dark) if(E.see_invisible) H.see_invisible = min(H.see_invisible, E.see_invisible) + if(E.lighting_alpha) + H.lighting_alpha = min(H.lighting_alpha, E.lighting_alpha) - var/lesser_darkview_bonus = INFINITY // my glasses, I can't see without my glasses if(H.glasses) var/obj/item/clothing/glasses/G = H.glasses H.sight |= G.vision_flags - lesser_darkview_bonus = G.darkness_view + H.see_in_dark = max(G.see_in_dark, H.see_in_dark) + if(G.invis_override) H.see_invisible = G.invis_override else H.see_invisible = min(G.invis_view, H.see_invisible) + + if(!isnull(G.lighting_alpha)) + H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) // better living through hat trading if(H.head) if(istype(H.head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = H.head H.sight |= hat.vision_flags + H.see_in_dark = max(hat.see_in_dark, H.see_in_dark) - if(hat.darkness_view) // Pick the lowest of the two darkness_views between the glasses and helmet. - lesser_darkview_bonus = min(hat.darkness_view,lesser_darkview_bonus) - - if(hat.helmet_goggles_invis_view) - H.see_invisible = min(hat.helmet_goggles_invis_view, H.see_invisible) + if(!isnull(hat.lighting_alpha)) + H.lighting_alpha = min(hat.lighting_alpha, H.lighting_alpha) if(istype(H.back, /obj/item/rig)) ///aghhh so snowflakey var/obj/item/rig/rig = H.back @@ -697,27 +696,27 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) var/obj/item/clothing/glasses/G = rig.visor.vision.glasses if(istype(G)) - H.see_in_dark = (G.darkness_view ? G.darkness_view : get_resultant_darksight(H)) // Otherwise we keep our darkness view with togglable nightvision. - if(G.vision_flags) // MESONS - H.sight |= G.vision_flags - + H.sight |= G.vision_flags + H.see_in_dark = max(G.see_in_dark, H.see_in_dark) H.see_invisible = min(G.invis_view, H.see_invisible) - if(lesser_darkview_bonus != INFINITY) - H.see_in_dark = max(lesser_darkview_bonus, H.see_in_dark) + if(!isnull(G.lighting_alpha)) + H.lighting_alpha = min(G.lighting_alpha, H.lighting_alpha) if(H.vision_type) - H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, get_resultant_darksight(H)) - H.see_invisible = H.vision_type.see_invisible - if(H.vision_type.light_sensitive) - H.weakeyes = 1 H.sight |= H.vision_type.sight_flags + H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark) + + if(!isnull(H.vision_type.lighting_alpha)) + H.lighting_alpha = min(H.vision_type.lighting_alpha, H.lighting_alpha) + + if(H.vision_type.light_sensitive) + H.weakeyes = TRUE if(XRAY in H.mutations) H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - if(H.see_override) //Override all - H.see_invisible = H.see_override + H.sync_lighting_plane_alpha() /datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index e790181188e..c1e416a8a48 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -607,7 +607,6 @@ ..() last_banana = world.time last_honk = world.time - H.job = "Clown" H.mutations.Add(COMIC) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/bikehorn(H), slot_l_store) @@ -682,7 +681,6 @@ /datum/species/golem/tranquillite/on_species_gain(mob/living/carbon/human/H) ..() - H.job = "Mime" H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head) H.equip_to_slot_or_del(new /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/cane(H), slot_l_hand) diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm index 5bb314c4f43..29ab2a0ee8d 100644 --- a/code/modules/mob/living/carbon/human/species/grey.dm +++ b/code/modules/mob/living/carbon/human/species/grey.dm @@ -27,6 +27,7 @@ dietflags = DIET_HERB has_gender = FALSE reagent_tag = PROCESS_ORG + flesh_color = "#a598ad" blood_color = "#A200FF" /datum/species/grey/handle_dna(mob/living/carbon/human/H, remove) diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm index a1d2fb6624d..538b524d4d8 100644 --- a/code/modules/mob/living/carbon/human/species/kidan.dm +++ b/code/modules/mob/living/carbon/human/species/kidan.dm @@ -13,6 +13,7 @@ bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS eyes = "kidan_eyes_s" dietflags = DIET_HERB + flesh_color = "#ba7814" blood_color = "#FB9800" reagent_tag = PROCESS_ORG //Default styles for created mobs. diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 35d02f82509..bb900cdb5b6 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -41,6 +41,7 @@ ) speciesbox = /obj/item/storage/box/survival_plasmaman + flesh_color = "#8b3fba" /datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking) if(copytext(message, 1, 2) != "*") diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index b33ebc1f048..37b38de361c 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -32,6 +32,7 @@ dietflags = DIET_CARN reagent_tag = PROCESS_ORG + flesh_color = "#5fe8b1" blood_color = "#0064C8" exotic_blood = "water" blood_damage_type = TOX diff --git a/code/modules/mob/living/carbon/human/species/tajaran.dm b/code/modules/mob/living/carbon/human/species/tajaran.dm index 2b0c65aa821..6c8c2312e17 100644 --- a/code/modules/mob/living/carbon/human/species/tajaran.dm +++ b/code/modules/mob/living/carbon/human/species/tajaran.dm @@ -31,7 +31,7 @@ taste_sensitivity = TASTE_SENSITIVITY_SHARP reagent_tag = PROCESS_ORG - flesh_color = "#AFA59E" + flesh_color = "#b5a69b" base_color = "#424242" butt_sprite = "tajaran" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e55eee62dbc..6133c5150e1 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -597,7 +597,7 @@ var/global/list/damage_icon_parts = list() client.screen -= thing // WHAT THE FUCKING FUCK BAY GODDAMNIT // **I FUCKING HATE YOU AAAAAAAAAA** if(thing) // - thing.loc = loc // + thing.forceMove(drop_location()) // thing.dropped(src) // thing.layer = initial(thing.layer) thing.plane = initial(thing.plane) @@ -659,6 +659,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) remove_overlay(GLASSES_LAYER) remove_overlay(GLASSES_OVER_LAYER) + remove_overlay(OVER_MASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -681,7 +682,12 @@ var/global/list/damage_icon_parts = list() new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + var/obj/item/clothing/glasses/G = glasses + if(istype(G) && G.over_mask) //If the user's used the 'wear over mask' verb on the glasses. + new_glasses.layer = -OVER_MASK_LAYER + overlays_standing[OVER_MASK_LAYER] = new_glasses + apply_overlay(OVER_MASK_LAYER) + else if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses apply_overlay(GLASSES_OVER_LAYER) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 48d8137092a..63f9f10dc71 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -343,36 +343,6 @@ Sleeping(2) return sleeping -/mob/living/carbon/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - - if(XRAY in mutations) - grant_xray_vision() - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.dark_view) - see_in_dark = max(see_in_dark,E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override - - /mob/living/carbon/handle_hud_icons() return diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 23918680197..40f9060ee63 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -47,7 +47,7 @@ /mob/living/carbon/slime/proc/Feedon(var/mob/living/M) Victim = M - src.loc = M.loc + forceMove(M.loc) canmove = 0 anchored = 1 var/lastnut = nutrition @@ -64,7 +64,7 @@ canmove = 0 if(Adjacent(Victim)) - loc = M.loc + forceMove(M.loc) if(iscarbon(Victim)) Victim.adjustCloneLoss(rand(5,6)) @@ -163,7 +163,7 @@ /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) if(Victim) if(Victim == M) - loc = M.loc // simple "attach to head" effect! + forceMove(M.loc) // simple "attach to head" effect! /mob/living/carbon/slime/verb/Evolve() diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 4e04090b649..62935713a80 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -50,11 +50,11 @@ if(class == "Superhero") W.assignment = "Superhero" W.rank = "Superhero" - ticker.mode.superheroes += H.mind + SSticker.mode.superheroes += H.mind else if(class == "Supervillain") W.assignment = "Supervillain" W.rank = "Supervillain" - ticker.mode.supervillains += H.mind + SSticker.mode.supervillains += H.mind W.icon_state = "lifetimeid" W.SetOwnerInfo(H) W.UpdateName() @@ -157,7 +157,7 @@ /obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets,mob/living/user = usr) for(var/mob/living/carbon/human/target in targets) var/obj/item/organ/external/head/head_organ = target.get_organ("head") - if(ticker.mode.greyshirts.len >= 3) + if(SSticker.mode.greyshirts.len >= 3) to_chat(user, "You have already recruited the maximum number of henchmen.") if(!in_range(user, target)) to_chat(user, "You need to be closer to enthrall [target].") @@ -218,7 +218,7 @@ to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.") to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.") to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.") - ticker.mode.greyshirts += target.mind + SSticker.mode.greyshirts += target.mind target.set_species(/datum/species/human) head_organ.h_style = "Bald" head_organ.f_style = "Shaved" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 37077881350..6054068eb15 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -69,7 +69,6 @@ med_hud_set_status() if(!gibbed && !QDELETED(src)) addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1) - callHook("death", list(src, gibbed)) for(var/s in ownedSoullinks) var/datum/soullink/S = s @@ -89,8 +88,8 @@ mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0) GLOB.respawnable_list += src - if(ticker && ticker.mode) - ticker.mode.check_win() + if(SSticker && SSticker.mode) + SSticker.mode.check_win() if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate mind.devilinfo.beginResurrectionCheck(src) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index d28e728c82c..e0c58c484d8 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -8,6 +8,15 @@ return 0 var/datum/gas_mixture/environment = loc.return_air() + if(client || registered_z) // This is a temporary error tracker to make sure we've caught everything + var/turf/T = get_turf(src) + if(client && registered_z != T.z) + message_admins("[src] [ADMIN_FLW(src, "FLW")] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z]. If you could ask them how that happened and notify the coders, it would be appreciated.") + log_game("Z-TRACKING: [src] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z].") + update_z(T.z) + else if (!client && registered_z) + log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") + update_z(null) if(stat != DEAD) //Chemicals in the body handle_chemicals_in_body() @@ -197,28 +206,15 @@ if(!remote_view && !client.adminobs) reset_perspective(null) -/mob/living/proc/update_sight() - if(stat == DEAD) - grant_death_vision() - return - // Gives a mob the vision of being dead /mob/living/proc/grant_death_vision() sight |= SEE_TURFS sight |= SEE_MOBS sight |= SEE_OBJS + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE see_in_dark = 8 see_invisible = SEE_INVISIBLE_OBSERVER - -// See through walls, dark, etc. -// basically the same as death vision except you can't -// see ghosts -/mob/living/proc/grant_xray_vision() - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + sync_lighting_plane_alpha() /mob/living/proc/handle_hud_icons() handle_hud_icons_health() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 52fde3d0d9e..727c900ac9c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -519,7 +519,6 @@ var/turf/T = loc . = ..() if(.) - SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED) handle_footstep(loc) step_count++ @@ -691,7 +690,7 @@ return name /mob/living/update_gravity(has_gravity) - if(!ticker) + if(!SSticker) return if(has_gravity) clear_alert("weightless") @@ -953,6 +952,27 @@ to_chat(src, "You can taste [english_list(final_taste_list)].") +/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister + if(registered_z != new_z) + if(registered_z) + SSmobs.clients_by_zlevel[registered_z] -= src + if(client) + if(new_z) + SSmobs.clients_by_zlevel[new_z] += src + for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 + var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] + if (SA) + SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs + else + SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + registered_z = new_z + else + registered_z = null + +/mob/living/onTransitZ(old_z,new_z) + ..() + update_z(new_z) + /mob/living/proc/owns_soul() if(mind) return mind.soulOwner == mind @@ -992,3 +1012,29 @@ for(var/atom/A in src) if(A.light_range > 0) A.extinguish_light() + +/mob/living/vv_edit_var(var_name, var_value) + switch(var_name) + if("stat") + if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life + GLOB.dead_mob_list -= src + GLOB.living_mob_list += src + if((stat < DEAD) && (var_value == DEAD))//Kill he + GLOB.living_mob_list -= src + GLOB.dead_mob_list += src + . = ..() + switch(var_name) + if("weakened") + SetWeakened(var_value) + if("stunned") + SetStunned(var_value) + if("paralysis") + SetParalysis(var_value) + if("sleeping") + SetSleeping(var_value) + if("maxHealth") + updatehealth() + if("resize") + update_transform() + if("lighting_alpha") + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 88b17124451..e9df2f0edad 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -279,7 +279,7 @@ return G /mob/living/attack_slime(mob/living/carbon/slime/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6e12748911b..ac89553865c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -33,7 +33,6 @@ var/mob_size = MOB_SIZE_HUMAN var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes. - var/nightvision = 0 var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour var/holder = null //The holder for blood crawling diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index d1157b662fa..d8e27df91fe 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -5,6 +5,10 @@ update_stat("mob login") update_sight() + var/turf/T = get_turf(src) + if(isturf(T)) + update_z(T.z) + //If they're SSD, remove it so they can wake back up. player_logged = 0 //Vents diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 87384669a7c..e1c33f89a7e 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,4 +1,5 @@ /mob/living/Logout() + update_z(null) if(ranged_ability && client) ranged_ability.remove_mousepointer(client) ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ccf319b0884..80d644152f4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -634,7 +634,7 @@ var/list/ai_verbs_default = list( return if(href_list["trackbot"]) - var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animal_list + var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animals if(target) ai_actual_track(target) else @@ -642,7 +642,7 @@ var/list/ai_verbs_default = list( return if(href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in GLOB.simple_animal_list + Bot = locate(href_list["callbot"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 @@ -650,7 +650,7 @@ var/list/ai_verbs_default = list( return if(href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in GLOB.simple_animal_list + Bot = locate(href_list["interface"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -746,7 +746,7 @@ var/list/ai_verbs_default = list( d += "Query network status
" d += "" - for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animals) if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! bot_area = get_area(Bot) d += "" @@ -1290,4 +1290,27 @@ var/list/ai_verbs_default = list( return FALSE /mob/living/silicon/ai/ExtinguishMob() - return \ No newline at end of file + return + + +/mob/living/silicon/ai/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + if(aiRestorePowerRoutine) + sight = sight &~ SEE_TURFS + sight = sight &~ SEE_MOBS + sight = sight &~ SEE_OBJS + see_in_dark = 0 + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 6d32c24bb0a..c8ffebc6647 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!ticker) + if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return ..() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 2771725a96d..6d12559ee9b 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -101,7 +101,7 @@ var/datum/cameranet/cameranet = new() /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) - if(!ticker || (opacity_check && !A.opacity)) + if(!SSticker || (opacity_check && !A.opacity)) return majorChunkChange(A, 2) diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index ec2fd378ed5..4b124c364c2 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -116,7 +116,8 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, null, 15) + t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER + 0.1) + t.obscured.plane = BYOND_LIGHTING_PLANE + 1 obscured += t.obscured for(var/eye in seenby) @@ -169,7 +170,8 @@ for(var/turf in obscuredTurfs) var/turf/t = turf if(!t.obscured) - t.obscured = image('icons/effects/cameravis.dmi', t, "black", 15) + t.obscured = image('icons/effects/cameravis.dmi', t, "black", BYOND_LIGHTING_LAYER + 0.1) + t.obscured.plane = BYOND_LIGHTING_PLANE + 1 obscured += t.obscured -#undef UPDATE_BUFFER \ No newline at end of file +#undef UPDATE_BUFFER diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 69136e07a99..513b26ee558 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -33,8 +33,8 @@ var/global/list/empty_playable_ai_cores = list() mind.objectives.Cut() mind.special_role = null else - if(ticker.mode.name == "AutoTraitor") - var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + if(SSticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = SSticker.mode current_mode.possible_traitors.Remove(src) // Ghost the current player and disallow them to return to the body diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index eec1ec5b8b8..06043025f7c 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -152,16 +152,3 @@ /mob/living/silicon/ai/rejuvenate() ..() add_ai_verbs(src) - -/mob/living/silicon/ai/update_sight() - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - if(aiRestorePowerRoutine) - sight = sight&~SEE_TURFS - sight = sight&~SEE_MOBS - sight = sight&~SEE_OBJS - see_in_dark = 0 - - if(see_override) - see_invisible = see_override diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 01240adf942..4892441b804 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,12 +1,12 @@ /mob/living/silicon/Login() SetSleeping(0) - if(mind && ticker && ticker.mode) - ticker.mode.remove_revolutionary(mind, 1) - ticker.mode.remove_cultist(mind, 1) - ticker.mode.remove_wizard(mind) - ticker.mode.remove_changeling(mind) - ticker.mode.remove_vampire(mind) - ticker.mode.remove_thrall(mind, 0) - ticker.mode.remove_shadowling(mind) - ticker.mode.remove_abductor(mind) - ..() + if(mind && SSticker && SSticker.mode) + SSticker.mode.remove_revolutionary(mind, 1) + SSticker.mode.remove_cultist(mind, 1) + SSticker.mode.remove_wizard(mind) + SSticker.mode.remove_changeling(mind) + SSticker.mode.remove_vampire(mind) + SSticker.mode.remove_thrall(mind, 0) + SSticker.mode.remove_shadowling(mind) + SSticker.mode.remove_abductor(mind) + ..() diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index ff859853ea5..b2828070ad3 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -50,8 +50,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates card.setPersonality(pai) card.looking_for_personality = 0 - ticker.mode.update_cult_icons_removed(card.pai.mind) - ticker.mode.update_rev_icons_removed(card.pai.mind) + SSticker.mode.update_cult_icons_removed(card.pai.mind) + SSticker.mode.update_rev_icons_removed(card.pai.mind) pai_candidates -= candidate usr << browse(null, "window=findPai") diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d81b76e2e76..d584d5a50f5 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -22,8 +22,11 @@ /datum/robot_component/proc/install() go_online() + owner.updatehealth("component '[src]' installed") + /datum/robot_component/proc/uninstall() go_offline() + owner.updatehealth("component '[src]' removed") /datum/robot_component/proc/destroy() if(wrapped) @@ -102,12 +105,6 @@ external_type = /obj/item/robot_parts/robot_component/actuator max_damage = 50 -/datum/robot_component/actuator/go_online() - owner.update_stat() - -/datum/robot_component/actuator/go_offline() - owner.update_stat() - /datum/robot_component/cell name = "power cell" max_damage = 50 @@ -115,12 +112,6 @@ /datum/robot_component/cell/is_powered() return ..() && owner.cell -/datum/robot_component/cell/go_online() - owner.update_stat() - -/datum/robot_component/cell/go_offline() - owner.update_stat() - /datum/robot_component/cell/destroy() ..() owner.cell = null @@ -264,19 +255,25 @@ if(M.timeofdeath && M.stat == DEAD) to_chat(user, "Time of Disable: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]") var/mob/living/silicon/robot/H = M - var/list/damaged = H.get_damaged_components(1,1,1) + var/list/damaged = H.get_damaged_components(TRUE, TRUE, TRUE) // Get all except the missing ones + var/list/missing = H.get_missing_components() to_chat(user, "Localized Damage:") - if(length(damaged)>0) - for(var/datum/robot_component/org in damaged) - user.show_message(text("\t []: [][] - [] - [] - []", \ - capitalize(org.name), \ - (org.installed == -1) ? "DESTROYED " :"",\ - (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ - (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ - (org.toggled) ? "Toggled ON" : "Toggled OFF",\ - (org.powered) ? "Power ON" : "Power OFF"),1) - else + if(!LAZYLEN(damaged) && !LAZYLEN(missing)) to_chat(user, "\t Components are OK.") + else + if(LAZYLEN(damaged)) + for(var/datum/robot_component/org in damaged) + user.show_message(text("\t []: [][] - [] - [] - []", \ + capitalize(org.name), \ + (org.installed == -1) ? "DESTROYED " :"",\ + (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ + (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ + (org.toggled) ? "Toggled ON" : "Toggled OFF",\ + (org.powered) ? "Power ON" : "Power OFF"),1) + if(LAZYLEN(missing)) + for(var/datum/robot_component/org in missing) + user.show_message("\t [capitalize(org.name)]: MISSING") + if(H.emagged && prob(5)) to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED") @@ -287,22 +284,22 @@ to_chat(user, "External prosthetics:") var/organ_found - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/external/E in H.bodyparts) if(!E.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[E.name]: [E.brute_dam][E.burn_dam]") if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
") to_chat(user, "Internal prosthetics:") organ_found = null - if(H.internal_organs.len) + if(LAZYLEN(H.internal_organs)) for(var/obj/item/organ/internal/O in H.internal_organs) if(!O.is_robotic()) continue - organ_found = 1 + organ_found = TRUE to_chat(user, "[capitalize(O.name)]: [O.damage]") if(!organ_found) to_chat(user, "No prosthetics located.") diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index e94f9e072b4..3985bfce50e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -182,7 +182,7 @@ to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.") if(jobban_isbanned(src, ROLE_SYNDICATE)) - ticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) + SSticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE) to_chat(src, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. You sense you have five minutes before the drone server detects this and automatically shuts you down.") diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 9bf388fe5fe..35bbad68b6a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -27,7 +27,7 @@ /obj/machinery/drone_fabricator/process() - if(ticker.current_state < GAME_STATE_PLAYING) + if(SSticker.current_state < GAME_STATE_PLAYING) return if(stat & NOPOWER || !produce_drones) @@ -98,7 +98,7 @@ to_chat(usr, "You are banned from playing drones and cannot spawn as a drone.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't join as a drone before the game starts!") return diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 8eb8bb80763..7695145300e 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -55,24 +55,24 @@ if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv1.screen_loc contents += O set_actions(O) else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv2.screen_loc contents += O set_actions(O) else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O - O.layer = 20 - O.plane = HUD_PLANE + O.layer = ABOVE_HUD_LAYER + O.plane = ABOVE_HUD_PLANE O.screen_loc = inv3.screen_loc contents += O set_actions(O) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 5f37177f674..bf09191ecf2 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -88,40 +88,6 @@ return 1 -/mob/living/silicon/robot/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) - sight = initial(sight) - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - if(sight_mode & BORGMESON) - sight |= SEE_TURFS - see_invisible = min(see_invisible, SEE_INVISIBLE_MINIMUM) - see_in_dark = 1 - - if(sight_mode & BORGXRAY) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_invisible = SEE_INVISIBLE_LIVING - see_in_dark = 8 - - if(sight_mode & BORGTHERM) - sight |= SEE_MOBS - see_invisible = min(see_invisible, SEE_INVISIBLE_LIVING) - see_in_dark = 8 - - if(see_override) - see_invisible = see_override - /mob/living/silicon/robot/handle_hud_icons() update_items() update_cell() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ae6a832f6ac..7521270346e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -114,7 +114,9 @@ var/list/robot_verbs_default = list( robot_modules_background = new() robot_modules_background.icon_state = "block" - robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.plane = HUD_PLANE + ident = rand(1, 999) rename_character(null, get_default_name()) update_icons() @@ -157,6 +159,7 @@ var/list/robot_verbs_default = list( var/datum/robot_component/cell_component = components["power cell"] cell_component.wrapped = cell cell_component.installed = 1 + cell_component.install() diag_hud_set_borgcell() scanner = new(src) @@ -438,8 +441,10 @@ var/list/robot_verbs_default = list( var/dat = "[src.name] Self-Diagnosis Report\n" for(var/V in components) var/datum/robot_component/C = components[V] - dat += "[C.name]

Name

Status

Location

Control

[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" - + if(C.installed == 0) + dat += "[C.name]
MISSING
" + else + dat += "[C.name][C.installed == -1 ? "
DESTROYED" : ""]
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[C.is_powered() ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" return dat /mob/living/silicon/robot/verb/self_diagnosis_verb() @@ -591,6 +596,9 @@ var/list/robot_verbs_default = list( if(!getBruteLoss()) to_chat(user, "Nothing to fix!") return + else if(!getBruteLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/weldingtool/WT = W user.changeNext_move(CLICK_CD_MELEE) if(WT.remove_fuel(0)) @@ -603,11 +611,14 @@ var/list/robot_verbs_default = list( return - else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) + else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone))) user.changeNext_move(CLICK_CD_MELEE) if(!getFireLoss()) to_chat(user, "Nothing to fix!") return + else if(!getFireLoss(TRUE)) + to_chat(user, "The damaged components are beyond saving!") + return var/obj/item/stack/cable_coil/coil = W adjustFireLoss(-30) updatehealth() @@ -654,10 +665,10 @@ var/list/robot_verbs_default = list( I.burn = C.electronics_damage I.loc = src.loc - - if(C.installed == 1) - C.uninstall() + var/was_installed = C.installed C.installed = 0 + if(was_installed == 1) + C.uninstall() else if(locked) @@ -1340,9 +1351,9 @@ var/list/robot_verbs_default = list( mind.special_role = SPECIAL_ROLE_ERT if(cyborg_unlock) crisis = 1 - if(!(mind in ticker.minds)) - ticker.minds += mind - ticker.mode.ert += mind + if(!(mind in SSticker.minds)) + SSticker.minds += mind + SSticker.mode.ert += mind /mob/living/silicon/robot/ert/gamma crisis = 1 @@ -1362,7 +1373,7 @@ var/list/robot_verbs_default = list( ..() var/brute = 1000 var/burn = 1000 - var/list/datum/robot_component/borked_parts = get_damaged_components(brute,burn,1) + var/list/datum/robot_component/borked_parts = get_damaged_components(TRUE, TRUE, TRUE, TRUE) for(var/datum/robot_component/borked_part in borked_parts) brute = borked_part.brute_damage burn = borked_part.electronics_damage @@ -1383,3 +1394,38 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/check_ear_prot() return ear_protection + +/mob/living/silicon/robot/update_sight() + if(!client) + return + + if(stat == DEAD) + grant_death_vision() + return + + see_invisible = initial(see_invisible) + see_in_dark = initial(see_in_dark) + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + + if(client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + if(sight_mode & BORGMESON) + sight |= SEE_TURFS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + + if(sight_mode & BORGXRAY) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_invisible = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + see_in_dark = 8 + + if(sight_mode & BORGTHERM) + sight |= SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() + \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index e2a93fa0167..81700464ac0 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -8,18 +8,20 @@ handle_hud_icons_health() diag_hud_set_health() -/mob/living/silicon/robot/getBruteLoss() +/mob/living/silicon/robot/getBruteLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.brute_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.brute_damage return amount -/mob/living/silicon/robot/getFireLoss() +/mob/living/silicon/robot/getFireLoss(repairable_only = FALSE) var/amount = 0 for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed != 0) amount += C.electronics_damage + if(C.installed != 0 && (!repairable_only || C.installed != -1)) // Installed ones only and if repair only remove the borked ones + amount += C.electronics_damage return amount /mob/living/silicon/robot/adjustBruteLoss(amount, updating_health = TRUE) @@ -36,11 +38,19 @@ heal_overall_damage(0, -amount, updating_health) return STATUS_UPDATE_HEALTH -/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn, var/get_all) +/mob/living/silicon/robot/proc/get_damaged_components(get_brute, get_burn, get_borked = FALSE, get_missing = FALSE) var/list/datum/robot_component/parts = list() for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1 || get_all) if((brute && C.brute_damage) || (burn && C.electronics_damage)) + if((C.installed == 1 || (get_borked && C.installed == -1) || (get_missing && C.installed == 0)) && ((get_brute && C.brute_damage) || (get_burn && C.electronics_damage))) + parts += C + return parts + +/mob/living/silicon/robot/proc/get_missing_components() + var/list/datum/robot_component/parts = list() + for(var/V in components) + var/datum/robot_component/C = components[V] + if(C.installed == 0) parts += C return parts @@ -48,41 +58,43 @@ var/list/rval = new for(var/V in components) var/datum/robot_component/C = components[V] - if(C.installed == 1) rval += C + if(C.installed == 1) + rval += C return rval /mob/living/silicon/robot/proc/get_armour() - - if(!components.len) return 0 + if(!LAZYLEN(components)) + return 0 var/datum/robot_component/C = components["armour"] if(C && C.installed == 1) return C return 0 /mob/living/silicon/robot/heal_organ_damage(brute, burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) - if(!parts.len) return + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) + if(!LAZYLEN(parts)) + return var/datum/robot_component/picked = pick(parts) - picked.heal_damage(brute,burn, updating_health) + picked.heal_damage(brute, burn, updating_health) /mob/living/silicon/robot/take_organ_damage(brute = 0, burn = 0, updating_health = TRUE, sharp = 0, edge = 0) var/list/components = get_damageable_components() - if(!components.len) + if(!LAZYLEN(components)) return //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -102,9 +114,9 @@ C.take_damage(brute, burn, sharp, updating_health) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn, updating_health = TRUE) - var/list/datum/robot_component/parts = get_damaged_components(brute,burn) + var/list/datum/robot_component/parts = get_damaged_components(brute, burn) - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage @@ -112,8 +124,8 @@ picked.heal_damage(brute,burn, updating_health) - brute -= (brute_was-picked.brute_damage) - burn -= (burn_was-picked.electronics_damage) + brute -= (brute_was - picked.brute_damage) + burn -= (burn_was - picked.electronics_damage) parts -= picked @@ -126,17 +138,17 @@ //Combat shielding absorbs a percentage of damage directly into the cell. var/obj/item/borg/combat/shield/shield - if(module_state_1 && istype(module_state_1,/obj/item/borg/combat/shield)) + if(module_state_1 && istype(module_state_1, /obj/item/borg/combat/shield)) shield = module_state_1 - else if(module_state_2 && istype(module_state_2,/obj/item/borg/combat/shield)) + else if(module_state_2 && istype(module_state_2, /obj/item/borg/combat/shield)) shield = module_state_2 - else if(module_state_3 && istype(module_state_3,/obj/item/borg/combat/shield)) + else if(module_state_3 && istype(module_state_3, /obj/item/borg/combat/shield)) shield = module_state_3 if(shield) //Shields absorb a certain percentage of damage based on their power setting. - var/absorb_brute = brute*shield.shield_level - var/absorb_burn = burn*shield.shield_level - var/cost = (absorb_brute+absorb_burn)*100 + var/absorb_brute = brute * shield.shield_level + var/absorb_burn = burn * shield.shield_level + var/cost = (absorb_brute+absorb_burn) * 100 cell.charge -= cost if(cell.charge <= 0) @@ -152,7 +164,7 @@ A.take_damage(brute, burn, sharp) return - while(parts.len && (brute>0 || burn>0) ) + while(LAZYLEN(parts) && (brute > 0 || burn > 0) ) var/datum/robot_component/picked = pick(parts) var/brute_was = picked.brute_damage diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 161b81e3cd2..85cc2ad5786 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -46,7 +46,9 @@ user.put_in_active_hand(cell) to_chat(user, "You remove \the [cell].") cell = null - update_stat() + var/datum/robot_component/C = components["power cell"] + C.installed = 0 + C.uninstall() diag_hud_set_borgcell() if(!opened) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 2b3d11357d1..ab9253b96cc 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -29,21 +29,21 @@ /mob/living/simple_animal/hostile/construct/New() ..() - if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + if(!SSticker.mode)//work around for maps with runes and cultdat is not loaded all the way name = "[const_type] ([rand(1, 1000)])" real_name = const_type icon_living = const_type icon_state = const_type else - name = "[ticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" - real_name = ticker.cultdat.get_name(const_type) - icon_living = ticker.cultdat.get_icon(const_type) - icon_state = ticker.cultdat.get_icon(const_type) + name = "[SSticker.cultdat.get_name(const_type)] ([rand(1, 1000)])" + real_name = SSticker.cultdat.get_name(const_type) + icon_living = SSticker.cultdat.get_icon(const_type) + icon_state = SSticker.cultdat.get_icon(const_type) for(var/spell in construct_spells) AddSpell(new spell(null)) - if(ticker.cultdat.theme == "blood") + if(SSticker.cultdat.theme == "blood") updateglow() /mob/living/simple_animal/hostile/construct/examine(mob/user) @@ -168,7 +168,7 @@ melee_damage_lower = 25 melee_damage_upper = 25 attacktext = "slashes" - see_in_dark = 7 + see_in_dark = 8 attack_sound = 'sound/weapons/bladeslice.ogg' const_type = "wraith" construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 38787198a5f..b5ce4622052 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -48,9 +48,9 @@ ..() /mob/living/simple_animal/pet/cat/Runtime/Life(seconds, times_fired) - if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP) + if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP) Deploy_The_Cats() - if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved) + if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e92174bd6c2..1e7b3a61d0c 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -22,7 +22,7 @@ del_on_death = 1 /mob/living/simple_animal/cockroach/can_die() - return ..() && !ticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. + return ..() && !SSticker.cinematic //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. /mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM) if(isliving(AM)) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 3ff26f7850c..970ac596482 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -451,7 +451,7 @@ response_harm = "kicks" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID -/mob/living/simple_animal/pet/corgi/Ian/process_ai() +/mob/living/simple_animal/pet/corgi/Ian/Life() ..() //Feeding, chasing food, FOOOOODDDD @@ -578,7 +578,7 @@ return ..() -/mob/living/simple_animal/pet/corgi/Lisa/process_ai() +/mob/living/simple_animal/pet/corgi/Lisa/Life() ..() make_babies() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ae19106e1af..3b9b2d720ca 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -35,8 +35,9 @@ can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/mouse/Initialize() +/mob/living/simple_animal/mouse/Initialize(mapload) . = ..() + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100) /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -54,9 +55,8 @@ else if(prob(5)) emote("snuffles") -/mob/living/simple_animal/mouse/process_ai() +/mob/living/simple_animal/mouse/Life() ..() - if(prob(0.5)) stat = UNCONSCIOUS icon_state = "mouse_[mouse_color]_sleep" @@ -93,10 +93,9 @@ /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if(ishuman(AM)) - if(stat == CONSCIOUS) + if(!stat) var/mob/M = AM to_chat(M, "[bicon(src)] Squeek!") - SEND_SOUND(M, squeak_sound) ..() /mob/living/simple_animal/mouse/death(gibbed) diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index e1e16ef42b2..36ce34094a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -19,7 +19,7 @@ see_in_dark = 5 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/pet/pug/process_ai() +/mob/living/simple_animal/pet/pug/Life() ..() if(!resting && !buckled) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 6ba407c8a90..d1982ac359d 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -30,7 +30,7 @@ status_flags = CANPUSH minbodytemp = 0 see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE death_sound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 5139f187494..299677804e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -1,11 +1,8 @@ - - /mob/living/simple_animal/hostile/carp name = "space carp" desc = "A ferocious, fang-bearing creature that resembles a fish." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -16,7 +13,6 @@ speed = 0 maxHealth = 25 health = 25 - harm_intent_damage = 8 obj_damage = 50 melee_damage_lower = 15 @@ -30,12 +26,27 @@ minbodytemp = 0 maxbodytemp = 1500 - - faction = list("carp") flying = 1 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" + /mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -50,7 +61,6 @@ var/mob/living/carbon/human/H = target H.adjustStaminaLoss(8) - /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" @@ -58,6 +68,8 @@ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID del_on_death = 1 +/mob/living/simple_animal/hostile/carp/holocarp/carp_randomify() + return /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/alienqueen.dmi' @@ -73,4 +85,7 @@ mob_size = MOB_SIZE_LARGE obj_damage = 80 melee_damage_lower = 20 - melee_damage_upper = 20 \ No newline at end of file + melee_damage_upper = 20 + +/mob/living/simple_animal/hostile/carp/megacarp/carp_randomify() + return 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 18219179d40..6795f4ccec2 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -16,7 +16,8 @@ emote_hear = list("chitters") speak_chance = 5 turns_per_move = 5 - see_in_dark = 10 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE butcher_results = list(/obj/item/reagent_containers/food/snacks/spidermeat = 2, /obj/item/reagent_containers/food/snacks/spiderleg = 8) response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 50568fb37d0..1914ef476cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,8 +30,6 @@ var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction - var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) - //typecache of things this mob will attack in DestroySurroundings() if it has environment_smash var/list/environment_target_typecache = list( /obj/machinery/door/window, @@ -66,12 +64,6 @@ walk(src, 0) return 0 -/mob/living/simple_animal/hostile/process_ai() - ..() - if(!AICanContinue()) - return 0 - return 1 - /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) return 0 @@ -83,7 +75,7 @@ DestroySurroundings() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one - AIStatus = AI_IDLE // otherwise we go idle + toggle_ai(AI_IDLE) // otherwise we go idle return 1 /mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) @@ -264,8 +256,8 @@ if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null - if(AIStatus == AI_IDLE) - AIStatus = AI_ON + if(AIStatus != AI_ON && AIStatus != AI_OFF) + toggle_ai(AI_ON) FindTarget() else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one FindTarget() @@ -401,9 +393,43 @@ if(AI_IDLE) if(FindTarget(possible_targets, 1)) . = 1 - AIStatus = AI_ON //Wake up for more than one Life() cycle. + toggle_ai(AI_ON) //Wake up for more than one Life() cycle. else . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) return !FindTarget(possible_targets, 1) + +/mob/living/simple_animal/hostile/consider_wakeup() + ..() + var/list/tlist + var/turf/T = get_turf(src) + + if(!T) + return + + if(!length(SSmobs.clients_by_zlevel[T.z])) // It's fine to use .len here but doesn't compile on 511 + toggle_ai(AI_Z_OFF) + return + + var/cheap_search = isturf(T) && !is_station_level(T.z) + if(cheap_search) + tlist = ListTargetsLazy(T.z) + else + tlist = ListTargets() + + if(AIStatus == AI_IDLE && FindTarget(tlist, 1)) + if(cheap_search) //Try again with full effort + FindTarget() + toggle_ai(AI_ON) + +/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) + . = list() + for(var/I in SSmobs.clients_by_zlevel[_Z]) + var/mob/M = I + if(get_dist(M, src) < vision_range) + if(isturf(M.loc)) + . += M + else if(M.loc.type in hostile_machines) + . += M.loc \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 81b384f56b7..67fb7722198 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -16,7 +16,7 @@ var/throw_message = "bounces off of" var/icon_aggro = null // for swapping to when we get aggressive see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE /mob/living/simple_animal/hostile/asteroid/Aggro() @@ -142,7 +142,7 @@ var/pre_attack = 0 loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) -/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() +/mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() handle_preattack() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm index 7b10c0e828a..184cb9eacb1 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm @@ -2,9 +2,8 @@ /mob/living/simple_animal/hostile/retaliate/carp name = "sea carp" desc = "A large fish bearing similarities to a certain space-faring menace." + icon = 'icons/mob/carp.dmi' icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" icon_gib = "carp_gib" speak_chance = 0 turns_per_move = 5 @@ -15,20 +14,33 @@ speed = 0 maxHealth = 25 health = 25 - retreat_distance = 6 vision_range = 5 - harm_intent_damage = 8 melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") - faction = list("carp") flying = 1 + var/carp_color = "carp" //holder for icon set + var/list/icon_sets = list("carp", "blue", "yellow", "grape", "rust", "teal", "purple") + +/mob/living/simple_animal/hostile/retaliate/carp/Initialize(mapload) + . = ..() + carp_randomify() + update_icons() + +/mob/living/simple_animal/hostile/retaliate/carp/proc/carp_randomify() + if(prob(1)) + carp_color = pick("white", "black") + else + carp_color = pick(icon_sets) + icon_state = "[carp_color]" + icon_living = "[carp_color]" + icon_dead = "[carp_color]_dead" /mob/living/simple_animal/hostile/retaliate/carp/koi name = "space koi" @@ -50,18 +62,17 @@ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE -/mob/living/simple_animal/hostile/retaliate/carp/koi/New() - ..() +/mob/living/simple_animal/hostile/retaliate/carp/koi/Initialize(mapload) + . = ..() var/koinum = rand(1, 4) icon_state = "koi[koinum]" icon_living = "koi[koinum]" icon_dead = "koi[koinum]-dead" - /mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir) return TRUE /mob/living/simple_animal/hostile/retaliate/carp/koi/honk icon_state = "koi5" icon_living = "koi5" - icon_dead = "koi5-dead" \ No newline at end of file + icon_dead = "koi5-dead" diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 829377720c1..3f649eae984 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -33,14 +33,14 @@ animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue. - see_in_dark = 13 + see_in_dark = 8 vision_range = 12 aggro_vision_range = 12 idle_vision_range = 12 search_objects = 1 // So that it can see through walls - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS move_force = MOVE_FORCE_EXTREMELY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG @@ -104,7 +104,7 @@ return null // Check for darkness var/turf/T = get_turf(loc) - if(T && destination && T.lighting_overlay) + if(T && destination && T.lighting_object) if(T.get_lumcount() * 10 < 1 && destination.get_lumcount() * 10 < 1) // No one can see us in the darkness, right? return null if(T == destination) @@ -189,13 +189,6 @@ L.EyeBlind(4) return -/mob/living/simple_animal/hostile/statue/update_sight() - if(!client) - return - if(stat == DEAD) - grant_death_vision() - return - //Toggle Night Vision /obj/effect/proc_holder/spell/targeted/night_vision name = "Toggle Nightvision" @@ -207,15 +200,23 @@ message = "You toggle your night vision!" range = -1 include_user = 1 - var/non_night_vision = SEE_INVISIBLE_LIVING - var/night_vision = SEE_INVISIBLE_OBSERVER_NOLIGHTING /obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) - if(target.see_invisible == non_night_vision) - target.see_invisible = night_vision - else - target.see_invisible = non_night_vision + switch(target.lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + name = "Toggle Nightvision \[More]" + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + name = "Toggle Nightvision \[Full]" + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + target.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + name = "Toggle Nightvision \[OFF]" + else + target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + name = "Toggle Nightvision \[ON]" + target.update_sight() /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 39c03feb928..f73ee07441a 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -94,9 +94,8 @@ var/global/list/ts_spiderling_list = list() // Vision idle_vision_range = 10 aggro_vision_range = 10 - see_in_dark = 10 - nightvision = 1 - see_invisible = 5 + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_MOBS // AI aggression settings diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b4019cff988..3799daacb63 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -80,10 +80,14 @@ var/deathmessage = "" var/death_sound = null //The sound played on death + var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) + var/can_have_ai = TRUE //once we have become sentient, we can never go back + var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. + /mob/living/simple_animal/Initialize() ..() - GLOB.simple_animal_list += src + GLOB.simple_animals[AIStatus] += src verbs -= /mob/verb/observe if(!can_hide) verbs -= /mob/living/simple_animal/verb/hide @@ -97,7 +101,18 @@ collar.forceMove(loc) collar = null master_commander = null - GLOB.simple_animal_list -= src + GLOB.simple_animals[AIStatus] -= src + if(SSnpcpool.state == SS_PAUSED && LAZYLEN(SSnpcpool.currentrun)) + SSnpcpool.currentrun -= src + + if(nest) + nest.spawned_mobs -= src + nest = null + + var/turf/T = get_turf(src) + if (T && AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + return ..() /mob/living/simple_animal/Login() @@ -111,12 +126,6 @@ health = Clamp(health, 0, maxHealth) med_hud_set_status() - -/mob/living/simple_animal/proc/process_ai() - handle_automated_movement() - handle_automated_action() - handle_automated_speech() - /mob/living/simple_animal/lay_down() ..() handle_resting_state_icons() @@ -534,8 +543,8 @@ W.forceMove(src) W.equipped(src, slot) - W.layer = 20 - W.plane = HUD_PLANE + W.layer = ABOVE_HUD_LAYER + W.plane = ABOVE_HUD_PLANE switch(slot) if(slot_collar) @@ -562,11 +571,59 @@ /* End Inventory */ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion + toggle_ai(AI_OFF) + can_have_ai = FALSE return +/mob/living/simple_animal/can_hear() + . = TRUE + +/mob/living/simple_animal/proc/consider_wakeup() + if(pulledby || shouldwakeup) + toggle_ai(AI_ON) + +/mob/living/simple_animal/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(!ckey && !stat)//Not unconscious + if(AIStatus == AI_IDLE) + toggle_ai(AI_ON) + +/mob/living/simple_animal/proc/toggle_ai(togglestatus) + if(!can_have_ai && (togglestatus != AI_OFF)) + return + if(AIStatus != togglestatus) + if(togglestatus > 0 && togglestatus < 5) + if(togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF) + var/turf/T = get_turf(src) + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + else + SSidlenpcpool.idle_mobs_by_zlevel[T.z] += src + GLOB.simple_animals[AIStatus] -= src + GLOB.simple_animals[togglestatus] += src + AIStatus = togglestatus + else + stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") + +/mob/living/simple_animal/onTransitZ(old_z, new_z) + ..() + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src + toggle_ai(initial(AIStatus)) + +// Simple animals will not be given night vision upon death, as that would result in issues when they are revived. +/mob/living/simple_animal/grant_death_vision() + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_OBSERVER + sync_lighting_plane_alpha() + /mob/living/simple_animal/update_sight() if(!client) return + if(stat == DEAD) grant_death_vision() return @@ -580,5 +637,5 @@ if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return -/mob/living/simple_animal/can_hear() - . = TRUE \ No newline at end of file + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 7a17dfb202b..686a20cee36 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -29,7 +29,7 @@ spawned_mobs = null return ..() -/mob/living/simple_animal/hostile/spawner/process_ai() +/mob/living/simple_animal/hostile/spawner/Life() ..() spawn_mob() diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index bec41f68698..39357533abb 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -93,9 +93,9 @@ density = !lying if(lying) if(layer == initial(layer)) - layer = MOB_LAYER - 0.2 + layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else - if(layer == MOB_LAYER - 0.2) + if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 0a1346fd0ed..f5f1924e395 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -70,5 +70,4 @@ AA.display_to(list(src)) update_client_colour(0) - - callHook("mob_login", list("client" = client, "mob" = src)) + update_morgue() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index f409d184340..376b8d46ea5 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -6,7 +6,7 @@ create_attack_log("Logged out at [atom_loc_line(get_turf(src))]") // `holder` is nil'd out by now, so we check the `admin_datums` array directly //Only report this stuff if we are currently playing. - if(admin_datums[ckey] && ticker && ticker.current_state == GAME_STATE_PLAYING) + if(admin_datums[ckey] && SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/datum/admins/temp_admin = admin_datums[ckey] // Triggers on people with banhammer power only - no mentors tripping the alarm if(temp_admin.rights & R_BAN) @@ -16,5 +16,5 @@ send2irc(config.admin_notify_irc, "[key_name(src)] logged out - No active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.") ..() - callHook("mob_logout", list("client" = client, "mob" = src)) + update_morgue() return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 482bf85491d..e7ea036fed1 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -745,7 +745,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "Respawning is disabled.") return - if(stat != DEAD || !ticker) + if(stat != DEAD || !SSticker) to_chat(usr, "You must be dead to use this!") return @@ -930,7 +930,7 @@ var/list/slot_equipment_priority = list( \ // They should be in a cell or the Brig portion of the shuttle. var/area/A = loc.loc - if(!istype(A, /area/security/prison) && !istype(A, /area/prison)) + if(!istype(A, /area/security/prison)) if(!istype(A, /area/shuttle/escape) || loc.name != "Brig floor") return 0 @@ -981,6 +981,7 @@ var/list/slot_equipment_priority = list( \ stat("CPU:", "[world.cpu]") stat("Instances:", "[num2text(world.contents.len, 10)]") GLOB.stat_entry() + stat("Server Time:", time_stamp()) stat(null) if(Master) Master.stat_entry() @@ -1100,7 +1101,7 @@ var/list/slot_equipment_priority = list( \ to_chat(usr, "You are banned from playing as sentient animals.") return - if(!ticker || ticker.current_state < 3) + if(!SSticker || SSticker.current_state < 3) to_chat(src, "You can't respawn as an NPC before the game starts!") return @@ -1346,3 +1347,13 @@ var/list/slot_equipment_priority = list( \ /mob/proc/is_literate() return FALSE + +/mob/proc/update_sight() + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) + sync_lighting_plane_alpha() + +/mob/proc/sync_lighting_plane_alpha() + if(hud_used) + var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] + if (L) + L.alpha = lighting_alpha \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3e9ff0b7ba6..60a3637166a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -1,6 +1,6 @@ /mob density = 1 - layer = 4.0 + layer = MOB_LAYER animate_movement = 2 pressure_resistance = 8 dont_save = TRUE //to avoid it messing up in buildmode saving @@ -83,7 +83,6 @@ var/obj/item/clothing/mask/wear_mask = null//Carbon var/seer = 0 //for cult//Carbon, probably Human - var/see_override = 0 var/datum/hud/hud_used = null @@ -93,7 +92,7 @@ var/list/grabbed_by = list() var/list/requests = list() - + var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/list/mapobjs = list() var/in_throw_mode = 0 @@ -177,7 +176,7 @@ var/player_ghosted = 0 var/turf/listed_turf = null //the current turf being examined in the stat panel - var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes + var/list/shouldnt_see = list(/atom/movable/lighting_object) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes var/kills = 0 @@ -196,9 +195,11 @@ var/list/permanent_huds = list() var/list/actions = list() + var/list/datum/action/chameleon_item_actions var/list/progressbars = null //for stacking do_after bars var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs var/forced_look = null // This can either be a numerical direction or a soft object reference (UID). It makes the mob always face towards the selected thing. + var/registered_z \ No newline at end of file diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 93941d6e7d2..077164be6b7 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -214,12 +214,12 @@ shift = -10 adir = assailant.dir affecting.setDir(assailant.dir) - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) if(GRAB_KILL) shift = 0 adir = 1 affecting.setDir(SOUTH)//face up - affecting.loc = assailant.loc + affecting.forceMove(assailant.loc) switch(adir) if(NORTH) @@ -387,15 +387,24 @@ if(M == assailant && state >= GRAB_AGGRESSIVE) //no eatin unless you have an agressive grab if(checkvalid(user, affecting)) //wut var/mob/living/carbon/attacker = user + + if(affecting.buckled) + to_chat(user, "[affecting] is buckled!") + return + user.visible_message("[user] is attempting to devour \the [affecting]!") if(!do_after(user, checktime(user, affecting), target = affecting)) return + if(affecting.buckled) + to_chat(user, "[affecting] is buckled!") + return + user.visible_message("[user] devours \the [affecting]!") if(affecting.mind) add_attack_logs(attacker, affecting, "Devoured") - affecting.loc = user + affecting.forceMove(user) attacker.stomach_contents.Add(affecting) qdel(src) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 1c7b06b1ce1..d8e6a239a9a 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -14,21 +14,16 @@ loc = locate(1,1,1) lastarea = loc + client.screen = list() // Remove HUD items just in case. + client.images = list() + if(!hud_used) + create_mob_hud() + if(hud_used) + hud_used.show_hud(hud_used.hud_version) + sight |= SEE_TURFS GLOB.player_list |= src -/* - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in GLOB.landmarks_list) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) -*/ - - callHook("mob_login", list("client" = client, "mob" = src)) - new_player_panel() spawn(30) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a46b9a94fc7..f0b6c0a5d7a 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -59,7 +59,7 @@ real_name = "Random Character Slot" var/output = "

Setup Character
[real_name]

" - if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) + if(!SSticker || SSticker.current_state <= GAME_STATE_PREGAME) if(!ready) output += "

Declare Ready

" else output += "

You are ready (Cancel)

" else @@ -106,21 +106,21 @@ /mob/new_player/Stat() statpanel("Lobby") - if(client.statpanel=="Lobby" && ticker) - if(ticker.hide_mode) + if(client.statpanel=="Lobby" && SSticker) + if(SSticker.hide_mode) stat("Game Mode:", "Secret") else - if(ticker.hide_mode == 0) + if(SSticker.hide_mode == 0) stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode else stat("Game Mode: ", "Secret") - if((ticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", ticker.pregame_timeleft) - if((ticker.current_state == GAME_STATE_PREGAME) && !going) + if((SSticker.current_state == GAME_STATE_PREGAME) && going) + stat("Time To Start:", round(SSticker.pregame_timeleft/10)) + if((SSticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) stat("Players:", "[totalPlayers]") if(check_rights(R_ADMIN, 0, src)) stat("Players Ready:", "[totalPlayersReady]") @@ -136,7 +136,7 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && ticker) + if(client.statpanel == "Status" && SSticker) show_stat_station_time() @@ -193,7 +193,7 @@ close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") to_chat(src, "Now teleporting.") - observer.loc = O.loc + observer.forceMove(O.loc) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) observer.icon = client.prefs.preview_icon @@ -217,7 +217,7 @@ if(!tos_consent) to_chat(usr, "You must consent to the terms of service before you can join!") return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return @@ -303,7 +303,7 @@ /mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at) if(src != usr) return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return 0 if(!enter_allowed) @@ -330,7 +330,7 @@ ai_character.moveToEmptyCore() AnnounceCyborg(ai_character, rank, "has been downloaded to the empty core in \the [get_area(ai_character)]") - ticker.mode.latespawn(ai_character) + SSticker.mode.latespawn(ai_character) qdel(src) return @@ -344,44 +344,40 @@ else if(IsSyndicateCommand(rank)) character.loc = pick(syndicateofficer) else - character.loc = pick(aroomwarp) + character.forceMove(pick(aroomwarp)) join_message = "has arrived" else if(spawning_at) S = spawntypes[spawning_at] if(S && istype(S)) if(S.check_job_spawning(rank)) - character.loc = pick(S.turfs) + character.forceMove(pick(S.turfs)) join_message = S.msg else to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" else - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" character.lastarea = get_area(loc) // Moving wheelchair if they have one if(character.buckled && istype(character.buckled, /obj/structure/chair/wheelchair)) - character.buckled.loc = character.loc + character.buckled.forceMove(character.loc) character.buckled.dir = character.dir character = SSjobs.EquipRank(character, rank, 1) //equips the human EquipCustomItems(character) - ticker.mode.latespawn(character) + SSticker.mode.latespawn(character) if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) - callHook("latespawn", list(character)) - else if(IsAdminJob(rank)) - callHook("latespawn", list(character)) else data_core.manifest_inject(character) - ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn AnnounceArrival(character, rank, join_message) - callHook("latespawn", list(character)) AddEmploymentContract(character) if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs) @@ -390,7 +386,7 @@ /mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -422,7 +418,7 @@ employmentCabinet.addFile(employee) /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -464,8 +460,7 @@ dat += " [a.title].

" - dat += "Choose from the following open positions:

" - + var/num_jobs_available = 0 var/list/activePlayers = list() var/list/categorizedJobs = list( "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"), @@ -480,6 +475,7 @@ ) for(var/datum/job/job in SSjobs.occupations) if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client)) + num_jobs_available++ activePlayers[job] = 0 var/categorized = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active @@ -502,23 +498,27 @@ if(!categorized) categorizedJobs["Miscellaneous"]["jobs"] += job - dat += "
" - for(var/jobcat in categorizedJobs) - if(categorizedJobs[jobcat]["colBreak"]) - dat += "" - if(length(categorizedJobs[jobcat]["jobs"]) < 1) - continue - var/color = categorizedJobs[jobcat]["color"] - dat += "
" - dat += "[jobcat]" - for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - if(job in SSjobs.prioritized_jobs) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - else - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - dat += "

" + if(num_jobs_available) + dat += "Choose from the following open positions:

" + dat += "
" + for(var/jobcat in categorizedJobs) + if(categorizedJobs[jobcat]["colBreak"]) + dat += "" + if(length(categorizedJobs[jobcat]["jobs"]) < 1) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
" + dat += "[jobcat]" + for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) + if(job in SSjobs.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + dat += "

" - dat += "
" + dat += "
" + else + dat += "

Unfortunately, there are no job slots free currently.
Wait a few minutes, then try again.
Or, try observing the round.
" // Removing the old window method but leaving it here for reference // src << browse(dat, "window=latechoices;size=300x640;can_close=1") // Added the new browser window method @@ -536,7 +536,7 @@ var/mob/living/carbon/human/new_character = new(loc) new_character.lastarea = get_area(loc) - if(ticker.random_players || appearance_isbanned(new_character)) + if(SSticker.random_players || appearance_isbanned(new_character)) client.prefs.random_character() client.prefs.real_name = random_name(client.prefs.gender) client.prefs.copy_to(new_character) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d3a8765cf86..00e5c1550d9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -94,8 +94,6 @@ if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. - callHook("borgify", list(O)) - O.update_pipe_vision() O.Namepick() diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 81d5fb03823..31bb8733463 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -263,8 +263,6 @@ modify.assignment = t1 modify.rank = t1 - callHook("reassign_employee", list(modify)) - if("PRG_reg") if(is_authenticated(usr)) var/temp_name = reject_bad_name(href_list["reg"]) @@ -337,7 +335,6 @@ SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name) modify.assignment = "Terminated" modify.access = list() - callHook("terminate_employee", list(modify)) if("PRG_make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 910ccbc953c..bfc87e0104c 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -6,7 +6,7 @@ Contents: */ -/obj/item/clothing/mask/gas/voice/space_ninja +/obj/item/clothing/mask/gas/space_ninja name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" @@ -19,3 +19,13 @@ Contents: "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) + + var/obj/item/voice_changer/voice_changer + +/obj/item/clothing/mask/gas/space_ninja/Initialize(mapload) + . = ..() + voice_changer = new(src) + +/obj/item/clothing/mask/gas/space_ninja/Destroy() + QDEL_NULL(voice_changer) + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f03a08d237a..dfd430a5754 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -24,7 +24,7 @@ Contents: var/obj/item/clothing/head/helmet/space/space_ninja/suitHood var/obj/item/clothing/gloves/space_ninja/suitGloves var/obj/item/clothing/shoes/space_ninja/suitShoes - var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask + var/obj/item/clothing/mask/gas/space_ninja/suitMask var/mob/living/carbon/human/suitOccupant /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) @@ -41,7 +41,7 @@ Contents: if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") return 0 - if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") return 0 diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index c40cb1667ad..0adec3f6baa 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -334,15 +334,15 @@ else if(h_user.l_store == src) h_user.unEquip(src) B.loc = h_user - B.layer = 20 - B.plane = HUD_PLANE + B.layer = ABOVE_HUD_LAYER + B.plane = ABOVE_HUD_PLANE h_user.l_store = B h_user.update_inv_pockets() else if(h_user.r_store == src) h_user.unEquip(src) B.loc = h_user - B.layer = 20 - B.plane = HUD_PLANE + B.layer = ABOVE_HUD_LAYER + B.plane = ABOVE_HUD_PLANE h_user.r_store = B h_user.update_inv_pockets() else if(h_user.head == src) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index af28e221eb8..de3f2ad52d6 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -325,9 +325,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s to_chat(user, "[pictures_left] photos left.") icon_state = icon_off on = 0 - if(user.mind && !(user.mind.assigned_role == "Chaplain")) - if(prob(24)) - handle_haunt(user) + if(istype(src,/obj/item/camera/spooky)) + if(user.mind && user.mind.assigned_role == "Chaplain" && see_ghosts) + if(prob(24)) + handle_haunt(user) spawn(64) icon_state = icon_on on = 1 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 8e78f0ce230..8c24cc55c9d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -92,27 +92,3 @@ icon_state = "stamp-syndicate" item_color = "syndicate" -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() - - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from - - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - - if(user && src in user.contents) - - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index de2414da743..a66e72d17a3 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -392,7 +392,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animals) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5cf1d5efbe3..a1f4c3b8e89 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -35,7 +35,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" var/d1 = 0 var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + layer = WIRE_LAYER //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 color = COLOR_RED /obj/structure/cable/yellow diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index e15c727accb..53ab45c58dc 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -25,8 +25,8 @@ /obj/singularity/narsie/large/New() ..() - icon_state = ticker.cultdat.entity_icon_state - name = ticker.cultdat.entity_name + icon_state = SSticker.cultdat.entity_icon_state + name = SSticker.cultdat.entity_name to_chat(world, " [name] HAS RISEN") world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg')) @@ -127,12 +127,12 @@ /obj/singularity/narsie/proc/acquire(var/mob/food) if(food == target) return - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HAS LOST INTEREST IN YOU") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HAS LOST INTEREST IN YOU") target = food if(ishuman(target)) - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HUNGERS FOR YOUR SOUL") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HUNGERS FOR YOUR SOUL") else - to_chat(target, "[uppertext(ticker.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL") + to_chat(target, "[uppertext(SSticker.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL") //Wizard narsie /obj/singularity/narsie/wizard diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 6c9ecb55afc..7ebc4f4471a 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -198,7 +198,7 @@ return 0 /obj/machinery/power/smes/Destroy() - if(ticker && ticker.current_state == GAME_STATE_PLAYING) + if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/area/area = get_area(src) if(area) message_admins("SMES deleted at ([area.name])") diff --git a/code/modules/reagents/chemistry/reagents/blob.dm b/code/modules/reagents/chemistry/reagents/blob.dm index 1dcd414b702..bca2cbd9067 100644 --- a/code/modules/reagents/chemistry/reagents/blob.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -56,7 +56,8 @@ volume = ..() M.apply_damage(0.6*volume, TOX) M.hallucination += 0.6*volume - M.reagents.add_reagent("spore", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("spore", 0.4*volume) /datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute name = "Lexorin Jelly" @@ -102,7 +103,8 @@ volume = ..() M.apply_damage(0.4*volume, BURN) M.adjustStaminaLoss(0.4*volume) - M.reagents.add_reagent("frostoil", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("frostoil", 0.4*volume) /datum/reagent/blob/b_sorium name = "Sorium" diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index b50ed09a27c..850df4f2382 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -178,7 +178,7 @@ /datum/reagent/consumable/drink/banana/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -194,7 +194,7 @@ /datum/reagent/consumable/drink/nothing/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(ishuman(M) && M.job in list("Mime")) + if(ishuman(M) && M.mind && M.mind.miming) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags @@ -402,7 +402,7 @@ /datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if((ishuman(M) && M.job in list("Clown") ) || issmall(M)) + if((ishuman(M) && COMIC in M.mutations) || issmall(M)) update_flags |= M.adjustBruteLoss(-1, FALSE) update_flags |= M.adjustFireLoss(-1, FALSE) return ..() | update_flags diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index 9d786dd0713..9e96ed5b56b 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -604,6 +604,32 @@ M.emote("laugh") return list(effect, update_flags) +/datum/reagent/rotatium //Rotatium. Fucks up your rotation and is hilarious + name = "Rotatium" + id = "rotatium" + description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." + reagent_state = LIQUID + color = "#AC88CA" //RGB: 172, 136, 202 + metabolization_rate = 0.6 * REAGENTS_METABOLISM + taste_message = "spinning" + +/datum/reagent/rotatium/on_mob_life(mob/living/carbon/M) + if(M.hud_used) + if(current_cycle >= 20 && current_cycle % 20 == 0) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + var/rotation = min(round(current_cycle / 20), 89) // By this point the player is probably puking and quitting anyway + for(var/whole_screen in screens) + animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1) + animate(transform = matrix(-rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING) + return ..() + +/datum/reagent/rotatium/on_mob_delete(mob/living/M) + if(M && M.hud_used) + var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"]) + for(var/whole_screen in screens) + animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING) + ..() + ////////////////////////////// // Synth-Drugs // ////////////////////////////// diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index bf2417a192e..a67f681973d 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -9,7 +9,7 @@ var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN /datum/reagent/consumable/on_mob_life(mob/living/M) - if(!(M.mind in ticker.mode.vampires)) + if(!(M.mind in SSticker.mode.vampires)) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients @@ -27,7 +27,7 @@ /datum/reagent/consumable/nutriment/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - if(!(M.mind in ticker.mode.vampires)) + if(!(M.mind in SSticker.mode.vampires)) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index dcd21f639d1..57f8b96b787 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -109,7 +109,7 @@ if(!(istype(B) && B.off_floor)) qdel(O) else - if(!istype(O, /atom/movable/lighting_overlay)) + if(!istype(O, /atom/movable/lighting_object)) O.color = initial(O.color) O.clean_blood() @@ -326,14 +326,14 @@ if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds M.AdjustConfused(3) if(isvampirethrall(M)) - ticker.mode.remove_vampire_mind(M.mind) + SSticker.mode.remove_vampire_mind(M.mind) holder.remove_reagent(id, volume) M.SetJitter(0) M.SetStuttering(0) M.SetConfused(0) return if(iscultist(M)) - ticker.mode.remove_cultist(M.mind) + SSticker.mode.remove_cultist(M.mind) holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.SetJitter(0) M.SetStuttering(0) diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index cdc10bcbcc5..99f33d625a6 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -174,4 +174,11 @@ required_reagents = list("formaldehyde" = 1, "sodium" = 1, "chlorine" = 1, "lithium" = 1) result_amount = 4 mix_message = "The mixture thins and loses all color." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' \ No newline at end of file + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' + +/datum/chemical_reaction/rotatium + name = "Rotatium" + id = "Rotatium" + result = "rotatium" + required_reagents = list("lsd" = 1, "teslium" = 1, "methamphetamine" = 1) + mix_message = "After sparks, fire, and the smell of LSD, the mix is constantly spinning with no stop in sight." \ No newline at end of file diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ef002caa1ec..6413765c99c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -680,7 +680,7 @@ dir = 0 // dir will contain dominant direction for junction pipes var/health = 10 // health points 0-10 armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100) - layer = 2.3 // slightly lower than wires and other pipes + layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map // new pipe, set the icon_state as on map diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index 0bac5824780..2a86d4a4a54 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -21,11 +21,11 @@ var/ert_request_answered = FALSE if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) to_chat(usr, "The round hasn't started yet!") return @@ -164,9 +164,9 @@ var/ert_request_answered = FALSE M.mind.original = M M.mind.assigned_role = SPECIAL_ROLE_ERT M.mind.special_role = SPECIAL_ROLE_ERT - if(!(M.mind in ticker.minds)) - ticker.minds += M.mind //Adds them to regular mind list. - ticker.mode.ert += M.mind + if(!(M.mind in SSticker.minds)) + SSticker.minds += M.mind //Adds them to regular mind list. + SSticker.mode.ert += M.mind M.forceMove(spawn_location) SSjobs.CreateMoneyAccount(M, class, null) diff --git a/code/modules/ruins/ruin_areas.dm b/code/modules/ruins/ruin_areas.dm index fc51dcc0155..0304f36156e 100644 --- a/code/modules/ruins/ruin_areas.dm +++ b/code/modules/ruins/ruin_areas.dm @@ -3,18 +3,18 @@ /area/ruin/ name = "\improper Unexplored Location" icon_state = "away" - has_gravity = 1 - there_can_be_many = 1 - + has_gravity = TRUE + there_can_be_many = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/ruin/unpowered - always_unpowered = 0 + always_unpowered = FALSE /area/ruin/unpowered/no_grav - has_gravity = 0 + has_gravity = FALSE /area/ruin/powered - requires_power = 0 + requires_power = FALSE diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 3f074c1246c..834d3ddc907 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -183,7 +183,7 @@ trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. /obj/machinery/keycard_auth/proc/is_ert_blocked() - return ticker.mode && ticker.mode.ert_disabled + return SSticker.mode && SSticker.mode.ert_disabled var/global/maint_all_access = 0 var/global/station_all_access = 0 diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index feff384ed87..4ef9cfc55b0 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -291,6 +291,8 @@ /mob/camera/aiEye/remote/shuttle_docker/update_remote_sight(mob/living/user) user.sight = SEE_TURFS + + ..() return TRUE /datum/action/innate/shuttledocker_rotate diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 44edebdca50..67765ef8ac5 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -1,12 +1,12 @@ // Shuttle on-movement // -/atom/movable/proc/onShuttleMove(turf/T1, rotation) - if(rotation) - shuttleRotate(rotation) - forceMove(T1) - return 1 - -/atom/movable/lighting_overlay/onShuttleMove() - return 0 +/atom/movable/proc/onShuttleMove(turf/oldT, turf/T1, rotation) + var/turf/newT = get_turf(src) + if(newT.z != oldT.z) + onTransitZ(oldT.z, newT.z) + if(rotation) + shuttleRotate(rotation) + forceMove(T1) + return 1 /obj/effect/landmark/shuttle_import/onShuttleMove() // Used for marking where to preview/load shuttles @@ -57,4 +57,5 @@ /obj/machinery/door/airlock/postDock(obj/docking_port/stationary/S1) . = ..() if(!S1.lock_shuttle_doors && id_tag == "s_docking_airlock") - INVOKE_ASYNC(src, .proc/unlock) \ No newline at end of file + INVOKE_ASYNC(src, .proc/unlock) + diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 06e0c2336f0..c72b0896893 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -442,11 +442,6 @@ if(canMove()) return -1 - -// //rotate transit docking ports, so we don't need zillions of variants -// if(istype(S1, /obj/docking_port/stationary/transit)) -// S1.dir = turn(NORTH, -travelDir) - var/obj/docking_port/stationary/S0 = get_docked() var/turf_type = /turf/space var/area_type = /area/space @@ -467,8 +462,6 @@ rotation += (rotation % 90) //diagonal rotations not allowed, round up rotation = SimplifyDegrees(rotation) - - //remove area surrounding docking port if(areaInstance.contents.len) var/area/A0 = locate("[area_type]") @@ -501,15 +494,17 @@ //move mobile to new location for(var/atom/movable/AM in T0) - AM.onShuttleMove(T1, rotation) + AM.onShuttleMove(T0, T1, rotation) if(rotation) T1.shuttleRotate(rotation) - //lighting stuff + //atmos and lighting stuff SSair.remove_from_active(T1) T1.CalculateAdjacentTurfs() SSair.add_to_active(T1,1) + + T1.lighting_build_overlay() T0.ChangeTurf(turf_type) @@ -868,12 +863,27 @@ possible_destinations = "science_home;science_away" /obj/machinery/computer/shuttle/admin - name = "Administration Shuttle Console" - desc = "Used to call and send the administration shuttle." + name = "admin shuttle console" + req_access = list(access_cent_general) shuttleId = "admin" - possible_destinations = "admin_home;admin_away" + possible_destinations = "admin_home;admin_away;admin_custom" resistance_flags = INDESTRUCTIBLE +/obj/machinery/computer/camera_advanced/shuttle_docker/admin + name = "Admin shuttle navigation computer" + desc = "Used to designate a precise transit location for the admin shuttle." + icon_screen = "navigation" + icon_keyboard = "med_key" + shuttleId = "admin" + shuttlePortId = "admin_custom" + view_range = 14 + x_offset = 0 + y_offset = 0 + resistance_flags = INDESTRUCTIBLE + access_tcomms = TRUE + access_construction = TRUE + access_mining = TRUE + /obj/machinery/computer/shuttle/trade name = "Freighter Console" resistance_flags = INDESTRUCTIBLE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index f48906fd1f3..28cb96b128b 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -58,7 +58,7 @@ var/contcount for(var/atom/A in T.contents) - if(istype(A,/atom/movable/lighting_overlay)) + if(istype(A,/atom/movable/lighting_object)) continue if(istype(A,/obj/machinery/light)) continue //hacky but whatever, shuttles need three spots each for this shit @@ -750,18 +750,6 @@ frequency.post_signal(src, status_signal) -/********** - MISC - **********/ -/area/supply/station - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - -/area/supply/dock - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 #undef ORDER_SCREEN_WIDTH #undef ORDER_SCREEN_HEIGHT diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 0a40901059f..0ec9e614110 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -42,7 +42,7 @@ ..() /obj/machinery/computer/shuttle/sst - name = "Syndicate Strike Time Shuttle Console" + name = "Syndicate Strike Team Shuttle Console" desc = "Used to call and send the SST shuttle." icon_keyboard = "syndie_key" icon_screen = "syndishuttle" diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 0efe2043ab0..4c945921389 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -13,7 +13,7 @@ /datum/station_goal/dna_vault/New() ..() animal_count = rand(15, 20) //might be too few given ~15 roundstart stationside ones - human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population. + human_count = rand(round(0.75 * SSticker.mode.num_players_started()), SSticker.mode.num_players_started()) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants)) @@ -166,8 +166,8 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ F.parent = src fillers += F - if(ticker.mode) - for(var/datum/station_goal/dna_vault/G in ticker.mode.station_goals) + if(SSticker.mode) + for(var/datum/station_goal/dna_vault/G in SSticker.mode.station_goals) animals_max = G.animal_count plants_max = G.plant_count dna_max = G.human_count diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 09ccb3ce36b..68977b5e14d 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -83,7 +83,7 @@ )) data["notice"] = notice - var/datum/station_goal/station_shield/G = locate() in ticker.mode.station_goals + var/datum/station_goal/station_shield/G = locate() in SSticker.mode.station_goals if(G) data["meteor_shield"] = 1 data["meteor_shield_coverage"] = G.get_coverage() diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 754e09b4185..90d4defa26c 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -33,7 +33,7 @@ to_chat(world, "Station Goal : [name] : Failed!") /datum/station_goal/Destroy() - ticker.mode.station_goals -= src + SSticker.mode.station_goals -= src . = ..() /datum/station_goal/Topic(href, href_list) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index da559d38d5f..463911861c2 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -8,8 +8,10 @@ w_class = WEIGHT_CLASS_TINY var/vision_flags = 0 - var/dark_view = 0 + var/see_in_dark = 0 var/see_invisible = 0 + var/lighting_alpha + var/eye_colour = "#000000" var/old_eye_colour = "#000000" var/flash_protect = 0 @@ -54,7 +56,7 @@ implant_color = "#AEFF00" origin_tech = "materials=4;engineering=4;biotech=4;magnets=4" vision_flags = SEE_TURFS - see_invisible = SEE_INVISIBLE_MINIMUM + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE aug_message = "Suddenly, you realize how much of a mess the station really is..." /obj/item/organ/internal/cyberimp/eyes/xray @@ -63,8 +65,8 @@ implant_color = "#000000" origin_tech = "materials=4;programming=4;biotech=6;magnets=4" vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - dark_view = 8 - see_invisible = SEE_INVISIBLE_MINIMUM + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE /obj/item/organ/internal/cyberimp/eyes/thermals name = "Thermals implant" @@ -72,6 +74,7 @@ eye_colour = "#FFCC00" implant_color = "#FFCC00" vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE flash_protect = -1 origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" aug_message = "You see prey everywhere you look..." diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 73d54003fc5..71a06d8e013 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -256,9 +256,17 @@ origin_tech = "materials=5;programming=4;biotech=4" slot = "heartdrive" var/revive_cost = 0 - var/reviving = 0 + var/reviving = FALSE var/cooldown = 0 +/obj/item/organ/internal/cyberimp/chest/reviver/hardened + name = "Hardened reviver implant" + emp_proof = TRUE + +/obj/item/organ/internal/cyberimp/chest/reviver/hardened/Initialize(mapload) + . = ..() + desc += " The implant has been hardened. It is invulnerable to EMPs." + /obj/item/organ/internal/cyberimp/chest/reviver/on_life() if(reviving) if(owner.stat == UNCONSCIOUS && (owner.sleeping == 0)) //!owner.sleeping didn't work for whatever dumb reason @@ -320,7 +328,7 @@ /obj/item/storage/box/cyber_implants/bundle name = "boxed cybernetic implants" var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals, - /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver) + /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver/hardened) var/amount = 5 /obj/item/storage/box/cyber_implants/bundle/New() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 51d73fc9873..fba2df57e8a 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -10,9 +10,13 @@ var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white. var/list/replace_colours = LIST_GREYSCALE_REPLACE var/dependent_disabilities = null //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation. - var/dark_view = 2 //Default dark_view for Humans. var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will. + var/vision_flags = 0 + var/see_in_dark = 2 + var/see_invisible = SEE_INVISIBLE_LIVING + var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + /obj/item/organ/internal/eyes/proc/update_colour() dna.write_eyes_attributes(src) @@ -31,11 +35,8 @@ else return colourmatrix -/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life(). - return dark_view - /obj/item/organ/internal/eyes/proc/shine() - if(is_robotic() || (dark_view > EYE_SHINE_THRESHOLD)) + if(is_robotic() || (see_in_dark > EYE_SHINE_THRESHOLD)) return TRUE /obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0) @@ -70,7 +71,7 @@ colourmatrix = null ..() //Make sure the organ's got the robotic status indicators before updating the client colour. if(owner) - owner.update_client_colour(0) //Since mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine. + owner.update_client_colour(0) //Since mechanical eyes give see_in_dark of 2 and full colour vision atm, just having this here is fine. /obj/item/organ/internal/eyes/cybernetic name = "cybernetic eyes" diff --git a/code/modules/surgery/organs/subtypes/abductor.dm b/code/modules/surgery/organs/subtypes/abductor.dm index fd57464381a..b499135417e 100644 --- a/code/modules/surgery/organs/subtypes/abductor.dm +++ b/code/modules/surgery/organs/subtypes/abductor.dm @@ -4,4 +4,4 @@ /obj/item/organ/internal/eyes/abductor name = "abductor eyeballs" - dark_view = 3 \ No newline at end of file + see_in_dark = 3 \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm index e457c4cddaa..49b11d096b6 100644 --- a/code/modules/surgery/organs/subtypes/drask.dm +++ b/code/modules/surgery/organs/subtypes/drask.dm @@ -26,4 +26,4 @@ name = "drask eyeballs" icon = 'icons/obj/species_organs/drask.dmi' desc = "Drask eyes. They look even stranger disembodied" - dark_view = 5 \ No newline at end of file + see_in_dark = 5 \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm index 3e7598fa06f..6e4a0e3eafd 100644 --- a/code/modules/surgery/organs/subtypes/grey.dm +++ b/code/modules/surgery/organs/subtypes/grey.dm @@ -23,7 +23,7 @@ name = "grey eyeballs" desc = "They still look creepy and emotionless" icon = 'icons/obj/species_organs/grey.dmi' - dark_view = 5 + see_in_dark = 5 /obj/item/organ/internal/heart/grey name = "grey heart" diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm index 26a0bc50577..56bec1a4a7e 100644 --- a/code/modules/surgery/organs/subtypes/shadow.dm +++ b/code/modules/surgery/organs/subtypes/shadow.dm @@ -1,3 +1,3 @@ /obj/item/organ/internal/eyes/shadow name = "dark orbs" - dark_view = 8 \ No newline at end of file + see_in_dark = 8 \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm index d6202a377e6..99598a80fb1 100644 --- a/code/modules/surgery/organs/subtypes/tajaran.dm +++ b/code/modules/surgery/organs/subtypes/tajaran.dm @@ -8,12 +8,12 @@ name = "tajaran eyeballs" colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. replace_colours = LIST_TAJ_REPLACE - dark_view = 8 + see_in_dark = 8 /obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness. name = "farwa eyeballs" colourmatrix = MATRIX_TAJ_CBLIND - dark_view = 8 + see_in_dark = 8 replace_colours = LIST_TAJ_REPLACE /obj/item/organ/internal/heart/tajaran diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm index 26ad86d4700..a612bc7f253 100644 --- a/code/modules/surgery/organs/subtypes/unathi.dm +++ b/code/modules/surgery/organs/subtypes/unathi.dm @@ -7,7 +7,7 @@ /obj/item/organ/internal/eyes/unathi name = "unathi eyeballs" icon = 'icons/obj/species_organs/unathi.dmi' - dark_view = 3 + see_in_dark = 3 /obj/item/organ/internal/heart/unathi name = "unathi heart" diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm index 2c583c8f84a..820b152c43f 100644 --- a/code/modules/surgery/organs/subtypes/vulpkanin.dm +++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm @@ -8,12 +8,12 @@ icon = 'icons/obj/species_organs/vulpkanin.dmi' colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. replace_colours = LIST_VULP_REPLACE - dark_view = 8 + see_in_dark = 8 /obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness. name = "wolpin eyeballs" colourmatrix = MATRIX_VULP_CBLIND - dark_view = 8 + see_in_dark = 8 replace_colours = LIST_VULP_REPLACE /obj/item/organ/internal/heart/vulpkanin diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm index ab30c16f61f..8900bb8b37d 100644 --- a/code/modules/surgery/organs/subtypes/wryn.dm +++ b/code/modules/surgery/organs/subtypes/wryn.dm @@ -8,4 +8,4 @@ slot = "hivenode" /obj/item/organ/internal/eyes/wryn - dark_view = 3 \ No newline at end of file + see_in_dark = 3 \ No newline at end of file diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index f959732427a..ebe824f0bbc 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -328,7 +328,7 @@ if(target.vision_type) //Turns off their darksight if it's still active. to_chat(target, "Your eyes are suddenly wrought with immense pain as your darksight is forcibly dismissed!") target.vision_type = null - ticker.mode.remove_thrall(target.mind, 0) + SSticker.mode.remove_thrall(target.mind, 0) target.visible_message("A strange black mass falls from [target]'s [E]!") var/obj/item/organ/thing = new /obj/item/organ/internal/shadowtumor(get_turf(target)) thing.set_dna(target.dna) diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm index 04a026141a5..fed50355dde 100644 --- a/code/modules/tram/tram.dm +++ b/code/modules/tram/tram.dm @@ -22,7 +22,7 @@ var/delay_timer = null - var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_overlay) + var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_object) var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/chair, /obj/structure/grille, /obj/structure/window) /obj/tram/tram_controller/New() diff --git a/config/example/config.txt b/config/example/config.txt index a0d733eacd1..6e54e2af1f6 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -317,8 +317,9 @@ EVENT_DELAY_UPPER 15;45;70 #EVENT_CUSTOM_START_MODERATE 30;45 EVENT_CUSTOM_START_MAJOR 80;100 -## Strength of ambient star light. Set to 0 or less to turn off. -STARLIGHT 2 +## Starlight for exterior walls and breaches. Uncomment for starlight! +## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting +#STARLIGHT ## Player rerouting stuff ## If not 0, players can be rerouted to an overflow server after a certain cap is reached diff --git a/html/changelog.html b/html/changelog.html index 7c4262f54ce..1d3eb4038b5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,353 @@ -->
+

10 May 2019

+

AffectedArc07 updated:

+
    +
  • Removes an infinite loop in the code
  • +
  • Removes unused code
  • +
  • Captains display case now actually has captains thumbprint lock on it
  • +
  • Morgue updates happen slightly better now
  • +
  • Fixes a minor NTTC issue
  • +
+

Arkatos updated:

+
    +
  • Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets.
  • +
  • Examine tooltip delay increased slightly
  • +
  • Examine tooltips now work properly on items in storage
  • +
  • Full toolbelts now spawn with randomly a colored cable coil
  • +
  • Added inhand sprites for belts
  • +
  • Species name now shows in a species theme color on examine
  • +
  • Added 4 new plushies
  • +
+

Couls updated:

+
    +
  • necromantic stone now forces the ghost back into the body as a skeleton
  • +
  • allow skeletons to give up their bodies and offer control to ghosts
  • +
+

Crazylemon and Fox McCloud updated:

+
    +
  • Fixes toggles not properly saving
  • +
+

EvadableMoxie updated:

+
    +
  • Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by admins.
  • +
  • Admin shuttle now requires ERT clearance instead of admin clearance.
  • +
  • Admin shuttle now has a navigation computer and tiny fans at the airlock.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes a few instances generating log spam relating to z-level tracking
  • +
  • Fixes weird behavior with ghosts being able to trigger a few things by crossing over them
  • +
  • Fixes drifting ghosts
  • +
+

Ionward updated:

+
    +
  • Updated the cautery sprite!
  • +
+

KasparoVy updated:

+
    +
  • Adds a verb to eyewear you can use to adjust them so they appear above or below masks. Discover interesting combinations and enjoy a cool look.
  • +
+

Kyep updated:

+
    +
  • Trying to latejoin a round with no open job slots now results in an informative error message, rather than broken-looking blank window.
  • +
  • Added new bonus loadout items for higher-tier patrons. Also gave admins access to patron items, and ensured that during custom events, you see the custom event announcement when you connect.
  • +
  • You can now identify when someone is using internals from a tank in their pocket, without having to remove the tank.
  • +
  • punching a windoor no longer generates a runtime error.
  • +
  • cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes when their blob special attack hits mobs that do not process reagents
  • +
  • fixed $5+ donors not getting extra loadout points.
  • +
+

Markolie updated:

+
    +
  • Ambient occlusion had been added to the game. This represents a shadowy effect on most objects. It can be turned off through the game preferences menu.
  • +
  • Our lighting system has been updated to /tg/'s latest version. Hopefully this means we'll have less lag later in the round.
  • +
  • Night vision has been modified. There are now three levels of night vision. Certain creatures that were previously able to toggle night vision can now switch between all levels. Thermals now give some night vision.
  • +
  • Mesons now no longer fully light up non-visible turfs. It uses slight darkness instead.
  • +
  • Syndicate operatives may now purchase a chameleon bundles (2TC), which allows them to disguise not just their jumpsuit, but all of their equipment. They can change individual clothing as well as the outfit as a whole.
  • +
  • When using a voice changer, NTTC will no longer default to an "Unknown" job: it'll still use the assignment on your card to prevent meta-gaming. Always combine a voice changer and a Syndicate ID.
  • +
  • Admins with advanced admin interaction toggled on can now interact with the small airlock buttons.
  • +
  • The steel_rain runtime fix has been re-applied.
  • +
  • The propulsion on the admin shuttles has been fixed. The shutters on the south side of the hospital shuttle now point the right way.
  • +
  • Nuclear Operative reinforcements now spawn with a properly counted agent designation.
  • +
  • Fixed an issue where a mob's sight wouldn't update properly in certain cases, such as being revived.
  • +
  • Resolved an issue where the lobby would be bright white when being sent back.
  • +
  • Resolved an issue where the ambient occlusion preference wouldn't update properly in the lobby.
  • +
  • Resolved an issue where clicking on a windoor would no longer prevent it from auto-closing.
  • +
  • When a nuclear operative chooses to play as the borg instead of operative using the cyborg teleporter, ghosts will now be informed of this in their acceptance message.
  • +
  • Resolved an issue where cameras couldn't take pictures of non-dynamic lighting areas, such as the holodeck or space.
  • +
  • Resolved an issue where mobs would appear above water.
  • +
  • Resolved an issue where radiation storms would make lighting invisible in space.
  • +
  • Simple mobs no longer retain their X-Ray upon being revived.
  • +
  • Applying brute/fire damage through the View Variables menu for non-humans has been fixed.
  • +
  • NTTC regex has been disabled due to an urgent security issue.
  • +
+

Mitchs98 updated:

+
    +
  • You can now order a Pig Crate from Cargo for 25 points.
  • +
+

TDSSS updated:

+
    +
  • typo on sst shuttle console
  • +
  • opening turret covers now stay on top of their turret.
  • +
+

Twinmold93 updated:

+
    +
  • Adds Server Time to the Status Tab for Admins.
  • +
+

farie82 updated:

+
    +
  • Transforming into another species will now retain the items correctly. Example clings will keep their armblades and they won't get stuck with a non existing armblade they can't put back
  • +
  • Devour and regurgitate use forcemove now. So no being buckled inside an alien
  • +
+

fludd12 updated:

+
    +
  • Project Mind now has a corollary ability, Scan Mind. Now communication can be two-way!
  • +
+

variableundefined updated:

+
    +
  • Simple animals actually use the new subsystem now
  • +
  • What was NPCAI is now renamed to NPCPool - Its the functional equivalent of what it is in tg
  • +
  • Simple animals actually run on subsystem instead of a process now.
  • +
  • idleNPCpool has been added reducing performance impact of hostile simple animals
  • +
  • NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow left out by me
  • +
  • SNPC & assocaited NPCAI Subsystem
  • +
  • Some of space hotel's functions.
  • +
  • Bodysnatch gland.
  • +
  • process_ai has been deprecated
  • +
+ +

02 May 2019

+

AffectedArc07 updated:

+
    +
  • ssMapping
  • +
  • Gateway and space ruins are now loaded with ssMapping
  • +
  • Master Controller
  • +
  • Darkmode chat department colors match NTTC theming now
  • +
  • SSvotes
  • +
  • SSradio
  • +
  • SSevents
  • +
  • SSholiday
  • +
  • We no longer check if its Christmas every tick. Dont ask.
  • +
  • SSalarms
  • +
+

Arkatos updated:

+
    +
  • Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind
  • +
  • Replaced title2.ogg music with a higher quality version
  • +
  • Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies.
  • +
  • Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook.
  • +
  • Ghosts now orbit around their followed targets
  • +
  • Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail.
  • +
  • Added custom icon for the Null Charge ability
  • +
  • Shadowling Drain Life ability removed
  • +
  • Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport
  • +
  • Added custom icons for Observer HUD buttons
  • +
  • Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others..
  • +
  • Added sprites of Floorbot color variants
  • +
  • Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab
  • +
  • Added cancel button to Wizard teleportation scrolls
  • +
  • Added an option to grant Martial Arts via administrative Var menu
  • +
  • Toggling hardhat light on/off now correctly updates wearer's sprite
  • +
  • Added deathsound for Silicons
  • +
  • Dice will now roll when thrown
  • +
  • Added sound when adding or removing IDs from ID modification computers
  • +
  • Added cancel button to transfer amount from stack menu
  • +
  • Alt-click is a new shortcut to take a custom amount from stack
  • +
  • Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum.
  • +
  • Added ability to rename pumps, volume pumps, filters and mixers with a pen.
  • +
  • Added sound for throwing bolas
  • +
  • Added hitsound for all types of bolas
  • +
  • Added AntagHUD to everyone at the round end
  • +
  • Circuit Boards now show their required components on examine
  • +
  • Revenants now have randomly generated flavor names
  • +
  • You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions.
  • +
  • Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print.
  • +
  • Puts beakers in your hand upon eject from chemistry machines
  • +
  • Cardboard can now be made in the Biogenerator
  • +
  • You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!
  • +
  • You can now also close a canister's valve and remove the tank inside it by alt-clicking it.
  • +
  • Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip.
  • +
  • Ghost teleport verb will no locker flicker when used
  • +
  • Alt-click now opens and closes fire extinguisher cabinet
  • +
  • Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet
  • +
  • Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off
  • +
  • Added sound for opening and closing fire extinguisher cabinet
  • +
  • Added new torch sprites
  • +
  • Torch light color is now orange instead of red
  • +
  • Torch sprite now correctly shows all inhand sprites
  • +
  • Blob Rally Spores power is now free to use
  • +
  • Blob mobs can no longer speak while being dead via Blob Broadcast
  • +
  • Blob structures now properly show working animation
  • +
  • Added new sprites for variants of Blob resource, factory and storage structures
  • +
  • Added inhand sprites for winter coats
  • +
  • Carps now spawn with a random color! There might even be some really rare ones..
  • +
  • Added carp color variants sprites
  • +
+

Arkatos and Paradise community: updated:

+
    +
  • Added Tip of the round to a pre-game lobby
  • +
  • Added Show Custom Tip admin verb
  • +
  • Added Give Random Tip OOC verb
  • +
+

Citinited updated:

+
    +
  • You can no longer turn transit turfs into foamed metal flooring.
  • +
  • Foamed metal floors have a sprite now.
  • +
  • Pipe dispensers (the big ones) now work again.
  • +
  • Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds
  • +
+

CornMyCob updated:

+
    +
  • The plasma cutter now cuts through multiple rock tiles.
  • +
+

CthulhuOnIce updated:

+
    +
  • you can smell dead bodies, even if someone else shouldn't
  • +
+

Fethas updated:

+
    +
  • Cluwne suits should no longer fall off cluwnes from being fat.
  • +
+

Fox McCloud updated:

+
    +
  • CQC has been updated; a few combos are more powerful
  • +
  • cost increased to 13 TC
  • +
  • CQC is now nuke ops only
  • +
  • gloves of the north star restriction on CQC removed
  • +
  • CQC disarms will now take the item from your opponent
  • +
  • CQC blocks melee weapons and a couple of stun weapons and not everything now
  • +
  • Reagents will now adjust to the body temperature over time as opposed to all at once
  • +
  • Strange Reagent will work 25% of the time with TOUCH based reactions
  • +
  • Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)
  • +
  • SR puts the occupant back in their body automatically
  • +
  • Cloners that eject their messes will now eject the unattached organs
  • +
  • the message for brain death will now properly and only occur when they have truly died from brain damage
  • +
  • Fixes being able to attain brain damage over 120
  • +
  • Updates nations. Updates nations so hard right into the void
  • +
  • Plasma fires should burn a bit faster now
  • +
  • Bleeding will now stop at the temperature at which cryoxadone heals
  • +
  • Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death
  • +
  • Tesla can't zap cameras and other disposal structures anymore
  • +
  • Simple mobs can now be shocked
  • +
  • Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random
  • +
  • Fixes being able to shock yourself with TK, at range, on electrical equipment
  • +
  • simple mobs can now be shocked by the tesla and other sources
  • +
  • Fixes goats not attacking people
  • +
  • Goats will eat glowshrooms
  • +
  • Goats will eat full grown diona
  • +
  • Remapped toxins to be more compatible with the modern age
  • +
  • updates plasma and N2O sprites
  • +
  • Fixes not being able to look at a turf if it had plasma/N2O on it
  • +
  • cold turfs no longer become icy
  • +
  • Cryostylane makes turfs icy
  • +
  • Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!
  • +
  • Fixes grammar of slipping on turfs; no more "you slipped on floor" or "you slipped on wet floor"
  • +
  • removes ponies
  • +
  • object and fast processing are now proper subsystems
  • +
  • Fixes multi-spawn blobs
  • +
  • Powersinks drain rate increased, but they also explode a bit sooner
  • +
  • Multitools display total power, load, and free power
  • +
  • Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location
  • +
+

Ionward updated:

+
    +
  • Added new mantles! Check the ClothesMate, or in department head's lockers.
  • +
+

KasparoVy updated:

+
    +
  • Adds striped normal-height socks.
  • +
  • Vox can now wear whatever undergarment they want.
  • +
  • Removes flesh from shredded Vox uniform sprites.
  • +
  • Armalis can no longer wear undergarments. They didn't fit, anyhow.
  • +
  • Underwear no can no longer lock up the character creator.
  • +
+

Kyep updated:

+
    +
  • bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information
  • +
  • admins issuing permanent bans are no longer presented with an "ip ban?" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored.
  • +
  • Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes.
  • +
  • Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so.
  • +
  • Fixed an error message being inappropriately generated for admins when someone signs up as a pAI.
  • +
  • The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray.
  • +
  • Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job.
  • +
  • Job transfers to karma jobs are now possible - if you have the job unlocked.
  • +
  • Attempting to bypass a job ban via a job transfer now generates a warning to all online admins.
  • +
  • Refactored and improved our entry on the server hub.
  • +
  • Fixed a runtime in job_exp.dm
  • +
+

Markolie updated:

+
    +
  • Safes can now consist of more than two tumblers.
  • +
  • All safes now have three tumblers by default, instead of two.
  • +
  • The safe opening mechanism has changed slightly. This is described on the safe cracking UI.
  • +
  • The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots.
  • +
  • Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each.
  • +
  • A number of new ammunition and weapon bundles have been added for Nuclear Operatives.
  • +
  • For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals.
  • +
  • The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified.
  • +
  • Saboteur borgs now spawn with thermals.
  • +
  • The Syndicate borg and exosuits have been moved to a new category, "Support and Mechanized Exosuits".
  • +
  • Existing bundles and telecrystal purchases have been moved to a new category, "Bundles and Telecrystals".
  • +
  • There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed.
  • +
  • Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated.
  • +
  • Shuttles no longer leave behind their propulsion.
  • +
  • AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again.
  • +
  • Jumpsuits are now removed by clicking instead of clicking and dragging.
  • +
  • Removed a useless message that would be sent to admins whenever a drone joins the round.
  • +
  • Fixed an issue where admins would receive a message whenever someone joined up as a pAI.
  • +
+

McDonald072 updated:

+
    +
  • You can no longer examine or teleport things using clipboards
  • +
+

Quantum-M updated:

+
    +
  • Two multicolor pens to the Internal Affairs Office
  • +
+

TDSSS updated:

+
    +
  • nukies can buy plasma grenades again
  • +
+

Ty-Omaha updated:

+
    +
  • Moves AI admin log to the all preference
  • +
+

dovydas12345 updated:

+
    +
  • Fixes normal cameras spooking non-chaplains even when they don't capture any ghosts
  • +
+

farie82 updated:

+
    +
  • Makes puke less lag inducing
  • +
  • Puke can now appear on all kinds of turfs except spess
  • +
  • Ticket messages now have their corresponding span classes. Making them easier to notice
  • +
  • PM's now shouldn't go to the wrong client anymore when the target left.
  • +
  • Cure text for Shock and Cardiac failure are more clear now
  • +
  • Ducttape gags can now be removed properly without spawning an invisible one in your hands
  • +
  • Windoors now give the airlock assembly electronics once deconstructed
  • +
  • Can't place runes in space anymore
  • +
  • Admins can now use all mhelp related things again
  • +
  • Fixed the toggle mentor ticket messages text
  • +
  • Vampiric glaring is logged now
  • +
  • Doctor delight and orange juice now heal again
  • +
  • Fixes admin PM's. Bwoinks are back on the menu!
  • +
  • Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in
  • +
  • The typing limiter option should now work for all edge cases. Such as dying while talking and such
  • +
  • Borgs health status now updates properly when removing and adding parts
  • +
  • You won't try to fix destroyed components in borgs anymore. Which resulted to lost materials and no healing
  • +
  • Borg analysers will now properly show missing components and won't show their damage if missing
  • +
  • Self diagnostics for borgs now also shows missing parts and destroyed ones
  • +
+

iantine updated:

+
    +
  • Adds Lumi's vox suit fluff
  • +
+

uc_guy updated:

+
    +
  • Players in the lobby no longer see cult speak.
  • +
+

08 April 2019

TDSSS updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d145f082f7c..d0e51aa9571 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9790,3 +9790,375 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2019-04-08: TDSSS: - bugfix: Added missing vent in toxins mixing +2019-05-02: + AffectedArc07: + - rscadd: ssMapping + - tweak: Gateway and space ruins are now loaded with ssMapping + - rscdel: Master Controller + - tweak: Darkmode chat department colors match NTTC theming now + - rscadd: SSvotes + - rscadd: SSradio + - rscadd: SSevents + - rscadd: SSholiday + - tweak: We no longer check if its Christmas every tick. Dont ask. + - rscadd: SSalarms + Arkatos: + - tweak: Shadowlings now have a slightly bigger colored text when speaking in the + Shadowling Hivemind + - soundadd: Replaced title2.ogg music with a higher quality version + - tweak: Shield Blobs automatically spawned around Blob Cores now give no refund + upon removing. No freebies. + - rscadd: Added new Wizard Spell - Summon Ghosts! This nefarious spell will make + all ghosts visible to the living. Be careful though, as while they cannot harm + you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's + spellbook. + - tweak: Ghosts now orbit around their followed targets + - rscadd: Added new Shadowling Ability - Null Charge! This new ability allows Shadowling + to completely drain an APC of it's power after a moderate delay. Shadowling + must not be interrupted, or the whole process will fail. + - imageadd: Added custom icon for the Null Charge ability + - rscdel: Shadowling Drain Life ability removed + - rscadd: Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and + Teleport + - imageadd: Added custom icons for Observer HUD buttons + - rscadd: Added Floorbot color variants. Different toolboxes will result in a differently + colored Floorbots. One even might be a little stronger than others.. + - imageadd: Added sprites of Floorbot color variants + - bugfix: Fixed incorrect amount of required floortiles for the Floorbot in the + crafting tab + - rscadd: Added cancel button to Wizard teleportation scrolls + - rscadd: Added an option to grant Martial Arts via administrative Var menu + - bugfix: Toggling hardhat light on/off now correctly updates wearer's sprite + - soundadd: Added deathsound for Silicons + - tweak: Dice will now roll when thrown + - soundadd: Added sound when adding or removing IDs from ID modification computers + - rscadd: Added cancel button to transfer amount from stack menu + - tweak: Alt-click is a new shortcut to take a custom amount from stack + - rscadd: Added shortcuts for handling pumps, volume pumps, filters, and mixers. + Ctrl-click these devices to turn them on/off and Alt-click them to set their + output to maximum. + - rscadd: Added ability to rename pumps, volume pumps, filters and mixers with a + pen. + - soundadd: Added sound for throwing bolas + - soundadd: Added hitsound for all types of bolas + - rscadd: Added AntagHUD to everyone at the round end + - rscadd: Circuit Boards now show their required components on examine + - rscadd: Revenants now have randomly generated flavor names + - tweak: You can shift-click any action button to reset it's position. Alt-click + on Hide Buttons will reset all action buttons to their default positions. + - rscadd: Pill Bottles are now printable in the Autolathe. You can find them in + the Medical section, and each costs 80 metal and 20 glass to print. + - tweak: Puts beakers in your hand upon eject from chemistry machines + - rscadd: Cardboard can now be made in the Biogenerator + - rscadd: You can now hotswap tanks in a canister or gas pump by clicking it with + a new tank! + - rscadd: You can now also close a canister's valve and remove the tank inside it + by alt-clicking it. + - rscadd: Added examine toolptips. Hover over any equipped or hold item for a little + while and it will display the item description as a tooltip. + - bugfix: Ghost teleport verb will no locker flicker when used + - rscadd: Alt-click now opens and closes fire extinguisher cabinet + - bugfix: Fire extinguisher cabinet now properly updates it's sprite correctly when + putting fire extinquisher inside the cabinet + - bugfix: Fire extinguisher no longer sprays when put into fire extinguisher cabinet + with a safety off + - soundadd: Added sound for opening and closing fire extinguisher cabinet + - imageadd: Added new torch sprites + - tweak: Torch light color is now orange instead of red + - bugfix: Torch sprite now correctly shows all inhand sprites + - tweak: Blob Rally Spores power is now free to use + - bugfix: Blob mobs can no longer speak while being dead via Blob Broadcast + - bugfix: Blob structures now properly show working animation + - imageadd: Added new sprites for variants of Blob resource, factory and storage + structures + - imageadd: Added inhand sprites for winter coats + - rscadd: Carps now spawn with a random color! There might even be some really rare + ones.. + - imageadd: Added carp color variants sprites + 'Arkatos and Paradise community:': + - rscadd: Added Tip of the round to a pre-game lobby + - rscadd: Added Show Custom Tip admin verb + - rscadd: Added Give Random Tip OOC verb + Citinited: + - bugfix: You can no longer turn transit turfs into foamed metal flooring. + - bugfix: Foamed metal floors have a sprite now. + - bugfix: Pipe dispensers (the big ones) now work again. + - tweak: Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds + CornMyCob: + - tweak: The plasma cutter now cuts through multiple rock tiles. + CthulhuOnIce: + - bugfix: you can smell dead bodies, even if someone else shouldn't + Fethas: + - bugfix: Cluwne suits should no longer fall off cluwnes from being fat. + Fox McCloud: + - tweak: CQC has been updated; a few combos are more powerful + - tweak: cost increased to 13 TC + - tweak: CQC is now nuke ops only + - tweak: gloves of the north star restriction on CQC removed + - tweak: CQC disarms will now take the item from your opponent + - tweak: CQC blocks melee weapons and a couple of stun weapons and not everything + now + - tweak: Reagents will now adjust to the body temperature over time as opposed to + all at once + - tweak: Strange Reagent will work 25% of the time with TOUCH based reactions + - tweak: Strange reagent will revive whether there's a ghost or not (can use SR + on clientless mobs now, like monkies) + - tweak: SR puts the occupant back in their body automatically + - tweak: Cloners that eject their messes will now eject the unattached organs + - tweak: the message for brain death will now properly and only occur when they + have truly died from brain damage + - bugfix: Fixes being able to attain brain damage over 120 + - rscdel: Updates nations. Updates nations so hard right into the void + - tweak: Plasma fires should burn a bit faster now + - tweak: Bleeding will now stop at the temperature at which cryoxadone heals + - bugfix: Fixes a few potential exploits with forcing chem, dust, and explosive + implants activating with the deathgasp emote, prior to death + - tweak: Tesla can't zap cameras and other disposal structures anymore + - rscadd: Simple mobs can now be shocked + - tweak: Electrocution damage scales a bit more linearly up to its maximum potential + instead of being heavily random + - bugfix: Fixes being able to shock yourself with TK, at range, on electrical equipment + - rscadd: simple mobs can now be shocked by the tesla and other sources + - bugfix: Fixes goats not attacking people + - tweak: Goats will eat glowshrooms + - rscadd: Goats will eat full grown diona + - rscadd: Remapped toxins to be more compatible with the modern age + - tweak: updates plasma and N2O sprites + - bugfix: Fixes not being able to look at a turf if it had plasma/N2O on it + - rscdel: cold turfs no longer become icy + - rscadd: Cryostylane makes turfs icy + - rscadd: Icy turfs are slippery; wear magboots to counteract the effect. Watch + your head! + - bugfix: Fixes grammar of slipping on turfs; no more "you slipped on floor" or + "you slipped on wet floor" + - rscdel: removes ponies + - tweak: object and fast processing are now proper subsystems + - bugfix: Fixes multi-spawn blobs + - tweak: Powersinks drain rate increased, but they also explode a bit sooner + - rscadd: Multitools display total power, load, and free power + - bugfix: Fix emitter sparks sparking at the location of emitters where biult as + opposed to emitter current location + Ionward: + - rscadd: Added new mantles! Check the ClothesMate, or in department head's lockers. + KasparoVy: + - rscadd: Adds striped normal-height socks. + - rscadd: Vox can now wear whatever undergarment they want. + - tweak: Removes flesh from shredded Vox uniform sprites. + - rscdel: Armalis can no longer wear undergarments. They didn't fit, anyhow. + - bugfix: Underwear no can no longer lock up the character creator. + Kyep: + - bugfix: bans issued by admins via the Player Panel no longer incorrectly omit + IP/etc information + - tweak: admins issuing permanent bans are no longer presented with an "ip ban?" + prompt, as all bans include IP/CID information now. This prompt was a legacy + thing from back when the filesystem was used to store bans, and hasn't ever + affected how DB-based bans were stored. + - rscadd: Added a config file option which allows SSD crew members to be moved to + cryo after a defined amount of minutes. + - rscadd: Added a config file option which causes most people trying to attack/loot/interact + with a SSD character to need to confirm they've read the rules before being + able to do so. + - bugfix: Fixed an error message being inappropriately generated for admins when + someone signs up as a pAI. + - rscadd: The ID computer now color-codes potential job transfer options, highlighting + good choices for a job transfer in green, and bad ones in gray. + - bugfix: Taking a job transfer now gives you playtime based on your new job, instead + of incorrectly still giving you playtime based on your old job. + - tweak: Job transfers to karma jobs are now possible - if you have the job unlocked. + - rscadd: Attempting to bypass a job ban via a job transfer now generates a warning + to all online admins. + - tweak: Refactored and improved our entry on the server hub. + - bugfix: Fixed a runtime in job_exp.dm + Markolie: + - rscadd: Safes can now consist of more than two tumblers. + - tweak: All safes now have three tumblers by default, instead of two. + - tweak: The safe opening mechanism has changed slightly. This is described on the + safe cracking UI. + - rscadd: The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle + have been replaced with suit storage units. Suit storage units now have a separate + slot for magboots. + - rscadd: Nuclear Operatives can now purchase reinforcements. These reinforcements + cost 25 telecrystals each. + - rscadd: A number of new ammunition and weapon bundles have been added for Nuclear + Operatives. + - tweak: For every ten players on the server, the Nuclear Operatives now receive + 2 extra telecrystals. + - tweak: The Syndicate borg spawners have been separated into three separate spawners, + one for each type of Syndicate cyborg. Their prices have been modified. + - tweak: Saboteur borgs now spawn with thermals. + - tweak: The Syndicate borg and exosuits have been moved to a new category, "Support + and Mechanized Exosuits". + - tweak: Existing bundles and telecrystal purchases have been moved to a new category, + "Bundles and Telecrystals". + - tweak: There are now more spawn points for nuclear operatives on their base. The + number of operatives spawning has not been changed. + - bugfix: Spawning nuclear operatives through the traitor panel now causes their + ID to be properly updated. + - bugfix: Shuttles no longer leave behind their propulsion. + - bugfix: AZERTY hotkey mode users can now switch between regular mode and hotkey + mode properly using TAB again. + - tweak: Jumpsuits are now removed by clicking instead of clicking and dragging. + - bugfix: Removed a useless message that would be sent to admins whenever a drone + joins the round. + - bugfix: Fixed an issue where admins would receive a message whenever someone joined + up as a pAI. + McDonald072: + - bugfix: You can no longer examine or teleport things using clipboards + Quantum-M: + - rscadd: Two multicolor pens to the Internal Affairs Office + TDSSS: + - tweak: nukies can buy plasma grenades again + Ty-Omaha: + - tweak: Moves AI admin log to the all preference + dovydas12345: + - bugfix: Fixes normal cameras spooking non-chaplains even when they don't capture + any ghosts + farie82: + - tweak: Makes puke less lag inducing + - tweak: Puke can now appear on all kinds of turfs except spess + - bugfix: Ticket messages now have their corresponding span classes. Making them + easier to notice + - bugfix: PM's now shouldn't go to the wrong client anymore when the target left. + - tweak: Cure text for Shock and Cardiac failure are more clear now + - bugfix: Ducttape gags can now be removed properly without spawning an invisible + one in your hands + - bugfix: Windoors now give the airlock assembly electronics once deconstructed + - bugfix: Can't place runes in space anymore + - bugfix: Admins can now use all mhelp related things again + - spellcheck: Fixed the toggle mentor ticket messages text + - bugfix: Vampiric glaring is logged now + - bugfix: Doctor delight and orange juice now heal again + - bugfix: Fixes admin PM's. Bwoinks are back on the menu! + - bugfix: Organs will now prompt a update_stat. Meaning that IRCs and the like now + get revived when possible when you put their battery and brain in + - bugfix: The typing limiter option should now work for all edge cases. Such as + dying while talking and such + - bugfix: Borgs health status now updates properly when removing and adding parts + - bugfix: You won't try to fix destroyed components in borgs anymore. Which resulted + to lost materials and no healing + - bugfix: Borg analysers will now properly show missing components and won't show + their damage if missing + - tweak: Self diagnostics for borgs now also shows missing parts and destroyed ones + iantine: + - rscadd: Adds Lumi's vox suit fluff + uc_guy: + - bugfix: Players in the lobby no longer see cult speak. +2019-05-10: + AffectedArc07: + - tweak: Removes an infinite loop in the code + - rscdel: Removes unused code + - tweak: Captains display case now actually has captains thumbprint lock on it + - tweak: Morgue updates happen slightly better now + - bugfix: Fixes a minor NTTC issue + Arkatos: + - rscadd: Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets. + - tweak: Examine tooltip delay increased slightly + - bugfix: Examine tooltips now work properly on items in storage + - tweak: Full toolbelts now spawn with randomly a colored cable coil + - imageadd: Added inhand sprites for belts + - tweak: Species name now shows in a species theme color on examine + - imageadd: Added 4 new plushies + Couls: + - tweak: necromantic stone now forces the ghost back into the body as a skeleton + - rscadd: allow skeletons to give up their bodies and offer control to ghosts + Crazylemon and Fox McCloud: + - bugfix: Fixes toggles not properly saving + EvadableMoxie: + - rscadd: Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by + admins. + - tweak: Admin shuttle now requires ERT clearance instead of admin clearance. + - tweak: Admin shuttle now has a navigation computer and tiny fans at the airlock. + Fox McCloud: + - bugfix: Fixes a few instances generating log spam relating to z-level tracking + - bugfix: Fixes weird behavior with ghosts being able to trigger a few things by + crossing over them + - bugfix: Fixes drifting ghosts + Ionward: + - imageadd: Updated the cautery sprite! + KasparoVy: + - rscadd: Adds a verb to eyewear you can use to adjust them so they appear above + or below masks. Discover interesting combinations and enjoy a cool look. + Kyep: + - rscadd: Trying to latejoin a round with no open job slots now results in an informative + error message, rather than broken-looking blank window. + - rscadd: Added new bonus loadout items for higher-tier patrons. Also gave admins + access to patron items, and ensured that during custom events, you see the custom + event announcement when you connect. + - tweak: You can now identify when someone is using internals from a tank in their + pocket, without having to remove the tank. + - bugfix: punching a windoor no longer generates a runtime error. + - bugfix: cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes + when their blob special attack hits mobs that do not process reagents + - bugfix: fixed $5+ donors not getting extra loadout points. + Markolie: + - rscadd: Ambient occlusion had been added to the game. This represents a shadowy + effect on most objects. It can be turned off through the game preferences menu. + - tweak: Our lighting system has been updated to /tg/'s latest version. Hopefully + this means we'll have less lag later in the round. + - tweak: Night vision has been modified. There are now three levels of night vision. + Certain creatures that were previously able to toggle night vision can now switch + between all levels. Thermals now give some night vision. + - tweak: Mesons now no longer fully light up non-visible turfs. It uses slight darkness + instead. + - rscadd: Syndicate operatives may now purchase a chameleon bundles (2TC), which + allows them to disguise not just their jumpsuit, but all of their equipment. + They can change individual clothing as well as the outfit as a whole. + - tweak: 'When using a voice changer, NTTC will no longer default to an "Unknown" + job: it''ll still use the assignment on your card to prevent meta-gaming. Always + combine a voice changer and a Syndicate ID.' + - tweak: Admins with advanced admin interaction toggled on can now interact with + the small airlock buttons. + - bugfix: The steel_rain runtime fix has been re-applied. + - bugfix: The propulsion on the admin shuttles has been fixed. The shutters on the + south side of the hospital shuttle now point the right way. + - bugfix: Nuclear Operative reinforcements now spawn with a properly counted agent + designation. + - bugfix: Fixed an issue where a mob's sight wouldn't update properly in certain + cases, such as being revived. + - bugfix: Resolved an issue where the lobby would be bright white when being sent + back. + - bugfix: Resolved an issue where the ambient occlusion preference wouldn't update + properly in the lobby. + - bugfix: Resolved an issue where clicking on a windoor would no longer prevent + it from auto-closing. + - bugfix: When a nuclear operative chooses to play as the borg instead of operative + using the cyborg teleporter, ghosts will now be informed of this in their acceptance + message. + - bugfix: Resolved an issue where cameras couldn't take pictures of non-dynamic + lighting areas, such as the holodeck or space. + - bugfix: Resolved an issue where mobs would appear above water. + - bugfix: Resolved an issue where radiation storms would make lighting invisible + in space. + - bugfix: Simple mobs no longer retain their X-Ray upon being revived. + - bugfix: Applying brute/fire damage through the View Variables menu for non-humans + has been fixed. + - rscdel: NTTC regex has been disabled due to an urgent security issue. + Mitchs98: + - rscadd: You can now order a Pig Crate from Cargo for 25 points. + TDSSS: + - bugfix: typo on sst shuttle console + - bugfix: opening turret covers now stay on top of their turret. + Twinmold93: + - rscadd: Adds Server Time to the Status Tab for Admins. + farie82: + - bugfix: Transforming into another species will now retain the items correctly. + Example clings will keep their armblades and they won't get stuck with a non + existing armblade they can't put back + - bugfix: Devour and regurgitate use forcemove now. So no being buckled inside an + alien + fludd12: + - rscadd: Project Mind now has a corollary ability, Scan Mind. Now communication + can be two-way! + variableundefined: + - tweak: Simple animals actually use the new subsystem now + - tweak: What was NPCAI is now renamed to NPCPool - Its the functional equivalent + of what it is in tg + - tweak: Simple animals actually run on subsystem instead of a process now. + - rscadd: idleNPCpool has been added reducing performance impact of hostile simple + animals + - rscdel: NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow + left out by me + - rscdel: SNPC & assocaited NPCAI Subsystem + - rscdel: Some of space hotel's functions. + - rscdel: Bodysnatch gland. + - tweak: process_ai has been deprecated diff --git a/html/changelogs/AutoChangeLog-pr-10327.yml b/html/changelogs/AutoChangeLog-pr-10327.yml deleted file mode 100644 index 7b73cbcbd97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10327.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "CQC has been updated; a few combos are more powerful" - - tweak: "cost increased to 13 TC" - - tweak: "CQC is now nuke ops only" - - tweak: "gloves of the north star restriction on CQC removed" - - tweak: "CQC disarms will now take the item from your opponent" - - tweak: "CQC blocks melee weapons and a couple of stun weapons and not everything now" diff --git a/html/changelogs/AutoChangeLog-pr-11102.yml b/html/changelogs/AutoChangeLog-pr-11102.yml deleted file mode 100644 index 7e54f5268ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11102.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "ssMapping" - - tweak: "Gateway and space ruins are now loaded with ssMapping" diff --git a/html/changelogs/AutoChangeLog-pr-11129.yml b/html/changelogs/AutoChangeLog-pr-11129.yml deleted file mode 100644 index de26a8b8f1b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11129.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iantine" -delete-after: True -changes: - - rscadd: "Adds Lumi's vox suit fluff" diff --git a/html/changelogs/AutoChangeLog-pr-11214.yml b/html/changelogs/AutoChangeLog-pr-11214.yml deleted file mode 100644 index fcad43b3086..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind" diff --git a/html/changelogs/AutoChangeLog-pr-11217.yml b/html/changelogs/AutoChangeLog-pr-11217.yml deleted file mode 100644 index 9c6b9803c94..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11217.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Reagents will now adjust to the body temperature over time as opposed to all at once" diff --git a/html/changelogs/AutoChangeLog-pr-11224.yml b/html/changelogs/AutoChangeLog-pr-11224.yml deleted file mode 100644 index 0357a4aa727..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Replaced title2.ogg music with a higher quality version" diff --git a/html/changelogs/AutoChangeLog-pr-11227.yml b/html/changelogs/AutoChangeLog-pr-11227.yml deleted file mode 100644 index cc4293ba715..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11227.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Strange Reagent will work 25% of the time with TOUCH based reactions" - - tweak: "Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)" - - tweak: "SR puts the occupant back in their body automatically" - - tweak: "Cloners that eject their messes will now eject the unattached organs" diff --git a/html/changelogs/AutoChangeLog-pr-11230.yml b/html/changelogs/AutoChangeLog-pr-11230.yml deleted file mode 100644 index 36c1f051aca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11230.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "the message for brain death will now properly and only occur when they have truly died from brain damage" - - bugfix: "Fixes being able to attain brain damage over 120" diff --git a/html/changelogs/AutoChangeLog-pr-11231.yml b/html/changelogs/AutoChangeLog-pr-11231.yml deleted file mode 100644 index 82560671a26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11231.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos and Paradise community:" -delete-after: True -changes: - - rscadd: "Added Tip of the round to a pre-game lobby" - - rscadd: "Added Show Custom Tip admin verb" - - rscadd: "Added Give Random Tip OOC verb" diff --git a/html/changelogs/AutoChangeLog-pr-11243.yml b/html/changelogs/AutoChangeLog-pr-11243.yml deleted file mode 100644 index c0843a66d43..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CornMyCob" -delete-after: True -changes: - - tweak: "The plasma cutter now cuts through multiple rock tiles." diff --git a/html/changelogs/AutoChangeLog-pr-11253.yml b/html/changelogs/AutoChangeLog-pr-11253.yml deleted file mode 100644 index 0cfbb99257a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11253.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "You can no longer turn transit turfs into foamed metal flooring." - - bugfix: "Foamed metal floors have a sprite now." diff --git a/html/changelogs/AutoChangeLog-pr-11255.yml b/html/changelogs/AutoChangeLog-pr-11255.yml deleted file mode 100644 index 7320fee3d2a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11255.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Safes can now consist of more than two tumblers." - - tweak: "All safes now have three tumblers by default, instead of two." - - tweak: "The safe opening mechanism has changed slightly. This is described on the safe cracking UI." diff --git a/html/changelogs/AutoChangeLog-pr-11257.yml b/html/changelogs/AutoChangeLog-pr-11257.yml deleted file mode 100644 index a675de535f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "Updates nations. Updates nations so hard right into the void" diff --git a/html/changelogs/AutoChangeLog-pr-11259.yml b/html/changelogs/AutoChangeLog-pr-11259.yml deleted file mode 100644 index 2b6bdf7e540..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11259.yml +++ /dev/null @@ -1,13 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots." - - rscadd: "Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each." - - rscadd: "A number of new ammunition and weapon bundles have been added for Nuclear Operatives." - - tweak: "For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals." - - tweak: "The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified." - - tweak: "Saboteur borgs now spawn with thermals." - - tweak: "The Syndicate borg and exosuits have been moved to a new category, \"Support and Mechanized Exosuits\"." - - tweak: "Existing bundles and telecrystal purchases have been moved to a new category, \"Bundles and Telecrystals\"." - - tweak: "There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed." - - bugfix: "Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated." diff --git a/html/changelogs/AutoChangeLog-pr-11270.yml b/html/changelogs/AutoChangeLog-pr-11270.yml deleted file mode 100644 index 6ecdf8039c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "nukies can buy plasma grenades again" diff --git a/html/changelogs/AutoChangeLog-pr-11277.yml b/html/changelogs/AutoChangeLog-pr-11277.yml deleted file mode 100644 index c966a9c74cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11277.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies." diff --git a/html/changelogs/AutoChangeLog-pr-11278.yml b/html/changelogs/AutoChangeLog-pr-11278.yml deleted file mode 100644 index 24f9c3ab4cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11278.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook." diff --git a/html/changelogs/AutoChangeLog-pr-11279.yml b/html/changelogs/AutoChangeLog-pr-11279.yml deleted file mode 100644 index 11bdfb80538..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Ghosts now orbit around their followed targets" diff --git a/html/changelogs/AutoChangeLog-pr-11280.yml b/html/changelogs/AutoChangeLog-pr-11280.yml deleted file mode 100644 index 5228e09b3c9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11280.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - rscadd: "Added new mantles! Check the ClothesMate, or in department head's lockers." diff --git a/html/changelogs/AutoChangeLog-pr-11282.yml b/html/changelogs/AutoChangeLog-pr-11282.yml deleted file mode 100644 index 5b8e5704c06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11282.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Plasma fires should burn a bit faster now" - - tweak: "Bleeding will now stop at the temperature at which cryoxadone heals" diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml deleted file mode 100644 index 9056578d68b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11283.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death" diff --git a/html/changelogs/AutoChangeLog-pr-11284.yml b/html/changelogs/AutoChangeLog-pr-11284.yml deleted file mode 100644 index 433a7fb3f68..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11284.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail." - - imageadd: "Added custom icon for the Null Charge ability" - - rscdel: "Shadowling Drain Life ability removed" diff --git a/html/changelogs/AutoChangeLog-pr-11285.yml b/html/changelogs/AutoChangeLog-pr-11285.yml deleted file mode 100644 index 3c725a05b90..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11285.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Tesla can't zap cameras and other disposal structures anymore" - - rscadd: "Simple mobs can now be shocked" - - tweak: "Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random" - - bugfix: "Fixes being able to shock yourself with TK, at range, on electrical equipment" - - rscadd: "simple mobs can now be shocked by the tesla and other sources" diff --git a/html/changelogs/AutoChangeLog-pr-11287.yml b/html/changelogs/AutoChangeLog-pr-11287.yml deleted file mode 100644 index 111f8aac824..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11287.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes goats not attacking people" - - tweak: "Goats will eat glowshrooms" - - rscadd: "Goats will eat full grown diona" diff --git a/html/changelogs/AutoChangeLog-pr-11288.yml b/html/changelogs/AutoChangeLog-pr-11288.yml deleted file mode 100644 index 2a309dde374..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11288.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Remapped toxins to be more compatible with the modern age" diff --git a/html/changelogs/AutoChangeLog-pr-11292.yml b/html/changelogs/AutoChangeLog-pr-11292.yml deleted file mode 100644 index 814c8530858..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11292.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Makes puke less lag inducing" - - tweak: "Puke can now appear on all kinds of turfs except spess" diff --git a/html/changelogs/AutoChangeLog-pr-11294.yml b/html/changelogs/AutoChangeLog-pr-11294.yml deleted file mode 100644 index 0088263303b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11294.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ticket messages now have their corresponding span classes. Making them easier to notice" diff --git a/html/changelogs/AutoChangeLog-pr-11296.yml b/html/changelogs/AutoChangeLog-pr-11296.yml deleted file mode 100644 index 42a9ce1a063..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11296.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "PM's now shouldn't go to the wrong client anymore when the target left." diff --git a/html/changelogs/AutoChangeLog-pr-11297.yml b/html/changelogs/AutoChangeLog-pr-11297.yml deleted file mode 100644 index 9973022ecea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11297.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "updates plasma and N2O sprites" - - bugfix: "Fixes not being able to look at a turf if it had plasma/N2O on it" - - rscdel: "cold turfs no longer become icy" - - rscadd: "Cryostylane makes turfs icy" - - rscadd: "Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!" - - bugfix: "Fixes grammar of slipping on turfs; no more \"you slipped on floor\" or \"you slipped on wet floor\"" diff --git a/html/changelogs/AutoChangeLog-pr-11298.yml b/html/changelogs/AutoChangeLog-pr-11298.yml deleted file mode 100644 index 0523ab305e7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11298.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information" - - tweak: "admins issuing permanent bans are no longer presented with an \"ip ban?\" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored." diff --git a/html/changelogs/AutoChangeLog-pr-11299.yml b/html/changelogs/AutoChangeLog-pr-11299.yml deleted file mode 100644 index 4994b017d39..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11299.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes." - - rscadd: "Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so." diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml deleted file mode 100644 index b949b7f91f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11300.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport" - - imageadd: "Added custom icons for Observer HUD buttons" diff --git a/html/changelogs/AutoChangeLog-pr-11301.yml b/html/changelogs/AutoChangeLog-pr-11301.yml deleted file mode 100644 index 2b1bc1f82cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11301.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Adds striped normal-height socks." - - rscadd: "Vox can now wear whatever undergarment they want." - - tweak: "Removes flesh from shredded Vox uniform sprites." - - rscdel: "Armalis can no longer wear undergarments. They didn't fit, anyhow." diff --git a/html/changelogs/AutoChangeLog-pr-11305.yml b/html/changelogs/AutoChangeLog-pr-11305.yml deleted file mode 100644 index 6ca9bfb33bd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "removes ponies" diff --git a/html/changelogs/AutoChangeLog-pr-11310.yml b/html/changelogs/AutoChangeLog-pr-11310.yml deleted file mode 100644 index 3ec3c388190..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11310.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - bugfix: "Underwear no can no longer lock up the character creator." diff --git a/html/changelogs/AutoChangeLog-pr-11312.yml b/html/changelogs/AutoChangeLog-pr-11312.yml deleted file mode 100644 index c7b31729672..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11312.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Cure text for Shock and Cardiac failure are more clear now" diff --git a/html/changelogs/AutoChangeLog-pr-11313.yml b/html/changelogs/AutoChangeLog-pr-11313.yml deleted file mode 100644 index d86b5ff7d0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ducttape gags can now be removed properly without spawning an invisible one in your hands" diff --git a/html/changelogs/AutoChangeLog-pr-11314.yml b/html/changelogs/AutoChangeLog-pr-11314.yml deleted file mode 100644 index 0d38b022e23..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Windoors now give the airlock assembly electronics once deconstructed" diff --git a/html/changelogs/AutoChangeLog-pr-11317.yml b/html/changelogs/AutoChangeLog-pr-11317.yml deleted file mode 100644 index 96503bf1d88..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11317.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Can't place runes in space anymore" diff --git a/html/changelogs/AutoChangeLog-pr-11318.yml b/html/changelogs/AutoChangeLog-pr-11318.yml deleted file mode 100644 index a9e5c225096..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscdel: "Master Controller" diff --git a/html/changelogs/AutoChangeLog-pr-11319.yml b/html/changelogs/AutoChangeLog-pr-11319.yml deleted file mode 100644 index c9c992c83d1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11319.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others.." - - imageadd: "Added sprites of Floorbot color variants" - - bugfix: "Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab" diff --git a/html/changelogs/AutoChangeLog-pr-11320.yml b/html/changelogs/AutoChangeLog-pr-11320.yml deleted file mode 100644 index 6bafcda7d63..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Shuttles no longer leave behind their propulsion." diff --git a/html/changelogs/AutoChangeLog-pr-11323.yml b/html/changelogs/AutoChangeLog-pr-11323.yml deleted file mode 100644 index 20da5d256b3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11323.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Darkmode chat department colors match NTTC theming now" diff --git a/html/changelogs/AutoChangeLog-pr-11328.yml b/html/changelogs/AutoChangeLog-pr-11328.yml deleted file mode 100644 index e91103f07cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11328.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Admins can now use all mhelp related things again" - - spellcheck: "Fixed the toggle mentor ticket messages text" diff --git a/html/changelogs/AutoChangeLog-pr-11329.yml b/html/changelogs/AutoChangeLog-pr-11329.yml deleted file mode 100644 index e25e56b8828..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11329.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Vampiric glaring is logged now" diff --git a/html/changelogs/AutoChangeLog-pr-11331.yml b/html/changelogs/AutoChangeLog-pr-11331.yml deleted file mode 100644 index bd501e2f162..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11331.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added cancel button to Wizard teleportation scrolls" diff --git a/html/changelogs/AutoChangeLog-pr-11332.yml b/html/changelogs/AutoChangeLog-pr-11332.yml deleted file mode 100644 index f76e2e2b48b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11332.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added an option to grant Martial Arts via administrative Var menu" diff --git a/html/changelogs/AutoChangeLog-pr-11333.yml b/html/changelogs/AutoChangeLog-pr-11333.yml deleted file mode 100644 index 71935d55d86..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11333.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Toggling hardhat light on/off now correctly updates wearer's sprite" diff --git a/html/changelogs/AutoChangeLog-pr-11334.yml b/html/changelogs/AutoChangeLog-pr-11334.yml deleted file mode 100644 index 7e119901704..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11334.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added deathsound for Silicons" diff --git a/html/changelogs/AutoChangeLog-pr-11335.yml b/html/changelogs/AutoChangeLog-pr-11335.yml deleted file mode 100644 index 084f93320cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11335.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Dice will now roll when thrown" diff --git a/html/changelogs/AutoChangeLog-pr-11336.yml b/html/changelogs/AutoChangeLog-pr-11336.yml deleted file mode 100644 index bf2626580e3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CthulhuOnIce" -delete-after: True -changes: - - bugfix: "you can smell dead bodies, even if someone else shouldn't" diff --git a/html/changelogs/AutoChangeLog-pr-11338.yml b/html/changelogs/AutoChangeLog-pr-11338.yml deleted file mode 100644 index 6505d695841..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11338.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added sound when adding or removing IDs from ID modification computers" diff --git a/html/changelogs/AutoChangeLog-pr-11339.yml b/html/changelogs/AutoChangeLog-pr-11339.yml deleted file mode 100644 index a5b0f74908e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11339.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again." diff --git a/html/changelogs/AutoChangeLog-pr-11340.yml b/html/changelogs/AutoChangeLog-pr-11340.yml deleted file mode 100644 index 3b9d667166a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11340.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - tweak: "Jumpsuits are now removed by clicking instead of clicking and dragging." diff --git a/html/changelogs/AutoChangeLog-pr-11347.yml b/html/changelogs/AutoChangeLog-pr-11347.yml deleted file mode 100644 index 57248e4f861..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11347.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added cancel button to transfer amount from stack menu" - - tweak: "Alt-click is a new shortcut to take a custom amount from stack" diff --git a/html/changelogs/AutoChangeLog-pr-11348.yml b/html/changelogs/AutoChangeLog-pr-11348.yml deleted file mode 100644 index 55335793f97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11348.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum." - - rscadd: "Added ability to rename pumps, volume pumps, filters and mixers with a pen." diff --git a/html/changelogs/AutoChangeLog-pr-11349.yml b/html/changelogs/AutoChangeLog-pr-11349.yml deleted file mode 100644 index 329fec2e5cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11349.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added sound for throwing bolas" - - soundadd: "Added hitsound for all types of bolas" diff --git a/html/changelogs/AutoChangeLog-pr-11350.yml b/html/changelogs/AutoChangeLog-pr-11350.yml deleted file mode 100644 index 54d750a6e7e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11350.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSvotes" - - rscadd: "SSradio" diff --git a/html/changelogs/AutoChangeLog-pr-11351.yml b/html/changelogs/AutoChangeLog-pr-11351.yml deleted file mode 100644 index 8fbca5fe9c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11351.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "Pipe dispensers (the big ones) now work again." - - tweak: "Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds" diff --git a/html/changelogs/AutoChangeLog-pr-11353.yml b/html/changelogs/AutoChangeLog-pr-11353.yml deleted file mode 100644 index 9807b7a0681..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11353.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added AntagHUD to everyone at the round end" diff --git a/html/changelogs/AutoChangeLog-pr-11355.yml b/html/changelogs/AutoChangeLog-pr-11355.yml deleted file mode 100644 index 934e85808ba..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11355.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed an error message being inappropriately generated for admins when someone signs up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11356.yml b/html/changelogs/AutoChangeLog-pr-11356.yml deleted file mode 100644 index d441bd658e1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11356.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "McDonald072" -delete-after: True -changes: - - bugfix: "You can no longer examine or teleport things using clipboards" diff --git a/html/changelogs/AutoChangeLog-pr-11360.yml b/html/changelogs/AutoChangeLog-pr-11360.yml deleted file mode 100644 index 3fb01b5b8f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11360.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSevents" - - rscadd: "SSholiday" - - tweak: "We no longer check if its Christmas every tick. Dont ask." diff --git a/html/changelogs/AutoChangeLog-pr-11361.yml b/html/changelogs/AutoChangeLog-pr-11361.yml deleted file mode 100644 index 7207d6d5daf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11361.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSalarms" diff --git a/html/changelogs/AutoChangeLog-pr-11362.yml b/html/changelogs/AutoChangeLog-pr-11362.yml deleted file mode 100644 index 72282104dc1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11362.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uc_guy" -delete-after: True -changes: - - bugfix: "Players in the lobby no longer see cult speak." diff --git a/html/changelogs/AutoChangeLog-pr-11364.yml b/html/changelogs/AutoChangeLog-pr-11364.yml deleted file mode 100644 index b331b4d009d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11364.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "object and fast processing are now proper subsystems" diff --git a/html/changelogs/AutoChangeLog-pr-11365.yml b/html/changelogs/AutoChangeLog-pr-11365.yml deleted file mode 100644 index fd5fe573104..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11365.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray." - - bugfix: "Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job." - - tweak: "Job transfers to karma jobs are now possible - if you have the job unlocked." - - rscadd: "Attempting to bypass a job ban via a job transfer now generates a warning to all online admins." diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml deleted file mode 100644 index 5d90a0b3f30..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11367.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Doctor delight and orange juice now heal again" diff --git a/html/changelogs/AutoChangeLog-pr-11368.yml b/html/changelogs/AutoChangeLog-pr-11368.yml new file mode 100644 index 00000000000..f2d543bae3a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11368.yml @@ -0,0 +1,5 @@ +author: "AffectedArc07" +delete-after: True +changes: + - rscadd: "SSticker" + - tweak: "You can no longer force-start a round unless its fully initialised." diff --git a/html/changelogs/AutoChangeLog-pr-11369.yml b/html/changelogs/AutoChangeLog-pr-11369.yml deleted file mode 100644 index c8bc9be9e2d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11369.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Circuit Boards now show their required components on examine" diff --git a/html/changelogs/AutoChangeLog-pr-11370.yml b/html/changelogs/AutoChangeLog-pr-11370.yml deleted file mode 100644 index 9cd7a28a5b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11370.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Revenants now have randomly generated flavor names" diff --git a/html/changelogs/AutoChangeLog-pr-11371.yml b/html/changelogs/AutoChangeLog-pr-11371.yml deleted file mode 100644 index 220e6962bc5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11371.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions." diff --git a/html/changelogs/AutoChangeLog-pr-11372.yml b/html/changelogs/AutoChangeLog-pr-11372.yml deleted file mode 100644 index 963e58006f1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11372.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print." diff --git a/html/changelogs/AutoChangeLog-pr-11373.yml b/html/changelogs/AutoChangeLog-pr-11373.yml deleted file mode 100644 index 9f90ffcd554..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11373.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Quantum-M" -delete-after: True -changes: - - rscadd: "Two multicolor pens to the Internal Affairs Office" diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml deleted file mode 100644 index 34d17cb10ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11375.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Puts beakers in your hand upon eject from chemistry machines" diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml deleted file mode 100644 index c3ed1239eb5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11376.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Cardboard can now be made in the Biogenerator" diff --git a/html/changelogs/AutoChangeLog-pr-11377.yml b/html/changelogs/AutoChangeLog-pr-11377.yml deleted file mode 100644 index 7b040fcc944..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11377.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!" - - rscadd: "You can now also close a canister's valve and remove the tank inside it by alt-clicking it." diff --git a/html/changelogs/AutoChangeLog-pr-11378.yml b/html/changelogs/AutoChangeLog-pr-11378.yml deleted file mode 100644 index fefbf428e06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip." diff --git a/html/changelogs/AutoChangeLog-pr-11381.yml b/html/changelogs/AutoChangeLog-pr-11381.yml deleted file mode 100644 index 604f3096553..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11381.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Moves AI admin log to the all preference" diff --git a/html/changelogs/AutoChangeLog-pr-11389.yml b/html/changelogs/AutoChangeLog-pr-11389.yml deleted file mode 100644 index 90d66861196..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "Refactored and improved our entry on the server hub." diff --git a/html/changelogs/AutoChangeLog-pr-11390.yml b/html/changelogs/AutoChangeLog-pr-11390.yml deleted file mode 100644 index 12edd2d1fa2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11390.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes multi-spawn blobs" diff --git a/html/changelogs/AutoChangeLog-pr-11391.yml b/html/changelogs/AutoChangeLog-pr-11391.yml deleted file mode 100644 index 2d23260b1e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11391.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Fixes admin PM's. Bwoinks are back on the menu!" diff --git a/html/changelogs/AutoChangeLog-pr-11393.yml b/html/changelogs/AutoChangeLog-pr-11393.yml deleted file mode 100644 index 955e99dab7a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11393.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Powersinks drain rate increased, but they also explode a bit sooner" - - rscadd: "Multitools display total power, load, and free power" - - bugfix: "Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location" diff --git a/html/changelogs/AutoChangeLog-pr-11395.yml b/html/changelogs/AutoChangeLog-pr-11395.yml deleted file mode 100644 index 08ad539b42d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11395.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in" diff --git a/html/changelogs/AutoChangeLog-pr-11396.yml b/html/changelogs/AutoChangeLog-pr-11396.yml deleted file mode 100644 index 7cbd431c75b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11396.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Ghost teleport verb will no locker flicker when used" diff --git a/html/changelogs/AutoChangeLog-pr-11397.yml b/html/changelogs/AutoChangeLog-pr-11397.yml deleted file mode 100644 index c19f8d2bd25..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11397.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Alt-click now opens and closes fire extinguisher cabinet" - - bugfix: "Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet" - - bugfix: "Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off" - - soundadd: "Added sound for opening and closing fire extinguisher cabinet" diff --git a/html/changelogs/AutoChangeLog-pr-11400.yml b/html/changelogs/AutoChangeLog-pr-11400.yml deleted file mode 100644 index 199c334303b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added new torch sprites" - - tweak: "Torch light color is now orange instead of red" - - bugfix: "Torch sprite now correctly shows all inhand sprites" diff --git a/html/changelogs/AutoChangeLog-pr-11404.yml b/html/changelogs/AutoChangeLog-pr-11404.yml deleted file mode 100644 index e4161ce9d6c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11404.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "The typing limiter option should now work for all edge cases. Such as dying while talking and such" diff --git a/html/changelogs/AutoChangeLog-pr-11405.yml b/html/changelogs/AutoChangeLog-pr-11405.yml deleted file mode 100644 index 82b5d6e22c6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11405.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Removed a useless message that would be sent to admins whenever a drone joins the round." diff --git a/html/changelogs/AutoChangeLog-pr-11406.yml b/html/changelogs/AutoChangeLog-pr-11406.yml deleted file mode 100644 index 4a3191624ea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11406.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Blob Rally Spores power is now free to use" - - bugfix: "Blob mobs can no longer speak while being dead via Blob Broadcast" - - bugfix: "Blob structures now properly show working animation" - - imageadd: "Added new sprites for variants of Blob resource, factory and storage structures" diff --git a/html/changelogs/AutoChangeLog-pr-11414.yml b/html/changelogs/AutoChangeLog-pr-11414.yml deleted file mode 100644 index a994f91763e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11414.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed an issue where admins would receive a message whenever someone joined up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11483.yml b/html/changelogs/AutoChangeLog-pr-11483.yml new file mode 100644 index 00000000000..635f5efede9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11483.yml @@ -0,0 +1,6 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "The Syndicate will no longer hire golems as agents." + - tweak: "Banana juice and Banana honk will now heal everyone with the Comic Sans mutation instead of checking for the clown job" + - tweak: "Nothing will now check if the player has an active vow of silence instead of checking for the mime job" diff --git a/html/changelogs/AutoChangeLog-pr-11508.yml b/html/changelogs/AutoChangeLog-pr-11508.yml new file mode 100644 index 00000000000..ebe3ed56455 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11508.yml @@ -0,0 +1,6 @@ +author: "datlo" +delete-after: True +changes: + - bugfix: "Ghosts will no longer get the wrong role offered when a nukie +spawns a borg and will properly be informed whether they will spawn as a +nuke ops or a syndi cyborg." diff --git a/html/changelogs/AutoChangeLog-pr-11523.yml b/html/changelogs/AutoChangeLog-pr-11523.yml new file mode 100644 index 00000000000..654203e359b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11523.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Future proofs the coming Ticker subsystem" diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt index 8f610ee9acf..2e919a6226d 100644 --- a/html/changelogs/__CHANGELOG_README.txt +++ b/html/changelogs/__CHANGELOG_README.txt @@ -15,5 +15,3 @@ TO MAKE A CHANGELOG .YML ENTRRY 5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file) ####################################################### - -If you have trouble ask for help in #codertrain on the Paradise Station IRC. diff --git a/html/nttc/dist/index.html b/html/nttc/dist/index.html index a8a7a17f1e3..ef7d917b471 100644 --- a/html/nttc/dist/index.html +++ b/html/nttc/dist/index.html @@ -13,7 +13,7 @@ - +
    NTTC
    diff --git a/icons/effects/alphacolors.dmi b/icons/effects/alphacolors.dmi index f27dfb036de..c01d261fe31 100644 Binary files a/icons/effects/alphacolors.dmi and b/icons/effects/alphacolors.dmi differ diff --git a/icons/effects/lighting_object.dmi b/icons/effects/lighting_object.dmi new file mode 100644 index 00000000000..51985c0c981 Binary files /dev/null and b/icons/effects/lighting_object.dmi differ diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi deleted file mode 100644 index daa43134b3c..00000000000 Binary files a/icons/effects/lighting_overlay.dmi and /dev/null differ diff --git a/icons/effects/lighting_overlay.png b/icons/effects/lighting_overlay.png deleted file mode 100644 index b317268b702..00000000000 Binary files a/icons/effects/lighting_overlay.png and /dev/null differ diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index b4d8a34a6e0..44fd328e6a2 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index b09302e0234..1e321d40058 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/carp.dmi b/icons/mob/carp.dmi new file mode 100644 index 00000000000..f5bb7f116b9 Binary files /dev/null and b/icons/mob/carp.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 6f2cf056cec..06b2934ebde 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 169e9e6cbf3..3a558b90140 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi new file mode 100644 index 00000000000..366493eebde Binary files /dev/null and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi new file mode 100644 index 00000000000..81b075f706e Binary files /dev/null and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index e84b0546950..595b870a172 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 02de48a6f41..469934ca932 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index bc36cdaaa8f..e212d9c5882 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 524418ba0e9..ccfa57790d9 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index cfce55cf6fb..87e919f1f09 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/paradise.dme b/paradise.dme index 1b7a691c820..79c465913f7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -57,7 +57,6 @@ #include "code\__DEFINES\rolebans.dm" #include "code\__DEFINES\shuttle.dm" #include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\snpc.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\station_goals.dm" @@ -145,6 +144,7 @@ #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\plane_master.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" @@ -198,9 +198,6 @@ #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" -#include "code\controllers\Processes\lighting.dm" -#include "code\controllers\Processes\npcai.dm" -#include "code\controllers\Processes\ticker.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\controllers\subsystem\air.dm" @@ -212,14 +209,15 @@ #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\holiday.dm" #include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\jobs.dm" +#include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\machinery.dm" #include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\nano_mob_hunter.dm" #include "code\controllers\subsystem\nanoui.dm" #include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcai.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\overlays.dm" #include "code\controllers\subsystem\radio.dm" @@ -227,6 +225,7 @@ #include "code\controllers\subsystem\spacedrift.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" @@ -443,7 +442,6 @@ #include "code\game\dna\genes\vg_powers.dm" #include "code\game\gamemodes\factions.dm" #include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\gameticker.dm" #include "code\game\gamemodes\intercept_report.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\scoreboard.dm" @@ -853,6 +851,7 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" @@ -1237,7 +1236,6 @@ #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\map_rng.dm" #include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\snpc.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\awaymissions\zvis.dm" @@ -1249,11 +1247,9 @@ #include "code\modules\awaymissions\mission_code\blackmarketpackers.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\clownplanet.dm" #include "code\modules\awaymissions\mission_code\evil_santa.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\spacehotel.dm" -#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" @@ -1319,7 +1315,6 @@ #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\patreon\glasses.dm" #include "code\modules\clothing\patreon\hats.dm" #include "code\modules\clothing\shoes\colour.dm" @@ -1587,11 +1582,10 @@ #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" #include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_overlay.dm" +#include "code\modules\lighting\lighting_object.dm" #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\lighting\~lighting_undefs.dm" #include "code\modules\logic\converter.dm" #include "code\modules\logic\dual_input.dm" #include "code\modules\logic\logic_base.dm" @@ -1746,9 +1740,6 @@ #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\update_stat.dm" -#include "code\modules\mob\living\carbon\human\interactive\functions.dm" -#include "code\modules\mob\living\carbon\human\interactive\interactive.dm" -#include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" #include "code\modules\mob\living\carbon\human\species\_species.dm" #include "code\modules\mob\living\carbon\human\species\abductor.dm" #include "code\modules\mob\living\carbon\human\species\diona.dm" diff --git a/strings/npc_chatter.json b/strings/npc_chatter.json deleted file mode 100644 index 833cb68605e..00000000000 --- a/strings/npc_chatter.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "nouns_insult": [ - "gaylord", - "shitcurity", - "noob", - "comdom", - "greyshirt", - "tator", - "lingbin", - "bitch", - "whorelord", - "cluwne", - "monkey", - "cheesemonger", - "milkdrinker" - ], - "adjective_objects": [ - "big", - "small", - "tiny", - "round", - "square", - "oblong", - "colorful", - "dull", - "shiny", - "sparkling", - "blinking", - "awful" - ], - "verbs_use": [ - "touch", - "hold", - "poke", - "punch", - "smash", - "assault", - "wrench", - "tickle", - "modify", - "whack", - "beat", - "tackle", - "destroy" - ], - "nouns_objects": [ - "thing", - "tool", - "whatever", - "potential murder weapon", - "object", - "toy", - "device", - "whatever" - ], - "nouns_generic": [ - "you", - "you there", - "guy", - "person", - "dude", - "jerk", - "officer" - ], - "curse_words": [ - "damn", - "shit", - "arse", - "ass", - "wank", - "jerk", - "bitch" - ], - "adjective_generic": [ - "nice", - "pretty", - "ugly", - "bad", - "okay", - "stupid" - ], - "verbs_move": [ - "run", - "jog", - "leg it", - "slide", - "cheese it", - "walk", - "stroll", - "fly", - "scoot", - "yakkety", - "speed", - "fuck off", - "escape" - ], - "verbs_touch": [ - "pat", - "mess with", - "absorb", - "sneeze on", - "inject", - "rip", - "slap", - "grab", - "choke" - ], - "adjective_insult": [ - "ugly", - "repulsive", - "dumb", - "asian", - "mongoloid", - "childish", - "captain-like", - "monkey-like", - "whoreish", - "dimwit", - "jerk-face", - "vomit-inducer" - ], - "nouns_body": [ - "ass", - "head", - "face", - "arms", - "fingers", - "toes", - "chest", - "eyes", - "nails", - "groin", - "stomach", - "intestines", - "head" - ] -} diff --git a/tools/ss13_genchangelog.py b/tools/ss13_genchangelog.py index ed76aa9c6c6..18634d34832 100644 --- a/tools/ss13_genchangelog.py +++ b/tools/ss13_genchangelog.py @@ -1,8 +1,15 @@ ''' +ss13_genchangelog.py - Generate changelog from YAML. + Usage: $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/ -ss13_genchangelog.py - Generate changelog from YAML. + Example (first use): + - Install python 2.7 + - run cmd.exe + - pip install pyyaml + - cd paradise github directory + - python tools/ss13_genchangelog.py html/changelog.html html/changelogs/ Copyright 2013 Rob "N3X15" Nelson