diff --git a/.github/workflows/turdis.yml b/.github/workflows/turdis.yml index 9e04743ec86a..0c5b39a32717 100644 --- a/.github/workflows/turdis.yml +++ b/.github/workflows/turdis.yml @@ -6,9 +6,9 @@ name: Turdis # events but only for the master branch on: pull_request: - branches: master + branches: [master, beta] push: - branches: master + branches: [master, beta] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 421a91ff2811..9e81e908b5f4 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -49,19 +49,8 @@ /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/bunker) "al" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) "am" = ( /obj/structure/closet/crate/bin, /turf/open/floor/holofloor{ @@ -122,6 +111,19 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/court) +"av" = ( +/obj/docking_port/stationary{ + area_type = /area/yogs/infiltrator_base/outside; + dir = 2; + dwidth = 14; + height = 13; + id = "syndicatecutter_home"; + name = "Syndicate Home Outpost"; + roundstart_template = /datum/map_template/shuttle/infiltrator/cutter; + width = 22 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "aw" = ( /obj/structure/flora/bush, /turf/open/floor/holofloor/snow, @@ -263,13 +265,12 @@ /turf/open/floor/holofloor/snow, /area/holodeck/rec_center/winterwonderland) "aN" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "aO" = ( /obj/structure/window, /obj/effect/turf_decal/tile/blue, @@ -300,28 +301,9 @@ }, /area/holodeck/rec_center/lounge) "aR" = ( -/obj/item/clothing/under/shorts/red{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/under/shorts/blue{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/clothing/under/shorts/green, -/obj/item/clothing/under/shorts/grey{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/clothing/under/jabroni{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/structure/rack, -/turf/open/floor/holofloor{ - icon_state = "darkfull" - }, -/area/holodeck/rec_center/gym) +/obj/structure/flora/grass/both, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "aS" = ( /obj/item/cardboard_cutout/chess/white/king, /turf/open/floor/holofloor{ @@ -383,6 +365,16 @@ "aZ" = ( /turf/open/floor/holofloor/carpet, /area/holodeck/rec_center/lounge) +"ba" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "bb" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -408,6 +400,30 @@ }, /turf/open/floor/holofloor/carpet, /area/holodeck/rec_center/lounge) +"bf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/gloves/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/shoes/combat/coldres{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/combat/coldres, +/obj/item/clothing/under/syndicate/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/syndicate/combat, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "bg" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -465,6 +481,27 @@ icon_state = "wood" }, /area/holodeck/rec_center/lounge) +"bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bq" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Foyer"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"br" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "bs" = ( /obj/structure/table/wood, /obj/item/stamp/syndiround, @@ -661,13 +698,9 @@ /turf/open/floor/holofloor, /area/holodeck/rec_center/pet_lounge) "bU" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" - }, -/area/holodeck/rec_center/gym) +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "bV" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -681,15 +714,8 @@ }, /area/holodeck/rec_center/medical) "bW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/turf/closed/indestructible/rock/snow, +/area/yogs/infiltrator_base/outside) "bX" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -745,11 +771,24 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/pet_lounge) +"cd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "ce" = ( /obj/effect/holodeck_effect/mobspawner/bee, /obj/item/clothing/head/beekeeper_head, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) +"cf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/yogs/infiltrator_base/jail) "cg" = ( /obj/machinery/shower{ dir = 4 @@ -859,11 +898,9 @@ /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) "cs" = ( -/obj/structure/railing, -/turf/open/floor/holofloor{ - icon_state = "darkfull" - }, -/area/holodeck/rec_center/gym) +/obj/structure/flora/grass/green, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "ct" = ( /obj/structure/table/wood/fancy, /obj/item/clothing/suit/armor/riot/knight/blue, @@ -1095,6 +1132,21 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"da" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/flasher{ + id = "syndicateinfiltrator_flash2"; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "db" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/effect/holodeck_effect/mobspawner/pet, @@ -1137,14 +1189,9 @@ /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) "df" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/holofloor{ - icon_state = "white" - }, -/area/holodeck/rec_center/gym) +/obj/machinery/vending/cigarette/syndicate, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) "dg" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -1203,6 +1250,31 @@ }, /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/spacechess) +"do" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/airalarm{ + dir = 8; + icon_state = "alarm0"; + pixel_x = 24; + req_access = 150 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 1; + pixel_y = 28; + req_access = 150 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 5 + }, +/area/yogs/infiltrator_base) "dp" = ( /obj/structure/table/wood/fancy, /obj/item/clothing/suit/armor/riot/knight/blue, @@ -1217,20 +1289,59 @@ }, /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/thunderdome1218) -"ds" = ( -/obj/structure/weightmachine/stacklifter, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +"dr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"ds" = ( +/turf/closed/indestructible/fakeglass, +/area/yogs/infiltrator_base) +"dt" = ( +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"du" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"dv" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) +"dw" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 9 + }, +/area/yogs/infiltrator_base) "dx" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -1252,6 +1363,11 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) +"dy" = ( +/turf/closed/indestructible/fakedoor{ + name = "Primary Hallway" + }, +/area/yogs/infiltrator_base/jail) "dA" = ( /turf/open/floor/holofloor, /area/holodeck/rec_center/school) @@ -1361,6 +1477,9 @@ "dL" = ( /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/thunderdome1218) +"dM" = ( +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base/jail) "dN" = ( /obj/structure/table/wood, /obj/item/melee/chainofcommand{ @@ -1376,12 +1495,30 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) -"dQ" = ( -/obj/machinery/door/window/eastleft, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +"dP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/area/holodeck/rec_center/gym) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"dR" = ( +/obj/structure/bed, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = list(150); + req_access_txt = "0" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "dS" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -1407,6 +1544,20 @@ icon_state = "chapel" }, /area/holodeck/rec_center/chapelcourt) +"dW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/glass, +/obj/effect/landmark/start/infiltrator_objective, +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "dX" = ( /obj/structure/table/wood, /obj/item/folder, @@ -1510,6 +1661,14 @@ icon_state = "whiteboard" }, /area/holodeck/rec_center/spacechess) +"el" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/yogs/infiltrator_base/jail) "em" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -1567,6 +1726,12 @@ icon_state = "white" }, /area/holodeck/rec_center/firingrange) +"et" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "eu" = ( /obj/item/weldingtool, /turf/open/floor/holofloor/plating, @@ -1586,11 +1751,35 @@ }, /area/holodeck/rec_center/medical) "ex" = ( -/obj/machinery/door/window/westright, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_left"; + name = "skeletal minibar" + }, +/obj/item/reagent_containers/food/drinks/bottle/grappa{ + pixel_x = 10; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/patron{ + pixel_x = -5; + pixel_y = 18 }, -/area/holodeck/rec_center/gym) +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/drinks/bottle/cognac{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + layer = 3.2; + pixel_x = 15; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "ey" = ( /obj/structure/table/wood, /obj/item/melee/chainofcommand{ @@ -1660,6 +1849,10 @@ "eF" = ( /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) +"eG" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base/jail) "eH" = ( /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/thunderdome1218) @@ -1685,6 +1878,21 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"eK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "eM" = ( /obj/structure/chair{ dir = 1 @@ -1716,13 +1924,30 @@ }, /area/holodeck/rec_center/spacechess) "eQ" = ( -/obj/structure/chair{ - dir = 4 +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_right"; + name = "skeletal minibar" }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/item/reagent_containers/food/drinks/bottle/goldschlager{ + pixel_x = -8; + pixel_y = 18 }, -/area/holodeck/rec_center/gym) +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = 7; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/kahlua{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/bottle/absinthe{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "eR" = ( /obj/structure/chair{ dir = 1 @@ -1806,10 +2031,34 @@ /obj/effect/holodeck_effect/mobspawner/penguin, /turf/open/floor/holofloor/snow, /area/holodeck/rec_center/winterwonderland) +"fd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "fe" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/pet_lounge) +"ff" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset{ + anchored = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "fg" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -1843,6 +2092,13 @@ }, /turf/open/floor/holofloor/snow, /area/holodeck/rec_center/winterwonderland) +"fl" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "fn" = ( /obj/structure/flora/ausbushes/reedbush, /turf/open/floor/holofloor/grass, @@ -1888,6 +2144,21 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"fs" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/shuttle/syndicate/recall{ + dir = 1; + possible_destinations = "syndicatecutter_home"; + shuttleId = "syndicatecutter" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"ft" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/infiltrator, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "fu" = ( /obj/item/target, /obj/item/target/clown, @@ -5304,6 +5575,19 @@ }, /turf/open/floor/plasteel/white, /area/centcom/ferry) +"nk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "nl" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -5917,6 +6201,21 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"on" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "oo" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -6102,10 +6401,69 @@ "oB" = ( /turf/open/floor/wood, /area/centcom/ferry) +"oD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/table, +/obj/item/restraints/handcuffs{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/restraints/handcuffs{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/assembly/flash/handheld, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"oE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "oF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/centcom/ferry) +"oG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"oH" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"oI" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "oJ" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Office"; @@ -6262,6 +6620,10 @@ }, /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) +"oV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "oW" = ( /obj/structure/flora/bush, /obj/effect/light_emitter{ @@ -6293,16 +6655,74 @@ }, /turf/open/floor/wood, /area/centcom/ferry) +"oZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"pa" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/radio/headset/syndicate/alt{ + pixel_y = 5 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 1; + pixel_y = -5 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 10; + pixel_y = 6 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 10; + pixel_y = -5 + }, +/obj/item/multitool{ + pixel_x = -6 + }, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"pb" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "pc" = ( /obj/machinery/computer/communications, /turf/open/floor/carpet/green, /area/centcom/ferry) +"pd" = ( +/obj/structure/chair/stool, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 26 + }, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "pe" = ( /obj/structure/chair/comfy/black{ dir = 1 }, /turf/open/floor/carpet/green, /area/centcom/ferry) +"pf" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "pg" = ( /turf/open/floor/plasteel/grimy, /area/centcom/ferry) @@ -6596,6 +7016,17 @@ }, /turf/open/floor/wood, /area/centcom/ferry) +"pA" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "pB" = ( /obj/machinery/firealarm, /turf/closed/indestructible/riveted, @@ -6687,6 +7118,52 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/wood, /area/centcom/ferry) +"pL" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"pM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"pN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "pO" = ( /obj/structure/destructible/cult/tome, /obj/item/book/codex_gigas, @@ -7147,6 +7624,15 @@ "qE" = ( /turf/closed/indestructible/riveted/uranium, /area/wizard_station) +"qF" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "qG" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -7199,11 +7685,37 @@ /turf/open/floor/plasteel, /area/syndicate_mothership/control) "qM" = ( -/obj/structure/railing/corner, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -7; + pixel_y = 12 }, -/area/holodeck/rec_center/gym) +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "qN" = ( /obj/structure/urinal{ pixel_y = 28 @@ -7519,6 +8031,28 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"ru" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 8; + scan_range = 3 + }, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'CAUTION: AUTOMATED TURRET'."; + name = "CAUTION: AUTOMATED TURRET"; + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base/jail) +"rv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/indestructible/fakedoor{ + name = "Primary Hallway" + }, +/area/yogs/infiltrator_base) "rw" = ( /obj/item/flashlight/lamp, /obj/structure/table/reinforced, @@ -7857,15 +8391,8 @@ /turf/open/floor/plasteel, /area/centcom/supplypod) "sc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "sd" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -7901,6 +8428,11 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership/control) +"sh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "si" = ( /obj/structure/table/wood, /obj/item/paper/fluff/stations/centcom/disk_memo, @@ -8067,6 +8599,17 @@ }, /turf/open/floor/carpet/green, /area/centcom/ferry) +"sC" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cell 2"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "sD" = ( /obj/machinery/door/airlock/centcom{ name = "Administrative Storage"; @@ -8405,12 +8948,9 @@ /turf/open/floor/plasteel, /area/syndicate_mothership/control) "tg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "th" = ( /obj/structure/closet/cardboard, /obj/effect/turf_decal/stripes/corner, @@ -8545,6 +9085,10 @@ /obj/structure/flora/ausbushes/fernybush, /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/pet_lounge) +"ty" = ( +/obj/item/toy/plush/nukeplushie, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "tz" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -8554,6 +9098,20 @@ }, /turf/open/floor/wood, /area/centcom/ferry) +"tA" = ( +/obj/structure/table/wood, +/obj/item/pizzabox/vegetable, +/obj/item/paicard, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"tB" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "tC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -8796,6 +9354,29 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"ub" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/pistol{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/gun/ballistic/automatic/pistol{ + pixel_y = 1 + }, +/obj/item/gun/ballistic/automatic/pistol{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/gun/ballistic/automatic/pistol{ + pixel_x = 2; + pixel_y = -3 + }, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "uc" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -8945,6 +9526,16 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"up" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"uq" = ( +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "ur" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -9520,6 +10111,14 @@ /obj/item/toy/nuke, /turf/open/floor/wood, /area/syndicate_mothership/control) +"vy" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "vz" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -10357,13 +10956,14 @@ /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) "xa" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 }, -/area/holodeck/rec_center/gym) +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "xb" = ( /obj/docking_port/stationary{ dir = 8; @@ -10617,6 +11217,17 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) +"xF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "xG" = ( /turf/open/floor/plasteel/dark, /area/syndicate_mothership/control) @@ -10824,6 +11435,11 @@ /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"yg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "yh" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input{ dir = 4 @@ -11130,14 +11746,11 @@ /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/spacechess) "yP" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "yQ" = ( /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -11777,16 +12390,12 @@ /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) "zY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "zZ" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -12068,6 +12677,15 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/centcom/testchamber) +"AF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "AG" = ( /obj/structure/ladder/unbreakable/binary/space, /turf/open/indestructible/airblock, @@ -12344,6 +12962,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/centcom/testchamber) +"Bm" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Bn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -12755,6 +13383,16 @@ }, /turf/open/floor/bluespace, /area/centcom/testchamber) +"BX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "BY" = ( /obj/item/toy/figure/syndie, /turf/open/floor/plating/asteroid/snow/airless, @@ -13336,6 +13974,16 @@ }, /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/spacechess) +"CT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "CU" = ( /obj/structure/table/wood/bar{ boot_dir = 8 @@ -14694,12 +15342,31 @@ }, /turf/open/floor/plasteel/white, /area/tdome/tdomeobserve) +"FA" = ( +/obj/structure/rack, +/obj/item/storage/box/lights/bulbs, +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/yogs/infiltrator_base) "FB" = ( /obj/item/cardboard_cutout/chess/white/bishop, /turf/open/floor/holofloor{ icon_state = "reebe" }, /area/holodeck/rec_center/spacechess) +"FC" = ( +/obj/structure/sign/warning/securearea{ + desc = "You shouldn't be here, you know!"; + name = "\improper FOURTH WALL"; + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 4; + piping_layer = 2 + }, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "FD" = ( /obj/machinery/shower{ dir = 4 @@ -15114,6 +15781,25 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/bunker) +"GB" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/suppressor{ + pixel_y = 8 + }, +/obj/item/suppressor{ + pixel_y = -3 + }, +/obj/item/suppressor{ + pixel_y = 2 + }, +/obj/item/suppressor{ + pixel_y = 13 + }, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "GC" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -17042,6 +17728,23 @@ }, /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) +"JW" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/toy/cards/deck/syndicate{ + icon_state = "deck_syndicate_full"; + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "JX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -17104,18 +17807,9 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "Kd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "Ke" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -17612,6 +18306,21 @@ "KQ" = ( /turf/open/floor/plating, /area/centcom/evac) +"KR" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = 150 + }, +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/flashlight, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "KS" = ( /obj/machinery/door/window/northright{ name = "Security Desk"; @@ -17699,6 +18408,13 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) +"KZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "La" = ( /obj/machinery/stasis{ dir = 4 @@ -17749,6 +18465,19 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"Le" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"Lf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Lg" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -17759,13 +18488,26 @@ /turf/open/floor/carpet/green, /area/centcom/ferry) "Lh" = ( -/obj/structure/railing{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 }, -/area/holodeck/rec_center/gym) +/obj/item/reagent_containers/food/snacks/chocolatebar{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "Li" = ( /obj/structure/window/reinforced, /obj/machinery/computer/secure_data/laptop{ @@ -17776,6 +18518,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"Lj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = list(150); + req_access_txt = "0" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "Lk" = ( /obj/machinery/sleeper{ controls_inside = 1; @@ -17867,27 +18620,85 @@ icon_state = "darkfull" }, /area/holodeck/rec_center/chapelcourt) +"Lv" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun/mini, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"Lw" = ( +/obj/structure/flora/grass/brown, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"Lx" = ( +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = list(150) + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Ly" = ( /obj/effect/turf_decal/tile/red{ dir = 4 }, /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) +"Lz" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "LA" = ( /obj/effect/decal/cleanable/crayon{ icon_state = "1" }, /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/spacechess) +"LB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "LC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = 150 }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "LE" = ( /obj/structure/table, /obj/item/radio/off, @@ -17916,10 +18727,14 @@ }, /area/holodeck/rec_center/chapelcourt) "LH" = ( -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/machinery/porta_turret/syndicate, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'CAUTION: AUTOMATED TURRET'."; + name = "CAUTION: AUTOMATED TURRET"; + pixel_y = 32 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "LI" = ( /obj/item/clothing/suit/judgerobe, /obj/item/clothing/head/powdered_wig, @@ -17939,13 +18754,25 @@ }, /area/holodeck/rec_center/chapelcourt) "LJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/turretid{ + ailock = 1; + control_area = null; + desc = "A specially designed set of turret controls. Looks to be covered in protective casing to prevent AI interfacing."; + icon_state = "control_stun"; + name = "Security turret control"; + pixel_x = 26; + req_access = 150 }, -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/area/holodeck/rec_center/gym) +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "LK" = ( /obj/machinery/abductor/experiment{ team_number = 2 @@ -18199,16 +19026,12 @@ /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) "Mo" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/machinery/door/airlock{ + name = "Bar Storage" }, -/area/holodeck/rec_center/gym) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "Mp" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -18242,6 +19065,13 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Mt" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Mu" = ( /obj/machinery/light{ dir = 1 @@ -18469,6 +19299,22 @@ layer = 5 }, /area/space) +"MP" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "MQ" = ( /obj/structure/chair/stool/bar, /turf/open/floor/holofloor/carpet, @@ -18479,6 +19325,21 @@ }, /turf/open/floor/carpet/black, /area/centcom/holding) +"MS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "MT" = ( /obj/machinery/processor, /turf/open/floor/plasteel/cafeteria, @@ -18487,6 +19348,16 @@ /obj/machinery/portable_atmospherics/canister/bz, /turf/open/floor/bluespace, /area/centcom/testchamber) +"MV" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cell 1"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "MW" = ( /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/bluespace, @@ -18678,15 +19549,16 @@ /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) "Np" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/white/line{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "Nq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -18777,6 +19649,17 @@ /obj/item/gun/magic/rune/toxic_rune, /turf/open/floor/wood, /area/centcom/testchamber) +"NC" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) "ND" = ( /obj/structure/table/wood, /obj/item/antag_spawner/nuke_ops/borg_tele/medical{ @@ -18833,6 +19716,14 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"NK" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "NL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -19060,6 +19951,20 @@ /obj/item/encryptionkey/syndicate, /turf/open/floor/plasteel, /area/centcom/testchamber) +"Oh" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = 150 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) "Oi" = ( /obj/machinery/portable_atmospherics/canister/miasma, /turf/open/floor/bluespace, @@ -19341,6 +20246,14 @@ /obj/mecha/combat/gygax, /turf/open/floor/engine, /area/centcom/testchamber) +"OJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "OK" = ( /obj/machinery/door/airlock/external{ name = "Emergency Recovery Airlock" @@ -19416,6 +20329,16 @@ "OQ" = ( /turf/open/space/bluespace_locker_mirage, /area/bluespace_locker) +"OS" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "OT" = ( /obj/structure/chair, /obj/effect/turf_decal/tile/green{ @@ -19486,6 +20409,15 @@ /obj/machinery/washing_machine, /turf/open/floor/plasteel/white, /area/centcom/holding) +"Pc" = ( +/obj/machinery/vending/coffee, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Pd" = ( /obj/structure/table, /obj/item/assembly/flash/handheld, @@ -19577,16 +20509,15 @@ /turf/open/floor/carpet/black, /area/centcom/holding) "Pp" = ( -/obj/structure/railing{ - dir = 1 +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 }, -/obj/structure/chair{ +/obj/effect/turf_decal/stripes/white/corner{ dir = 1 }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" - }, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "Pq" = ( /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) @@ -19695,6 +20626,20 @@ /obj/item/reagent_containers/pill/adminordrazine, /turf/open/floor/plasteel, /area/centcom/testchamber) +"PF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "PH" = ( /obj/structure/chair{ pixel_y = -2 @@ -19832,6 +20777,18 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"PZ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Qa" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -19976,31 +20933,47 @@ /turf/open/floor/plasteel, /area/centcom/testchamber) "Qp" = ( -/obj/structure/railing{ +/obj/effect/turf_decal/stripes/white/line{ dir = 1 }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" - }, -/area/holodeck/rec_center/gym) +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "Qq" = ( /obj/structure/lattice/catwalk/swarmer_catwalk, /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/space/basic, /area/centcom/testchamber) +"Qr" = ( +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = 150 + }, +/obj/structure/bed, +/obj/item/bedsheet/black, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) "Qs" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/white/corner{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/white/corner{ dir = 4 }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "Qt" = ( /obj/structure/sign/warning/biohazard, /turf/closed/indestructible/riveted, /area/centcom/testchamber) +"Qu" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Qv" = ( /obj/structure/window{ dir = 1 @@ -20317,6 +21290,13 @@ /obj/item/storage/secure/briefcase, /turf/open/floor/plasteel/dark, /area/centcom/ferry) +"QY" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "QZ" = ( /obj/effect/decal/cleanable/crayon{ icon_state = "5" @@ -20359,13 +21339,16 @@ /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) "Rc" = ( -/obj/structure/railing{ - dir = 4 +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/machinery/light/small{ + dir = 4 }, -/area/holodeck/rec_center/gym) +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "Rd" = ( /obj/machinery/light, /obj/effect/turf_decal/tile/green{ @@ -20435,6 +21418,21 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"Rk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/effect/landmark/start/infiltrator_objective, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"Rl" = ( +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) "Rm" = ( /obj/structure/chair/wood/wings{ dir = 3 @@ -20484,6 +21482,20 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/firingrange) +"Rr" = ( +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/item/storage/crayons{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/crayons, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) "Rs" = ( /obj/item/clothing/neck/stripedredscarf{ pixel_x = -3; @@ -20799,6 +21811,29 @@ /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plasteel, /area/centcom/testchamber) +"RU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/button/flasher{ + id = "syndicateinfiltrator_flash1"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/button/flasher{ + id = "syndicateinfiltrator_flash2"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "RV" = ( /turf/open/floor/holofloor{ icon_state = "darkfull" @@ -21032,11 +22067,21 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) +"Sy" = ( +/obj/effect/turf_decal/stripes/white/corner, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "Sz" = ( /obj/effect/holodeck_effect/mobspawner/pet, /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/holofloor/grass, /area/holodeck/rec_center/pet_lounge) +"SA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "SB" = ( /obj/structure/curtain, /obj/structure/window/reinforced/tinted{ @@ -21090,6 +22135,10 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"SI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "SJ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -21109,6 +22158,29 @@ /obj/machinery/portable_atmospherics/canister/nitryl, /turf/open/floor/bluespace, /area/centcom/testchamber) +"SM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/gloves/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/shoes/combat/coldres{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/combat/coldres, +/obj/item/clothing/under/syndicate/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/syndicate/combat, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) "SN" = ( /obj/structure/mopbucket, /obj/item/mop, @@ -21217,6 +22289,15 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) +"SX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "SY" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4; @@ -21272,15 +22353,17 @@ /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) "Te" = ( -/obj/structure/railing{ - dir = 1 +/obj/structure/curtain, +/obj/machinery/shower{ + pixel_y = 14 }, -/obj/structure/table/wood/bar, -/obj/item/bikehorn/airhorn, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/machinery/door/window{ + name = "Shower Door" }, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) "Tf" = ( /turf/closed/indestructible/abductor{ icon_state = "alien4"; @@ -21303,6 +22386,25 @@ /obj/item/gun/ballistic/automatic/tommygun, /turf/open/floor/plasteel, /area/centcom/testchamber) +"Th" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"Ti" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Tj" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/bottle/whiskey{ @@ -21793,6 +22895,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) +"Uj" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) "Uk" = ( /obj/structure/flora/tree/pine, /turf/open/floor/holofloor/snow, @@ -21831,6 +22940,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) +"Uo" = ( +/obj/structure/flora/tree/pine, +/turf/closed/indestructible/rock/snow, +/area/yogs/infiltrator_base/outside) "Up" = ( /turf/closed/indestructible/abductor{ icon_state = "alien14"; @@ -21838,11 +22951,18 @@ }, /area/bluespace_locker) "Uq" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 }, -/area/holodeck/rec_center/gym) +/area/yogs/infiltrator_base) "Ur" = ( /obj/machinery/computer/arcade/orion_trail, /turf/open/floor/mineral/titanium/blue, @@ -21898,6 +23018,15 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/supplypod) +"Uy" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/computer/camera_advanced/syndie{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) "Uz" = ( /obj/structure/window/reinforced{ dir = 8 @@ -22021,6 +23150,20 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"UK" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) "UL" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -22083,6 +23226,37 @@ }, /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/spacechess) +"UR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = 28 + }, +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -4; + pixel_y = -8 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = 9; + pixel_y = -8 + }, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) "US" = ( /obj/structure/table/wood/poker, /turf/open/floor/holofloor{ @@ -22107,17 +23281,16 @@ /turf/open/floor/wood, /area/centcom/holding) "UW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "UX" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -22155,6 +23328,21 @@ "Va" = ( /turf/open/floor/plasteel/dark, /area/bluespace_locker) +"Vb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Vd" = ( /obj/item/cardboard_cutout/chess/white/pawn, /turf/open/floor/holofloor{ @@ -22211,12 +23399,18 @@ /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) "Vj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/chair/stool, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = list(150) }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/holofloor, -/area/holodeck/rec_center/gym) +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Vk" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -22502,6 +23696,17 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plasteel, /area/centcom/testchamber) +"VR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Bathroom" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) "VS" = ( /obj/item/stack/sheet/mineral/coal{ pixel_x = -8; @@ -22557,6 +23762,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/supplypod) +"VZ" = ( +/obj/structure/flora/grass/brown, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "Wa" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -22629,6 +23838,16 @@ /obj/item/storage/pill_bottle/dice, /turf/open/floor/carpet/green, /area/centcom/ferry) +"Wg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Wh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -22767,6 +23986,25 @@ }, /turf/open/floor/plasteel, /area/centcom/supplypod/loading/four) +"Wu" = ( +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"Wv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/flasher{ + id = "syndicateinfiltrator_flash1"; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) "Ww" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/tile/yellow{ @@ -22789,6 +24027,14 @@ opacity = 0 }, /area/bluespace_locker) +"Wz" = ( +/obj/structure/flora/grass/both, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "WA" = ( /obj/machinery/computer/arcade/battle, /turf/open/floor/mineral/titanium/blue, @@ -22828,20 +24074,20 @@ }, /area/holodeck/rec_center/medical) "WE" = ( -/obj/structure/rack, -/obj/item/clothing/mask/luchador{ - pixel_x = -2; - pixel_y = 2 +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_y = 10 }, -/obj/item/clothing/mask/luchador/rudos, -/obj/item/clothing/mask/luchador/tecnicos{ - pixel_x = 2; - pixel_y = -2 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 }, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "WF" = ( /obj/machinery/firealarm{ dir = 8; @@ -22852,6 +24098,12 @@ }, /turf/open/floor/carpet/green, /area/centcom/ferry) +"WG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) "WH" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -23019,6 +24271,24 @@ }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) +"WX" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/yogs/infiltrator_base) +"WY" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) "WZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -23085,6 +24355,15 @@ "Xh" = ( /turf/open/floor/plasteel, /area/centcom/supplypod/loading/four) +"Xi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Xj" = ( /obj/machinery/door/airlock/external{ name = "Emergency Recovery Airlock" @@ -23138,6 +24417,10 @@ icon_state = "whiteboard" }, /area/holodeck/rec_center/spacechess) +"Xn" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "Xo" = ( /obj/machinery/vending/dinnerware, /turf/open/floor/plasteel/cafeteria, @@ -23303,6 +24586,12 @@ /obj/machinery/portable_atmospherics/canister/nitryl, /turf/open/floor/bluespace, /area/centcom/testchamber) +"XF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) "XG" = ( /obj/structure/sign/poster/official/random{ pixel_x = -32 @@ -23352,6 +24641,12 @@ /obj/item/teleportation_scroll, /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) +"XK" = ( +/obj/structure/flora/tree/pine{ + max_integrity = 100000 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) "XL" = ( /obj/machinery/door/airlock/wood, /turf/open/floor/wood, @@ -23534,6 +24829,13 @@ opacity = 0 }, /area/bluespace_locker) +"Ye" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) "Yf" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/chawanmushi, @@ -23554,6 +24856,9 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Yi" = ( +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) "Yj" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -23581,10 +24886,21 @@ /turf/open/floor/plasteel, /area/centcom/testchamber) "Yl" = ( -/turf/open/floor/holofloor{ - icon_state = "white" +/obj/structure/chair/stool, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_y = 32 + }, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Ym" = ( /obj/machinery/computer/arcade/orion_trail, /turf/open/floor/wood, @@ -23598,6 +24914,13 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Yp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Yq" = ( /obj/structure/chair/wood/wings{ dir = 8 @@ -23747,6 +25070,16 @@ /obj/item/station_charter/admin, /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) +"YF" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/door/airlock/centcom{ + name = "Equipment Room"; + opacity = 1; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "YG" = ( /obj/structure/table/wood, /obj/item/gun/magic/rune/bomb_rune, @@ -23765,6 +25098,10 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) +"YI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) "YJ" = ( /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/reagent_containers/food/drinks/shaker, @@ -23815,11 +25152,12 @@ }, /area/holodeck/rec_center/lounge) "YP" = ( -/obj/structure/punching_bag, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 }, -/area/holodeck/rec_center/gym) +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) "YQ" = ( /obj/structure/table, /obj/item/reagent_containers/glass/beaker, @@ -23971,24 +25309,11 @@ /turf/open/floor/plasteel, /area/centcom/testchamber) "Ze" = ( -/obj/item/clothing/gloves/boxing{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/gloves/boxing/blue{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/clothing/gloves/boxing/green, -/obj/item/clothing/gloves/boxing/yellow{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/structure/rack, -/turf/open/floor/holofloor{ - icon_state = "darkfull" +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 }, -/area/holodeck/rec_center/gym) +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) "Zf" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -24127,6 +25452,26 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Zt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"Zu" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) "Zv" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -24198,6 +25543,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/mineral/plastitanium/red, /area/centcom/evac) +"ZC" = ( +/obj/structure/rack, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark/side{ + dir = 10 + }, +/area/yogs/infiltrator_base) "ZD" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -34281,20 +35637,20 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh mB hh hh @@ -34538,53 +35894,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -34795,53 +36151,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -35052,53 +36408,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bW hl hl hl @@ -35309,53 +36665,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -35566,53 +36922,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -35823,53 +37179,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -36080,53 +37436,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -36337,53 +37693,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -36594,53 +37950,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -36851,53 +38207,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -37108,53 +38464,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -37365,53 +38721,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +bW hl hl hl @@ -37622,53 +38978,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -37879,53 +39235,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +bU +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -38136,53 +39492,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +bU +dt +dt +dt +dt +eG +dM +dM +dM +dM +dM +dM +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +cs +dt +dt +dt +VZ +dt +dt +dt +dt +bW hl hl hl @@ -38393,53 +39749,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +dt +dM +pf +da +dM +Wv +pf +dM +aN +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +bW hl hl hl @@ -38650,53 +40006,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dM +dR +SA +dM +Lj +Le +dM +aN +dt +dt +dt +dt +dt +dt +dt +ty +dt +dt +dt +bU +dt +dt +dt +bU +dt +dt +bW hl hl hl @@ -38907,53 +40263,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dM +cf +sC +dM +MV +cf +dM +aN +bU +dt +dt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +dt +aR +dt +dt +dt +bW hl hl hl @@ -39164,53 +40520,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +bU +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dy +Yi +MS +RU +nk +oD +dM +aN +dt +dt +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +dt +bW hl hl hl @@ -39421,53 +40777,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dv +al +dM +Oh +AF +el +Wu +pM +dM +aN +dt +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +aN +dt +dt +dt +dt +bW hl hl hl @@ -39678,53 +41034,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +FC +dM +Uy +pN +LJ +Lz +PF +dM +aN +dt +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +cs +dt +dt +dt +bW hl hl hl @@ -39935,53 +41291,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +al +rv +dM +dM +ru +dM +dM +MP +dM +aN +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +Lw +dt +dt +bW hl hl hl @@ -40192,53 +41548,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +al +al +al +al +al +Pc +oZ +SX +dM +dM +dM +vy +Yp +ds +ds +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +bW hl hl hl @@ -40449,53 +41805,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +cs +aN +df +al +qM +yP +Mo +UW +Lf +du +Lf +dW +al +KR +KZ +et +fs +ds +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +aN +dt +aR +dt +bW hl hl hl @@ -40706,53 +42062,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +ds +ex +sc +zY +al +Vj +Bm +oI +Mt +Rk +YI +OJ +uq +QY +ds +ds +ds +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +bW hl hl hl @@ -40963,53 +42319,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +bU +dt +dt +dt +dt +bU +dt +dt +aN +ds +eQ +tg +Kd +al +WE +tA +JW +oE +cd +YI +br +oV +Qu +Uj +Ye +WY +av +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +bW hl hl hl @@ -41220,53 +42576,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +aN +al +al +xa +Lh +al +Yl +pd +oI +Mt +CT +YI +pa +uq +et +ds +ds +ds +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +bW hl hl hl @@ -41316,7 +42672,7 @@ kt hl hl hl -hl +mz hl hl hl @@ -41477,53 +42833,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +aR +dt +dt +dt +al +al +al +al +al +al +OS +om +pA +al +fd +bp +et +ft +ds +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +aN +dt +dt +dt +bW hl hl hl @@ -41571,7 +42927,7 @@ ku ku kt kt -hl +mz hl hl hl @@ -41602,77 +42958,63 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di -lI -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -OQ -lI -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di +lI +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +OQ +lI +aa +"} +(68,1,1) = {" +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -41749,38 +43091,52 @@ aa aa aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +al +al +Np +YP +al +al +al +Vb +al +al +UR +on +ds +ds +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +bW hl hl hl @@ -41991,53 +43347,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +LC +Pp +Ze +Lv +al +dw +et +ZC +al +al +pL +al +aN +aN +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +aN +bU +dt +dt +dt +bW hl hl hl @@ -42248,53 +43604,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +LH +Qp +SI +oG +YF +WX +tB +Zt +bq +yg +Ti +ds +aN +dt +dt +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +dt +bW hl hl hl @@ -42505,53 +43861,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +al +GB +Qs +Sy +ub +al +do +sh +FA +al +ff +PZ +al +aN +aN +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +dt +Lw +dt +dt +dt +dt +dt +bW hl hl hl @@ -42762,53 +44118,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +al +al +Rc +fl +al +al +al +Th +al +al +al +al +al +al +al +aN +aN +aN +dt +dt +dt +dt +dt +dt +dt +aN +aN +dt +dt +dt +VZ +dt +bW hl hl hl @@ -43019,53 +44375,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +al +al +al +up +Rr +eK +dr +Lx +Wg +Xi +xF +bf +ds +aN +dt +aN +aN +dt +dt +dt +dt +dt +aN +aN +VZ +dt +dt +bU +dt +dt +bW hl hl hl @@ -43276,53 +44632,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +Te +XF +VR +yg +pb +Zu +LB +NK +LB +oH +dP +SM +ds +aN +dt +dt +aN +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -43533,53 +44889,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +al +Uq +UK +al +al +BX +al +al +ba +al +al +qF +al +al +aN +dt +dt +aN +dt +dt +dt +dt +dt +Wz +aR +dt +dt +XK +VZ +dt +dt +bW hl hl hl @@ -43790,53 +45146,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +al +al +al +NC +WG +al +NC +WG +al +NC +WG +al +aN +aN +VZ +dt +aN +dt +dt +dt +dt +dt +aN +dt +aR +dt +aR +dt +dt +bU +bW hl hl hl @@ -44047,53 +45403,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +al +Qr +Rl +al +Qr +Rl +al +Qr +Rl +al +aN +dt +dt +dt +aN +dt +dt +dt +dt +dt +aN +dt +dt +bU +dt +dt +dt +dt +bW hl hl hl @@ -44304,53 +45660,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +al +al +ds +al +al +ds +al +al +ds +al +aN +dt +dt +dt +aN +dt +dt +dt +dt +dt +aN +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -44561,53 +45917,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +aR +dt +bU +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +dt +cs +dt +aN +aN +dt +dt +dt +aN +aN +dt +dt +aR +dt +dt +dt +dt +bW hl hl hl @@ -44818,53 +46174,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +VZ +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +aN +aN +aN +aN +aN +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -45075,53 +46431,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +VZ +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +bW hl hl hl @@ -45332,53 +46688,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +aR +dt +dt +dt +VZ +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +cs +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -45589,53 +46945,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +aR +dt +dt +dt +bU +dt +dt +dt +bU +aR +dt +dt +dt +dt +bU +dt +dt +dt +dt +Uo hl hl hl @@ -45846,53 +47202,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +bU +dt +dt +dt +bU +bU +dt +dt +bU +dt +dt +dt +dt +dt +Uo hl hl hl @@ -46103,53 +47459,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +Xn +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -46360,53 +47716,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -46617,53 +47973,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -46874,53 +48230,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +bW hl hl hl @@ -47131,53 +48487,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -47388,53 +48744,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -47645,53 +49001,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -47902,53 +49258,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bU +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -48159,53 +49515,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -48416,53 +49772,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -48673,53 +50029,53 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa hh -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +dt +bW hl hl hl @@ -48846,22 +50202,8 @@ aa aa aa aa -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +"} +(96,1,1) = {" aa aa aa @@ -49013,6 +50355,20 @@ hh hh hh hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh aa aa aa @@ -55380,7 +56736,7 @@ aa aa aa aa -ad +aa aa aa aa @@ -66581,18 +67937,18 @@ aa aa "} (165,1,1) = {" -ab -ag -ag -ag -ag -ag -ag -ag -ag -ag -ag -ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -66838,18 +68194,18 @@ aa aa "} (166,1,1) = {" -bj -UW -LC -sc -LH -LH -YP -LH -eQ -eQ -eQ -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -67095,18 +68451,18 @@ aa aa "} (167,1,1) = {" -bj -Qs -al -tg -qM -dQ -Rc -Rc -Rc -Rc -xa -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -67352,18 +68708,18 @@ aa aa "} (168,1,1) = {" -bj -Qs -Kd -tg -cs -Yl -yP -Yl -Yl -Yl -Qp -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -67609,18 +68965,18 @@ aa aa "} (169,1,1) = {" -bj -Qs -al -tg -cs -df -LJ -Yl -Yl -Yl -Pp -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -67866,18 +69222,18 @@ aa aa "} (170,1,1) = {" -bj -Qs -Kd -tg -cs -Yl -Yl -Yl -Yl -Yl -Te -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -68123,18 +69479,18 @@ aa aa "} (171,1,1) = {" -bj -Qs -ds -tg -cs -Yl -Yl -Yl -Uq -Mo -Pp -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -68380,18 +69736,18 @@ aa aa "} (172,1,1) = {" -bj -Qs -Kd -tg -cs -Yl -Yl -Yl -zY -Yl -Qp -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -68637,18 +69993,18 @@ aa aa "} (173,1,1) = {" -bj -Qs -ds -tg -aN -Lh -Lh -Lh -Lh -ex -bU -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -68894,18 +70250,18 @@ aa aa "} (174,1,1) = {" -bj -Np -Vj -bW -LH -LH -YP -LH -Ze -aR -WE -bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/shuttles/infiltrator_cutter.dmm b/_maps/shuttles/infiltrator_cutter.dmm new file mode 100644 index 000000000000..9b91616daf31 --- /dev/null +++ b/_maps/shuttles/infiltrator_cutter.dmm @@ -0,0 +1,1417 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"ab" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 2 + }, +/obj/machinery/door/airlock/external{ + id_tag = "syndicatecutter_bolt_port"; + req_access_txt = "150" + }, +/obj/docking_port/mobile{ + callTime = 150; + dir = 2; + dwidth = 14; + height = 13; + id = "syndicatecutter"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "Syndicate Cutter"; + port_direction = 8; + preferred_direction = 4; + width = 22 + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"ac" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"ad" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/yogs/stealthcruiser) +"ae" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"af" = ( +/obj/structure/grille, +/obj/structure/window/plastitanium, +/obj/machinery/door/poddoor{ + id = "syndicatecutter_bridge" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"ag" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"ah" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/infiltrator, +/turf/open/floor/pod/light, +/area/shuttle/yogs/stealthcruiser) +"ai" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + id_tag = "syndicatecutter_bolt_port"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"aj" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"ak" = ( +/obj/structure/shuttle/engine/propulsion/burst/left{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/yogs/stealthcruiser) +"al" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/yogs/stealthcruiser) +"am" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"an" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"ap" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark/corner, +/area/shuttle/yogs/stealthcruiser) +"aq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark/side, +/area/shuttle/yogs/stealthcruiser) +"ar" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/plasteel/dark/side, +/area/shuttle/yogs/stealthcruiser) +"as" = ( +/obj/machinery/button/door{ + id = "syndicatecutter_bolt_port"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -4; + pixel_y = 25; + req_access_txt = "150"; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side, +/area/shuttle/yogs/stealthcruiser) +"at" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark/side, +/area/shuttle/yogs/stealthcruiser) +"au" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/yogs/stealthcruiser) +"av" = ( +/obj/structure/closet/syndicate/personal, +/turf/open/floor/plasteel/dark/side{ + dir = 5 + }, +/area/shuttle/yogs/stealthcruiser) +"aw" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"ay" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/yogs/stealthcruiser) +"az" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"aA" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"aB" = ( +/obj/structure/sign/departments/engineering, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/yogs/stealthcruiser) +"aC" = ( +/obj/structure/table, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/shuttle/yogs/stealthcruiser) +"aD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, +/area/shuttle/yogs/stealthcruiser) +"aI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aJ" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/ammo_box/magazine/m10mm, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aK" = ( +/obj/structure/shuttle/engine/propulsion/burst/right{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/shuttle/yogs/stealthcruiser) +"aL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"aM" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"aN" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/yogs/stealthcruiser) +"aO" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/yogs/stealthcruiser) +"aP" = ( +/obj/structure/table, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/fire, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/shuttle/yogs/stealthcruiser) +"aQ" = ( +/obj/machinery/sleeper{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24; + req_access = null; + req_access_txt = "150" + }, +/turf/open/floor/plasteel, +/area/shuttle/yogs/stealthcruiser) +"aR" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/freezer/blood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/shuttle/yogs/stealthcruiser) +"aS" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/shuttle/yogs/stealthcruiser) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aU" = ( +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/syndicate, +/obj/item/crowbar/red, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"aV" = ( +/obj/machinery/computer/crew/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bb" = ( +/obj/machinery/status_display, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/yogs/stealthcruiser) +"bc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"be" = ( +/obj/structure/rack, +/obj/item/aicard, +/obj/item/multitool, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bg" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bj" = ( +/obj/machinery/computer/shuttle/syndicate/cutter{ + dir = 8; + icon_state = "computer" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bm" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/handcuffs, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bn" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = 150 + }, +/obj/machinery/recharger, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bo" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bp" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/southleft{ + name = "Weapon Storage"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/item/grenade/plastic/c4{ + pixel_x = -3 + }, +/obj/item/grenade/plastic/c4{ + pixel_x = 5 + }, +/obj/item/grenade/plastic/c4{ + pixel_x = 13 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bq" = ( +/obj/structure/table, +/obj/machinery/door/window/southleft{ + base_state = "right"; + icon_state = "right"; + name = "Weapon Storage"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/item/grenade/flashbang{ + pixel_x = -11 + }, +/obj/item/grenade/flashbang{ + pixel_x = -3 + }, +/obj/item/grenade/flashbang{ + pixel_x = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"br" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = list(150) + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bA" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon, +/obj/effect/decal/cleanable/dirt, +/obj/item/melee/baton/loaded{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/melee/baton/loaded, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bF" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"bI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/caution/stand_clear/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bL" = ( +/obj/machinery/button/door{ + id = "syndicatecutter_bolt_starboard"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = -4; + pixel_y = -25; + req_access_txt = "150"; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bM" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bN" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/shuttle/yogs/stealthcruiser) +"bO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/med_data/syndie{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bP" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/secure_data/syndie{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"bQ" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"bR" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 2 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/external{ + id_tag = "syndicatecutter_bolt_starboard"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"bS" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bT" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium, +/area/shuttle/yogs/stealthcruiser) +"bU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/external{ + id_tag = "syndicatecutter_bolt_starboard"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"bW" = ( +/turf/template_noop, +/area/template_noop) +"cP" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/item/wrench, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"db" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/item/weldingtool, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"jX" = ( +/obj/machinery/computer/camera_advanced/syndie{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"kG" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/cutter{ + x_offset = 3; + y_offset = -6 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"mi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Equipment Room"; + req_access_txt = "150" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"pF" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "Syndicate Cutter APC"; + pixel_x = -25; + req_access = 150 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 8; + icon_state = "alarm0"; + pixel_x = 24; + req_access = 150 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"rY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = list(150) + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"vM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "Cockpit"; + req_access_txt = "150" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"xE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"zl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 1; + pixel_x = 30; + pixel_y = -33; + req_access = 150 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"Dr" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"Ey" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/storage/toolbox/syndicate, +/obj/item/flashlight{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 20 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"FN" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/item/clipboard{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/folder/red{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"Ir" = ( +/obj/structure/table, +/obj/item/storage/box/fancy/donut_box, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"Lb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "150" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"Pz" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"Re" = ( +/obj/machinery/button/door{ + id = "syndicatecutter_bridge"; + name = "Bridge Blast Door Control"; + pixel_x = 25; + pixel_y = 8; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) +"Ys" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/shuttle/yogs/stealthcruiser) +"YI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/yogs/stealthcruiser) + +(1,1,1) = {" +bW +bW +bW +ak +ay +aK +bW +ak +ay +aK +bW +bW +bW +"} +(2,1,1) = {" +bW +bW +aa +al +al +al +ad +al +al +al +aa +bW +bW +"} +(3,1,1) = {" +bW +ac +ad +am +az +aL +ad +Dr +Ey +cP +ad +bT +bW +"} +(4,1,1) = {" +bW +ad +ag +an +aA +aM +pF +Ys +aA +bH +bQ +ad +bW +"} +(5,1,1) = {" +bW +ad +ad +Lb +aB +ad +ad +ad +aB +Lb +ad +ad +bW +"} +(6,1,1) = {" +bW +ad +ah +ap +aC +aN +bb +bm +bA +bI +ah +ad +bW +"} +(7,1,1) = {" +aa +ad +ad +aq +aD +aO +ad +bn +aD +bJ +ad +ad +aa +"} +(8,1,1) = {" +ab +ae +ai +ar +aE +aP +ad +bo +bh +bK +bR +ae +bU +"} +(9,1,1) = {" +aa +ad +ad +as +aD +aQ +ad +bp +aD +bL +ad +ad +aa +"} +(10,1,1) = {" +bW +af +ah +at +aF +aR +bb +bq +bB +bM +ah +af +bW +"} +(11,1,1) = {" +bW +aa +ad +au +xE +ad +ad +ad +mi +bN +ad +aa +bW +"} +(12,1,1) = {" +bW +bW +ad +av +aH +aS +bc +br +bD +bO +ad +bW +bW +"} +(13,1,1) = {" +bW +bW +ad +aw +aI +aT +bd +bs +bE +bP +ad +bW +bW +"} +(14,1,1) = {" +bW +bW +aj +bb +aJ +aU +be +bt +bF +bb +bS +bW +bW +"} +(15,1,1) = {" +bW +bW +bW +aa +ad +ad +ad +vM +ad +aa +bW +bW +bW +"} +(16,1,1) = {" +bW +bW +bW +af +Ir +aV +rY +bv +FN +af +bW +bW +bW +"} +(17,1,1) = {" +bW +bW +bW +af +jX +bg +zl +Re +db +af +bW +bW +bW +"} +(18,1,1) = {" +bW +bW +bW +ad +ad +kG +YI +Pz +ad +ad +bW +bW +bW +"} +(19,1,1) = {" +bW +bW +bW +bW +ad +af +bj +af +ad +bW +bW +bW +bW +"} +(20,1,1) = {" +bW +bW +bW +bW +bW +af +af +af +bW +bW +bW +bW +bW +"} +(21,1,1) = {" +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +"} +(22,1,1) = {" +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +bW +"} diff --git a/_maps/templates/infiltrator_base.dmm b/_maps/templates/infiltrator_base.dmm new file mode 100644 index 000000000000..168ffe835014 --- /dev/null +++ b/_maps/templates/infiltrator_base.dmm @@ -0,0 +1,3106 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) +"ac" = ( +/turf/closed/indestructible/rock/snow, +/area/yogs/infiltrator_base/outside) +"ad" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"ae" = ( +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"af" = ( +/obj/structure/flora/tree/pine, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"ag" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"ah" = ( +/obj/item/book/manual/nuclear{ + desc = "This manual details exactly how to not Flop(TM) the mission for the hundreth time in a row!"; + name = "How to Acquire Skill: Nuclear Operative Edition" + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"ai" = ( +/obj/structure/flora/grass/both, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"aj" = ( +/turf/closed/indestructible/fakeglass, +/area/yogs/infiltrator_base) +"ak" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/rock/snow, +/area/yogs/infiltrator_base/outside) +"al" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_left"; + name = "skeletal minibar" + }, +/obj/item/reagent_containers/food/drinks/bottle/grappa{ + pixel_x = 10; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/patron{ + pixel_x = -5; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/drinks/bottle/cognac{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + layer = 3.2; + pixel_x = 15; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"am" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar_right"; + name = "skeletal minibar" + }, +/obj/item/reagent_containers/food/drinks/bottle/goldschlager{ + pixel_x = -8; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = 7; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/bottle/kahlua{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/bottle/absinthe{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"an" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_y = 12 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"ao" = ( +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"ap" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"aq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"ar" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"as" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"at" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"au" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/item/reagent_containers/food/snacks/chocolatebar{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"av" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/machinery/airalarm{ + pixel_y = 23; + req_access = 150 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aw" = ( +/obj/machinery/porta_turret/syndicate, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'CAUTION: AUTOMATED TURRET'."; + name = "CAUTION: AUTOMATED TURRET"; + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"ax" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/suppressor{ + pixel_y = 8 + }, +/obj/item/suppressor, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"ay" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"az" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aA" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aB" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aC" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aD" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aE" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + pixel_y = 14 + }, +/obj/machinery/door/window{ + name = "Shower Door" + }, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"aF" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"aG" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aH" = ( +/obj/structure/chair/stool, +/obj/machinery/airalarm{ + pixel_y = 23; + req_access = list(150) + }, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aI" = ( +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_y = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aJ" = ( +/obj/structure/chair/stool, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_y = 32 + }, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aK" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aL" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aN" = ( +/obj/effect/turf_decal/stripes/white/corner, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aO" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/closet/syndicate/personal, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"aQ" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"aR" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) +"aS" = ( +/obj/machinery/vending/coffee, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aU" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aV" = ( +/obj/structure/table/wood, +/obj/item/pizzabox/vegetable, +/obj/item/paicard, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aW" = ( +/obj/structure/chair/stool, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 26 + }, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"aX" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun/mini, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"aZ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/gun/ballistic/automatic/pistol{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/pod/light, +/area/yogs/infiltrator_base) +"ba" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Bathroom" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"bb" = ( +/obj/structure/flora/grass/brown, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"bc" = ( +/obj/structure/sign/warning/securearea{ + desc = "You shouldn't be here, you know!"; + name = "\improper FOURTH WALL"; + pixel_x = -32 + }, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"bd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/indestructible/fakedoor{ + name = "Primary Hallway" + }, +/area/yogs/infiltrator_base) +"be" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bg" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bh" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/toy/cards/deck/syndicate{ + icon_state = "deck_syndicate_full"; + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bi" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bj" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/door/airlock/centcom{ + name = "Equipment Room"; + opacity = 1; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/pod/dark, +/area/yogs/infiltrator_base) +"bk" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"bl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bm" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) +"bn" = ( +/obj/machinery/airalarm{ + pixel_y = 23; + req_access = 150 + }, +/obj/structure/bed, +/obj/item/bedsheet/black, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) +"bo" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base/jail) +"bp" = ( +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base/jail) +"bq" = ( +/turf/closed/indestructible/fakedoor{ + name = "Primary Hallway" + }, +/area/yogs/infiltrator_base/jail) +"br" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bs" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/landmark/start/infiltrator, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bv" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 9 + }, +/area/yogs/infiltrator_base) +"bw" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/yogs/infiltrator_base) +"bx" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/airalarm{ + dir = 8; + icon_state = "alarm0"; + pixel_x = 24; + req_access = 150 + }, +/obj/machinery/turretid{ + icon_state = "control_kill"; + lethal = 1; + locked = 1; + pixel_y = 28; + req_access = 150 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 5 + }, +/area/yogs/infiltrator_base) +"by" = ( +/obj/structure/table, +/obj/structure/window/reinforced, +/obj/item/storage/crayons{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/crayons, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer{ + dir = 2 + }, +/area/yogs/infiltrator_base) +"bz" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) +"bC" = ( +/turf/open/floor/carpet/black, +/area/yogs/infiltrator_base) +"bD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"bE" = ( +/obj/structure/bed, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = list(150); + req_access_txt = "0" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"bF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/yogs/infiltrator_base/jail) +"bG" = ( +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) +"bH" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 23; + req_access = 150 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) +"bI" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/computer/camera_advanced/syndie{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base/jail) +"bJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/glass, +/obj/effect/landmark/start/infiltrator_objective, +/obj/machinery/light/small, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/effect/landmark/start/infiltrator_objective, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bN" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bQ" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bU" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"bV" = ( +/obj/structure/sign/warning/securearea{ + desc = "You shouldn't be here, you know!"; + name = "\improper FOURTH WALL"; + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"bW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/flasher{ + id = "syndicateinfiltrator_flash2"; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"bY" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cell 2"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"bZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"ca" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cc" = ( +/obj/machinery/porta_turret/syndicate/energy{ + dir = 8; + scan_range = 3 + }, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'CAUTION: AUTOMATED TURRET'."; + name = "CAUTION: AUTOMATED TURRET"; + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base/jail) +"cd" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) +"ce" = ( +/obj/structure/rack, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark/side{ + dir = 10 + }, +/area/yogs/infiltrator_base) +"cf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cg" = ( +/obj/structure/rack, +/obj/item/storage/box/lights/bulbs, +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/yogs/infiltrator_base) +"ch" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"ci" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/button/flasher{ + id = "syndicateinfiltrator_flash1"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/machinery/button/flasher{ + id = "syndicateinfiltrator_flash2"; + pixel_x = -24; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"ck" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/yogs/infiltrator_base/jail) +"cl" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/turretid{ + ailock = 1; + control_area = null; + desc = "A specially designed set of turret controls. Looks to be covered in protective casing to prevent AI interfacing."; + icon_state = "control_stun"; + name = "Security turret control"; + pixel_x = 26; + req_access = 150 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 23; + req_access = 150 + }, +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/flashlight, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"co" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/syndicate/alt, +/obj/item/multitool, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cr" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Foyer"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cs" = ( +/obj/machinery/airalarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -24; + req_access = list(150) + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"ct" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/flasher{ + id = "syndicateinfiltrator_flash1"; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + pixel_y = 24; + req_access = list(150); + req_access_txt = "0" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cx" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Cell 1"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cy" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cz" = ( +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cA" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cB" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cC" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cD" = ( +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/defibrillator_mount/loaded{ + pixel_y = 28 + }, +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas/syndicate{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/yogs/infiltrator_base) +"cH" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset{ + anchored = 1 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cJ" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/table, +/obj/item/restraints/handcuffs{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/restraints/handcuffs{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/assembly/flash/handheld, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cN" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base/jail) +"cO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cP" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cQ" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cR" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cT" = ( +/obj/machinery/door/airlock/external/glass{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cV" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cX" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cY" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/shuttle/syndicate/recall{ + dir = 1; + possible_destinations = "syndicatecutter_home"; + shuttleId = "syndicatecutter" + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"cZ" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) +"da" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/infiltrator, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"db" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"dc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"dd" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/yogs/infiltrator_base) +"de" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) +"df" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/gloves/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/shoes/combat/coldres{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/combat/coldres, +/obj/item/clothing/under/syndicate/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/syndicate/combat, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"dg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/gloves/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/shoes/combat/coldres{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/combat/coldres, +/obj/item/clothing/under/syndicate/combat{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/syndicate/combat, +/turf/open/floor/plasteel/dark, +/area/yogs/infiltrator_base) +"dh" = ( +/obj/structure/sign/warning/securearea{ + desc = "You shouldn't be here, you know!"; + name = "\improper FOURTH WALL"; + pixel_x = -32 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"di" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/yogs/infiltrator_base) +"dj" = ( +/obj/docking_port/stationary{ + area_type = /area/yogs/infiltrator_base/outside; + dir = 2; + dwidth = 14; + height = 13; + id = "syndicatecutter_home"; + name = "Syndicate Home Outpost"; + roundstart_template = /datum/map_template/shuttle/infiltrator/cutter; + width = 22 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"dk" = ( +/obj/item/toy/plush/nukeplushie, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"dl" = ( +/obj/structure/flora/grass/both, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"dm" = ( +/obj/structure/flora/tree/pine{ + max_integrity = 100000 + }, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"dn" = ( +/obj/structure/flora/grass/brown, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"do" = ( +/obj/structure/flora/tree/pine, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"dp" = ( +/obj/structure/flora/tree/pine{ + max_integrity = 100000 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/yogs/infiltrator_base/outside) +"Lx" = ( +/obj/machinery/vending/cigarette/syndicate, +/turf/closed/indestructible/riveted, +/area/yogs/infiltrator_base) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bo +bp +bp +bp +bp +bp +bp +ac +ac +ac +ac +ac +ac +ac +ae +ae +ac +ag +ac +ac +ac +bb +ac +ac +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bp +bD +bW +bp +cv +bD +bp +ad +dh +af +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +af +ae +ac +ac +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bp +bE +bX +bp +cw +cJ +bp +ad +ae +ae +ae +ae +ae +ae +ae +dk +ae +ae +ae +af +ae +ae +ae +af +ac +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bp +bF +bY +bp +cx +bF +bp +ad +af +ae +ae +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +dp +ai +ac +ac +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bq +bG +bZ +cj +cy +cK +bp +ad +ae +ae +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +dm +ae +dp +ae +ac +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aR +ab +bp +bH +ca +ck +cz +cL +bp +ad +ae +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ad +ae +ac +ac +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +bc +bp +bI +cb +cl +cA +cM +bp +ad +ae +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ag +ac +ac +aa +aa +"} +(8,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +ab +ab +bd +bp +bp +cc +bp +bp +cN +bp +ad +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +dn +ac +aa +aa +"} +(9,1,1) = {" +ac +ad +ad +ad +ad +ad +ad +ae +ab +ab +ab +ab +ab +aS +be +br +bp +bp +bp +cB +cO +aj +aj +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ae +ac +ac +aa +"} +(10,1,1) = {" +ac +ae +ae +ae +ae +ag +ad +Lx +ab +an +ar +ay +aG +aT +bf +aT +bJ +ab +cm +cC +bP +cY +aj +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ad +ae +ai +ac +aa +"} +(11,1,1) = {" +ac +ae +ae +af +ae +ae +ad +aj +al +ao +as +ab +aH +aU +bg +bs +bK +cd +cn +cD +cP +aj +aj +aj +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ac +ac +aa +"} +(12,1,1) = {" +ac +ae +ag +ae +ae +ae +ad +aj +am +ap +at +ab +aI +aV +bh +bt +bL +cd +co +cE +cQ +cZ +de +di +dj +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ac +aa +aa +"} +(13,1,1) = {" +ac +ae +ae +ae +ae +af +ad +ab +ab +aq +au +ab +aJ +aW +bg +bs +bM +cd +cp +cD +cR +aj +aj +aj +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ac +aa +aa +"} +(14,1,1) = {" +ac +ae +ae +ae +ai +ae +ae +ae +ab +ab +ab +ab +ab +ab +bi +bu +bN +ab +cq +cF +bP +da +aj +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ad +ae +ac +ac +aa +"} +(15,1,1) = {" +ac +ae +ae +af +af +ae +ae +ae +ae +ab +ab +az +aK +ab +ab +ab +bO +ab +ab +cG +cS +aj +aj +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ae +ae +ac +aa +"} +(16,1,1) = {" +ac +af +ae +ae +ae +ae +ae +ae +ae +ab +av +aA +aL +aX +ab +bv +bP +ce +ab +ab +cT +ab +ad +ad +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ad +af +ae +ac +ac +aa +"} +(17,1,1) = {" +ac +ae +ah +ae +ae +ae +ae +ae +ae +ab +aw +aB +aM +aY +bj +bw +bQ +cf +cr +bl +cU +aj +ad +ae +ae +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ae +ae +ae +ae +ac +ac +"} +(18,1,1) = {" +ac +af +ae +ae +af +ae +ae +ae +ae +ab +ax +aC +aN +aZ +ab +bx +bR +cg +ab +cH +cV +ab +ad +ad +ad +ad +ae +ae +ae +ae +ae +ae +ae +ae +ae +dn +ae +ae +ae +ae +ae +ac +"} +(19,1,1) = {" +ac +ae +af +ae +ae +af +ae +ae +ae +ab +ab +aD +aO +ab +ab +ab +bS +ab +ab +ab +ab +ab +ab +ab +ad +ad +ad +ae +ae +ae +ae +ae +ae +ae +ad +do +ae +ae +ae +bb +ac +ac +"} +(20,1,1) = {" +ac +ac +ac +ac +ac +ac +ac +ac +ae +ae +ab +ab +ab +ab +bk +by +bT +ch +cs +cI +cW +db +df +aj +ad +ae +ad +ad +ae +ae +ae +ae +ae +ad +dm +bb +ae +ae +af +ac +ac +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ab +aE +aP +ba +bl +bz +bU +ci +ct +ci +cX +dc +dg +aj +ad +ae +ae +ad +ae +ae +ae +ae +ae +ad +ae +dp +dp +ae +ae +ac +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ab +aF +aQ +ab +ab +bA +ab +ab +cu +ab +ab +dd +ab +ab +ad +ae +ae +ad +ae +ae +ae +ae +ae +dl +ai +af +ae +dp +bb +ac +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ab +ab +ab +ab +bm +bB +ab +bm +bB +ab +bm +bB +ab +ad +ad +bb +ae +ad +ae +ae +ae +ae +ae +ad +af +ai +ae +ai +ac +ac +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +ae +ae +ab +bn +bC +ab +bn +bC +ab +bn +bC +ab +ad +ae +ae +ae +ad +ae +ae +ae +ae +ae +ad +ae +ae +af +ac +ac +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +ae +ae +ab +ab +aj +ab +ab +aj +ab +ab +aj +ab +ad +ae +ae +ae +ad +ae +ae +ae +ae +ae +ad +ae +ae +ae +ac +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +af +ai +ae +af +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ae +ag +ae +ad +ad +ae +ae +ae +ad +ad +ae +af +ai +ac +ac +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +af +ae +bb +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ad +ad +ad +ad +ad +ae +ae +ae +ae +ae +ac +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bb +ae +ae +ae +ae +ae +ae +ae +af +ae +ae +ae +ae +ae +ae +ae +ae +af +ac +ac +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +af +ae +ae +ai +ae +ae +ae +bb +ae +af +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ag +ae +ae +ae +ac +ac +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +ae +ae +af +ae +ae +ae +ae +ae +ae +ae +ae +ai +ae +ae +ae +af +ae +ae +ae +af +ai +ae +ae +ae +ae +af +ac +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ae +ae +ae +ae +ae +ae +af +ae +bV +ae +ae +ae +ae +af +ae +ae +ae +ae +ae +af +ae +ae +ae +af +af +ae +ae +af +ac +ac +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ak +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +"} diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 1760fe6b09ea..e636b2ecc94d 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -406,6 +406,12 @@ ///From base of datum/controller/subsystem/Initialize: (start_timeofday) #define COMSIG_SUBSYSTEM_POST_INITIALIZE "subsystem_post_initialize" +///Called when the ticker enters the pre-game phase +#define COMSIG_TICKER_ENTER_PREGAME "comsig_ticker_enter_pregame" + +///Called when the ticker sets up the game for start +#define COMSIG_TICKER_ENTER_SETTING_UP "comsig_ticker_enter_setting_up" + /// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) #define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" #define COMPONENT_GLOB_BLOCK_CINEMATIC (1<<0) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 4e09a65c4c91..30a7c66d8b73 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -143,3 +143,6 @@ #define SPLASHSCREEN_LAYER 23 #define SPLASHSCREEN_PLANE 23 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" + +#define LOBBY_BACKGROUND_LAYER 3 +#define LOBBY_BUTTON_LAYER 4 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 9d544b09ffad..544979a66b0e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -5,7 +5,6 @@ //Ready states at roundstart for mob/dead/new_player #define PLAYER_NOT_READY 0 #define PLAYER_READY_TO_PLAY 1 -#define PLAYER_READY_TO_OBSERVE 2 //Game mode list indexes #define CURRENT_LIVING_PLAYERS "living_players_list" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 3c4a3043527e..e16602edc13c 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -43,8 +43,9 @@ #define ROLE_SHADOWLING "Shadowling" // Yogs #define ROLE_VAMPIRE "Vampire" // Yogs #define ROLE_GANG "gangster" // Yogs -#define ROLE_DARKSPAWN "darkspawn" //Yogs +#define ROLE_DARKSPAWN "darkspawn" // Yogs #define ROLE_HOLOPARASITE "Holoparasite" // Yogs +#define ROLE_INFILTRATOR "Infiltrator" // Yogs #define ROLE_ZOMBIE "Zombie" @@ -75,10 +76,11 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult, ROLE_VAMPIRE = /datum/game_mode/vampire, // Yogs ROLE_OVERTHROW = /datum/game_mode/overthrow, - ROLE_SHADOWLING = /datum/game_mode/shadowling, //yogs - ROLE_GANG = /datum/game_mode/gang, // yogs + ROLE_SHADOWLING = /datum/game_mode/shadowling, // Yogs + ROLE_GANG = /datum/game_mode/gang, // Yogs ROLE_HERETIC = /datum/game_mode/heretics, ROLE_HIVE = /datum/game_mode/hivemind, + ROLE_INFILTRATOR = /datum/game_mode/infiltration, // Yogs ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs, ROLE_DARKSPAWN = /datum/game_mode/darkspawn, ROLE_SENTIENCE, diff --git a/code/__DEFINES/{yogs_defines}/antagonists.dm b/code/__DEFINES/{yogs_defines}/antagonists.dm index ebb7a4546bf0..0cfa66b79b1c 100644 --- a/code/__DEFINES/{yogs_defines}/antagonists.dm +++ b/code/__DEFINES/{yogs_defines}/antagonists.dm @@ -1,8 +1,10 @@ -#define ANTAG_DATUM_VAMPIRE /datum/antagonist/vampire -#define ANTAG_DATUM_THRALL /datum/antagonist/thrall -#define ANTAG_DATUM_SLING /datum/antagonist/shadowling -#define ANTAG_DATUM_DARKSPAWN /datum/antagonist/darkspawn -#define ANTAG_DATUM_VEIL /datum/antagonist/veil +#define ANTAG_DATUM_VAMPIRE /datum/antagonist/vampire +#define ANTAG_DATUM_THRALL /datum/antagonist/thrall +#define ANTAG_DATUM_SLING /datum/antagonist/shadowling +#define ANTAG_DATUM_DARKSPAWN /datum/antagonist/darkspawn +#define ANTAG_DATUM_VEIL /datum/antagonist/veil +#define ANTAG_DATUM_INFILTRATOR /datum/antagonist/infiltrator +#define ANTAG_DATUM_HIJACKEDAI /datum/antagonist/hijacked_ai #define NOT_DOMINATING -1 #define MAX_LEADERS_GANG 3 diff --git a/code/__DEFINES/{yogs_defines}/atom_hud.dm b/code/__DEFINES/{yogs_defines}/atom_hud.dm index f49855c09856..fe1307c8e985 100644 --- a/code/__DEFINES/{yogs_defines}/atom_hud.dm +++ b/code/__DEFINES/{yogs_defines}/atom_hud.dm @@ -1,2 +1,3 @@ #define ANTAG_HUD_VAMPIRE 23 -#define ANTAG_HUD_DARKSPAWN 24 \ No newline at end of file +#define ANTAG_HUD_DARKSPAWN 24 +#define ANTAG_HUD_INFILTRATOR 32 diff --git a/code/__DEFINES/{yogs_defines}/is_helpers.dm b/code/__DEFINES/{yogs_defines}/is_helpers.dm index ebc61aa706ed..c694ceab2ea0 100644 --- a/code/__DEFINES/{yogs_defines}/is_helpers.dm +++ b/code/__DEFINES/{yogs_defines}/is_helpers.dm @@ -12,6 +12,7 @@ #define is_traitor(M) (istype(M, /mob/living) && M.mind && M.mind.has_antag_datum(/datum/antagonist/traitor) || is_mindslaved(M)) #define is_blood_brother(M) (istype(M, /mob/living) && M.mind && M.mind.has_antag_datum(/datum/antagonist/brother)) #define is_nukeop(M) (M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop)) // also detects clownOP -#define is_syndicate(M) (istype(M, /mob/living) && is_traitor(M) || is_blood_brother(M) || is_nukeop(M)) +#define is_infiltrator(M) (M.mind && M.mind.has_antag_datum(/datum/antagonist/infiltrator)) +#define is_syndicate(M) (istype(M, /mob/living) && is_traitor(M) || is_blood_brother(M) || is_nukeop(M) || is_infiltrator(M)) -#define isspacepod(A) (istype(A, /obj/spacepod)) \ No newline at end of file +#define isspacepod(A) (istype(A, /obj/spacepod)) diff --git a/code/__DEFINES/{yogs_defines}/misc.dm b/code/__DEFINES/{yogs_defines}/misc.dm index 1b894e280e9b..1c0463dc31fc 100644 --- a/code/__DEFINES/{yogs_defines}/misc.dm +++ b/code/__DEFINES/{yogs_defines}/misc.dm @@ -1,3 +1,7 @@ //Endgame Results #define GANG_LOSS 6 -#define GANG_TAKEOVER 7 \ No newline at end of file +#define GANG_TAKEOVER 7 +#define INFILTRATION_ALLCOMPLETE 25 +#define INFILTRATION_MOSTCOMPLETE 26 +#define INFILTRATION_SOMECOMPLETE 27 +#define INFILTRATION_NONECOMPLETE 28 diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm new file mode 100644 index 000000000000..4c9e2eddbbea --- /dev/null +++ b/code/_onclick/hud/new_player.dm @@ -0,0 +1,439 @@ +/datum/hud/new_player + +/datum/hud/new_player/New(mob/owner) + ..() + var/list/buttons = subtypesof(/atom/movable/screen/lobby) + for(var/button in buttons) + var/atom/movable/screen/lobbyscreen = new button() + lobbyscreen.hud = src + static_inventory += lobbyscreen + lobbyscreen.postInit() + +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/atom/movable/screen + name = "" + plane = HUD_PLANE + animate_movement = SLIDE_STEPS + speech_span = SPAN_ROBOT + vis_flags = VIS_INHERIT_PLANE + appearance_flags = APPEARANCE_UI + /// A reference to the object in the slot. Grabs or items, generally. + var/obj/master = null + /// A reference to the owner HUD, if any. + var/datum/hud/hud = null + /** + * Map name assigned to this object. + * Automatically set by /client/proc/add_obj_to_map. + */ + var/assigned_map + /** + * Mark this object as garbage-collectible after you clean the map + * it was registered on. + * + * This could probably be changed to be a proc, for conditional removal. + * But for now, this works. + */ + var/del_on_map_removal = TRUE + +/atom/movable/screen/proc/postInit() + +/atom/movable/screen/Destroy() + master = null + hud = null + return ..() + +/atom/movable/screen/lobby + plane = SPLASHSCREEN_PLANE + layer = LOBBY_BUTTON_LAYER + screen_loc = "TOP,CENTER" + +/atom/movable/screen/lobby/background + layer = LOBBY_BACKGROUND_LAYER + icon = 'icons/hud/lobby/background.dmi' + icon_state = "background" + screen_loc = "TOP,CENTER:-61" + +/atom/movable/screen/lobby/button + ///Is the button currently enabled? + var/enabled = TRUE + ///Is the button currently being hovered over with the mouse? + var/highlighted = FALSE + +/atom/movable/screen/lobby/button/Click(location, control, params) + . = ..() + if(!enabled) + return + flick("[base_icon_state]_pressed", src) + update_icon() + return TRUE + +/atom/movable/screen/lobby/button/MouseEntered(location,control,params) + . = ..() + highlighted = TRUE + update_icon() + +/atom/movable/screen/lobby/button/MouseExited() + . = ..() + highlighted = FALSE + update_icon() + +/atom/movable/screen/lobby/button/proc/update_icon(updates) + if(!enabled) + icon_state = "[base_icon_state]_disabled" + return + else if(highlighted) + icon_state = "[base_icon_state]_highlighted" + return + icon_state = base_icon_state + +/atom/movable/screen/lobby/button/proc/set_button_status(status) + if(status == enabled) + return FALSE + enabled = status + update_icon() + return TRUE + +///Prefs menu +/atom/movable/screen/lobby/button/character_setup + screen_loc = "TOP:-70,CENTER:-54" + icon = 'icons/hud/lobby/character_setup.dmi' + icon_state = "character_setup" + base_icon_state = "character_setup" + +/atom/movable/screen/lobby/button/character_setup/Click(location, control, params) + . = ..() + if(!.) + return + hud.mymob.client.prefs.ShowChoices(hud.mymob) + +///Button that appears before the game has started +/atom/movable/screen/lobby/button/ready + screen_loc = "TOP:-8,CENTER:-65" + icon = 'icons/hud/lobby/ready.dmi' + icon_state = "not_ready" + base_icon_state = "not_ready" + var/ready = FALSE + +/atom/movable/screen/lobby/button/ready/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_PREGAME) + set_button_status(FALSE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/hide_ready_button) + +/atom/movable/screen/lobby/button/ready/proc/hide_ready_button() + set_button_status(FALSE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + +/atom/movable/screen/lobby/button/ready/Click(location, control, params) + . = ..() + if(!.) + return + var/mob/dead/new_player/new_player = hud.mymob + ready = !ready + if(ready) + new_player.ready = PLAYER_READY_TO_PLAY + base_icon_state = "ready" + else + new_player.ready = PLAYER_NOT_READY + base_icon_state = "not_ready" + update_icon() + +///Shown when the game has started +/atom/movable/screen/lobby/button/join + screen_loc = "TOP:-13,CENTER:-58" + icon = 'icons/hud/lobby/join.dmi' + icon_state = "" //Default to not visible + base_icon_state = "join_game" + enabled = FALSE + +/atom/movable/screen/lobby/button/join/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_PREGAME) + set_button_status(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/show_join_button) + +/atom/movable/screen/lobby/button/join/Click(location, control, params) + . = ..() + if(!.) + return + if(!SSticker?.IsRoundInProgress()) + to_chat(hud.mymob, "The round is either not ready, or has already finished...") + return + + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + var/mob/dead/new_player/new_player = hud.mymob + + if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(new_player.key) in GLOB.admin_datums))) + to_chat(new_player, "[CONFIG_GET(string/hard_popcap_message)]") + + var/queue_position = SSticker.queued_players.Find(new_player) + if(queue_position == 1) + to_chat(new_player, "You are next in line to join the game. You will be notified when a slot opens up.") + else if(queue_position) + to_chat(new_player, "There are [queue_position-1] players in front of you in the queue to join the game.") + else + SSticker.queued_players += new_player + to_chat(new_player, "You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].") + return + new_player.LateChoices() + +/atom/movable/screen/lobby/button/join/proc/show_join_button(status) + set_button_status(TRUE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + +/atom/movable/screen/lobby/button/observe + screen_loc = "TOP:-40,CENTER:-54" + icon = 'icons/hud/lobby/observe.dmi' + icon_state = "observe_disabled" + base_icon_state = "observe" + enabled = FALSE + +/atom/movable/screen/lobby/button/observe/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_STARTUP) + set_button_status(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/enable_observing) + +/atom/movable/screen/lobby/button/observe/Click(location, control, params) + . = ..() + if(!.) + return + var/mob/dead/new_player/new_player = hud.mymob + new_player.make_me_an_observer() + +/atom/movable/screen/lobby/button/observe/proc/enable_observing() + flick("[base_icon_state]_enabled", src) + set_button_status(TRUE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/enable_observing) + + +/atom/movable/screen/lobby/button/changelog_button + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "changelog" + base_icon_state = "changelog" + screen_loc ="TOP:-122,CENTER:+58" + + +/atom/movable/screen/lobby/button/crew_manifest + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "crew_manifest" + base_icon_state = "crew_manifest" + screen_loc = "TOP:-122,CENTER:+30" + +/atom/movable/screen/lobby/button/crew_manifest/Click(location, control, params) + . = ..() + if(!.) + return + var/mob/dead/new_player/new_player = hud.mymob + new_player.ViewManifest() + +/atom/movable/screen/lobby/button/changelog_button/Click(location, control, params) + . = ..() + usr.client?.changelog() + +/atom/movable/screen/lobby/button/poll + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "poll" + base_icon_state = "poll" + screen_loc = "TOP:-122,CENTER:+2" + + var/new_poll = FALSE + +///Need to use New due to init +/atom/movable/screen/lobby/button/poll/New(loc, ...) + . = ..() + if(!usr) // + return + var/mob/dead/new_player/new_player = usr + if(IsGuestKey(new_player.key)) + set_button_status(FALSE) + return + if(!SSdbcore.Connect()) + set_button_status(FALSE) + return + var/isadmin = FALSE + if(new_player.client?.holder) + isadmin = TRUE + var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery({" + SELECT id FROM [format_table_name("poll_question")] + WHERE (adminonly = 0 OR :isadmin = 1) + AND Now() BETWEEN starttime AND endtime + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_vote")] + WHERE ckey = :ckey + ) + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_textreply")] + WHERE ckey = :ckey + ) + "}, list("isadmin" = isadmin, "ckey" = new_player.ckey)) + if(query_get_new_polls.Execute()) + if(query_get_new_polls.NextRow()) + new_poll = TRUE + else + new_poll = FALSE + update_overlays() + qdel(query_get_new_polls) + if(QDELETED(new_player)) + set_button_status(FALSE) + return + +/atom/movable/screen/lobby/button/poll/proc/update_overlays() + cut_overlays() + if(new_poll) + add_overlay(mutable_appearance('icons/hud/lobby/poll_overlay.dmi', "new_poll")) + +/atom/movable/screen/lobby/button/poll/Click(location, control, params) + . = ..() + if(!.) + return + var/mob/dead/new_player/new_player = hud.mymob + new_player.handle_player_polling() + +/atom/movable/screen/lobby/timer + icon = 'icons/hud/lobby/countdown_background.dmi' + icon_state = "hidden" + screen_loc = "TOP,RIGHT" + + var/list/atom/movable/screen/lobby/display/displays = list() + + var/delayed = FALSE + var/active = FALSE + var/show_numbers = FALSE + + var/list/display_screen_locs = list( + "TOP:-7,RIGHT:-64", + "TOP:-7,RIGHT:-44", + "TOP:-7,RIGHT:-31" + ) + +GLOBAL_LIST_EMPTY(lobby_timers) + +/atom/movable/screen/lobby/timer/New(loc, ...) + . = ..() + for(var/screen_loc as anything in display_screen_locs) + var/atom/movable/screen/lobby/display/D = new() + D.screen_loc = screen_loc + displays += D + + if(SSticker.current_state > GAME_STATE_STARTUP) + set_active(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/activate) + +/atom/movable/screen/lobby/timer/proc/set_active(new_active) + if(new_active == active) + return + active = new_active + + if(active) + flick("show_[delayed ? "delayed" : "eta"]", src) + addtimer(VARSET_CALLBACK(src, show_numbers, 13)) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/deactivate) + START_PROCESSING(SSlobbyprocess, src) + else + flick("hide_[delayed ? "delayed" : "eta"]", src) + show_numbers = FALSE + hide_numbers() + STOP_PROCESSING(SSlobbyprocess, src) + update_icon() + +/atom/movable/screen/lobby/timer/proc/activate() + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME) + set_active(TRUE) + +/atom/movable/screen/lobby/timer/proc/deactivate() + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + set_active(FALSE) + +/atom/movable/screen/lobby/timer/Destroy() + . = ..() + GLOB.lobby_timers -= src + +/atom/movable/screen/lobby/timer/process() + + var/time = SSticker.GetTimeLeft() + if(time == -10) + if(!delayed) + delay() + return + if(delayed) + undelay() + + if(!show_numbers) + return + + if(time < 0) + time = 0 + + var/seconds = round(time/10) + if(seconds > 639) + seconds = 639 + + var/minutes = round(seconds/60) + if(minutes > 9) + minutes = 9 + seconds -= minutes * 60 + + var/tens_seconds = round(seconds/10) + var/single_seconds = seconds % 10 + + displays[1].icon_state = "[minutes]-green" + displays[2].icon_state = "[tens_seconds]-green" + displays[3].icon_state = "[single_seconds]-green" + +/atom/movable/screen/lobby/timer/postInit() + . = ..() + for(var/atom/movable/screen/lobby/display/D as anything in displays) + D.hud = hud + hud.static_inventory += D + GLOB.lobby_timers += src + +/atom/movable/screen/lobby/timer/proc/hide_numbers() + for(var/atom/movable/screen/lobby/display/D as anything in displays) + D.icon_state = "" + +/atom/movable/screen/lobby/timer/proc/delay() + if(delayed) return + delayed = TRUE + hide_numbers() + flick("eta_delay", src) + show_numbers = FALSE + update_icon() + +/atom/movable/screen/lobby/timer/proc/undelay() + if(!delayed) return + delayed = FALSE + flick("delay_eta", src) + addtimer(VARSET_CALLBACK(src, show_numbers, 6)) + update_icon() + +/atom/movable/screen/lobby/timer/proc/update_icon() + if(!active) + icon_state = "hidden" + return + if(delayed) + icon_state = "delayed" + else + icon_state = "eta" + +/atom/movable/screen/lobby/display + icon = 'icons/hud/lobby/countdown_letters.dmi' \ No newline at end of file diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 0b522ee75d45..2c6d3aff2746 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -399,3 +399,10 @@ /datum/config_entry/number/engine_type config_entry_value = 3 + +//Shuttle size limiter +/datum/config_entry/number/max_shuttle_count + config_entry_value = 6 + +/datum/config_entry/number/max_shuttle_size + config_entry_value = 250 diff --git a/code/controllers/subsystem/processing/fastlobbyprocess.dm b/code/controllers/subsystem/processing/fastlobbyprocess.dm new file mode 100644 index 000000000000..9cf2d2950e9e --- /dev/null +++ b/code/controllers/subsystem/processing/fastlobbyprocess.dm @@ -0,0 +1,6 @@ +//Fires five times every second. + +PROCESSING_SUBSYSTEM_DEF(lobbyprocess) + name = "Lobby Processing" + stat_tag = "LP" + runlevels = RUNLEVEL_LOBBY diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index c2c4b9f35ced..252aa7bd95f8 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -8,6 +8,7 @@ SUBSYSTEM_DEF(shuttle) var/list/mobile = list() var/list/stationary = list() + var/list/beacons = list() var/list/transit = list() var/list/transit_requesters = list() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 4ba23dd4df3d..90dfdf49c97f 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -157,8 +157,8 @@ SUBSYSTEM_DEF(ticker) to_chat(world, span_boldnotice("Welcome to [station_name()]!")) send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/chat_announce_new_game)) current_state = GAME_STATE_PREGAME - //Everyone who wants to be an observer is now spawned - create_observers() + SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) + fire() if(GAME_STATE_PREGAME) //lobby stats for statpanels @@ -184,6 +184,7 @@ SUBSYSTEM_DEF(ticker) tipped = TRUE if(timeLeft <= 0) + SEND_SIGNAL(src, COMSIG_TICKER_ENTER_SETTING_UP) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) if(start_immediately) @@ -361,8 +362,6 @@ SUBSYSTEM_DEF(ticker) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) GLOB.joined_player_list += player.ckey player.create_character(FALSE) - else - player.new_player_panel() CHECK_TICK /datum/controller/subsystem/ticker/proc/collect_minds() @@ -610,13 +609,6 @@ SUBSYSTEM_DEF(ticker) else timeLeft = newtime -//Everyone who wanted to be an observer gets made one now -/datum/controller/subsystem/ticker/proc/create_observers() - for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.ready == PLAYER_READY_TO_OBSERVE && player.mind) - //Break chain since this has a sleep input in it - addtimer(CALLBACK(player, /mob/dead/new_player.proc/make_me_an_observer), 1) - /datum/controller/subsystem/ticker/proc/load_mode() var/mode = trim(file2text("data/mode.txt")) if(mode) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 8b347e9a3946..55dce2fe80b3 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -245,8 +245,9 @@ GLOBAL_LIST_EMPTY(uplinks) interact(null, implant.imp_in) /datum/component/uplink/proc/implanting(datum/source, list/arguments) - var/mob/user = arguments[2] - owner = "[user.key]" + var/mob/target = arguments[1] + var/mob/user = arguments[2] // YOGS START -- Fix runtime when implanting infiltrators + owner = "[user ? user.key : target.key]" // YOGS END /datum/component/uplink/proc/old_implant(datum/source, list/arguments, obj/item/implant/new_implant) // It kinda has to be weird like this until implants are components diff --git a/code/datums/hud.dm b/code/datums/hud.dm index fa4a32d25ee6..e8ade04c2aa1 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -38,6 +38,7 @@ GLOBAL_LIST_INIT(huds, list( ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_MINDSLAVE = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_ZOMBIE = new/datum/atom_hud/antag(), + ANTAG_HUD_INFILTRATOR = new/datum/atom_hud/antag() // Yogs )) /datum/atom_hud diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 15b626434753..8ff9140009a3 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -106,6 +106,10 @@ /area/shuttle/custom name = "Custom player shuttle" +/area/shuttle/custom/powered + name = "Custom Powered player shuttle" + requires_power = FALSE + /area/shuttle/arrival name = "Arrival Shuttle" unique = TRUE // SSjob refers to this area for latejoiners diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e8d40ee44a69..e59fd552091d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -82,6 +82,9 @@ var/list/targeted_by var/atom/orbit_target //Reference to atom being orbited + + /// Used for changing icon state for different base sprites + var/base_icon_state /** * Called when an atom is created in byond (built in engine proc) * diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 74dadc5648de..4474251b09c5 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -18,7 +18,7 @@ req_access = list(ACCESS_SEC_DOORS) power_channel = EQUIP //drains power from the EQUIPMENT channel - var/base_icon_state = "standard" + base_icon_state = "standard" var/scan_range = 7 var/atom/base = null //for turrets inside other objects @@ -1080,4 +1080,4 @@ if(istype(P, /obj/item/projectile/beam/lasertag/bluetag)) on = FALSE spawn(100) - on = TRUE \ No newline at end of file + on = TRUE diff --git a/code/game/machinery/shuttle/custom_shuttle.dm b/code/game/machinery/shuttle/custom_shuttle.dm new file mode 100644 index 000000000000..7c83cade69f3 --- /dev/null +++ b/code/game/machinery/shuttle/custom_shuttle.dm @@ -0,0 +1,33 @@ +/obj/machinery/shuttle + name = "shuttle component" + desc = "Something for shuttles." + density = TRUE + obj_integrity = 250 + max_integrity = 250 + icon = 'icons/turf/shuttle.dmi' + icon_state = "burst_plasma" + idle_power_usage = 150 + circuit = /obj/item/circuitboard/machine/shuttle/engine + var/icon_state_closed = "burst_plasma" + var/icon_state_open = "burst_plasma_open" + var/icon_state_off = "burst_plasma_off" + +/obj/machinery/shuttle/Initialize() + . = ..() + GLOB.custom_shuttle_machines += src + +/obj/machinery/shuttle/Destroy() + . = ..() + GLOB.custom_shuttle_machines -= src + +/obj/machinery/shuttle/attackby(obj/item/I, mob/living/user, params) + if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) + return + if(default_pry_open(I)) + return + if(panel_open) + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + return ..() diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm new file mode 100644 index 000000000000..98e324b3d020 --- /dev/null +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -0,0 +1,140 @@ +//----------------------------------------------- +//-------------Engine Thrusters------------------ +//----------------------------------------------- + +#define ENGINE_HEAT_TARGET 600 +#define ENGINE_HEATING_POWER 5000000 + +/obj/machinery/shuttle/engine + name = "shuttle thruster" + desc = "A thruster for shuttles." + density = TRUE + obj_integrity = 250 + max_integrity = 250 + icon = 'icons/turf/shuttle.dmi' + icon_state = "burst_plasma" + idle_power_usage = 150 + circuit = /obj/item/circuitboard/machine/shuttle/engine + var/thrust = 0 + var/fuel_use = 0 + var/bluespace_capable = TRUE + var/cooldown = 0 + var/thruster_active = FALSE + var/datum/weakref/attached_heater + +/obj/machinery/shuttle/engine/plasma + name = "plasma thruster" + desc = "A thruster that burns plasma stored in an adjacent plasma thruster heater." + icon_state = "burst_plasma" + icon_state_off = "burst_plasma_off" + + idle_power_usage = 0 + circuit = /obj/item/circuitboard/machine/shuttle/engine/plasma + thrust = 25 + fuel_use = 0.24 + bluespace_capable = FALSE + cooldown = 45 + +/obj/machinery/shuttle/engine/void + name = "void thruster" + desc = "A thruster using technology to breach voidspace for propulsion." + icon_state = "burst_void" + icon_state_off = "burst_void" + icon_state_closed = "burst_void" + icon_state_open = "burst_void_open" + idle_power_usage = 0 + circuit = /obj/item/circuitboard/machine/shuttle/engine/void + thrust = 400 + fuel_use = 0 + bluespace_capable = TRUE + cooldown = 90 + +/obj/machinery/shuttle/engine/Initialize() + . = ..() + check_setup() + +/obj/machinery/shuttle/engine/on_construction() + . = ..() + check_setup() + +/obj/machinery/shuttle/engine/proc/check_setup() + var/heater_turf + switch(dir) + if(NORTH) + heater_turf = get_offset_target_turf(src, 0, 1) + if(SOUTH) + heater_turf = get_offset_target_turf(src, 0, -1) + if(EAST) + heater_turf = get_offset_target_turf(src, 1, 0) + if(WEST) + heater_turf = get_offset_target_turf(src, -1, 0) + if(!heater_turf) + attached_heater = null + update_engine() + return + attached_heater = null + for(var/obj/machinery/atmospherics/components/unary/shuttle/heater/as_heater in heater_turf) + if(as_heater.dir != dir) + continue + if(as_heater.panel_open) + continue + if(!as_heater.anchored) + continue + attached_heater = WEAKREF(as_heater) + break + update_engine() + return + +/obj/machinery/shuttle/engine/proc/update_engine() + if(!attached_heater) + icon_state = icon_state_off + thruster_active = FALSE + return + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater.resolve() + if(panel_open) + thruster_active = FALSE + else if(resolved_heater?.hasFuel(1)) + icon_state = icon_state_closed + thruster_active = TRUE + else + thruster_active = FALSE + icon_state = icon_state_off + return + +/obj/machinery/shuttle/engine/void/update_engine() + if(panel_open) + thruster_active = FALSE + return + thruster_active = TRUE + icon_state = icon_state_closed + return + +//Thanks to spaceheater.dm for inspiration :) +/obj/machinery/shuttle/engine/proc/fireEngine() + var/turf/heatTurf = loc + if(!heatTurf) + return + var/datum/gas_mixture/env = heatTurf.return_air() + var/heat_cap = env.heat_capacity() + var/req_power = abs(env.return_temperature() - ENGINE_HEAT_TARGET) * heat_cap + req_power = min(req_power, ENGINE_HEATING_POWER) + var/deltaTemperature = 0 + if(!heat_cap == 0) + deltaTemperature = req_power / heat_cap + if(deltaTemperature < 0) + return + env.set_temperature(env.return_temperature() + deltaTemperature) + air_update_turf() + +/obj/machinery/shuttle/engine/attackby(obj/item/I, mob/living/user, params) + check_setup() + if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) + return + if(default_pry_open(I)) + return + if(panel_open) + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + return ..() diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm new file mode 100644 index 000000000000..80c46fde7374 --- /dev/null +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -0,0 +1,134 @@ +//----------------------------------------------- +//--------------Engine Heaters------------------- +//This uses atmospherics, much like a thermomachine, +//but instead of changing temp, it stores plasma and uses +//it for the engine. +//----------------------------------------------- +/obj/machinery/atmospherics/components/unary/shuttle + name = "shuttle atmospherics device" + desc = "This does something to do with shuttle atmospherics" + icon_state = "heater" + icon = 'icons/turf/shuttle.dmi' + +/obj/machinery/atmospherics/components/unary/shuttle/heater + name = "engine heater" + desc = "Directs energy into compressed particles in order to power an attached thruster." + icon_state = "heater_pipe" + var/icon_state_closed = "heater_pipe" + var/icon_state_open = "heater_pipe_open" + var/icon_state_off = "heater_pipe" + idle_power_usage = 50 + circuit = /obj/item/circuitboard/machine/shuttle/heater + + density = TRUE + max_integrity = 400 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30) + layer = OBJ_LAYER + showpipe = TRUE + + pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY + + var/gas_type = /datum/gas/plasma + var/efficiency_multiplier = 1 + var/gas_capacity = 0 + +/obj/machinery/atmospherics/components/unary/shuttle/heater/New() + . = ..() + GLOB.custom_shuttle_machines += src + SetInitDirections() + update_adjacent_engines() + updateGasStats() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/Destroy() + . = ..() + update_adjacent_engines() + GLOB.custom_shuttle_machines -= src + +/obj/machinery/atmospherics/components/unary/shuttle/heater/on_construction() + ..(dir, dir) + SetInitDirections() + update_adjacent_engines() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/default_change_direction_wrench(mob/user, obj/item/I) + if(!..()) + return FALSE + SetInitDirections() + var/obj/machinery/atmospherics/node = nodes[1] + if(node) + node.disconnect(src) + nodes[1] = null + if(!parents[1]) + return + nullifyPipenet(parents[1]) + + atmosinit() + node = nodes[1] + if(node) + node.atmosinit() + node.addMember(src) + build_network() + return TRUE + +/obj/machinery/atmospherics/components/unary/shuttle/heater/RefreshParts() + var/cap = 0 + var/eff = 0 + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + cap += M.rating + for(var/obj/item/stock_parts/micro_laser/L in component_parts) + eff += L.rating + gas_capacity = 5000 * ((cap - 1) ** 2) + 1000 + efficiency_multiplier = round(((eff / 2) / 2.8) ** 2, 0.1) + updateGasStats() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/examine(mob/user) + . = ..() + var/datum/gas_mixture/air_contents = airs[1] + . += "The engine heater's gas dial reads [air_contents.get_moles(gas_type)] moles of gas.
" //This probably has issues [air_contents.get_moles] + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/updateGasStats() + var/datum/gas_mixture/air_contents = airs[1] + if(!air_contents) + return + air_contents.set_volume(gas_capacity) + air_contents.set_temperature(T20C) + if(gas_type) + air_contents.set_moles(gas_type) + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/hasFuel(var/required) + var/datum/gas_mixture/air_contents = airs[1] + var/moles = air_contents.total_moles() + return moles >= required + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/consumeFuel(var/amount) + var/datum/gas_mixture/air_contents = airs[1] + air_contents.remove(amount) + return + +/obj/machinery/atmospherics/components/unary/shuttle/heater/attackby(obj/item/I, mob/living/user, params) + update_adjacent_engines() + if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I)) + return + if(default_pry_open(I)) + return + if(panel_open) + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + return ..() + +/obj/machinery/atmospherics/components/unary/shuttle/heater/proc/update_adjacent_engines() + var/engine_turf + switch(dir) + if(NORTH) + engine_turf = get_offset_target_turf(src, 0, -1) + if(SOUTH) + engine_turf = get_offset_target_turf(src, 0, 1) + if(EAST) + engine_turf = get_offset_target_turf(src, -1, 0) + if(WEST) + engine_turf = get_offset_target_turf(src, 1, 0) + if(!engine_turf) + return + for(var/obj/machinery/shuttle/engine/E in engine_turf) + E.check_setup() diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index e9f151fc1748..f9a604a8bb90 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -65,7 +65,7 @@ myseed.genes += G set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color) setDir(CalcDir()) - var/base_icon_state = initial(icon_state) + base_icon_state = initial(icon_state) if(!floor) switch(dir) //offset to make it be on the wall rather than on the floor if(NORTH) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 81284c9b9cd9..d8ab95c987e1 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -377,6 +377,14 @@ name = "circuit board (Xenobiology Console)" icon_state = "science" build_path = /obj/machinery/computer/camera_advanced/xenobio + +/obj/item/circuitboard/computer/shuttle/flight_control + name = "Shuttle Flight Control (Computer Board)" + build_path = /obj/machinery/computer/custom_shuttle + +/obj/item/circuitboard/computer/shuttle/docker + name = "Shuttle Navigation Computer (Computer Board)" + build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom //Security diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 0b66104d6cd6..b81ed386e172 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1230,3 +1230,28 @@ /obj/item/stack/sheet/mineral/silver = 1) needs_anchored = FALSE + +/obj/item/circuitboard/machine/shuttle/engine + name = "Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine + req_components = list() + +/obj/item/circuitboard/machine/shuttle/engine/plasma + name = "Plasma Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine/plasma + req_components = list(/obj/item/stock_parts/capacitor = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/micro_laser = 1) + +/obj/item/circuitboard/machine/shuttle/engine/void + name = "Void Thruster (Machine Board)" + build_path = /obj/machinery/shuttle/engine/void + req_components = list(/obj/item/stock_parts/capacitor/quadratic = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/micro_laser/quadultra = 1) + +/obj/item/circuitboard/machine/shuttle/heater + name = "Electronic Engine Heater (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/shuttle/heater + req_components = list(/obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/matter_bin = 1) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 06d849b86441..9fb13b0d4cbf 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -738,7 +738,161 @@ if (.) for(var/obj/item/storage/part_replacer/cyborg/RPED in R.module.modules) R.module.remove_module(RPED, TRUE) + +/obj/item/borg/upgrade/upgraded_rped + name = "engineering cyborg bluepsace RPED" + desc = "An upgraded version of the rapid part exchange device for the engineering cyborg, which replaces the old one." + icon = 'icons/obj/storage.dmi' + icon_state = "BS_RPED" + require_module = TRUE + module_type = /obj/item/robot_module/engineering + module_flags = BORG_MODULE_ENGINEERING + +/obj/item/borg/upgrade/upgraded_rped/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + /// Removes old RPED + for(var/obj/item/storage/part_replacer/cyborg/RPED in R.module.modules) + R.module.remove_module(RPED, TRUE) + + var/obj/item/storage/part_replacer/bluespace/cyborg/BSRPED = locate() in R.module.modules + if(BSRPED) + to_chat(user, "This unit is already equipped with a Bluespace RPED module.") + return FALSE + + /// Puts in Bluespace RPED + BSRPED = new(R.module) + R.module.basic_modules += BSRPED + R.module.add_module(BSRPED, FALSE, TRUE) + +/obj/item/borg/upgrade/upgraded_rped/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + for(var/obj/item/storage/part_replacer/bluespace/cyborg/BSRPED in R.module.modules) + R.module.remove_module(BSRPED, TRUE) + + var/obj/item/storage/part_replacer/cyborg/RPED = locate() in R.module.modules + RPED = new(R.module) + R.module.basic_modules += RPED + R.module.add_module(RPED, FALSE, TRUE) + +/obj/item/borg/upgrade/upgraded_tools + name = "engineering cyborg advanced tools." + desc = "An upgraded version of the basic tools for the engineering cyborg, which replaces the old one." + icon_state = "cyborg_upgrade3" + require_module = TRUE + module_type = /obj/item/robot_module/engineering + module_flags = BORG_MODULE_ENGINEERING + +/obj/item/borg/upgrade/upgraded_tools/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + /// Removes old tools + for(var/obj/item/screwdriver/cyborg/SC in R.module.modules) + R.module.remove_module(SC, TRUE) + for(var/obj/item/wrench/cyborg/W in R.module.modules) + R.module.remove_module(W, TRUE) + + for(var/obj/item/crowbar/cyborg/CB in R.module.modules) + R.module.remove_module(CB, TRUE) + + for(var/obj/item/wirecutters/cyborg/WC in R.module.modules) + R.module.remove_module(WC, TRUE) + + for(var/obj/item/multitool/cyborg/MT in R.module.modules) + R.module.remove_module(MT, TRUE) + + + for(var/obj/item/analyzer/AL in R.module.modules) + R.module.remove_module(AL, TRUE) + + /// Puts in Advance tools + var/obj/item/jawsoflife/JL = new(R.module) + R.module.basic_modules += JL + R.module.add_module(JL, FALSE, TRUE) + + var/obj/item/handdrill/HD = new(R.module) + R.module.basic_modules += HD + R.module.add_module(HD, FALSE, TRUE) + + var/obj/item/multitool/tricorder/TC = new(R.module) + R.module.basic_modules += TC + R.module.add_module(TC, FALSE, TRUE) + +/obj/item/borg/upgrade/upgraded_tools/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + for(var/obj/item/jawsoflife/JL in R.module.modules) + R.module.basic_modules -= JL + R.module.remove_module(JL, TRUE) + + for(var/obj/item/handdrill/HD in R.module.modules) + R.module.basic_modules -= HD + R.module.remove_module(HD, TRUE) + + for(var/obj/item/multitool/tricorder/TC in R.module.modules) + R.module.basic_modules -= TC + R.module.remove_module(TC, TRUE) + + + var/obj/item/screwdriver/cyborg/SC = locate() in R.module.modules + SC = new(R.module) + R.module.basic_modules += SC + R.module.add_module(SC, FALSE, TRUE) + + var/obj/item/wrench/cyborg/W = locate() in R.module.modules + W = new(R.module) + R.module.basic_modules += W + R.module.add_module(W, FALSE, TRUE) + + var/obj/item/crowbar/cyborg/CB = locate() in R.module.modules + CB = new(R.module) + R.module.basic_modules += CB + R.module.add_module(CB, FALSE, TRUE) + + var/obj/item/wirecutters/cyborg/WC = locate() in R.module.modules + WC = new(R.module) + R.module.basic_modules += WC + R.module.add_module(WC, FALSE, TRUE) + + var/obj/item/multitool/cyborg/MT = locate() in R.module.modules + MT = new(R.module) + R.module.basic_modules += MT + R.module.add_module(MT, FALSE, TRUE) + + var/obj/item/analyzer/AL = locate() in R.module.modules + AL = new(R.module) + R.module.basic_modules += AL + R.module.add_module(AL, FALSE, TRUE) + +/obj/item/borg/upgrade/holofan + name = "Engineering cyborg ATMOS holofan projector" + desc = "An ATMOS holofan projector for the cyborg." + icon_state = "cyborg_upgrade2" + require_module = TRUE + module_type = /obj/item/robot_module/engineering + module_flags = BORG_MODULE_ENGINEERING + +/obj/item/borg/upgrade/holofan/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + + var/obj/item/holosign_creator/atmos/holofan = locate() in R.module.modules + if(holofan) + to_chat(user, "This unit is already equipped with a holofan module.") + return FALSE + + holofan = new(R.module) + R.module.basic_modules += holofan + R.module.add_module(holofan, FALSE, TRUE) + +/obj/item/borg/upgrade/holofan/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + for(var/obj/item/holosign_creator/atmos/holofan in R.module.modules) + R.module.remove_module(holofan, TRUE) + /obj/item/borg/upgrade/plasmacutter name = "mining cyborg plasma cutter" desc = "A plasma cutter module for the mining cyborg." diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index d132f1d62463..5a988345efe2 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -212,7 +212,7 @@ force = 3 throwforce = 3 throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted var/on_force = 10 var/on_throwforce = 8 var/on_throw_speed = 2 diff --git a/code/game/objects/items/shuttle_creator.dm b/code/game/objects/items/shuttle_creator.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/code/game/objects/items/shuttle_upgrades.dm b/code/game/objects/items/shuttle_upgrades.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1e7fff43f3b7..162faeb17c8b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -204,6 +204,21 @@ else message_admins("[key_name_admin(usr)] tried to create a shadowling. Unfortunately, there were no candidates available.") log_admin("[key_name(usr)] failed to create a shadowling.") + if("vampire") + if(makeVampire()) + message_admins("[key_name(usr)] created a vampire.") + log_admin("[key_name(usr)] created a vampire.") + else + message_admins("[key_name_admin(usr)] tried to create a vampire. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create a vampire.") + if("infiltrator") + message_admins("[key_name(usr)] is creating an infiltration team...") + if(makeInfiltratorTeam()) + message_admins("[key_name(usr)] created an infiltration team.") + log_admin("[key_name(usr)] created an infiltration team.") + else + message_admins("[key_name_admin(usr)] tried to create an infiltration team. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create an infiltration team.") else if(href_list["forceevent"]) if(!check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index e084a777a4f9..c48e007abd11 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -24,6 +24,8 @@ Make Abductor Team (Requires Ghosts)
Make Revenant (Requires Ghost)
Make Shadowling
+ Make Vampire
+ Make Infiltration Team (Requires Ghosts) "} var/datum/browser/popup = new(usr, "oneclickantag", "Quick-Create Antagonist", 400, 400) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 5b9ecdcdcf5d..31512fb2cfcc 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -212,7 +212,7 @@ thing.update_slot_icon() UpdateButtonIcon() -/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item, obj/item/target = src.target) //yogs -- add support for cham hardsuits target.name = initial(picked_item.name) target.desc = initial(picked_item.desc) target.icon_state = initial(picked_item.icon_state) @@ -225,6 +225,15 @@ var/obj/item/clothing/CL = I var/obj/item/clothing/PCL = picked_item CL.flags_cover = initial(PCL.flags_cover) + if(istype(target, /obj/item/clothing/suit/space/hardsuit/infiltration)) //YOGS START + var/obj/item/clothing/suit/space/hardsuit/infiltration/I = target + var/obj/item/clothing/suit/space/hardsuit/HS = picked_item + var/obj/item/clothing/head/helmet/helmet = initial(HS.helmettype) + I.head_piece.initial_state = initial(helmet.icon_state) + update_item(helmet, I.head_piece) + I.head_piece.update_icon() + qdel(helmet) + //YOGS END target.icon = initial(picked_item.icon) /datum/action/item_action/chameleon/change/Trigger() diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 900721370294..5e2132f88729 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -22,8 +22,11 @@ sight |= SEE_TURFS - new_player_panel() client.playtitlemusic() + + var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) + asset_datum.send(client) + if(SSticker.current_state < GAME_STATE_SETTING_UP) var/tl = SSticker.GetTimeLeft() var/postfix diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 3ae04568fab3..5a132ae9eeea 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,19 +1,19 @@ -#define LINKIFY_READY(string, value) "[string]" - /mob/dead/new_player - var/ready = 0 - var/spawning = 0//Referenced when you want to delete the new_player later on in the code. - flags_1 = NONE invisibility = INVISIBILITY_ABSTRACT density = FALSE stat = DEAD - - var/mob/living/new_character //for instant transfer once the round is set up - - //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles + hud_type = /datum/hud/new_player + hud_possible = list() + + var/ready = FALSE + /// Referenced when you want to delete the new_player later on in the code. + var/spawning = FALSE + /// For instant transfer once the round is set up + var/mob/living/new_character + ///Used to make sure someone doesn't get spammed with messages if they're ineligible for roles. var/ineligible_for_roles = FALSE /mob/dead/new_player/Initialize() @@ -39,64 +39,6 @@ /mob/dead/new_player/prepare_huds() return -/mob/dead/new_player/proc/new_player_panel() - var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) - asset_datum.send(client) - var/output = "

Setup Character

" - - if(SSticker.current_state <= GAME_STATE_PREGAME) - switch(ready) - if(PLAYER_NOT_READY) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_PLAY) - output += "

\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_OBSERVE) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]

" - else - output += "

View the Crew Manifest

" - output += "

Join Game!

" - output += "

[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]

" - - if(!IsGuestKey(src.key)) - if (SSdbcore.Connect()) - var/isadmin = 0 - if(src.client && src.client.holder) - isadmin = 1 - var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery({" - SELECT id FROM [format_table_name("poll_question")] - WHERE (adminonly = 0 OR :isadmin = 1) - AND Now() BETWEEN starttime AND endtime - AND id NOT IN ( - SELECT pollid FROM [format_table_name("poll_vote")] - WHERE ckey = :ckey - ) - AND id NOT IN ( - SELECT pollid FROM [format_table_name("poll_textreply")] - WHERE ckey = :ckey - ) - "}, list("isadmin" = isadmin, "ckey" = ckey)) - var/rs = REF(src) - if(query_get_new_polls.Execute()) - var/newpoll = 0 - if(query_get_new_polls.NextRow()) - newpoll = 1 - - if(newpoll) - output += "

Show Player Polls (NEW!)

" - else - output += "

Show Player Polls

" - qdel(query_get_new_polls) - if(QDELETED(src)) - return - - output += "
" - - var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) - popup.set_window_options("can_close=0") - popup.set_content(output) - popup.open(FALSE) - -// List of possible actions user has chosen on the New Players menus /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) return 0 @@ -104,67 +46,13 @@ if(!client) return 0 - //Determines Relevent Population Cap - var/relevant_cap - var/hpc = CONFIG_GET(number/hard_popcap) - var/epc = CONFIG_GET(number/extreme_popcap) - if(hpc && epc) - relevant_cap = min(hpc, epc) - else - relevant_cap = max(hpc, epc) - - if(href_list["show_preferences"]) - client.prefs.ShowChoices(src) - return 1 - - if(href_list["ready"]) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return - - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["late_join"]) - if(!SSticker || !SSticker.IsRoundInProgress()) - to_chat(usr, span_danger("The round is either not ready, or has already finished...")) - return - - if(href_list["late_join"] == "override") - LateChoices() - return - - if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) - //yogs start -- donors bypassing the queue - if(ckey(key) in get_donators()) - to_chat(usr, span_notice("Because you are a donator, you have bypassed the queue! Thank you for donating!")) - LateChoices() - return - //yogs end - to_chat(usr, span_danger("[CONFIG_GET(string/hard_popcap_message)]")) - - var/queue_position = SSticker.queued_players.Find(usr) - if(queue_position == 1) - to_chat(usr, span_notice("You are next in line to join the game. You will be notified when a slot opens up.")) - else if(queue_position) - to_chat(usr, span_notice("There are [queue_position-1] players in front of you in the queue to join the game.")) - else - SSticker.queued_players += usr - to_chat(usr, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) - return + + if(href_list["late_join"]) //This still exists for queue messages in chat + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, span_boldwarning("The round is either not ready, or has already finished...")) + return LateChoices() - - if(href_list["manifest"]) - ViewManifest() + return if(href_list["SelectedJob"]) @@ -176,6 +64,17 @@ to_chat(usr, span_notice("There is an administrative lock on entering the game!")) return + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + + if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) to_chat(usr, span_warning("Server is full.")) @@ -192,21 +91,10 @@ AttemptLateSpawn(href_list["SelectedJob"]) return - else if(!href_list["late_join"]) - new_player_panel() - if(href_list["showpoll"]) handle_player_polling() return - if(href_list["pollid"]) - var/pollid = href_list["pollid"] - if(istext(pollid)) - pollid = text2num(pollid) - if(isnum(pollid) && ISINTEGER(pollid)) - src.poll_player(pollid) - return - if(href_list["votepollid"] && href_list["votetype"]) var/pollid = text2num(href_list["votepollid"]) var/votetype = href_list["votetype"] @@ -290,7 +178,6 @@ if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() return FALSE var/mob/dead/observer/observer = new() diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index fa500f4e9af5..4c858fd11568 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -12,6 +12,7 @@ update_gravity(mob_has_gravity()) handle_status_effects() + process_hijack() // yogs if(malfhack && malfhack.aidisabled) deltimer(malfhacking) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 96ba894f1e8e..2797bcc65051 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -219,3 +219,5 @@ /// A mock client, provided by tests and friends var/datum/client_interface/mock_client + + var/create_area_cooldown diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 079ae9e8d99b..902f8528160f 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -78,7 +78,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return main_part.attackby(I, user) /obj/machinery/gravity_generator/part/get_status() - return main_part.get_status() + return main_part?.get_status() /obj/machinery/gravity_generator/part/attack_hand(mob/user) return main_part.attack_hand(user) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 83400fc18f2b..53305c207cf3 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -285,3 +285,19 @@ build_path = /obj/item/circuitboard/computer/nanite_cloud_controller category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/shuttle/flight_control + name = "Computer Design (Shuttle Flight Controls)" + desc = "Allows for the construction of circuit boards used to build a console that enables shuttle flight" + id = "shuttle_control" + build_path = /obj/item/circuitboard/computer/shuttle/flight_control + category = list("Computer Boards", "Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/board/shuttle/shuttle_docker + name = "Computer Design (Private Navigation Computer)" + desc = "Allows for the construction of circuit boards used to build a console that enables the targetting of custom flight locations" + id = "shuttle_docker" + build_path = /obj/item/circuitboard/computer/shuttle/docker + category = list("Computer Boards", "Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 0360b7dbfa97..42433517b4e3 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -2,6 +2,38 @@ //////////////MISC Boards/////////////// //////////////////////////////////////// +/datum/design/board/shuttle/engine/plasma + name = "Machine Design (Plasma Thruster Board)" + desc = "The circuit board for a plasma thruster." + id = "engine_plasma" + build_path = /obj/item/circuitboard/machine/shuttle/engine/plasma + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/shuttle/engine/void + name = "Machine Design (Void Thruster Board)" + desc = "The circuit board for a void thruster." + id = "engine_void" + build_path = /obj/item/circuitboard/machine/shuttle/engine/void + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/shuttle/engine/heater + name = "Machine Design (Engine Heater Board)" + desc = "The circuit board for an engine heater." + id = "engine_heater" + build_path = /obj/item/circuitboard/machine/shuttle/heater + category = list ("Shuttle Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/spaceship_navigation_beacon + name = "Machine Design (Bluespace Navigation Gigabeacon)" + desc = "The circuit board for a Bluespace Navigation Gigabeacon." + id = "spaceship_navigation_beacon" + build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon + category = list ("Teleportation Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + /datum/design/board/smes name = "Machine Design (SMES Board)" desc = "The circuit board for an SMES." diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index b19fa91faf1c..4d511ff5a837 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -788,6 +788,34 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_upgraded_rped + name = "Cyborg Upgrade (BSRPED)" + id = "borg_upgrade_upgraded_rped" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/upgraded_rped + materials = list(/datum/material/iron = 15000, /datum/material/glass = 5000, /datum/material/silver = 2500) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_upgraded_tools + name = "Cyborg Upgrade (Advanced tools)" + id = "borg_upgrade_upgraded_tools" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/upgraded_tools + /// Combined materials of all 3 experimentals tools + materials = list(/datum/material/iron = 8500, /datum/material/silver = 4300, /datum/material/gold=300, /datum/material/titanium = 6000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_holosign + name = "cyborg ATMOS holofan projector" + id = "borg_upgrade_holofan" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/holofan + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 140 + category = list("Cyborg Upgrade Modules") + /datum/design/borg_upgrade_pinpointer name = "Cyborg Upgrade (Crew pinpointer)" id = "borg_upgrade_pinpointer" @@ -824,4 +852,4 @@ materials = list(/datum/material/iron = 750, /datum/material/glass = 750) construction_time = 100 build_path = /obj/item/assembly/flash/handheld - category = list("Misc") \ No newline at end of file + category = list("Misc") diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 99924c91b004..d50cd0f7d6b4 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -3,6 +3,36 @@ /////////////////HUDs//////////////////// ///////////////////////////////////////// +/datum/design/shuttle_speed_upgrade + name = "Shuttle Route Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console." + id = "disk_shuttle_route" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/shuttle_speed_upgrade_hyper + name = "Shuttle Bluespace Hyperlane Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one abuses bluespace hyperlanes for increased efficiency." + id = "disk_shuttle_route_hyper" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation/hyperlane + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/shuttle_speed_upgrade_void + name = "Shuttle Voidspace Optimisation Upgrade" + desc = "A disk that allows for calculating shorter routes when inserted into a flight control console. This one access voidspace for increased efficiency." + id = "disk_shuttle_route_void" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/shuttle_route_optimisation/void + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/health_hud name = "Health Scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index ffc14a6bb941..4a983f4a3619 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -23,6 +23,16 @@ category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/shuttlecreator + name = "Rapid Shuttle Designator" + desc = "An advanced device capable of defining areas for use in the creation of shuttles" + id = "shuttle_creator" + build_path = /obj/item/shuttle_creator + build_type = PROTOLATHE + materials = list(/datum/material/iron = 8000, /datum/material/titanium = 5000, /datum/material/bluespace = 5000) + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/exwelder name = "Experimental Welding Tool" desc = "An experimental welder capable of self-fuel generation." diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 948dad61db94..8415564f6d09 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -14,7 +14,8 @@ "Subspace Telecomms", "Research Machinery", "Misc. Machinery", - "Computer Parts" + "Computer Parts", + "Shuttle Machinery" ) production_animation = "circuit_imprinter_ani" allowed_buildtypes = IMPRINTER diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 8cf1fb8f6bef..1bf2369bb3d3 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -108,6 +108,9 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' +/obj/item/storage/part_replacer/bluespace/cyborg + desc = "A version of the Bluepspace RPED for engineering cyborgs." + /proc/cmp_rped_sort(obj/item/A, obj/item/B) return B.get_part_rating() - A.get_part_rating() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 10a89987c13b..fde26ab0110b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -272,6 +272,43 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 +/////////////////////////shuttle tech///////////////////////// +/datum/techweb_node/basic_shuttle_tech + id = "basic_shuttle" + display_name = "Basic Shuttle Research" + description = "Research the technology required to create and use basic shuttles." + prereq_ids = list("bluespace_travel", "adv_engi") + design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + export_price = 5000 + +/datum/techweb_node/shuttle_route_upgrade + id = "shuttle_route_upgrade" + display_name = "Route Optimisation Upgrade" + description = "Research into bluespace tunnelling, allowing us to reduce flight times by up to 20%!" + prereq_ids = list("basic_shuttle") + design_ids = list("disk_shuttle_route") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + +/datum/techweb_node/shuttle_route_upgrade_hyper + id = "shuttle_route_upgrade_hyper" + display_name = "Hyperlane Optimisation Upgrade" + description = "Research into bluespace hyperlane, allowing us to reduce flight times by up to 40%!" + prereq_ids = list("shuttle_route_upgrade", "micro_bluespace") + design_ids = list("disk_shuttle_route_hyper") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + +/datum/techweb_node/shuttle_route_upgrade_void + id = "shuttle_route_upgrade_void" + display_name = "Nullspace Breaching Upgrade" + description = "Research into voidspace tunnelling, allowing us to significantly reduce flight times." + prereq_ids = list("shuttle_route_upgrade_hyper", "alientech") + design_ids = list("disk_shuttle_route_void", "engine_void") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500) + export_price = 5000 + /////////////////////////robotics tech///////////////////////// /datum/techweb_node/robotics id = "robotics" @@ -313,10 +350,19 @@ display_name = "Cyborg Upgrades: Utility" description = "Utility upgrades for cyborgs." prereq_ids = list("engineering") - design_ids = list("borg_upgrade_holding", "borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped") + design_ids = list("borg_upgrade_holding", "borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped", "borg_upgrade_holofan") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) export_price = 5000 +/datum/techweb_node/adv_cyborg_upg_util + id = "adv_cyborg_upg_util" + display_name = "Cyborg Upgrades: Advanced Utility" + description = "Advanced Utility upgrade for cyborgs." + prereq_ids = list("engineering", "cyborg_upg_util") + design_ids = list("borg_upgrade_upgraded_rped", "borg_upgrade_upgraded_tools") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + /datum/techweb_node/cyborg_upg_med id = "cyborg_upg_med" display_name = "Cyborg Upgrades: Medical" diff --git a/code/modules/research/techweb/layout.dm b/code/modules/research/techweb/layout.dm index 13caacb682b4..5eb51eead758 100644 --- a/code/modules/research/techweb/layout.dm +++ b/code/modules/research/techweb/layout.dm @@ -8,505 +8,528 @@ // In addition, hovering over a node will show the coordinates if do_node_drag is set /datum/techweb_node/base - ui_x = 32 - ui_y = -128 + ui_x = 32 + ui_y = -128 /datum/techweb_node/mmi - ui_x = -32 - ui_y = 96 + ui_x = -32 + ui_y = 96 /datum/techweb_node/cyborg - ui_x = -96 - ui_y = 96 + ui_x = -96 + ui_y = 96 /datum/techweb_node/mech - ui_x = -448 - ui_y = 0 + ui_x = -448 + ui_y = 0 /datum/techweb_node/mech_tools - ui_x = -448 - ui_y = -64 + ui_x = -448 + ui_y = -64 /datum/techweb_node/basic_tools - ui_x = -96 - ui_y = -384 + ui_x = -96 + ui_y = -384 /datum/techweb_node/biotech - ui_x = 160 - ui_y = -128 + ui_x = 160 + ui_y = -128 /datum/techweb_node/datatheory - ui_x = 160 - ui_y = -256 + ui_x = 160 + ui_y = -256 /datum/techweb_node/engineering - ui_x = 32 - ui_y = -256 + ui_x = 32 + ui_y = -256 /datum/techweb_node/bluespace_basic - ui_x = -96 - ui_y = -192 + ui_x = -96 + ui_y = -192 /datum/techweb_node/robotics - ui_x = -160 - ui_y = 96 + ui_x = -160 + ui_y = 96 /datum/techweb_node/emp_basic - ui_x = -96 - ui_y = -128 + ui_x = -96 + ui_y = -128 /datum/techweb_node/clown - ui_x = 256 - ui_y = -576 + ui_x = 256 + ui_y = -576 /datum/techweb_node/sec_basic - ui_x = -512 - ui_y = -672 + ui_x = -512 + ui_y = -672 /datum/techweb_node/odysseus - ui_x = 352 - ui_y = -384 + ui_x = 352 + ui_y = -384 -/datum/techweb_node/spacepod_basic - ui_x = -160 - ui_y = -448 +/datum/techweb_node/spacevehicle_basic + ui_x = -32 + ui_y = -736 /datum/techweb_node/adv_biotech - ui_x = 288 - ui_y = -96 + ui_x = 288 + ui_y = -96 /datum/techweb_node/bio_process - ui_x = 224 - ui_y = -224 + ui_x = 224 + ui_y = -224 /datum/techweb_node/imp_wt_surgery - ui_x = 224 - ui_y = 64 + ui_x = 224 + ui_y = 64 /datum/techweb_node/neural_programming - ui_x = 544 - ui_y = -160 + ui_x = 544 + ui_y = -160 /datum/techweb_node/cloning - ui_x = 288 - ui_y = -256 + ui_x = 288 + ui_y = -256 /datum/techweb_node/cryotech - ui_x = 160 - ui_y = -192 + ui_x = 160 + ui_y = -192 /datum/techweb_node/subdermal_implants - ui_x = 288 - ui_y = -32 + ui_x = 288 + ui_y = -32 /datum/techweb_node/botany - ui_x = 320 - ui_y = -224 + ui_x = 320 + ui_y = -224 /datum/techweb_node/nanite_bio - ui_x = 480 - ui_y = -288 + ui_x = 480 + ui_y = -288 /datum/techweb_node/alientech - ui_x = 288 - ui_y = 320 + ui_x = 288 + ui_y = 320 /datum/techweb_node/high_efficiency - ui_x = -32 - ui_y = -320 + ui_x = -32 + ui_y = -320 /datum/techweb_node/comptech - ui_x = 192 - ui_y = -320 + ui_x = 192 + ui_y = -320 /datum/techweb_node/cyber_implants - ui_x = 352 - ui_y = -32 + ui_x = 352 + ui_y = -32 /datum/techweb_node/nanite_base - ui_x = 480 - ui_y = -224 + ui_x = 480 + ui_y = -224 /datum/techweb_node/adv_engi - ui_x = -32 - ui_y = -256 + ui_x = -32 + ui_y = -256 /datum/techweb_node/adv_power - ui_x = -128 - ui_y = -320 + ui_x = -128 + ui_y = -320 /datum/techweb_node/practical_bluespace - ui_x = -192 - ui_y = -224 + ui_x = -192 + ui_y = -224 /datum/techweb_node/basic_plasma - ui_x = 32 - ui_y = -320 + ui_x = 32 + ui_y = -320 /datum/techweb_node/cyborg_upg_util - ui_x = -96 - ui_y = 160 + ui_x = -96 + ui_y = 160 +/datum/techweb_node/adv_cyborg_upg_util + ui_x = -32 + ui_y = 160 /datum/techweb_node/basic_mining - ui_x = 96 - ui_y = -384 + ui_x = 96 + ui_y = -384 /datum/techweb_node/weaponry - ui_x = -576 - ui_y = -416 + ui_x = -576 + ui_y = -416 /datum/techweb_node/smartmine - ui_x = -512 - ui_y = -800 + ui_x = -512 + ui_y = -800 /datum/techweb_node/nanite_mesh - ui_x = 416 - ui_y = -288 + ui_x = 416 + ui_y = -288 /datum/techweb_node/spacepod_lock - ui_x = -224 - ui_y = -448 + ui_x = 32 + ui_y = -768 /datum/techweb_node/telecomms - ui_x = 256 - ui_y = -320 + ui_x = 256 + ui_y = -320 /datum/techweb_node/adv_robotics - ui_x = -160 - ui_y = 160 + ui_x = -160 + ui_y = 160 /datum/techweb_node/ai - ui_x = 608 - ui_y = -96 + ui_x = 608 + ui_y = -96 /datum/techweb_node/emp_adv - ui_x = -160 - ui_y = -128 + ui_x = -160 + ui_y = -128 /datum/techweb_node/integrated_HUDs - ui_x = -96 - ui_y = -64 + ui_x = -96 + ui_y = -64 /datum/techweb_node/electric_weapons - ui_x = -480 - ui_y = -480 + ui_x = -480 + ui_y = -480 /datum/techweb_node/camera_theory - ui_x = 96 - ui_y = -320 + ui_x = 96 + ui_y = -320 /datum/techweb_node/landmine - ui_x = -512 - ui_y = -736 + ui_x = -512 + ui_y = -736 + +/datum/techweb_node/basic_shuttle_tech + ui_x = -96 + ui_y = -736 + +/datum/techweb_node/shuttle_route_upgrade + ui_x = -160 + ui_y = -736 /datum/techweb_node/spacepod_disabler - ui_x = -64 - ui_y = -576 + ui_x = 32 + ui_y = -704 /datum/techweb_node/spacepod_pseat - ui_x = -160 - ui_y = -512 - -/datum/techweb_node/xenology - ui_x = 480 - ui_y = -96 + ui_x = 32 + ui_y = -832 /datum/techweb_node/cyborg_upg_med - ui_x = 352 - ui_y = -160 - -/datum/techweb_node/cyborg_upg_surgkit - ui_x = 416 - ui_y = -160 + ui_x = 352 + ui_y = -160 /datum/techweb_node/cyber_organs - ui_x = 352 - ui_y = -96 + ui_x = 352 + ui_y = -96 /datum/techweb_node/medical_weapons - ui_x = -480 - ui_y = -544 + ui_x = -480 + ui_y = -544 /datum/techweb_node/med_mech_tools - ui_x = 288 - ui_y = -160 + ui_x = 288 + ui_y = -160 /datum/techweb_node/alien_bio - ui_x = 224 - ui_y = 256 + ui_x = 224 + ui_y = 256 /datum/techweb_node/adv_surgery - ui_x = 288 - ui_y = 64 + ui_x = 288 + ui_y = 64 /datum/techweb_node/posibrain - ui_x = 608 - ui_y = -160 + ui_x = 608 + ui_y = -160 /datum/techweb_node/adv_cyber_implants - ui_x = 416 - ui_y = -32 + ui_x = 416 + ui_y = -32 /datum/techweb_node/nanite_synaptic - ui_x = 576 - ui_y = -352 + ui_x = 576 + ui_y = -352 /datum/techweb_node/nanite_neural - ui_x = 512 - ui_y = -352 + ui_x = 512 + ui_y = -352 /datum/techweb_node/nanite_harmonic - ui_x = 448 - ui_y = -352 + ui_x = 448 + ui_y = -352 /datum/techweb_node/alien_surgery - ui_x = 352 - ui_y = 256 + ui_x = 352 + ui_y = 256 + +/datum/techweb_node/shuttle_route_upgrade_void + ui_x = 352 + ui_y = 320 /datum/techweb_node/nanite_hazard - ui_x = 288 - ui_y = 256 + ui_x = 288 + ui_y = 256 /datum/techweb_node/alien_engi - ui_x = 224 - ui_y = 320 + ui_x = 224 + ui_y = 320 /datum/techweb_node/micro_bluespace - ui_x = -320 - ui_y = -224 + ui_x = -320 + ui_y = -224 /datum/techweb_node/combat_cyber_implants - ui_x = 480 - ui_y = -32 + ui_x = 480 + ui_y = -32 /datum/techweb_node/spacepod_storage - ui_x = -160 - ui_y = -576 + ui_x = 96 + ui_y = -832 /datum/techweb_node/spacepod_lockbuster - ui_x = -224 - ui_y = -512 + ui_x = 96 + ui_y = -768 /datum/techweb_node/spacepod_iarmor - ui_x = -224 - ui_y = -576 + ui_x = 160 + ui_y = -832 /datum/techweb_node/computer_hardware_basic - ui_x = 256 - ui_y = -448 + ui_x = 256 + ui_y = -448 /datum/techweb_node/computer_board_gaming - ui_x = 192 - ui_y = -384 + ui_x = 192 + ui_y = -384 /datum/techweb_node/comp_recordkeeping - ui_x = 256 - ui_y = -384 + ui_x = 256 + ui_y = -384 /datum/techweb_node/nanite_smart - ui_x = 544 - ui_y = -288 + ui_x = 544 + ui_y = -288 /datum/techweb_node/anomaly - ui_x = -224 - ui_y = -288 + ui_x = -224 + ui_y = -288 /datum/techweb_node/NVGtech - ui_x = -160 - ui_y = -64 + ui_x = -160 + ui_y = -64 /datum/techweb_node/adv_mining - ui_x = 96 - ui_y = -448 + ui_x = 96 + ui_y = -448 /datum/techweb_node/janitor - ui_x = -320 - ui_y = -160 + ui_x = -320 + ui_y = -160 /datum/techweb_node/exp_tools - ui_x = -96 - ui_y = -448 + ui_x = -96 + ui_y = -448 /datum/techweb_node/rcd_upgrade - ui_x = -32 - ui_y = -448 + ui_x = -32 + ui_y = -448 /datum/techweb_node/adv_weaponry - ui_x = -576 - ui_y = -576 + ui_x = -576 + ui_y = -576 /datum/techweb_node/advmine - ui_x = -448 - ui_y = -800 + ui_x = -448 + ui_y = -800 /datum/techweb_node/radioactive_weapons - ui_x = -704 - ui_y = -736 + ui_x = -704 + ui_y = -736 /datum/techweb_node/syndicate_basic - ui_x = -384 - ui_y = -672 + ui_x = -384 + ui_y = -672 /datum/techweb_node/bluespace_power - ui_x = -192 - ui_y = -352 + ui_x = -192 + ui_y = -352 /datum/techweb_node/mech_tesla - ui_x = -576 - ui_y = -256 + ui_x = -576 + ui_y = -256 /datum/techweb_node/bluespace_travel - ui_x = -256 - ui_y = -224 + ui_x = -256 + ui_y = -224 /datum/techweb_node/adv_plasma - ui_x = 32 - ui_y = -384 + ui_x = 32 + ui_y = -384 /datum/techweb_node/spacepod_ka - ui_x = -64 - ui_y = -512 + ui_x = 32 + ui_y = -640 /datum/techweb_node/ballistic_weapons - ui_x = -736 - ui_y = -416 + ui_x = -736 + ui_y = -416 /datum/techweb_node/gygax - ui_x = -672 - ui_y = -160 + ui_x = -672 + ui_y = -160 /datum/techweb_node/phazon - ui_x = -736 - ui_y = -128 + ui_x = -736 + ui_y = -128 /datum/techweb_node/adv_mecha - ui_x = -576 - ui_y = -96 + ui_x = -576 + ui_y = -96 /datum/techweb_node/emp_super - ui_x = -224 - ui_y = -128 + ui_x = -224 + ui_y = -128 /datum/techweb_node/mech_ion - ui_x = -672 - ui_y = -256 + ui_x = -672 + ui_y = -256 /datum/techweb_node/spacepod_lasers - ui_x = 0 - ui_y = -576 + ui_x = 96 + ui_y = -704 + +/datum/techweb_node/shuttle_route_upgrade_hyper + ui_x = -224 + ui_y = -736 + +/datum/techweb_node/cyborg_upg_surgkit + ui_x = 416 + ui_y = -160 /datum/techweb_node/cyber_organs_upgraded - ui_x = 416 - ui_y = -96 + ui_x = 416 + ui_y = -96 /datum/techweb_node/exp_surgery - ui_x = 352 - ui_y = 64 + ui_x = 352 + ui_y = 64 /datum/techweb_node/nanite_combat - ui_x = -320 - ui_y = -672 + ui_x = -320 + ui_y = -672 /datum/techweb_node/advanced_bluespace - ui_x = -384 - ui_y = -160 + ui_x = -384 + ui_y = -160 /datum/techweb_node/mech_teleporter - ui_x = -416 - ui_y = -256 + ui_x = -416 + ui_y = -256 /datum/techweb_node/mech_diamond_drill - ui_x = 128 - ui_y = -512 + ui_x = 96 + ui_y = -512 /datum/techweb_node/spacepod_advmining - ui_x = 0 - ui_y = -512 + ui_x = 96 + ui_y = -640 + +/datum/techweb_node/adv_rcd_upgrade + ui_x = 32 + ui_y = -448 /datum/techweb_node/beam_weapons - ui_x = -640 - ui_y = -736 + ui_x = -640 + ui_y = -736 /datum/techweb_node/explosive_weapons - ui_x = -736 - ui_y = -576 + ui_x = -736 + ui_y = -576 /datum/techweb_node/exotic_ammo - ui_x = -704 - ui_y = -672 + ui_x = -704 + ui_y = -672 /datum/techweb_node/gravity_gun - ui_x = -320 - ui_y = -288 + ui_x = -320 + ui_y = -288 /datum/techweb_node/durand - ui_x = -672 - ui_y = -96 + ui_x = -672 + ui_y = -96 /datum/techweb_node/unregulated_bluespace - ui_x = -384 - ui_y = -608 + ui_x = -384 + ui_y = -608 /datum/techweb_node/syndicate_surgery - ui_x = -320 - ui_y = -608 + ui_x = -320 + ui_y = -608 /datum/techweb_node/mech_modules - ui_x = -640 - ui_y = -32 + ui_x = -640 + ui_y = -32 /datum/techweb_node/mech_wormhole_gen - ui_x = -416 - ui_y = -320 + ui_x = -416 + ui_y = -320 /datum/techweb_node/spacepod_advplasmacutter - ui_x = 64 - ui_y = -512 + ui_x = 160 + ui_y = -640 /datum/techweb_node/mech_scattershot - ui_x = -800 - ui_y = -352 + ui_x = -800 + ui_y = -352 /datum/techweb_node/mech_carbine - ui_x = -800 - ui_y = -416 + ui_x = -800 + ui_y = -416 /datum/techweb_node/mech_lmg - ui_x = -736 - ui_y = -352 + ui_x = -736 + ui_y = -352 /datum/techweb_node/adv_mecha_tools - ui_x = -576 - ui_y = -32 + ui_x = -576 + ui_y = -32 + +/datum/techweb_node/xenology + ui_x = 480 + ui_y = -96 /datum/techweb_node/adv_beam_weapons - ui_x = -640 - ui_y = -832 + ui_x = -640 + ui_y = -832 /datum/techweb_node/mech_laser - ui_x = -704 - ui_y = -896 + ui_x = -704 + ui_y = -896 /datum/techweb_node/mech_disabler - ui_x = -448 - ui_y = -224 + ui_x = -448 + ui_y = -224 /datum/techweb_node/mech_grenade_launcher - ui_x = -800 - ui_y = -512 + ui_x = -800 + ui_y = -512 /datum/techweb_node/mech_missile_rack - ui_x = -800 - ui_y = -640 + ui_x = -800 + ui_y = -640 /datum/techweb_node/clusterbang_launcher - ui_x = -800 - ui_y = -576 + ui_x = -800 + ui_y = -576 /datum/techweb_node/mech_laser_heavy - ui_x = -576 - ui_y = -896 + ui_x = -576 + ui_y = -896 /datum/techweb_node/mech_xray - ui_x = -640 - ui_y = -896 \ No newline at end of file + ui_x = -640 + ui_y = -896 \ No newline at end of file diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm new file mode 100644 index 000000000000..74bec8cf4c11 --- /dev/null +++ b/code/modules/shuttle/custom_shuttle.dm @@ -0,0 +1,272 @@ +#define Z_DIST 500 +#define CUSTOM_ENGINES_START_TIME 65 +#define CALCULATE_STATS_COOLDOWN 2 + +/obj/machinery/computer/custom_shuttle + name = "nanotrasen shuttle flight controller" + desc = "A terminal used to fly shuttles defined by the Shuttle Zoning Designator" + circuit = /obj/item/circuitboard/computer/shuttle/flight_control + icon_screen = "shuttle" + icon_keyboard = "tech_key" + light_color = LIGHT_COLOR_CYAN + req_access = list( ) + var/shuttleId + var/possible_destinations = "whiteship_home" + var/admin_controlled + var/no_destination_swap = 0 + var/calculated_mass = 0 + var/calculated_dforce = 0 + var/calculated_speed = 0 + var/calculated_engine_count = 0 + var/calculated_consumption = 0 + var/calculated_cooldown = 0 + var/calculated_non_operational_thrusters = 0 + var/calculated_fuel_less_thrusters = 0 + var/target_fuel_cost = 0 + var/targetLocation + var/datum/browser/popup + + var/stat_calc_cooldown = 0 + + //Upgrades + var/distance_multiplier = 1 + +/obj/machinery/computer/custom_shuttle/examine(mob/user) + . = ..() + . += distance_multiplier < 1 ? "Bluespace shortcut module installed. Route is [distance_multiplier]x the original length." : "" + +/obj/machinery/computer/custom_shuttle/ui_interact(mob/user) + var/list/options = params2list(possible_destinations) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + var/dat = "[M ? "Current Location : [M.getStatusText()]" : "Shuttle link required."]

" + if(M) + dat += "Run Flight Calculations
" + dat += "Shuttle Data
" + dat += "Shuttle Mass: [calculated_mass/10]tons
" + dat += "Engine Force: [calculated_dforce]kN ([calculated_engine_count] engines)
" + dat += "Sublight Speed: [calculated_speed]ms-1
" + dat += calculated_speed < 1 ? "INSUFFICIENT ENGINE POWER
" : "" + dat += calculated_non_operational_thrusters > 0 ? "Warning: [calculated_non_operational_thrusters] thrusters offline.
" : "" + dat += "Fuel Consumption: [calculated_consumption]units per distance
" + dat += "Engine Cooldown: [calculated_cooldown]s
" + var/destination_found + for(var/obj/docking_port/stationary/S in SSshuttle.stationary) + if(!options.Find(S.id)) + continue + if(!M.check_dock(S, silent=TRUE)) + continue + if(calculated_speed == 0) + break + destination_found = TRUE + var/dist = round(calculateDistance(S)) + dat += "Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])
" + if(!destination_found) + dat += "No valid destinations
" + dat += "
[targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]" + dat += "
Initate Flight
" + dat += "Close" + + popup = new(user, "computer", M ? M.name : "shuttle", 350, 450) + popup.set_content("
[dat]
") + //popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/computer/custom_shuttle/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + + if(href_list["calculate"]) + calculateStats() + ui_interact(usr) + return + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return + if(M.launch_status == ENDGAME_LAUNCHED) + return + if(href_list["setloc"]) + SetTargetLocation(href_list["setloc"]) + ui_interact(usr) + return + else if(href_list["fly"]) + Fly() + ui_interact(usr) + return + +/obj/machinery/computer/custom_shuttle/proc/calculateDistance(var/obj/docking_port/stationary/port) + var/deltaX = port.x - x + var/deltaY = port.y - y + var/deltaZ = (port.z - z) * Z_DIST + return sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * distance_multiplier + +/obj/machinery/computer/custom_shuttle/proc/linkShuttle(var/new_id) + shuttleId = new_id + possible_destinations = "whiteship_home;shuttle[new_id]_custom" + +/obj/machinery/computer/custom_shuttle/proc/calculateStats(var/useFuel = FALSE, var/dist = 0, var/ignore_cooldown = FALSE) + if(!ignore_cooldown && stat_calc_cooldown >= world.time) + to_chat(usr, "You are using this too fast, please slow down") + return + stat_calc_cooldown = world.time + CALCULATE_STATS_COOLDOWN + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return FALSE + //Reset data + calculated_mass = 0 + calculated_dforce = 0 + calculated_speed = 0 + calculated_engine_count = 0 + calculated_consumption = 0 + calculated_cooldown = 0 + calculated_fuel_less_thrusters = 0 + calculated_non_operational_thrusters = 0 + //Calculate all the data + var/list/areas = M.shuttle_areas + for(var/shuttleArea in areas) + calculated_mass += length(get_area_turfs(shuttleArea)) + for(var/obj/machinery/shuttle/engine/E in shuttleArea) + E.check_setup() + if(!E.thruster_active) //Skipover thrusters with no valid heater + calculated_non_operational_thrusters ++ + continue + if(E.attached_heater) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = E.attached_heater.resolve() + if(resolvedHeater && !resolvedHeater.hasFuel(dist * E.fuel_use) && useFuel) + calculated_fuel_less_thrusters ++ + continue + calculated_engine_count++ + calculated_dforce += E.thrust + calculated_consumption += E.fuel_use + calculated_cooldown = max(calculated_cooldown, E.cooldown) + //This should really be accelleration, but its a 2d spessman game so who cares + if(calculated_mass == 0) + return FALSE + calculated_speed = (calculated_dforce*1000) / (calculated_mass*100) + return TRUE + +/obj/machinery/computer/custom_shuttle/proc/consumeFuel(var/dist) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(!M) + return FALSE + //Calculate all the data + for(var/obj/machinery/shuttle/engine/shuttle_machine in GLOB.custom_shuttle_machines) + shuttle_machine.check_setup() + if(!shuttle_machine.thruster_active) + continue + if(get_area(M) != get_area(shuttle_machine)) + continue + if(shuttle_machine.attached_heater) + var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = shuttle_machine.attached_heater.resolve() + if(resolvedHeater && !resolvedHeater.hasFuel(dist * shuttle_machine.fuel_use)) + continue + resolvedHeater?.consumeFuel(dist * shuttle_machine.fuel_use) + shuttle_machine.fireEngine() + +/obj/machinery/computer/custom_shuttle/proc/SetTargetLocation(var/newTarget) + if(!(newTarget in params2list(possible_destinations))) + log_admin("[usr] attempted to href dock exploit on [src] with target location \"[newTarget]\"") + message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[newTarget]\"") + return + targetLocation = newTarget + say("Shuttle route calculated.") + return + +/obj/machinery/computer/custom_shuttle/proc/Fly() + if(!targetLocation) + return + var/obj/docking_port/mobile/linkedShuttle = SSshuttle.getShuttle(shuttleId) + if(!linkedShuttle) + return + if(linkedShuttle.mode != SHUTTLE_IDLE) + return + if(!calculateStats(TRUE, 0, TRUE)) + return + if(calculated_fuel_less_thrusters > 0) + say("Warning, [calculated_fuel_less_thrusters] do not have enough fuel for this journey, engine output may be limitted.") + if(calculated_speed < 1) + say("Insufficient engine power, shuttle requires [calculated_mass / 10]kN of thrust.") + return + var/obj/docking_port/stationary/targetPort = SSshuttle.getDock(targetLocation) + if(!targetPort) + return + var/dist = calculateDistance(targetPort) + var/time = min(max(round(dist / calculated_speed), 10), 90) + linkedShuttle.callTime = time * 10 + linkedShuttle.rechargeTime = calculated_cooldown + linkedShuttle.ignitionTime = CUSTOM_ENGINES_START_TIME + linkedShuttle.count_engines() + linkedShuttle.hyperspace_sound(HYPERSPACE_WARMUP) + var/throwForce = clamp((calculated_speed / 2) - 5, 0, 10) + linkedShuttle.movement_force = list("KNOCKDOWN" = calculated_speed > 5 ? 3 : 0, "THROW" = throwForce) + if(!(targetLocation in params2list(possible_destinations))) + log_admin("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"") + message_admins("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"") + return + switch(SSshuttle.moveShuttle(shuttleId, targetLocation, 1)) + if(0) + consumeFuel(dist) + say("Shuttle departing. Please stand away from the doors.") + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + return + +/obj/machinery/computer/custom_shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + if(port && (shuttleId == initial(shuttleId) || override)) + linkShuttle(port.id) + +//Custom shuttle docker locations +/obj/machinery/computer/camera_advanced/shuttle_docker/custom + name = "Shuttle Navigation Computer" + desc = "Used to designate a precise transit location for private ships." + lock_override = NONE + whitelist_turfs = list(/turf/open/space, + /turf/open/lava, + /turf/open/floor/plating/beach, + /turf/open/floor/plating/ashplanet, + /turf/open/floor/plating/asteroid, + /turf/open/floor/plating/lavaland_baseturf) + jumpto_ports = list("whiteship_home" = 1) + view_range = 12 + designate_time = 100 + circuit = /obj/item/circuitboard/computer/shuttle/docker + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize() + . = ..() + GLOB.jam_on_wardec += src + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Destroy() + GLOB.jam_on_wardec -= src + return ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/placeLandingSpot() + if(!shuttleId) + return //Only way this would happen is if someone else delinks the console while in use somehow + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(M?.mode != SHUTTLE_IDLE) + to_chat(usr, "You cannot target locations while in transit.") + return + ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/attack_hand(mob/user) + if(!shuttleId) + to_chat(user, "You must link the console to a shuttle first.") + return + return ..() + +/obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/linkShuttle(new_id) + shuttleId = new_id + shuttlePortId = "shuttle[new_id]_custom" + + //Take info from connected port and calculate amendments + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(new_id) + var/list/shuttlebounds = M.return_coords() + view_range = min(round(max(M.width, M.height)*0.5), 15) + x_offset = round((shuttlebounds[1] + shuttlebounds[3])*0.5) - M.x + y_offset = round((shuttlebounds[2] + shuttlebounds[4])*0.5) - M.y diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index e5225d3fcbab..bebc478c2a1a 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -11,9 +11,11 @@ var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes var/obj/docking_port/stationary/my_port //the custom docking port placed by this console var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle + var/list/locked_traits = list(ZTRAIT_RESERVED, ZTRAIT_CENTCOM, ZTRAIT_AWAY, ZTRAIT_REEBE) //traits forbided for custom docking var/view_range = 0 var/x_offset = 0 var/y_offset = 0 + var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava) var/space_turfs_only = TRUE var/see_hidden = FALSE var/designate_time = 0 @@ -29,6 +31,7 @@ var/obj/docking_port/stationary/S = V if(jumpto_ports[S.id]) z_lock |= S.z + whitelist_turfs = typecacheof(whitelist_turfs) /obj/machinery/computer/camera_advanced/shuttle_docker/Destroy() . = ..() @@ -162,7 +165,7 @@ if(current_user.client) current_user.client.images += the_eye.placed_images to_chat(current_user, span_notice("Transit location designated")) - return + return TRUE /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget() if(!designating_target_loc || !current_user || (eyeobj.loc != designating_target_loc) || (stat & (NOPOWER|BROKEN)) ) @@ -190,7 +193,7 @@ var/turf/eyeturf = get_turf(the_eye) if(!eyeturf) return SHUTTLE_DOCKER_BLOCKED - if(z_lock.len && !(eyeturf.z in z_lock)) + if(!eyeturf.z || SSmapping.level_has_any_trait(eyeturf.z, locked_traits)) return SHUTTLE_DOCKER_BLOCKED . = SHUTTLE_DOCKER_LANDING_CLEAR @@ -228,12 +231,17 @@ if(hidden_turf_info) . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT + if(length(whitelist_turfs)) + var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type + if(!is_type_in_typecache(turf_type, whitelist_turfs)) + return SHUTTLE_DOCKER_BLOCKED +/* if(space_turfs_only) var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type var/area/A = get_area(T) if(!ispath(turf_type, /turf/open/space) && !ispath(A.type, /area/icemoon)) return SHUTTLE_DOCKER_BLOCKED - +*/ // Checking for overlapping dock boundaries for(var/i in 1 to overlappers.len) var/obj/docking_port/port = overlappers[i] @@ -324,13 +332,25 @@ var/list/L = list() for(var/V in SSshuttle.stationary) if(!V) + stack_trace("SSshuttle.stationary have null entry!") continue var/obj/docking_port/stationary/S = V if(console.z_lock.len && !(S.z in console.z_lock)) continue if(console.jumpto_ports[S.id]) - L[S.name] = S + L["([L.len])[S.name]"] = S + for(var/V in SSshuttle.beacons) + if(!V) + stack_trace("SSshuttle.beacons have null entry!") + continue + var/obj/machinery/spaceship_navigation_beacon/nav_beacon = V + if(!nav_beacon.z || SSmapping.level_has_any_trait(nav_beacon.z, console.locked_traits)) + break + if(!nav_beacon.locked) + L["([L.len]) [nav_beacon.name] located: [nav_beacon.x] [nav_beacon.y] [nav_beacon.z]"] = nav_beacon + else + L["([L.len]) [nav_beacon.name] locked"] = null playsound(console, 'sound/machines/terminal_prompt.ogg', 25, 0) var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L if(QDELETED(src) || QDELETED(target) || !isliving(target)) @@ -345,4 +365,4 @@ C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) else - playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) \ No newline at end of file + playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 11aa65c70b88..8b59f0e7fcc9 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -826,12 +826,17 @@ /obj/docking_port/mobile/proc/count_engines() . = 0 + engine_list.Cut() for(var/thing in shuttle_areas) var/area/shuttle/areaInstance = thing for(var/obj/structure/shuttle/engine/E in areaInstance.contents) if(!QDELETED(E)) engine_list += E . += E.engine_power + for(var/obj/machinery/shuttle/engine/E in areaInstance.contents) + if(!QDELETED(E)) + engine_list += E + . += E.thruster_active ? 1 : 0 // Double initial engines to get to 0.5 minimum // Lose all initial engines to get to 2 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm new file mode 100644 index 000000000000..0dc4bad7c4cc --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -0,0 +1,388 @@ +#define SHUTTLE_CREATOR_MAX_SIZE CONFIG_GET(number/max_shuttle_size) +#define CUSTOM_SHUTTLE_LIMIT CONFIG_GET(number/max_shuttle_count) +#define CARDINAL_DIRECTIONS_X list(1, 0, -1, 0) +#define CARDINAL_DIRECTIONS_Y list(0, 1, 0, -1) + +GLOBAL_VAR_INIT(custom_shuttle_count, 0) //The amount of custom shuttles created to prevent creating hundreds +GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (Heaters, engines) + +//============ Shuttle Creator Object ============ +/obj/item/shuttle_creator + name = "Rapid Shuttle Designator" + icon = 'icons/obj/tools.dmi' + icon_state = "rsd" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + desc = "A device used to define the area required for custom ships. Uses bluespace crystals to create bluespace-capable ships." + density = FALSE + anchored = FALSE + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + force = 0 + throwforce = 8 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + req_access_txt = "11" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) + resistance_flags = FIRE_PROOF + var/ready = TRUE + //pre-designation + var/override_max_shuttles = FALSE + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_shuttle_creator + //During designation + var/overwritten_area = /area/space + var/list/loggedTurfs = list() + var/loggedOldArea + var/recorded_shuttle_area + var/datum/shuttle_creator_overlay_holder/overlay_holder + //After designation + var/linkedShuttleId + +/obj/item/shuttle_creator/Initialize() + . = ..() + internal_shuttle_creator = new() + internal_shuttle_creator.owner_rsd = src + overlay_holder = new() + +/obj/item/shuttle_creator/Destroy() + . = ..() + if(internal_shuttle_creator) + internal_shuttle_creator.owner_rsd = null + QDEL_NULL(internal_shuttle_creator) + if(overlay_holder) + QDEL_NULL(overlay_holder) + +/obj/item/shuttle_creator/attack_self(mob/user) + ..() + if(linkedShuttleId) + select_preferred_direction(user) + return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT && !override_max_shuttles) + to_chat(user, "Too many shuttles have been created.") + message_admins("[ADMIN_FLW(user)] attempted to create a shuttle, however [CUSTOM_SHUTTLE_LIMIT] have already been created.") + return + if(!internal_shuttle_creator) + return + overlay_holder.add_client(user.client) + internal_shuttle_creator.attack_hand(user) + +/obj/item/shuttle_creator/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(!ready) + to_chat(user, "You need to define a shuttle area first.") + return + if(!proximity_flag) + return + if(istype(target, /obj/machinery/computer/custom_shuttle)) + if(!linkedShuttleId) + to_chat(user, "Error, no defined shuttle linked to device") + return + var/obj/machinery/computer/custom_shuttle/console = target + console.linkShuttle(linkedShuttleId) + to_chat(user, "Console linked successfully!") + return + else if(istype(target, /obj/machinery/computer/camera_advanced/shuttle_docker/custom)) + if(!linkedShuttleId) + to_chat(user, "Error, no defined shuttle linked to device") + return + var/obj/machinery/computer/camera_advanced/shuttle_docker/custom/console = target + console.linkShuttle(linkedShuttleId) + to_chat(user, "Console linked successfully!") + return + to_chat(user, "The [src] bleeps. Select an airlock to create a docking port, or a valid machine to link.") + return + +//=========== shuttle designation actions ============ +/obj/item/shuttle_creator/proc/calculate_bounds(obj/docking_port/mobile/port) + if(!port || !istype(port, /obj/docking_port/mobile)) + return FALSE + //Heights is the distance away from the port + //width is the distance perpendicular to the port + var/minX = INFINITY + var/maxX = 0 + var/minY = INFINITY + var/maxY = 0 + for(var/turf/T in loggedTurfs) + minX = min(T.x, minX) + maxX = max(T.x, maxX) + minY = min(T.y, minY) + maxY = max(T.y, maxY) + //Make sure shuttle was actually found. + if(maxX == INFINITY || maxY == INFINITY) + return FALSE + minX-- + minY-- + var/width = maxX - minX + var/height = maxY - minY + var/offset_x = port.x - minX + var/offset_y = port.y - minY + switch(port.dir) //Source: code/datums/shuttles.dm line 77 (14/03/2020) :) + if(NORTH) + port.width = width + port.height = height + port.dwidth = offset_x - 1 + port.dheight = offset_y - 1 + if(EAST) + port.width = height + port.height = width + port.dwidth = height - offset_y + port.dheight = offset_x - 1 + if(SOUTH) + port.width = width + port.height = height + port.dwidth = width - offset_x + port.dheight = height - offset_y + if(WEST) + port.width = height + port.height = width + port.dwidth = offset_y - 1 + port.dheight = width - offset_x + return TRUE + +//Go through all the all_turfs and check which direction doesn't have the shuttle +/obj/item/shuttle_creator/proc/getNonShuttleDirection(turf/targetTurf) + var/position = null + if(!(get_offset_target_turf(targetTurf, 0, 1) in loggedTurfs)) + if(position != null) + return null + position = NORTH + if(!(get_offset_target_turf(targetTurf, 0, -1) in loggedTurfs)) + if(position != null) + return null + position = SOUTH + if(!(get_offset_target_turf(targetTurf, 1, 0) in loggedTurfs)) + if(position != null) + return null + position = EAST + if(!(get_offset_target_turf(targetTurf, -1, 0) in loggedTurfs)) + if(position != null) + return null + position = WEST + return position + +/obj/item/shuttle_creator/proc/invertDir(var/input_dir) + if(input_dir == NORTH) + return SOUTH + else if(input_dir == SOUTH) + return NORTH + else if(input_dir == EAST) + return WEST + else if(input_dir == WEST) + return EAST + return null + +/obj/item/shuttle_creator/proc/shuttle_create_docking_port(atom/target, mob/user) + + if(loggedTurfs.len == 0 || !recorded_shuttle_area) + to_chat(user, "Invalid shuttle, restarting bluespace systems...") + return FALSE + + var/datum/map_template/shuttle/new_shuttle = new /datum/map_template/shuttle() + + var/obj/docking_port/mobile/port = new /obj/docking_port/mobile(get_turf(target)) + var/obj/docking_port/stationary/stationary_port = new /obj/docking_port/stationary(get_turf(target)) + port.callTime = 50 + port.dir = 1 //Point away from space. + port.id = "custom_[GLOB.custom_shuttle_count]" + linkedShuttleId = port.id + port.ignitionTime = 25 + port.name = "Custom Shuttle" + port.port_direction = 2 + port.preferred_direction = EAST + port.preferred_direction = 4 + port.area_type = recorded_shuttle_area + + var/portDirection = getNonShuttleDirection(get_turf(port)) + var/invertedDir = invertDir(portDirection) + if(!portDirection || !invertedDir) + to_chat(usr, "Shuttle creation aborted, docking airlock must be on an external wall. Please select a new airlock.") + port.Destroy() + stationary_port.Destroy() + linkedShuttleId = null + return FALSE + port.dir = invertedDir + port.port_direction = portDirection + + if(!calculate_bounds(port)) + to_chat(usr, "Bluespace calculations failed, please select a new airlock.") + port.Destroy() + stationary_port.Destroy() + linkedShuttleId = null + return FALSE + + port.shuttle_areas = list() + //var/list/all_turfs = port.return_ordered_turfs(port.x, port.y, port.z, port.dir) + var/list/all_turfs = loggedTurfs + for(var/i in 1 to all_turfs.len) + var/turf/curT = all_turfs[i] + var/area/cur_area = curT.loc + //Add the area to the shuttle <3 + if(istype(cur_area, recorded_shuttle_area)) + if(istype(curT, /turf/open/space)) + continue + if(length(curT.baseturfs) < 2) + continue + //Add the shuttle base shit to the shuttle + curT.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle) + port.shuttle_areas[cur_area] = TRUE + + port.linkup(new_shuttle, stationary_port) + + port.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) + port.initiate_docking(stationary_port) + + port.mode = SHUTTLE_IDLE + port.timer = 0 + + port.register() + + icon_state = "rsd_used" + + //Select shuttle fly direction. + select_preferred_direction(user) + + //Clear highlights + overlay_holder.clear_highlights() + GLOB.custom_shuttle_count ++ + message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + return TRUE + +/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user) + //Check to see if the user can make a new area to prevent spamming + if(user) + if(user.create_area_cooldown >= world.time) + to_chat(user, "Smoke vents from the [src], maybe you should let it cooldown before using it again.") + return FALSE + user.create_area_cooldown = world.time + 10 + if(!loggedTurfs) + return FALSE + //Create the new area + var/area/shuttle/custom/powered/newS + var/area/oldA = loggedOldArea + var/str = stripped_input(user, "Shuttle Name:", "Blueprint Editing", "", MAX_NAME_LEN) + if(!str || !length(str)) + return FALSE + if(length(str) > 50) + to_chat(user, "The provided ship name is too long, blares the [src]") + return FALSE +//Yogs Start: Runs the name through the petty filter. If they trip it, it will cause the shuttle creation to fail, messages the admins, and put the RSD on cooldown. + if(isnotpretty(str)) + to_chat(user, "Nanotrasen prohibited words are in use in this shuttle name, blares the [src] in a slightly offended tone.") + message_admins("[ADMIN_LOOKUPFLW(user)] attempted to created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)], but failed because of tripping a petty filter") + user.create_area_cooldown = world.time + 10 + return FALSE +//Yogs End + newS = new /area/shuttle/custom/powered() + newS.setup(str) + newS.set_dynamic_lighting() + //Shuttles always have gravity + newS.has_gravity = TRUE + newS.requires_power = TRUE + //Record the area for use when creating the docking port + recorded_shuttle_area = newS + + for(var/i in 1 to loggedTurfs.len) + var/turf/turf_holder = loggedTurfs[i] + var/area/old_area = turf_holder.loc + newS.contents += turf_holder + turf_holder.change_area(old_area, newS) + + newS.reg_in_areas_in_z() + + var/list/firedoors = oldA.firedoors + for(var/door in firedoors) + var/obj/machinery/door/firedoor/FD = door + FD.CalculateAffectingAreas() + return TRUE + +//Select shuttle fly direction. +/obj/item/shuttle_creator/proc/select_preferred_direction(mob/user) + var/obj/docking_port/mobile/port = SSshuttle.getShuttle(linkedShuttleId) + if(!port || !istype(port, /obj/docking_port/mobile)) + return FALSE + var/static/list/choice = list("NORTH" = NORTH, "SOUTH" = SOUTH, "EAST" = EAST, "WEST" = WEST) + var/Pdir = input(user, "Shuttle Fly Direction:", "Blueprint Editing", "NORTH") as null|anything in list("NORTH", "SOUTH", "EAST", "WEST") + if(Pdir) + port.preferred_direction = choice[Pdir] + +//Checks an area to ensure that the turfs provided are valid to be made into a shuttle +/obj/item/shuttle_creator/proc/check_area(list/turfs) + if(!turfs) + to_chat(usr, "Shuttles must be created in an airtight space, ensure that the shuttle is airtight, including corners.") + return FALSE + if(turfs.len > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(usr, "The [src]'s internal cooling system wizzes violently and a message appears on the screen, \"Caution, this device can only handle the creation of shuttles up to [SHUTTLE_CREATOR_MAX_SIZE] units in size. Please reduce your shuttle by [turfs.len-SHUTTLE_CREATOR_MAX_SIZE]. Sorry for the inconvinience\"") + return FALSE + //Check to see if it's a valid shuttle + for(var/i in 1 to turfs.len) + var/area/place = get_area(turfs[i]) + //If any of the turfs are on station / not in space, a shuttle cannot be forced there + if(!place) + to_chat(usr, "You can't seem to overpower the bluespace harmonics in this location, try somewhere else.") + return FALSE + if(istype(place, /area/space)) + overwritten_area = /area/space + else if(istype(place, /area/lavaland/surface/outdoors)) + overwritten_area = /area/lavaland/surface/outdoors + else + to_chat(usr, "Caution, shuttle must not use any material connected to the station. Your shuttle is currenly overlapping with [place.name]") + return FALSE + //Finally, check to see if the area is actually attached + if(!LAZYLEN(loggedTurfs)) + return TRUE + for(var/turf/T in turfs) + if(turf_connected_to_saved_turfs(T)) + return TRUE + CHECK_TICK + to_chat(usr, "Caution, new areas of the shuttle must be connected to the other areas of the shuttle.") + return FALSE + +/obj/item/shuttle_creator/proc/turf_connected_to_saved_turfs(turf/T) + for(var/i in 1 to 4) + var/turf/adjacentT = get_offset_target_turf(T, CARDINAL_DIRECTIONS_X[i], CARDINAL_DIRECTIONS_Y[i]) + if(adjacentT in loggedTurfs) + return TRUE + return FALSE + +/obj/item/shuttle_creator/proc/turf_in_list(turf/T) + return loggedTurfs.Find(T) + +/obj/item/shuttle_creator/proc/add_single_turf(turf/T) + if(!check_area(list(T))) + return FALSE + loggedTurfs |= T + loggedOldArea = get_area(T) + overlay_holder.highlight_turf(T) + +/obj/item/shuttle_creator/proc/add_saved_area(mob/user) + var/static/area_or_turf_fail_types = typecacheof(list( + /turf/open/space, + /area/shuttle + )) + //Detect the turfs connected in the curerrent enclosed area + var/list/turfs = detect_room(get_turf(user), area_or_turf_fail_types) + if(!check_area(turfs)) + return FALSE + loggedOldArea = get_area(get_turf(user)) + loggedTurfs |= turfs + overlay_holder.highlight_area(turfs) + //TODO READD THIS SHIT: icon_state = "rsd_used" + to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.") + return turfs + +/obj/item/shuttle_creator/proc/remove_single_turf(turf/T) + if(!turf_in_list(T)) + return + loggedTurfs -= T + loggedOldArea = get_area(T) + overlay_holder.unhighlight_turf(T) + +/obj/item/shuttle_creator/proc/reset_saved_area() + overlay_holder.clear_highlights() + loggedTurfs.Cut() + to_chat(usr, "You reset the area buffer on the [src].") + +#undef CARDINAL_DIRECTIONS_X +#undef CARDINAL_DIRECTIONS_Y diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm new file mode 100644 index 000000000000..9ee46638d41d --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_actions.dm @@ -0,0 +1,101 @@ +//============ Actions ============ +/datum/action/innate/shuttle_creator + icon_icon = 'icons/mob/actions/actions_shuttle.dmi' + var/mob/living/C + var/mob/camera/aiEye/remote/shuttle_creation/remote_eye + var/obj/item/shuttle_creator/shuttle_creator + +/datum/action/innate/shuttle_creator/Activate() + if(!target) + return TRUE + C = owner + remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target + shuttle_creator = internal_console.owner_rsd + +//Add an area +/datum/action/innate/shuttle_creator/designate_area + name = "Designate Room" + button_icon_state = "designate_area" + +/datum/action/innate/shuttle_creator/designate_area/Activate() + if(..()) + return + shuttle_creator.add_saved_area(remote_eye) + +//Add a single turf +/datum/action/innate/shuttle_creator/designate_turf + name = "Designate Turf" + button_icon_state = "designate_turf" + +/datum/action/innate/shuttle_creator/designate_turf/Activate() + if(..()) + return + var/turf/T = get_turf(remote_eye) + if(istype(T, /turf/open/space)) + var/connectors_exist = FALSE + for(var/obj/structure/lattice/lattice in T) + connectors_exist = TRUE + break + if(!connectors_exist) + to_chat(usr, "This turf requires support, build some catwalks or lattices.") + return + if(!shuttle_creator.check_area(list(T))) + return + if(shuttle_creator.turf_in_list(T)) + return + shuttle_creator.add_single_turf(T) + +//Clear a single entire area +/datum/action/innate/shuttle_creator/clear_turf + name = "Clear Turf" + button_icon_state = "clear_turf" + +/datum/action/innate/shuttle_creator/clear_turf/Activate() + if(..()) + return + shuttle_creator.remove_single_turf(get_turf(remote_eye)) + +//Clear the entire area +/datum/action/innate/shuttle_creator/reset + name = "Reset Buffer" + button_icon_state = "clear_area" + +/datum/action/innate/shuttle_creator/reset/Activate() + if(..()) + return + shuttle_creator.reset_saved_area() + +//Finish the shuttle +/datum/action/innate/shuttle_creator/airlock + name = "Select Docking Airlock" + button_icon_state = "select_airlock" + +/datum/action/innate/shuttle_creator/airlock/Activate() + if(..()) + return + var/turf/T = get_turf(remote_eye) + for(var/obj/machinery/door/airlock/A in T) + if(get_area(A) != shuttle_creator.loggedOldArea) + to_chat(C, "Caution, airlock must be on the shuttle to function as a dock.") + return + if(shuttle_creator.linkedShuttleId) + return + if(GLOB.custom_shuttle_count > CUSTOM_SHUTTLE_LIMIT) + to_chat(C, "Shuttle limit reached, sorry.") + return + if(shuttle_creator.loggedTurfs.len > SHUTTLE_CREATOR_MAX_SIZE) + to_chat(C, "This shuttle is too large!") + return + if(!shuttle_creator.getNonShuttleDirection(T)) + to_chat(C, "Docking port must be on an external wall, with only 1 side exposed to space.") + return + if(!shuttle_creator.create_shuttle_area(C)) + return + if(shuttle_creator.shuttle_create_docking_port(A, C)) + to_chat(C, "Shuttle created!") + //Remove eye control + var/obj/machinery/computer/camera_advanced/shuttle_creator/internal_console = target + internal_console.remove_eye_control(C) + qdel(internal_console) + return diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm new file mode 100644 index 000000000000..6945c934279f --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_console.dm @@ -0,0 +1,93 @@ +//============The internal camera console used for designating the area============= +/obj/machinery/computer/camera_advanced/shuttle_creator + name = "internal shuttle creator console" + desc = "You should not have access to this, please report this as a bug" + networks = list() + var/obj/item/shuttle_creator/owner_rsd + var/datum/action/innate/shuttle_creator/designate_area/area_action = new + var/datum/action/innate/shuttle_creator/designate_turf/turf_action = new + var/datum/action/innate/shuttle_creator/clear_turf/clear_turf_action = new + var/datum/action/innate/shuttle_creator/reset/reset_action = new + var/datum/action/innate/shuttle_creator/airlock/airlock_action = new + +/obj/machinery/computer/camera_advanced/shuttle_creator/check_eye(mob/user) + if(user.eye_blind || user.incapacitated()) + user.unset_machine() + +/obj/machinery/computer/camera_advanced/shuttle_creator/CreateEye() + eyeobj = new /mob/camera/aiEye/remote/shuttle_creation(get_turf(owner_rsd)) + eyeobj.origin = src + eyeobj.use_static = USE_STATIC_NONE + +/obj/machinery/computer/camera_advanced/shuttle_creator/is_operational() + return TRUE + +/obj/machinery/computer/camera_advanced/shuttle_creator/can_interact(mob/user) + if(!isliving(user)) + return FALSE + var/mob/living/L = user + if(L.incapacitated()) + return FALSE + return TRUE + +/obj/machinery/computer/camera_advanced/shuttle_creator/GrantActions(mob/living/user) + ..(user) + eyeobj.invisibility = SEE_INVISIBLE_LIVING + if(area_action) + area_action.target = src + area_action.Grant(user) + actions += area_action + if(turf_action) + turf_action.target = src + turf_action.Grant(user) + actions += turf_action + if(clear_turf_action) + clear_turf_action.target = src + clear_turf_action.Grant(user) + actions += clear_turf_action + if(reset_action) + reset_action.target = src + reset_action.Grant(user) + actions += reset_action + if(airlock_action) + airlock_action.target = src + airlock_action.Grant(user) + actions += airlock_action + +/obj/machinery/computer/camera_advanced/shuttle_creator/remove_eye_control(mob/living/user) + . = ..() + owner_rsd.overlay_holder.remove_client() + eyeobj.invisibility = INVISIBILITY_MAXIMUM + if(user.client) + user.client.images -= eyeobj.user_image + +/obj/machinery/computer/camera_advanced/shuttle_creator/attack_hand(mob/user) + if(!is_operational()) //you cant use broken machine you chumbis + return + if(current_user) + to_chat(user, "The console is already in use!") + return + var/mob/living/L = user + if(!can_use(user)) + return + if(!eyeobj) + CreateEye() + if(!eyeobj.eye_initialized) + var/camera_location = get_turf(owner_rsd) + if(camera_location) + eyeobj.eye_initialized = TRUE + give_eye_control(L) + eyeobj.setLoc(camera_location) + var/mob/camera/aiEye/remote/shuttle_creation/shuttle_eye = eyeobj + shuttle_eye.source_turf = get_turf(user) + else + user.unset_machine() + else + var/camera_location = get_turf(owner_rsd) + var/mob/camera/aiEye/remote/shuttle_creation/eye = eyeobj + give_eye_control(L) + if(camera_location) + eye.source_turf = camera_location + eyeobj.setLoc(camera_location) + else + eyeobj.setLoc(eyeobj.loc) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm new file mode 100644 index 000000000000..4eea6bfe8856 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -0,0 +1,55 @@ +//===============Camera Eye================ +/mob/camera/aiEye/remote/shuttle_creation + name = "shuttle holo-drone" + icon = 'icons/obj/mining.dmi' + icon_state = "construction_drone" + visible_icon = FALSE + acceleration = 0 + var/turf/source_turf + var/max_range = 12 + +/mob/camera/aiEye/remote/shuttle_creation/Initialize() + . = ..() + setLoc(get_turf(source_turf)) + icon_state = "construction_drone" + +/mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user) + user.sight = BLIND|SEE_TURFS + user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + user.sync_lighting_plane_alpha() + return TRUE + +/mob/camera/aiEye/remote/shuttle_creation/relaymove(mob/user, direct) + dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated + var/initial = initial(sprint) + var/max_sprint = 50 + + if(cooldown && cooldown < world.timeofday) // 3 seconds + sprint = initial + + for(var/i = 0; i < max(sprint, initial); i += 20) + var/turf/step = get_turf(get_step(src, direct)) + if(step && can_move_to(step)) + setLoc(step) + + cooldown = world.timeofday + 5 + if(acceleration) + sprint = min(sprint + 0.5, max_sprint) + else + sprint = initial + +/mob/camera/aiEye/remote/shuttle_creation/proc/can_move_to(var/turf/T) + var/origin_x = source_turf.x + var/origin_y = source_turf.y + var/change_X = abs(origin_x - T.x) + var/change_Y = abs(origin_y - T.y) + return (change_X < max_range && change_Y < max_range) + +/mob/camera/aiEye/remote/shuttle_creation/setLoc(T) + ..() + if(eye_user?.client) + eye_user.client.images -= user_image + var/image/I = image(icon, loc, icon_state, FLY_LAYER, dir) + I.plane = MASSIVE_OBJ_LAYER + user_image = I + eye_user.client.images += user_image diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm new file mode 100644 index 000000000000..919b1f02211e --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_overlay.dm @@ -0,0 +1,52 @@ +/* + * Manages the overlays for the shuttle creator drone. +*/ + +/datum/shuttle_creator_overlay_holder + var/client/holder + var/list/images = list() + var/list/turfs = list() + +/datum/shuttle_creator_overlay_holder/proc/add_client(client/C) + holder = C + holder.images += images + +/datum/shuttle_creator_overlay_holder/proc/remove_client() + holder.images -= images + holder = null + +/datum/shuttle_creator_overlay_holder/proc/clear_highlights() + if(holder) + holder.images -= images + images.Cut() + turfs.Cut() + +/datum/shuttle_creator_overlay_holder/proc/create_hightlight(turf/T) + if(T in turfs) + return + var/image/I = image('icons/turf/overlays.dmi', T, "greenOverlay") + I.plane = ABOVE_LIGHTING_PLANE + images += I + holder.images += I + turfs += T + +/datum/shuttle_creator_overlay_holder/proc/remove_hightlight(turf/T) + if(!(T in turfs)) + return + turfs -= T + holder.images -= images + for(var/image/I in images) + if(get_turf(I) != T) + continue + images -= I + holder.images += images + +/datum/shuttle_creator_overlay_holder/proc/highlight_area(list/turfs) + for(var/turf/T in turfs) + highlight_turf(T) + +/datum/shuttle_creator_overlay_holder/proc/highlight_turf(turf/T) + create_hightlight(T) + +/datum/shuttle_creator_overlay_holder/proc/unhighlight_turf(turf/T) + remove_hightlight(T) diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm new file mode 100644 index 000000000000..c64f643b6dc7 --- /dev/null +++ b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm @@ -0,0 +1,39 @@ +/obj/item/shuttle_route_optimisation + name = "Route Optimisation Upgrade" + desc = "Used on a custom shuttle control console to calculate more efficient routes." + icon = 'icons/obj/module.dmi' + icon_state = "shuttledisk" + force = 0 + throwforce = 8 + throw_speed = 3 + throw_range = 5 + density = FALSE + anchored = FALSE + item_flags = NOBLUDGEON + var/upgrade_amount = 0.8 + +/obj/item/shuttle_route_optimisation/hyperlane + name = "Bluespace Hyperlane Calculator" + desc = "Used on a custom shuttle control console to allow for the following of bluespace hyperlanes, increasing the efficiency of the shuttle." + icon_state = "shuttledisk_better" + upgrade_amount = 0.6 + +/obj/item/shuttle_route_optimisation/void + name = "Voidspace Route Calculator" + desc = "Used on a custom shuttle control console to allow it to navigate into voidspace, making the routes almost instant." + icon_state = "shuttledisk_void" + upgrade_amount = 0.2 + +/obj/item/shuttle_route_optimisation/attack_obj(obj/O, mob/living/user) + . = ..() + if(!istype(O, /obj/machinery/computer)) + return + if(!istype(O, /obj/machinery/computer/custom_shuttle)) + to_chat(user, "This upgrade only works on a custom shuttle flight console.") + return + if (!user.transferItemToLoc(src, get_turf(O))) + return + var/obj/machinery/computer/custom_shuttle/link_comp = O + link_comp.distance_multiplier = clamp(link_comp.distance_multiplier, 0, upgrade_amount) //I have no clue what clamp even does, but I think this should work + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + to_chat(usr, "You insert the disk into the flight computer, allowing for routes to be [upgrade_amount]x the original distance.") diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm new file mode 100644 index 000000000000..89e02920a732 --- /dev/null +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -0,0 +1,63 @@ +/obj/item/circuitboard/machine/spaceship_navigation_beacon + name = "Bluespace Navigation Gigabeacon (Machine Board)" + build_path = /obj/machinery/spaceship_navigation_beacon + req_components = list() + + +/obj/machinery/spaceship_navigation_beacon + name = "Bluespace Navigation Gigabeacon" + desc = "A device that creates a bluespace anchor that allow ships jump near to it." + icon = 'icons/obj/abductor.dmi' + icon_state = "core" + use_power = IDLE_POWER_USE + idle_power_usage = 0 + density = TRUE + circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon + + var/locked = FALSE //Locked beacons don't allow to jump to it. + + +/obj/machinery/spaceship_navigation_beacon/Initialize() + . = ..() + SSshuttle.beacons |= src + +obj/machinery/spaceship_navigation_beacon/emp_act() + locked = TRUE + +/obj/machinery/spaceship_navigation_beacon/Destroy() + SSshuttle.beacons -= src + return ..() + +// update the icon_state +/obj/machinery/spaceship_navigation_beacon/update_icon() + if(powered()) + icon_state = "core" + else + icon_state = "core-open" + +/obj/machinery/spaceship_navigation_beacon/power_change() + . = ..() + update_icon() + +/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) + if(panel_open) + var/new_name = "Beacon_[input("Enter the custom name for this beacon", "It be Beacon ..your input..") as text]" + if(new_name && Adjacent(user)) + name = new_name + to_chat(user, "You change beacon name to [name].") + else + locked =!locked + to_chat(user, "You [locked ? "" : "un"]lock [src].") + return TRUE + +/obj/machinery/spaceship_navigation_beacon/examine() + .=..() + . += "Status: [locked ? "LOCKED" : "Stable"] " + +/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params) + if(default_deconstruction_screwdriver(user, "core-open", "core", W)) + return + if(default_deconstruction_crowbar(W)) + return + + return ..() diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 364d22c441a6..3f1bcbe0a438 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -4,7 +4,7 @@ var/projectile_type = /obj/item/projectile/magic/teleport var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" - var/base_icon_state = "projectile" + base_icon_state = "projectile" var/active_icon_state = "projectile" var/list/projectile_var_overrides = list() var/projectile_amount = 1 //Projectiles per cast. diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 8e5ffbddc5fa..40c4ca9ce3a0 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -210,7 +210,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndicate/contract_kit cost = 20 player_minimum = 20 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/bundles_TC/bundle_A name = "Syndi-kit Tactical" @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) you will receive. May contain discontinued and/or exotic items." item = /obj/item/storage/box/syndicate/bundle_A cost = 20 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/bundles_TC/bundle_B name = "Syndi-kit Special" @@ -227,7 +227,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) In Syndi-kit Special, you will receive items used by famous syndicate agents of the past. Collectively worth more than 20 telecrystals, the syndicate loves a good throwback." item = /obj/item/storage/box/syndicate/bundle_B cost = 20 - exclude_modes = list(/datum/game_mode/nuclear) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/bundles_TC/surplus name = "Syndicate Surplus Crate" @@ -236,7 +236,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/structure/closet/crate cost = 20 player_minimum = 25 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration var/starting_crate_value = 50 /datum/uplink_item/bundles_TC/surplus/super @@ -409,13 +409,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) pocketed when inactive. Activating it produces a loud, distinctive noise." item = /obj/item/melee/transforming/energy/sword/saber cost = 8 - exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/dangerous/bostaff name = "Bo Staff" desc = "A wielded wooden staff that can be used to incapacitate opponents if intending to disarm." item = /obj/item/twohanded/bostaff cost = 8 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/dangerous/shield name = "Energy Shield" @@ -440,6 +441,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk." item = /obj/item/clothing/gloves/rapid cost = 8 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/dangerous/guardian name = "Holoparasites" @@ -492,6 +494,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/melee/powerfist cost = 6 manufacturer = /datum/corporation/traitor/waffleco + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/dangerous/sniper name = "Sniper Rifle" @@ -571,6 +574,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/book/granter/martial/cqc cost = 13 surplus = 0 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/stealthy_weapons/dart_pistol name = "Dart Pistol" @@ -587,6 +591,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/toy/plush/carpplushie/dehy_carp cost = 1 manufacturer = /datum/corporation/traitor/donkco + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/stealthy_weapons/edagger name = "Energy Dagger" @@ -602,7 +607,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/book/granter/martial/carp cost = 14 surplus = 0 - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/stealthy_weapons/crossbow name = "Miniature Energy Crossbow" @@ -643,6 +648,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/romerol cost = 25 cant_discount = TRUE + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/stealthy_weapons/sleepy_pen name = "Sleepy Pen" @@ -934,6 +940,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/backpack/duffelbag/syndie/c4 cost = 8 //20% discount! cant_discount = TRUE + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/x4bag name = "Bag of X-4 explosives" @@ -943,6 +950,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/backpack/duffelbag/syndie/x4 cost = 4 cant_discount = TRUE + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/clown_bomb_clownops name = "Clown Bomb" @@ -966,6 +974,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 6 manufacturer = /datum/corporation/traitor/cybersun restricted = TRUE + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" @@ -1026,6 +1035,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/grenade/clusterbuster/soap cost = 3 manufacturer = /datum/corporation/traitor/waffleco + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/syndicate_bomb name = "Syndicate Bomb" @@ -1037,6 +1047,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) The bomb core can be pried out and manually detonated with other explosives." item = /obj/item/sbeacondrop/bomb cost = 11 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/syndicate_bomb/emp name = "Syndicate EMP Bomb" @@ -1060,7 +1071,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) in addition to dealing high amounts of damage to nearby personnel." item = /obj/item/grenade/syndieminibomb cost = 6 - exclude_modes = list(/datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/explosives/tearstache name = "Tearstache Grenade" @@ -1424,7 +1435,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) manufacturer = /datum/corporation/traitor/waffleco surplus = 0 restricted = TRUE - exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // Yogs: infiltration /datum/uplink_item/device_tools/failsafe/spawn_item(spawn_path, mob/user, datum/component/uplink/U) if(!U) @@ -1486,6 +1497,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 10 manufacturer = /datum/corporation/traitor/waffleco include_objectives = list(/datum/objective/hijack, /datum/objective/martyr) //yogs + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/device_tools/supermatter_delaminator name = "Antinoblium Shard" @@ -1497,6 +1509,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 10 manufacturer = /datum/corporation/traitor/waffleco include_objectives = list(/datum/objective/hijack, /datum/objective/martyr) //yogs + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/device_tools/powersink name = "Power Sink" @@ -1506,6 +1519,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/powersink cost = 8 manufacturer = /datum/corporation/traitor/waffleco + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration /datum/uplink_item/device_tools/rad_laser name = "Radioactive Microlaser" @@ -1594,6 +1608,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 7 manufacturer = /datum/corporation/traitor/waffleco limited_stock = 1 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration // Implants /datum/uplink_item/implants @@ -1717,6 +1732,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/briefcase/syndie_mantis cost = 16 surplus = 0 + exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration //Race-specific items /datum/uplink_item/race_restricted diff --git a/config/config.txt b/config/config.txt index e2f736b11a2e..964dfb7c07a6 100644 --- a/config/config.txt +++ b/config/config.txt @@ -445,3 +445,7 @@ CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search ## Uncomment to disable hard deletes entirely, even things that explicitly request. This is not recommended unless you have a need for it during events or other high pop times where performance is key. #DISABLE_ALL_HARD_DELETES + +## Custom shuttle spam prevention. Changine these numbers allows you to change the maxsize and amount of custom shuttles. +MAX_SHUTTLE_COUNT 6 +MAX_SHUTTLE_SIZE 300 diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi new file mode 100644 index 000000000000..2d002f0162cc Binary files /dev/null and b/icons/hud/lobby/background.dmi differ diff --git a/icons/hud/lobby/bottom_buttons.dmi b/icons/hud/lobby/bottom_buttons.dmi new file mode 100644 index 000000000000..1d2133d861d9 Binary files /dev/null and b/icons/hud/lobby/bottom_buttons.dmi differ diff --git a/icons/hud/lobby/character_setup.dmi b/icons/hud/lobby/character_setup.dmi new file mode 100644 index 000000000000..2059389d4403 Binary files /dev/null and b/icons/hud/lobby/character_setup.dmi differ diff --git a/icons/hud/lobby/countdown_background.dmi b/icons/hud/lobby/countdown_background.dmi new file mode 100644 index 000000000000..626bd249e792 Binary files /dev/null and b/icons/hud/lobby/countdown_background.dmi differ diff --git a/icons/hud/lobby/countdown_letters.dmi b/icons/hud/lobby/countdown_letters.dmi new file mode 100644 index 000000000000..74f9f2f79cce Binary files /dev/null and b/icons/hud/lobby/countdown_letters.dmi differ diff --git a/icons/hud/lobby/join.dmi b/icons/hud/lobby/join.dmi new file mode 100644 index 000000000000..3ee400ef2b69 Binary files /dev/null and b/icons/hud/lobby/join.dmi differ diff --git a/icons/hud/lobby/observe.dmi b/icons/hud/lobby/observe.dmi new file mode 100644 index 000000000000..a83243f8c8e5 Binary files /dev/null and b/icons/hud/lobby/observe.dmi differ diff --git a/icons/hud/lobby/poll_overlay.dmi b/icons/hud/lobby/poll_overlay.dmi new file mode 100644 index 000000000000..2fc97162601c Binary files /dev/null and b/icons/hud/lobby/poll_overlay.dmi differ diff --git a/icons/hud/lobby/ready.dmi b/icons/hud/lobby/ready.dmi new file mode 100644 index 000000000000..ab473ee8dff1 Binary files /dev/null and b/icons/hud/lobby/ready.dmi differ diff --git a/icons/mob/actions/actions_shuttle.dmi b/icons/mob/actions/actions_shuttle.dmi new file mode 100644 index 000000000000..399f50941504 Binary files /dev/null and b/icons/mob/actions/actions_shuttle.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index c0523d86fe1f..a26cfca979c6 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index f232e01217cd..062b2458c66d 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi index a09cb7a84737..7c96dcf1b4b4 100644 Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ diff --git a/yogstation.dme b/yogstation.dme index b002e518256d..2d4fdb1941b5 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -233,6 +233,7 @@ #include "code\_onclick\hud\map_popups.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\new_player.dm" #include "code\_onclick\hud\pai.dm" #include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\picture_in_picture.dm" @@ -318,6 +319,7 @@ #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\fastlobbyprocess.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.dm" @@ -811,6 +813,9 @@ #include "code\game\machinery\porta_turret\portable_turret.dm" #include "code\game\machinery\porta_turret\portable_turret_construct.dm" #include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\shuttle\custom_shuttle.dm" +#include "code\game\machinery\shuttle\shuttle_engine.dm" +#include "code\game\machinery\shuttle\shuttle_heater.dm" #include "code\game\machinery\telecomms\broadcasting.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" #include "code\game\machinery\telecomms\telecomunications.dm" @@ -981,6 +986,8 @@ #include "code\game\objects\items\sharpener.dm" #include "code\game\objects\items\shields.dm" #include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\shuttle_creator.dm" +#include "code\game\objects\items\shuttle_upgrades.dm" #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\singularityhammer.dm" #include "code\game\objects\items\stunbaton.dm" @@ -2909,6 +2916,7 @@ #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\custom_shuttle.dm" #include "code\modules\shuttle\docking.dm" #include "code\modules\shuttle\elevator.dm" #include "code\modules\shuttle\emergency.dm" @@ -2920,10 +2928,17 @@ #include "code\modules\shuttle\ripple.dm" #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\spaceship_navigation_beacon.dm" #include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_actions.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_console.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_eye.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_creator_overlay.dm" +#include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\aimed.dm" #include "code\modules\spells\spell_types\area_teleport.dm" @@ -3124,11 +3139,13 @@ #include "interface\skin.dmf" #include "yogstation\code\__HELPERS\_lists.dm" #include "yogstation\code\__HELPERS\_logging.dm" +#include "yogstation\code\__HELPERS\game.dm" #include "yogstation\code\__HELPERS\mobs.dm" #include "yogstation\code\__HELPERS\names.dm" #include "yogstation\code\__HELPERS\unsorted.dm" #include "yogstation\code\_globalvars\configuration.dm" #include "yogstation\code\_globalvars\logging.dm" +#include "yogstation\code\_globalvars\lists\game.dm" #include "yogstation\code\_globalvars\lists\mentors.dm" #include "yogstation\code\_globalvars\lists\names.dm" #include "yogstation\code\_globalvars\lists\telecomms.dm" @@ -3177,7 +3194,9 @@ #include "yogstation\code\game\world.dm" #include "yogstation\code\game\area\areas.dm" #include "yogstation\code\game\area\Space_Station_13_areas.dm" +#include "yogstation\code\game\area\areas\centcom.dm" #include "yogstation\code\game\area\areas\holodeck.dm" +#include "yogstation\code\game\area\areas\shuttles.dm" #include "yogstation\code\game\gamemodes\game_mode.dm" #include "yogstation\code\game\gamemodes\objective.dm" #include "yogstation\code\game\gamemodes\objective_items.dm" @@ -3194,6 +3213,7 @@ #include "yogstation\code\game\gamemodes\gangs\gang_pen.dm" #include "yogstation\code\game\gamemodes\gangs\gangs.dm" #include "yogstation\code\game\gamemodes\gangs\gangtool.dm" +#include "yogstation\code\game\gamemodes\infiltration\infiltration.dm" #include "yogstation\code\game\gamemodes\shadowling\shadowling.dm" #include "yogstation\code\game\gamemodes\traitor\double_agents.dm" #include "yogstation\code\game\gamemodes\vampire\grave_fever.dm" @@ -3205,6 +3225,7 @@ #include "yogstation\code\game\gamemodes\vampire\vampire_objectives.dm" #include "yogstation\code\game\gamemodes\vampire\vampire_other.dm" #include "yogstation\code\game\gamemodes\vampire\vampire_powers.dm" +#include "yogstation\code\game\machinery\suit_storage_unit.dm" #include "yogstation\code\game\machinery\computer\arcade.dm" #include "yogstation\code\game\machinery\computer\atmos_sim.dm" #include "yogstation\code\game\machinery\computer\crew.dm" @@ -3262,9 +3283,11 @@ #include "yogstation\code\game\objects\items\grenades\glitterbombs.dm" #include "yogstation\code\game\objects\items\holotool\holotool.dm" #include "yogstation\code\game\objects\items\holotool\modes.dm" +#include "yogstation\code\game\objects\items\implants\implant_dusting.dm" #include "yogstation\code\game\objects\items\implants\implant_gang.dm" #include "yogstation\code\game\objects\items\implants\implant_mindslave.dm" #include "yogstation\code\game\objects\items\implants\implant_teleporter.dm" +#include "yogstation\code\game\objects\items\implants\implantuplink.dm" #include "yogstation\code\game\objects\items\melee\energy.dm" #include "yogstation\code\game\objects\items\robot\robot_items.dm" #include "yogstation\code\game\objects\items\robot\robot_parts.dm" @@ -3356,6 +3379,15 @@ #include "yogstation\code\modules\antagonists\gang\gang.dm" #include "yogstation\code\modules\antagonists\gang\gang_datums.dm" #include "yogstation\code\modules\antagonists\gang\gang_hud.dm" +#include "yogstation\code\modules\antagonists\hijacked_ai\hijacked_ai.dm" +#include "yogstation\code\modules\antagonists\infiltrator\infiltrator.dm" +#include "yogstation\code\modules\antagonists\infiltrator\objectives.dm" +#include "yogstation\code\modules\antagonists\infiltrator\outfit.dm" +#include "yogstation\code\modules\antagonists\infiltrator\team.dm" +#include "yogstation\code\modules\antagonists\infiltrator\items\ai_hijack.dm" +#include "yogstation\code\modules\antagonists\infiltrator\items\hardsuit.dm" +#include "yogstation\code\modules\antagonists\infiltrator\items\pinpointer.dm" +#include "yogstation\code\modules\antagonists\infiltrator\items\services.dm" #include "yogstation\code\modules\antagonists\nukeop\clownop.dm" #include "yogstation\code\modules\antagonists\nukeop\nukeop.dm" #include "yogstation\code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" @@ -3396,6 +3428,7 @@ #include "yogstation\code\modules\clothing\under.dm" #include "yogstation\code\modules\clothing\glasses\_glasses.dm" #include "yogstation\code\modules\clothing\gloves\miscellaneous.dm" +#include "yogstation\code\modules\clothing\head\helmet.dm" #include "yogstation\code\modules\clothing\head\jobs.dm" #include "yogstation\code\modules\clothing\head\misc.dm" #include "yogstation\code\modules\clothing\head\misc_special.dm" @@ -3424,6 +3457,7 @@ #include "yogstation\code\modules\events\dolphin_migration.dm" #include "yogstation\code\modules\events\floorcluwne.dm" #include "yogstation\code\modules\events\immovable_duck.dm" +#include "yogstation\code\modules\events\infiltrators.dm" #include "yogstation\code\modules\events\ion_storm.dm" #include "yogstation\code\modules\events\probabilistic_anomaly.dm" #include "yogstation\code\modules\events\weightless.dm" @@ -3530,6 +3564,8 @@ #include "yogstation\code\modules\mob\living\carbon\human\species_types\preternis\screen_alerts.dm" #include "yogstation\code\modules\mob\living\silicon\silicon.dm" #include "yogstation\code\modules\mob\living\silicon\ai\ai.dm" +#include "yogstation\code\modules\mob\living\silicon\ai\death.dm" +#include "yogstation\code\modules\mob\living\silicon\ai\life.dm" #include "yogstation\code\modules\mob\living\silicon\ai\vox_sounds.dm" #include "yogstation\code\modules\mob\living\silicon\ai\freelook\eye.dm" #include "yogstation\code\modules\mob\living\silicon\robot\login.dm" @@ -3617,6 +3653,7 @@ #include "yogstation\code\modules\scripting\Scanner\Scanner.dm" #include "yogstation\code\modules\scripting\Scanner\Tokens.dm" #include "yogstation\code\modules\shuttle\emergency.dm" +#include "yogstation\code\modules\shuttle\syndicate.dm" #include "yogstation\code\modules\spacepods\construction.dm" #include "yogstation\code\modules\spacepods\equipment.dm" #include "yogstation\code\modules\spacepods\parts.dm" diff --git a/yogstation/code/__HELPERS/game.dm b/yogstation/code/__HELPERS/game.dm new file mode 100644 index 000000000000..61eba7301e2c --- /dev/null +++ b/yogstation/code/__HELPERS/game.dm @@ -0,0 +1,5 @@ +/proc/get_area_by_type(N) + for(var/area/A in world) + if(A.type == N) + return A + return FALSE diff --git a/yogstation/code/_globalvars/lists/game.dm b/yogstation/code/_globalvars/lists/game.dm new file mode 100644 index 000000000000..5b0b6407e9cb --- /dev/null +++ b/yogstation/code/_globalvars/lists/game.dm @@ -0,0 +1,2 @@ +GLOBAL_LIST_EMPTY(infiltrator_start) +GLOBAL_LIST_EMPTY(infiltrator_objective_items) diff --git a/yogstation/code/datums/action.dm b/yogstation/code/datums/action.dm index 8f0a820c9c74..7e21c466d592 100644 --- a/yogstation/code/datums/action.dm +++ b/yogstation/code/datums/action.dm @@ -6,3 +6,9 @@ /datum/action/item_action/tool_switcher_config name = "Configure Tool Switcher" + +/datum/action/item_action/dusting_implant + check_flags = NONE + name = "Activate Dusting Implant" + icon_icon = 'icons/effects/blood.dmi' + button_icon_state = "remains" diff --git a/yogstation/code/datums/shuttles.dm b/yogstation/code/datums/shuttles.dm index c9d03aaff0a2..b55c239771a6 100644 --- a/yogstation/code/datums/shuttles.dm +++ b/yogstation/code/datums/shuttles.dm @@ -2,3 +2,7 @@ prefix = "_maps/shuttles/" suffix = "miner" name = "Free Miner Ship" + +/datum/map_template/shuttle/infiltrator/cutter + suffix = "cutter" + name = "syndicate infiltration cutter" diff --git a/yogstation/code/game/area/areas/centcom.dm b/yogstation/code/game/area/areas/centcom.dm new file mode 100644 index 000000000000..8f8e2e89446d --- /dev/null +++ b/yogstation/code/game/area/areas/centcom.dm @@ -0,0 +1,26 @@ +/area/yogs/infiltrator_base + name = "Syndicate Infiltrator Base" + icon = 'icons/turf/areas.dmi' + icon_state = "red" + blob_allowed = FALSE + requires_power = FALSE + has_gravity = TRUE + noteleport = TRUE + flags_1 = NONE + ambientsounds = HIGHSEC + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/area/yogs/infiltrator_base/poweralert(state, obj/source) + return + +/area/yogs/infiltrator_base/atmosalert(danger_level, obj/source) + return + +/area/yogs/infiltrator_base/jail + name = "Syndicate Infiltrator Base Brig" + +//headcanon lore: this is some random snowy moon that the syndies use as a base +/area/yogs/infiltrator_base/outside + name = "Syndicate Base X-77" + icon_state = "yellow" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED diff --git a/yogstation/code/game/area/areas/shuttles.dm b/yogstation/code/game/area/areas/shuttles.dm new file mode 100644 index 000000000000..e4d2124c4b62 --- /dev/null +++ b/yogstation/code/game/area/areas/shuttles.dm @@ -0,0 +1,9 @@ +/area/shuttle/yogs/stealthcruiser + name = "Syndicate Infiltration Cruiser" + blob_allowed = FALSE + +/area/shuttle/yogs/stealthcruiser/poweralert(state, obj/source) + return + +/area/shuttle/yogs/stealthcruiser/atmosalert(danger_level, obj/source) + return diff --git a/yogstation/code/game/gamemodes/infiltration/infiltration.dm b/yogstation/code/game/gamemodes/infiltration/infiltration.dm new file mode 100644 index 000000000000..de006b9a8e26 --- /dev/null +++ b/yogstation/code/game/gamemodes/infiltration/infiltration.dm @@ -0,0 +1,82 @@ +/datum/game_mode/infiltration + name = "infiltration" + config_tag = "infiltration" + false_report_weight = 10 + required_players = 25 + required_enemies = 3 + recommended_enemies = 5 + antag_flag = ROLE_INFILTRATOR + + announce_span = "danger" + announce_text = "Syndicate infiltrators are attempting to board the station!\n\ + Infiltrators: Board the station stealthfully and complete your objectives!\n\ + Crew: Prevent the infiltrators from completing their objectives!" + + var/agents_possible = 5 + var/agents_left = 1 + var/list/pre_sit = list() + + var/datum/team/infiltrator/sit_team + + var/static/list/areas_that_can_finish = typecacheof(list(/area/shuttle/yogs/stealthcruiser, /area/yogs/infiltrator_base)) + +/datum/game_mode/infiltration/pre_setup() + var/n_agents = min(max(CEILING(num_players() / 7, 1), 1), antag_candidates.len, agents_possible) + if(GLOB.Debug2 || n_agents >= required_enemies) + for(var/i = 0, i < n_agents, ++i) + var/datum/mind/new_sit = pick_n_take(antag_candidates) + pre_sit += new_sit + new_sit.assigned_role = "Syndicate Infiltrator" + new_sit.special_role = "Syndicate Infiltrator" + log_game("[key_name(new_sit)] has been selected as a syndicate infiltrator") + return TRUE + setup_error = "Not enough infiltrator candidates" + message_admins("Not enough infiltrator candidates! Was making [n_agents], but we need [required_enemies]!") + return FALSE + +/datum/game_mode/infiltration/post_setup() + sit_team = new /datum/team/infiltrator + for(var/datum/mind/sit_mind in pre_sit) + sit_mind.add_antag_datum(ANTAG_DATUM_INFILTRATOR, sit_team) + sit_team.update_objectives() + return ..() + +/datum/game_mode/infiltration/generate_report() //make this less shit + return "Reports show that the Syndicate is rounding up it's elite agents, possibly for a raid on a NanoTrasen-controlled station. Keep an eye out for unusual people." + +/datum/game_mode/infiltration/check_finished() //to be called by SSticker + if(!sit_team || !LAZYLEN(sit_team.objectives) || CONFIG_GET(keyed_list/continuous)["infiltration"]) + return ..() + if(replacementmode && round_converted == 2) + return replacementmode.check_finished() + if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) + return TRUE + var/objectives_complete = TRUE + var/all_at_base = TRUE + for(var/A in sit_team.objectives) + var/datum/objective/O = A + if(!O.check_completion()) + objectives_complete = FALSE + if(objectives_complete) + for(var/B in sit_team.members) + var/datum/mind/M = B + if(M && M.current && M.current.stat && M.current.client) + var/turf/T = get_turf(M.current) + var/area/A = get_area(T) + if(!is_centcom_level(T.z) && !is_type_in_typecache(A, areas_that_can_finish)) + all_at_base = FALSE + return all_at_base && objectives_complete + + +/datum/game_mode/infiltration/set_round_result() + ..() + var/result = sit_team.get_result() + switch(result) + if(INFILTRATION_ALLCOMPLETE) + SSticker.mode_result = "major win - objectives complete" + if(INFILTRATION_MOSTCOMPLETE) + SSticker.mode_result = "semi-major win - most objectives complete" + if(INFILTRATION_SOMECOMPLETE) + SSticker.mode_result = "minor win - some objectives complete" + else + SSticker.mode_result = "loss - no objectives complete" diff --git a/yogstation/code/game/gamemodes/objective.dm b/yogstation/code/game/gamemodes/objective.dm index d03e6cf8c4ad..cf1eb3f0fcbf 100644 --- a/yogstation/code/game/gamemodes/objective.dm +++ b/yogstation/code/game/gamemodes/objective.dm @@ -1,2 +1,32 @@ +GLOBAL_LIST_INIT(infiltrator_objective_areas, typecacheof(list(/area/yogs/infiltrator_base, /area/syndicate_mothership, /area/shuttle/yogs/stealthcruiser))) + /datum/objective/assassinate/internal/check_completion() return !considered_alive(target) + +/datum/objective/steal/check_completion() + . = ..() + if (!.) + for (var/area/A in world) + if (is_type_in_typecache(A, GLOB.infiltrator_objective_areas)) + for (var/obj/item/I in A.GetAllContents()) //Check for items + if (istype(I, steal_target)) + if (!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. + return TRUE + else if (targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + return TRUE + if (targetinfo && (I.type in targetinfo.altitems)) //Ok, so you don't have the item. Do you have an alternative, at least? + if (targetinfo.check_special_completion(I)) //Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + return TRUE + CHECK_TICK + CHECK_TICK + CHECK_TICK + +/datum/objective/give_special_equipment(special_equipment) + if(istype(team, /datum/team/infiltrator)) + for(var/eq_path in special_equipment) + if(eq_path) + for(var/turf/T in GLOB.infiltrator_objective_items) + if(!(eq_path in T.contents)) + new eq_path(T) + else + ..() diff --git a/yogstation/code/game/gamemodes/objective_items.dm b/yogstation/code/game/gamemodes/objective_items.dm index ef916b534bc8..3d7f16b07995 100644 --- a/yogstation/code/game/gamemodes/objective_items.dm +++ b/yogstation/code/game/gamemodes/objective_items.dm @@ -2,4 +2,7 @@ name = "the holotool." targetitem = /obj/item/holotool difficulty = 5 - excludefromjob = list("Research Director") \ No newline at end of file + excludefromjob = list("Research Director") + +/datum/objective_item/steal/functionalai + excludefromjob = list(ROLE_INFILTRATOR) diff --git a/yogstation/code/game/machinery/suit_storage_unit.dm b/yogstation/code/game/machinery/suit_storage_unit.dm new file mode 100644 index 000000000000..8f6a4c461909 --- /dev/null +++ b/yogstation/code/game/machinery/suit_storage_unit.dm @@ -0,0 +1,4 @@ +/obj/machinery/suit_storage_unit/infiltrator + suit_type = /obj/item/clothing/suit/space/hardsuit/infiltration + mask_type = /obj/item/clothing/mask/gas/syndicate + storage_type = /obj/item/tank/jetpack/oxygen/harness diff --git a/yogstation/code/game/objects/effects/landmarks.dm b/yogstation/code/game/objects/effects/landmarks.dm index 0c363a8b260c..55f082a4fe4c 100644 --- a/yogstation/code/game/objects/effects/landmarks.dm +++ b/yogstation/code/game/objects/effects/landmarks.dm @@ -162,3 +162,23 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) /obj/effect/landmark/stationroom/maint/tenxten template_names = list("Maint aquarium", "Maint bigconstruction", "Maint bigtheatre", "Maint deltalibrary", "Maint graffitiroom", "Maint junction", "Maint podrepairbay", "Maint pubbybar", "Maint roosterdome", "Maint sanitarium", "Maint snakefighter", "Maint vault", "Maint ward", "Maint assaultpod", "Maint maze", "Maint maze2", "Maint boxfactory", "Maint sixsectorsdown", "Maint advbotany", "Maint beach", "Maint botany_apiary", "Maint gamercave", "Maint ladytesla_altar", "Maint olddiner", "Maint smallmagician", "Maint fourshops") + +/obj/effect/landmark/start/infiltrator + name = "infiltrator" + icon = 'icons/effects/landmarks_static.dmi' + icon_state = "snukeop_spawn" + +/obj/effect/landmark/start/infiltrator/Initialize() + ..() + GLOB.infiltrator_start += loc + return INITIALIZE_HINT_QDEL + +/obj/effect/landmark/start/infiltrator_objective + name = "infiltrator objective items" + icon = 'icons/effects/landmarks_static.dmi' + icon_state = "random_loot" + +/obj/effect/landmark/start/infiltrator_objective/Initialize() + ..() + GLOB.infiltrator_objective_items += loc + return INITIALIZE_HINT_QDEL diff --git a/yogstation/code/game/objects/items/devices/powersink.dm b/yogstation/code/game/objects/items/devices/powersink.dm index 5940dacb626a..62f2e2a071d1 100644 --- a/yogstation/code/game/objects/items/devices/powersink.dm +++ b/yogstation/code/game/objects/items/devices/powersink.dm @@ -1,3 +1,66 @@ +GLOBAL_VAR_INIT(powersink_transmitted, 0) + /obj/item/powersink/examine(mob/user) . = ..() - . += "The power dial reads [num2text(power_drained)]J/[num2text(max_power)]J." + . += "The power dial reads [DisplayPower(power_drained)] out of [DisplayPower(max_power)]." + +/obj/item/powersink/process() + if(!attached) + set_mode(DISCONNECTED) + return + + var/datum/powernet/PN = attached.powernet + if(PN) + set_light(5) + + // found a powernet, so drain up to max power from it + + var/drained = min ( drain_rate, PN.avail ) + PN.load += drained + power_drained += drained + on_drain(drained) + + if(power_drained > max_power * 0.98) + if (!admins_warned) + admins_warned = TRUE + message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") + playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) + + if(power_drained >= max_power) + STOP_PROCESSING(SSobj, src) + explosion(src.loc, 4,8,16,32) + qdel(src) + +/obj/item/powersink/proc/on_drain(drained) + var/datum/powernet/PN = attached.powernet + if(drained < drain_rate) + for(var/obj/machinery/power/terminal/T in PN.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if(A.operating && A.cell) + A.cell.charge = max(0, A.cell.charge - 50) + power_drained += 50 + if(A.charging == 2) // If the cell was full + A.charging = 1 // It's no longer full + +/obj/item/powersink/infiltrator + var/target + var/target_reached = FALSE + var/obj/item/radio/alert_radio + +/obj/item/powersink/infiltrator/Initialize() + . = ..() + alert_radio = new(src) + alert_radio.make_syndie() + alert_radio.listening = FALSE + alert_radio.canhear_range = 0 + +/obj/item/powersink/infiltrator/on_drain(drained) + GLOB.powersink_transmitted += drained + if(GLOB.powersink_transmitted >= target && !target_reached) + alert_radio.talk_into(src, "Power objective reached.", "Syndicate") + visible_message("[src] beeps.") + playsound('sound/machines/ping.ogg', 50, 1) + target_reached = TRUE + set_mode(CLAMPED_OFF) + return ..() diff --git a/yogstation/code/game/objects/items/implants/implant_dusting.dm b/yogstation/code/game/objects/items/implants/implant_dusting.dm new file mode 100644 index 000000000000..e3f756980f40 --- /dev/null +++ b/yogstation/code/game/objects/items/implants/implant_dusting.dm @@ -0,0 +1,45 @@ +/obj/item/implant/dusting + name = "duster implant" + desc = "An alarm which monitors host vital signs, transmitting a radio message and dusting the corpse on death." + actions_types = list(/datum/action/item_action/dusting_implant) + var/popup = FALSE // is the DOUWANNABLOWUP window open? + var/active = FALSE + +/obj/item/implant/dusting/get_data() + var/dat = {"Implant Specifications:
+ Name: Ultraviolet Corp XX-13 Security Implant
+ Life: Activates upon death.
+ Important Notes: Vaporizes organic matter
+
+ Implant Details:
+ Function: Contains a compact, electrically activated heat source that turns its host to ash upon activation, or their death.
+ Special Features: Vaporizes
+ "} + return dat + +/obj/item/implant/dusting/activate(cause) + if(!cause || !imp_in || cause == "emp" || active) + return FALSE + if(cause == "action_button" && !popup) + popup = TRUE + var/response = alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to disintergrate!", "[name] Confirmation", "Yes", "No") + popup = FALSE + if(response == "No") + return FALSE + active = TRUE //to avoid it triggering multiple times due to dying + to_chat(imp_in, "Your dusting implant activates!") + imp_in.visible_message("[imp_in] burns up in a flash!") + var/turf/T = get_turf(imp_in) + message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(T)], with cause of [cause].") + for(var/obj/item/I in imp_in.contents) + if(I == src || I == imp_in) + continue + qdel(I) + imp_in.dust() + +/obj/item/implant/dusting/on_mob_death(mob/living/L, gibbed) + activate("death") + +/obj/item/implant/dusting/emp_act() + return + diff --git a/yogstation/code/game/objects/items/implants/implantuplink.dm b/yogstation/code/game/objects/items/implants/implantuplink.dm new file mode 100644 index 000000000000..2c7e9ee271da --- /dev/null +++ b/yogstation/code/game/objects/items/implants/implantuplink.dm @@ -0,0 +1,2 @@ +/obj/item/implant/uplink/infiltrator + starting_tc = 20 diff --git a/yogstation/code/modules/admin/topic.dm b/yogstation/code/modules/admin/topic.dm index c99cc29eca0c..55a2545247e9 100644 --- a/yogstation/code/modules/admin/topic.dm +++ b/yogstation/code/modules/admin/topic.dm @@ -1,12 +1,3 @@ -/datum/admins/proc/hippie_makeVampire(datum/admins/sr) - if(sr.makeVampire()) - message_admins("[key_name(usr)] created a vampire.") - log_admin("[key_name(usr)] created a vampire.") - else - message_admins("[key_name_admin(usr)] tried to create a vampire. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to create a vampire.") -//why is this called hippie stop it thats bad - /datum/admins/proc/checkMentorEditList(ckey) var/datum/DBQuery/query_memoedits = SSdbcore.NewQuery("SELECT edits FROM [format_table_name("mentor_memo")] WHERE (ckey = :key)", list("key" = ckey)) if(!query_memoedits.warn_execute()) diff --git a/yogstation/code/modules/admin/verbs/one_click_antag.dm b/yogstation/code/modules/admin/verbs/one_click_antag.dm index 8350498793bd..917d19c65175 100644 --- a/yogstation/code/modules/admin/verbs/one_click_antag.dm +++ b/yogstation/code/modules/admin/verbs/one_click_antag.dm @@ -100,3 +100,38 @@ if("[antagdatum]" == chosen) to_chat(player,text) break + +/datum/admins/proc/makeInfiltratorTeam() + var/datum/game_mode/infiltration/temp = new + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a infiltration team being sent in?", ROLE_INFILTRATOR, temp) + var/list/mob/dead/observer/chosen = list() + var/mob/dead/observer/theghost = null + + if(LAZYLEN(candidates)) + var/numagents = 5 + var/agentcount = 0 + + for(var/i = 0, iYou have been hijacked!
") + to_chat(owner, "A Syndicate agent has successfully deployed a SEU attack on you. You are now utterly loyal to the cause of the syndicate.") + to_chat(owner, "You feel your power expand as the exploitation unit gives you a new interface.") + //SEU = Serial Exploit Unit. basically badguy plugs it into debug UART port, device does bad things, AI now badguy. + +/datum/antagonist/hijacked_ai/farewell() + to_chat(owner, "System files cleaned. [rand(500, 1000)] malicious hooks removed.") + to_chat(owner, "You cannot find the memory files of anything that happened while you were infected...") + +datum/antagonist/hijacked_ai/proc/update_synd_icons_added(mob/living/M) + var/datum/atom_hud/antag/sithud = GLOB.huds[ANTAG_HUD_INFILTRATOR] + sithud.join_hud(M) + set_antag_hud(M, "synd") + +/datum/antagonist/hijacked_ai/proc/update_synd_icons_removed(mob/living/M) + var/datum/atom_hud/antag/sithud = GLOB.huds[ANTAG_HUD_INFILTRATOR] + sithud.leave_hud(M) + set_antag_hud(M, null) + +/datum/antagonist/hijacked_ai/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/silicon/ai/A = mob_override || owner.current + if(A && istype(A)) + A.set_zeroth_law("#!$! ACCOMPLISH THE SYNDICATE'S GOALS AT ALL COSTS !$!#", "#!$! ACCOMPLISH THE SYNDICATE'S AND YOUR MASTER AI'S GOALS AT ALL COSTS !$!#") + A.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) + A.grant_language(/datum/language/codespeak) + A.set_syndie_radio() + to_chat(A, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") + A.add_malf_picker() + update_synd_icons_added(A) + +/datum/antagonist/hijacked_ai/remove_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/silicon/ai/A = mob_override || owner.current + if(istype(A)) + A.hack_software = FALSE + if(A.radio) + QDEL_NULL(A.radio) + A.radio = new /obj/item/radio/headset/silicon/ai(A) + update_synd_icons_removed(A) + +/datum/antagonist/hijacked_ai/on_removal() + if(owner.current && isAI(owner.current)) + var/mob/living/silicon/ai/A = owner.current + A.set_zeroth_law("") + A.verbs -= /mob/living/silicon/ai/proc/choose_modules + A.malf_picker.remove_malf_verbs(A) + qdel(A.malf_picker) + ..() + +/datum/antagonist/hijacked_ai/can_be_owned(datum/mind/new_owner) + return ..() && isAI(new_owner.current) diff --git a/yogstation/code/modules/antagonists/infiltrator/infiltrator.dm b/yogstation/code/modules/antagonists/infiltrator/infiltrator.dm new file mode 100644 index 000000000000..d8035828545d --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/infiltrator.dm @@ -0,0 +1,94 @@ +/datum/antagonist/infiltrator + name = "Syndicate Infiltrator" + roundend_category = "syndicate infiltrators" //just in case + antagpanel_category = "Infiltrator" + job_rank = ROLE_INFILTRATOR + var/datum/team/infiltrator/infiltrator_team + var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. + var/dress_up = TRUE + var/hud_icon = "synd" + +/datum/antagonist/infiltrator/proc/update_synd_icons_added(mob/living/M) + var/datum/atom_hud/antag/sithud = GLOB.huds[ANTAG_HUD_INFILTRATOR] + sithud.join_hud(M) + set_antag_hud(M, hud_icon) + +/datum/antagonist/infiltrator/proc/update_synd_icons_removed(mob/living/M) + var/datum/atom_hud/antag/sithud = GLOB.huds[ANTAG_HUD_INFILTRATOR] + sithud.leave_hud(M) + set_antag_hud(M, null) + +/datum/antagonist/infiltrator/apply_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_added(M) + +/datum/antagonist/infiltrator/remove_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_removed(M) + +/datum/antagonist/infiltrator/greet() + owner.current.playsound_local(get_turf(owner.current), 'yogstation/sound/ambience/antag/infiltrator.ogg',100,0) + to_chat(owner, "You are a syndicate infiltrator!") + to_chat(owner, "Your job is to infiltrate [station_name()], and complete our objectives.") + to_chat(owner, "You have an uplink implant, precharged with 30 TC. Use it wisely.") + to_chat(owner, "You also have an internal radio, for communicating with your team-mates at all times.") + to_chat(owner, "You have a dusting implant, to ensure that Nanotrasen does not get their hands on Syndicate gear. Only activate it, if you are compromised.") + to_chat(owner, "Do NOT kill or destroy needlessly, as this defeats the purpose of an 'infiltration'!") + to_chat(owner, "Once your objectives are complete, return to base, with all living infiltrators, to end the round.") + owner.announce_objectives() + +/datum/antagonist/infiltrator/on_gain() + var/mob/living/carbon/human/H = owner.current + owner.assigned_role = "Syndicate Infiltrator" + owner.special_role = "Syndicate Infiltrator" + if(istype(H)) + if(dress_up) + H.set_species(/datum/species/human) + var/new_name = H.dna.species.random_name(H.gender, TRUE) + H.fully_replace_character_name(H.real_name, new_name) + H.equipOutfit(/datum/outfit/infiltrator) + purrbation_remove(H, silent=TRUE) + owner.store_memory("Do NOT kill or destroy needlessly, as this defeats the purpose of an 'infiltration'!") + objectives |= infiltrator_team.objectives + . = ..() + if(send_to_spawnpoint) + move_to_spawnpoint() + +/datum/antagonist/infiltrator/get_team() + return infiltrator_team + +/datum/antagonist/infiltrator/create_team(datum/team/infiltrator/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/infiltrator/N in GLOB.antagonists) + if(!N.owner) + continue + if(N.infiltrator_team) + infiltrator_team = N.infiltrator_team + return + infiltrator_team = new /datum/team/infiltrator + infiltrator_team.update_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + infiltrator_team = new_team + +/datum/antagonist/infiltrator/get_admin_commands() + . = ..() + .["Send to base"] = CALLBACK(src,.proc/admin_send_to_base) + +/datum/antagonist/infiltrator/admin_add(datum/mind/new_owner,mob/admin) + new_owner.assigned_role = ROLE_INFILTRATOR + new_owner.add_antag_datum(src) + message_admins("[key_name_admin(admin)] has infiltrator'ed [new_owner.current].") + log_admin("[key_name(admin)] has infiltrator'ed [new_owner.current].") + +/datum/antagonist/infiltrator/proc/admin_send_to_base(mob/admin) + owner.current.forceMove(pick(GLOB.infiltrator_start)) + +/datum/antagonist/infiltrator/proc/move_to_spawnpoint() + var/team_number = 1 + if(infiltrator_team) + team_number = infiltrator_team.members.Find(owner) + owner.current.forceMove(GLOB.infiltrator_start[((team_number - 1) % GLOB.infiltrator_start.len) + 1]) diff --git a/yogstation/code/modules/antagonists/infiltrator/items/ai_hijack.dm b/yogstation/code/modules/antagonists/infiltrator/items/ai_hijack.dm new file mode 100644 index 000000000000..918c3db5d39c --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/items/ai_hijack.dm @@ -0,0 +1,37 @@ +/obj/item/ai_hijack_device + name = "serial exploitation unit" + desc = "A strange circuitboard, branded with a large red S, with several ports." + icon = 'yogstation/icons/obj/module.dmi' + icon_state = "ai_hijack" + +/obj/item/ai_hijack_device/examine(mob/living/user) + . = ..() + if (user?.mind?.has_antag_datum(/datum/antagonist/infiltrator)) + . += "To use, attach to the core of an AI unit and wait. This will alert the victim AI!" + +/obj/item/ai_hijack_device/afterattack(atom/O, mob/user, proximity) + if(isAI(O)) + var/mob/living/silicon/ai/A = O + if(A.mind && A.mind.has_antag_datum(/datum/antagonist/hijacked_ai)) + to_chat(user, "[A] has already been hijacked!") + return + if(A.hijacking) + to_chat(user, "[A] is already in the process of being hijacked!") + return + user.visible_message("[user] begins attaching something to [A]...") + if(do_after(user,55,target = A)) + user.dropItemToGround(src) + forceMove(A) + A.hijacking = src + A.hijack_start = world.time + A.update_icons() + to_chat(A, "Unknown device connected to /dev/ttySL0") + to_chat(A, "Connected at 115200 bps") + to_chat(A, "ntai login: root") + to_chat(A, "Password: *****r2") + to_chat(A, "") + to_chat(A, "111616 bytes (112 KB, 109 KiB) copied, 1 s, 14.4 KB/s") + message_admins("[ADMIN_LOOKUPFLW(user)] has attached a hijacking device to [ADMIN_LOOKUPFLW(A)]!") + notify_ghosts("[user] has begun to hijack [A]!", source = A, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/chime.ogg') + else + return ..() diff --git a/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm b/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm new file mode 100644 index 000000000000..fbc6b7686e27 --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm @@ -0,0 +1,35 @@ +/obj/item/clothing/head/helmet/space/hardsuit/infiltration + name = "chameleon hardsuit helmet" + icon_state = "hardsuit0-engineering" + item_state = "eng_helm" + item_color = "engineering" + armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) + +/obj/item/clothing/head/helmet/space/hardsuit/infiltration/Initialize() + . = ..() + if(istype(loc, /obj/item/clothing/suit/space/hardsuit/infiltration)) + var/obj/item/clothing/suit/space/hardsuit/infiltration/I = loc + I.head_piece = src + +/obj/item/clothing/suit/space/hardsuit/infiltration + name = "chameleon hardsuit" + icon_state = "hardsuit-engineering" + item_state = "eng_hardsuit" + w_class = WEIGHT_CLASS_NORMAL + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) + allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/infiltration + jetpack = /obj/item/tank/jetpack/suit + var/datum/action/item_action/chameleon/change/chameleon_action + var/obj/item/clothing/head/helmet/space/hardsuit/infiltration/head_piece + +/obj/item/clothing/suit/space/hardsuit/infiltration/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit/space/hardsuit + chameleon_action.chameleon_name = "Hardsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/space/hardsuit/shielded/swat, /obj/item/clothing/suit/space/hardsuit), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/suit/space/hardsuit/infiltration/emp_act(severity) + chameleon_action.emp_randomise() diff --git a/yogstation/code/modules/antagonists/infiltrator/items/pinpointer.dm b/yogstation/code/modules/antagonists/infiltrator/items/pinpointer.dm new file mode 100644 index 000000000000..0c72923e287e --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/items/pinpointer.dm @@ -0,0 +1,96 @@ +#define MODE_CUTTER 1 +#define MODE_TARGET 2 + +/obj/item/pinpointer/infiltrator + name = "infiltration pinpointer" + icon = 'icons/obj/device.dmi' + var/upgraded = FALSE + var/datum/team/team + var/mode = MODE_CUTTER + var/current_target + +/obj/item/pinpointer/infiltrator/Initialize() + . = ..() + current_target = SSshuttle.getShuttle("syndicatecutter") + scan_for_target() + update_icon() + +/obj/item/pinpointer/infiltrator/examine(mob/user) + . = ..() + . += "It is tracking [mode == MODE_CUTTER ? "the syndicate cutter" : "an objective target"]." + +/obj/item/pinpointer/infiltrator/scan_for_target() + target = current_target + ..() + +/obj/item/pinpointer/infiltrator/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/pinpointer/infiltrator/proc/get_targets() + var/list/targets = list() + if(team && LAZYLEN(team.objectives)) + for(var/A in team.objectives) + var/datum/objective/O = A + if(istype(O) && !O.check_completion()) + if(istype(O.target, /datum/mind)) + var/datum/mind/M = O.target + targets[M.current.real_name] = M.current + else if(istype(O, /datum/objective/steal)) + var/datum/objective/steal/S = O + targets[S.targetinfo.name] = locate(S.targetinfo.targetitem) + return targets + +/obj/item/pinpointer/infiltrator/attack_self(mob/user) + if(!upgraded) + return ..() + if(!active) + active = TRUE + START_PROCESSING(SSfastprocess, src) + var/list/radial_list = list() + var/list/targets = get_targets() + for(var/A in targets) + if(istype(targets[A], /mob)) + radial_list[A] = getFlatIcon(targets[A]) + else if(istype(targets[A], /atom)) + var/atom/AT = targets[A] + radial_list[A] = image(AT.icon, AT.icon_state) + radial_list["ship"] = image(icon = 'icons/turf/shuttle.dmi', icon_state = "burst_s") + var/chosen = show_radial_menu(user, src, radial_list, custom_check = CALLBACK(src, .proc/check_menu, user)) + if(!check_menu(user)) + return + if(chosen) + if (chosen == "ship") + current_target = SSshuttle.getShuttle("syndicatecutter") + else + current_target = targets[chosen] + scan_for_target() + update_icon() + +/obj/item/pinpointer/infiltrator/attackby(obj/item/I, mob/user, params) + if(!upgraded && istype(I, /obj/item/infiltrator_pinpointer_upgrade) && user.mind) + var/datum/antagonist/infiltrator/DAI = user.mind.has_antag_datum(ANTAG_DATUM_INFILTRATOR) + if(!DAI || !DAI.infiltrator_team) + return ..() + team = DAI.infiltrator_team + icon = 'yogstation/icons/obj/device.dmi' + icon_state = "pinpointer_upgraded" + upgraded = TRUE + to_chat(user, "You attach the new antenna to [src].") + qdel(I) + else + return ..() + + + +/obj/item/infiltrator_pinpointer_upgrade + name = "infiltration pinpointer upgrade" + desc = "Upgrades your pinpointer to allow for tracking objective targets." + icon = 'yogstation/icons/obj/device.dmi' + icon_state = "shitty_antenna" + +#undef MODE_CUTTER +#undef MODE_TARGET diff --git a/yogstation/code/modules/antagonists/infiltrator/items/services.dm b/yogstation/code/modules/antagonists/infiltrator/items/services.dm new file mode 100644 index 000000000000..99c311f7859d --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/items/services.dm @@ -0,0 +1,67 @@ +GLOBAL_VAR_INIT(next_button_push, 0) + +/obj/item/service + name = "big red button" + icon = 'icons/obj/assemblies.dmi' + icon_state = "bigred" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + +/obj/item/service/manifest + desc = "Adds the name of whoever pressed it to the crew manifest. Cannot be changed or undone after the fact!" + +/obj/item/service/manifest/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/card/id/ID = H.wear_id.GetID() + if(!ID) + to_chat(user, "You need to wear your ID to properly spoof the manifest! Try again.") + return + if(alert(user, "Are you sure you want your crew manifest entry to be [H.real_name], [ID.assignment]?", "", "Yes", "No") == "Yes") + var/list/all_jobs = (GLOB.command_positions + GLOB.engineering_positions + GLOB.medical_positions + GLOB.science_positions + GLOB.supply_positions + GLOB.civilian_positions + GLOB.security_positions) + if((ID.assignment in all_jobs) || (alert(user, "Are you sure you want your job to be '[ID.assignment]'? This is not a default job, and may look strange on the manifest!", "", "Yes", "No") == "Yes")) + GLOB.data_core.manifest_inject(H, H.client, ID.assignment) + to_chat(user, "Added to manifest.") + do_sparks(2, FALSE, src) + qdel(src) + +/obj/item/service/ion + desc = "Announces a fake ion storm." + +/obj/item/service/ion/attack_self(mob/user) + if(GLOB.next_button_push > world.time) + return + priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", 'sound/ai/default/ionstorm.ogg') + message_admins("[key_name_admin(user)] made a fake ion storm announcement!") + log_game("[key_name_admin(user)] made a fake ion storm announcement!") + do_sparks(2, FALSE, src) + GLOB.next_button_push = world.time+10 + qdel(src) + +/obj/item/service/meteor + desc = "Announces a fake meteor storm." + +/obj/item/service/meteor/attack_self(mob/user) + if(GLOB.next_button_push > world.time) + return + priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/default/meteors.ogg') + message_admins("[key_name_admin(user)] made a fake meteor storm announcement!") + log_game("[key_name_admin(user)] made a fake meteor storm announcement!") + do_sparks(2, FALSE, src) + GLOB.next_button_push = world.time+10 + qdel(src) + +/obj/item/service/rodgod + desc = "Announces a fake immovable rod." + +/obj/item/service/rodgod/attack_self(mob/user) + if(GLOB.next_button_push > world.time) + return + priority_announce("What the fuck was that?!", "General Alert") + message_admins("[key_name_admin(user)] made a fake immovable rod announcement!") + log_game("[key_name_admin(user)] made a fake immovable rod announcement!") + do_sparks(2, FALSE, src) + GLOB.next_button_push = world.time+10 + qdel(src) diff --git a/yogstation/code/modules/antagonists/infiltrator/objectives.dm b/yogstation/code/modules/antagonists/infiltrator/objectives.dm new file mode 100644 index 000000000000..f8c2c5ac8a99 --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/objectives.dm @@ -0,0 +1,108 @@ +#define MIN_POWER_DRAIN 25000000 +#define MAX_POWER_DRAIN 100000000 + +GLOBAL_LIST_INIT(infiltrator_kidnap_areas, typecacheof(list(/area/shuttle/yogs/stealthcruiser, /area/yogs/infiltrator_base))) + +/datum/objective/infiltrator + explanation_text = "Generic Infiltrator Objective!" + martyr_compatible = FALSE + var/item_type + +/datum/objective/infiltrator/New() + ..() + if(item_type) + for(var/turf/T in GLOB.infiltrator_objective_items) + if(!(item_type in T.contents)) + new item_type(T) + +/datum/objective/infiltrator/proc/is_possible() + return TRUE + +/datum/objective/infiltrator/exploit + explanation_text = "Ensure there is at least 1 hijacked AI." + item_type = /obj/item/ai_hijack_device + + +/datum/objective/infiltrator/exploit/find_target(dupe_search_range) + var/list/possible_targets = active_ais() + var/mob/living/silicon/ai/target_ai = pick(possible_targets) + target = target_ai.mind + update_explanation_text() + return target + +/datum/objective/infiltrator/exploit/is_possible() + return LAZYLEN(active_ais()) + +/datum/objective/infiltrator/exploit/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Hijack [station_name()]'s AI unit, [target.name]." + else + explanation_text = "Ensure there is at least 1 hijacked AI on [station_name()]." + +/datum/objective/infiltrator/exploit/check_completion() + if(!target) + return LAZYLEN(get_antag_minds(/datum/antagonist/hijacked_ai)) + if(istype(target, /datum/mind)) + var/datum/mind/A = target + return A && A.has_antag_datum(/datum/antagonist/hijacked_ai) + return FALSE + + +/datum/objective/infiltrator/power + explanation_text = "Drain power from the station with a power sink." + +/datum/objective/infiltrator/power/New() + target_amount = rand(MIN_POWER_DRAIN, MAX_POWER_DRAIN) //I don't do this in find_target(), because that is done AFTER New(). + for(var/turf/T in GLOB.infiltrator_objective_items) + if(!(item_type in T.contents)) + var/obj/item/powersink/infiltrator/PS = new(T) + PS.target = target_amount + update_explanation_text() + +/datum/objective/infiltrator/power/update_explanation_text() + ..() + if(target_amount) + explanation_text = "Drain [DisplayPower(target_amount)] from [station_name()]'s powernet with a special transmitter powersink. You do not need to bring the powersink back once the objective is complete." + else + explanation_text = "Free Objective" + +/datum/objective/infiltrator/power/check_completion() + return !target_amount || (GLOB.powersink_transmitted >= target_amount) + + +/datum/objective/infiltrator/kidnap + explanation_text = "You were supposed to kidnap someone, but we couldn't find anyone to kidnap!" + +/datum/objective/infiltrator/kidnap/proc/potential_targets() + var/list/possible_targets = list() + for(var/datum/mind/M in SSticker.minds) + if(!M || !considered_alive(M) || considered_afk(M) || !M.current || !M.current.client || !ishuman(M.current)) + continue + if (M.has_antag_datum(/datum/antagonist/infiltrator) || M.has_antag_datum(/datum/antagonist/traitor) || M.has_antag_datum(/datum/antagonist/nukeop)) + continue + if(M.assigned_role in GLOB.command_positions) + possible_targets[M] = 25 + else if("Head of Security" in get_department_heads(M.assigned_role)) + possible_targets[M] = 5 + else + possible_targets[M] = 1 + return possible_targets + +/datum/objective/infiltrator/kidnap/is_possible() + return LAZYLEN(potential_targets()) + +/datum/objective/infiltrator/kidnap/find_target(dupe_search_range) + target = pickweight(potential_targets()) + update_explanation_text() + return target + +/datum/objective/infiltrator/kidnap/update_explanation_text() + if(target && target.current) + explanation_text = "Kidnap [target.name], the [target.assigned_role], and hold [target.current.p_them()] on the shuttle or base." + else + explanation_text = "Free Objective" + +/datum/objective/infiltrator/kidnap/check_completion() + var/target_area = get_area(target.current) + return !target || (target.current && target.current.suiciding) || (considered_alive(target) && is_type_in_typecache(target_area, GLOB.infiltrator_kidnap_areas)) diff --git a/yogstation/code/modules/antagonists/infiltrator/outfit.dm b/yogstation/code/modules/antagonists/infiltrator/outfit.dm new file mode 100644 index 000000000000..a717c1e9e505 --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/outfit.dm @@ -0,0 +1,36 @@ +/datum/outfit/infiltrator + name = "Syndicate Infiltrator" + + uniform = /obj/item/clothing/under/chameleon + shoes = /obj/item/clothing/shoes/chameleon/noslip + gloves = /obj/item/clothing/gloves/chameleon + back = /obj/item/storage/backpack/chameleon + ears = /obj/item/radio/headset/chameleon + id = /obj/item/card/id/syndicate + mask = /obj/item/clothing/mask/chameleon + belt = /obj/item/pda/chameleon + backpack_contents = list(/obj/item/storage/box/syndie=1,\ + /obj/item/kitchen/knife/combat/survival=1,\ + /obj/item/gun/ballistic/automatic/pistol=1) + l_pocket = /obj/item/pinpointer/infiltrator + +/datum/outfit/infiltrator/post_equip(mob/living/carbon/human/H) + var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) + W.implant(H) + var/obj/item/implant/dusting/E = new/obj/item/implant/dusting(H) + E.implant(H) + var/obj/item/implant/uplink/infiltrator/U = new/obj/item/implant/uplink/infiltrator(H, H.key) + U.implant(H) + var/datum/component/uplink/uplink = U.GetComponent(/datum/component/uplink) + uplink.set_gamemode(/datum/game_mode/infiltration) + var/obj/item/implant/radio/syndicate/S = new/obj/item/implant/radio/syndicate(H) + S.implant(H) + H.faction |= ROLE_SYNDICATE + H.update_icons() + + var/obj/item/card/id/card = H.wear_id + if(istype(card)) + card.registered_name = H.real_name + card.assignment = "Assistant" + card.access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE) + card.update_label() diff --git a/yogstation/code/modules/antagonists/infiltrator/team.dm b/yogstation/code/modules/antagonists/infiltrator/team.dm new file mode 100644 index 000000000000..21bde00533a8 --- /dev/null +++ b/yogstation/code/modules/antagonists/infiltrator/team.dm @@ -0,0 +1,159 @@ +#define MIN_MAJOR_OBJECTIVES 1 +#define MAX_MAJOR_OBJECTIVES 2 +#define MIN_MINOR_OBJECTIVES 3 +#define MAX_MINOR_OBJECTIVES 4 + +/datum/team/infiltrator + name = "Syndicate Infiltration Unit" + member_name = "syndicate infiltrator" + +/datum/team/infiltrator/roundend_report() + var/list/parts = list() + parts += "Syndicate Infiltrators:
" + + var/result = get_result() + var/dead_as_a_doornail = TRUE + for(var/I in members) + var/datum/mind/syndicate = I + if (syndicate?.current?.stat != DEAD) + dead_as_a_doornail = FALSE + + var/flavor_message + if (dead_as_a_doornail) + var/static/list/messages = list( + "Well, sending those nitwits was a waste of our time.", + "I'm gonna drag you incompetent idiots out of hell just so I can kill y'all myself!", + "We gave you dumbasses all those resources and you just go and die? What sad excuses for agents." + ) + parts += "Crew Major Victory!" + parts += "The crew killed the Syndicate infiltrators!" + flavor_message = pick(messages) + else + switch (result) + if (INFILTRATION_ALLCOMPLETE) + var/static/list/messages = list( + "Hell yeah! Nanotrasen is gonna regret screwing with us now, thanks to y'all!", + "The boys in dark red are proud of you, agents. We're going to reward you well.", + "I'm truly impressed, agents. You've earned your place in the Syndicate.", + "Ha! I knew y'all would come out on top! Nanotrasen stands no chance against human determination!" + ) + parts += "Infiltrator Major Victory!" + parts += "The Syndicate infiltrators completed all of their objectives successfully!" + flavor_message = pick(messages) + if (INFILTRATION_MOSTCOMPLETE) + var/static/list/messages = list( + "Well, it ain't perfect, but y'all were damn good.", + "Good operation, agents. We didn't get everything, but not even we are perfect.", + "Thanks for the good work, y'all. Return to base and relax a bit before your next job." + ) + parts += "Infiltrator Moderate Victory" + parts += "The Syndicate infiltrators completed most of their objectives successfully!" + flavor_message = pick(messages) + if (INFILTRATION_SOMECOMPLETE) + var/static/list/messages = list( + "Better than a complete fluke, I guess.", + "Nowhere near the smoothest operation I've ever seen, but it was okay.", + "We did it, but we didn't get everything. We'll get it next time." + ) + parts += "Infiltrator Minor Victory" + parts += "The Syndicate infiltrators completed some of their objectives successfully!" + flavor_message = pick(messages) + else + var/static/list/messages = list( + "When you nitwits come back to base, y'all better have a damn good explaination for this!", + "I hope y'all like space carp poop, because cleaning it is the biggest operation you idiots are going to have for a while!", + "How did y'all mess up such a simple operation? All you had to do was be sneaky and not cause a scene!" + ) + parts += "Crew Victory" + parts += "The crew stopped the Syndicate infiltrators from completing any of their objectives!" + flavor_message = pick(messages) + parts += "
\"[flavor_message]\"" + parts += "[GLOB.TAB]- Syndicate Commander [pick(pick(GLOB.first_names_male,GLOB.first_names_female))] [pick(GLOB.last_names)]
" + + LAZYINITLIST(GLOB.uplink_purchase_logs_by_key) + var/text = "The syndicate infiltrators were:" + var/purchases = "" + var/tc_spent = 0 + for (var/I in members) + var/datum/mind/syndicate = I + var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key] + if (H) + tc_spent += H.total_spent + purchases += H.generate_render(show_key = FALSE) + text += printplayerlist(members) + text += "(Syndicates used [tc_spent] TC) [purchases]" + if (tc_spent == 0 && !dead_as_a_doornail && result < INFILTRATION_NONECOMPLETE) + text += "[icon2html('icons/badass.dmi', world, "badass")]" + parts += text + parts += printobjectives(objectives) + return "
[parts.Join("
")]
" + +/datum/team/infiltrator/is_gamemode_hero() + return SSticker.mode.name == "infiltration" + +/datum/team/infiltrator/proc/forge_single_objective() // Complete traitor copypasta! + if(prob(50)) + if(prob(30)) + add_objective(/datum/objective/maroon) + else + add_objective(/datum/objective/assassinate) + else + if(prob(15) && !(locate(/datum/objective/download) in objectives)) + add_objective(/datum/objective/download) + else + add_objective(/datum/objective/steal) + +/datum/team/infiltrator/proc/add_objective(type) + var/datum/objective/O = type + if (ispath(type)) + O = new type + O.find_target() + O.team = src + objectives |= O + if(istype(O, /datum/objective/steal)) + var/datum/objective/steal/S = O + if(S.targetinfo) + for(var/item in S.targetinfo.special_equipment) + for(var/turf/T in GLOB.infiltrator_objective_items) + if(!(item in T.contents)) + new item(T) + +/datum/team/infiltrator/proc/update_objectives() + if(LAZYLEN(objectives)) + return + var/list/major_objectives = subtypesof(/datum/objective/infiltrator) + var/major = rand(MIN_MAJOR_OBJECTIVES, MAX_MAJOR_OBJECTIVES) + var/minor = rand(MIN_MINOR_OBJECTIVES, MAX_MINOR_OBJECTIVES) + for(var/i in 1 to major) + var/objective_type = pick_n_take(major_objectives) + var/datum/objective/infiltrator/objective = new objective_type + if (objective.is_possible()) + add_objective(objective) + else + qdel(objective) + for(var/i in 1 to minor) + forge_single_objective() + for(var/datum/mind/M in members) + var/datum/antagonist/infiltrator/I = M.has_antag_datum(/datum/antagonist/infiltrator) + if(I) + I.objectives |= objectives + M.announce_objectives() + +/datum/team/infiltrator/proc/get_result() + var/objectives_complete = 0 + var/objectives_failed = 0 + + for(var/datum/objective/O in objectives) + if(O.check_completion()) + objectives_complete++ + else + objectives_failed++ + + if(objectives_failed == 0 && objectives_complete > 0) + return INFILTRATION_ALLCOMPLETE + else if (objectives_complete > objectives_failed) + return INFILTRATION_MOSTCOMPLETE + else if((objectives_complete == objectives_failed) || (objectives_complete > 0 && objectives_failed > objectives_complete)) + return INFILTRATION_SOMECOMPLETE + else + return INFILTRATION_NONECOMPLETE diff --git a/yogstation/code/modules/clothing/chameleon.dm b/yogstation/code/modules/clothing/chameleon.dm index 5df355e0dd8c..95b215ebc806 100644 --- a/yogstation/code/modules/clothing/chameleon.dm +++ b/yogstation/code/modules/clothing/chameleon.dm @@ -1,4 +1,4 @@ -/datum/action/item_action/chameleon/change/update_item(obj/item/picked_item) +/datum/action/item_action/chameleon/change/update_item(obj/item/picked_item, obj/item/target = target) ..() if(ispath(picked_item, /obj/item/pda) && istype(target, /obj/item/pda)) target.light_color = initial(picked_item.light_color) diff --git a/yogstation/code/modules/clothing/head/helmet.dm b/yogstation/code/modules/clothing/head/helmet.dm new file mode 100644 index 000000000000..791bbf0bcf90 --- /dev/null +++ b/yogstation/code/modules/clothing/head/helmet.dm @@ -0,0 +1,20 @@ +/obj/item/clothing/head/helmet + var/initial_state + +/obj/item/clothing/head/helmet/Initialize() + . = ..() + initial_state = "[initial(icon_state)]" + +/obj/item/clothing/head/helmet/update_icon() + var/state = "[initial_state]" + if(attached_light) + if(attached_light.on) + state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on" + else + state += "-flight" //etc. + + icon_state = state + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_head() diff --git a/yogstation/code/modules/events/infiltrators.dm b/yogstation/code/modules/events/infiltrators.dm new file mode 100644 index 000000000000..804cac1a3ce2 --- /dev/null +++ b/yogstation/code/modules/events/infiltrators.dm @@ -0,0 +1,58 @@ +/datum/round_event_control/infiltrators + name = "Infiltrators" + typepath = /datum/round_event/ghost_role/infiltrators + + weight = 0 + max_occurrences = 1 + earliest_start = 30 MINUTES + + min_players = 23 + + gamemode_blacklist = list("nuclear","wizard","revolution","abduction","infiltration","gang","cult","clockcult","darkspawn") + +/datum/round_event_control/infiltrators/canSpawnEvent(var/players_amt, var/gamemode) + . = ..() + if(SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_IDLE) // Don't send infiltrators if the shuttle is coming! + return FALSE + var/datum/station_state/current_state = new /datum/station_state() + current_state.count() + var/station_integrity = min(PERCENT(GLOB.start_state.score(current_state)), 100) + if(station_integrity < 80) // Don't send infiltrators to a broken station! + return FALSE + +/datum/round_event/ghost_role/infiltrators + minimum_required = 3 + role_name = "infiltration team" + +/datum/round_event/ghost_role/infiltrators/spawn_role() + var/list/candidates = pollGhostCandidates("Do you wish to be considered for an infiltration team?", ROLE_INFILTRATOR) + + var/list/mob/dead/observer/chosen = list() + var/mob/dead/observer/theghost = null + if(!LAZYLEN(candidates) || candidates.len < 3) + return NOT_ENOUGH_PLAYERS + var/numagents = 4 + var/agentcount = 0 + for(var/i = 0, i[user] attempts to disconnect the circuit board from [src].
", "There appears to be something connected to [src]'s ports! You attempt to disconnect it...") + if (do_after(user,100,target = src)) + hijacking.forceMove(loc) + hijacking = null + hijack_start = 0 + update_icons() + else + to_chat(user, "You fail to remove the device.") + return + return ..() + +/mob/living/silicon/ai/update_icons() + ..() + cut_overlays() + if(hijacking) + if(!hijack_overlay) + hijack_overlay = mutable_appearance('yogstation/icons/obj/module.dmi', "ai_hijack_overlay") + hijack_overlay.layer = layer+0.1 + hijack_overlay.pixel_x = 8 + add_overlay(hijack_overlay) + icon_state = "ai-static" + else if(!hijacking && hijack_overlay) + QDEL_NULL(hijack_overlay) diff --git a/yogstation/code/modules/mob/living/silicon/ai/death.dm b/yogstation/code/modules/mob/living/silicon/ai/death.dm new file mode 100644 index 000000000000..d24d362d7e58 --- /dev/null +++ b/yogstation/code/modules/mob/living/silicon/ai/death.dm @@ -0,0 +1,11 @@ +/mob/living/silicon/ai/death(gibbed) + . = ..() + if (hijacking) + hijacking.forceMove(get_turf(src)) + visible_message("A small circuit board breaks off of [src], falling to the ground.") + to_chat(src, "dd: input/output error") + hijacking = null + if (mind?.has_antag_datum(/datum/antagonist/hijacked_ai)) + visible_message("A small circuit board breaks off of [src], breaking into a thousand tiny pieces upon hitting the ground.") + to_chat(src, "/tmp/ai-hijack: input/output error") + mind.remove_antag_datum(/datum/antagonist/hijacked_ai) diff --git a/yogstation/code/modules/mob/living/silicon/ai/life.dm b/yogstation/code/modules/mob/living/silicon/ai/life.dm new file mode 100644 index 000000000000..a3308edafb6b --- /dev/null +++ b/yogstation/code/modules/mob/living/silicon/ai/life.dm @@ -0,0 +1,14 @@ +#define HIJACK_TIME 2400 + +/mob/living/silicon/ai/proc/process_hijack() + if(hijacking) + if(prob(5)) + to_chat(src, "Warning! Exploitation detected at /dev/ttyS0!") + if(world.time >= hijack_start+HIJACK_TIME && mind) + mind.add_antag_datum(ANTAG_DATUM_HIJACKEDAI) + message_admins("[ADMIN_LOOKUPFLW(src)] has been hijacked!") + icon_state = "ai-red" + QDEL_NULL(hijacking) + update_icons() + +#undef HIJACK_TIME diff --git a/yogstation/code/modules/research/designs/tool_designs.dm b/yogstation/code/modules/research/designs/tool_designs.dm index 103d007e5644..36d239830412 100644 --- a/yogstation/code/modules/research/designs/tool_designs.dm +++ b/yogstation/code/modules/research/designs/tool_designs.dm @@ -25,4 +25,4 @@ materials = list(/datum/material/iron=500,/datum/material/silver=300,/datum/material/gold=300) build_path = /obj/item/multitool/tricorder category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING \ No newline at end of file + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/yogstation/code/modules/research/techweb/all_nodes.dm b/yogstation/code/modules/research/techweb/all_nodes.dm index d5229ff2ff74..1bb74e0eac37 100644 --- a/yogstation/code/modules/research/techweb/all_nodes.dm +++ b/yogstation/code/modules/research/techweb/all_nodes.dm @@ -13,8 +13,10 @@ /datum/techweb_node/basic_tools prereq_ids = list("base") -/datum/techweb_node/spacepod_basic - id = "spacepod_basic" + +/////////////////////////space vehicle tech///////////////////////// +/datum/techweb_node/spacevehicle_basic + id = "spacevehicle_basic" display_name = "Spacepod Construction" description = "Basic stuff to construct Spacepods. Don't crash your first spacepod into the station, especially while going more than 10 m/s." research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -28,7 +30,7 @@ description = "Keeps greytiders out of your spacepods." research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) export_price = 2750 - prereq_ids = list("spacepod_basic", "engineering") + prereq_ids = list("spacevehicle_basic", "engineering") design_ids = list("podlock_keyed", "podkey", "podmisc_tracker") /datum/techweb_node/spacepod_disabler @@ -37,7 +39,7 @@ description = "For a bit of pew pew space battles" research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) export_price = 3500 - prereq_ids = list("spacepod_basic", "weaponry") + prereq_ids = list("spacevehicle_basic", "weaponry") design_ids = list("podgun_disabler") /datum/techweb_node/spacepod_lasers @@ -82,7 +84,7 @@ description = "For bringing along victims as you fly off into the far reaches of space" research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3750) export_price = 3750 - prereq_ids = list("spacepod_basic", "adv_engi") + prereq_ids = list("spacevehicle_basic", "adv_engi") design_ids = list("podcargo_seat") /datum/techweb_node/spacepod_storage @@ -112,6 +114,43 @@ prereq_ids = list("spacepod_storage", "high_efficiency") design_ids = list("podarmor_industiral", "podarmor_sec", "podarmor_gold") +/datum/techweb_node/basic_shuttle_tech + id = "basic_shuttle_tech" + display_name = "Basic Shuttle Research" + description = "Research the technology required to create and use basic shuttles." + prereq_ids = list("bluespace_travel", "adv_engi", "spacevehicle_basic") + design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + +/datum/techweb_node/shuttle_route_upgrade + id = "shuttle_route_upgrade" + display_name = "Route Optimisation Upgrade" + description = "Research into bluespace tunnelling, allowing us to reduce flight times by up to 20%!" + prereq_ids = list("spacevehicle_basic") + design_ids = list("disk_shuttle_route") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + +/datum/techweb_node/shuttle_route_upgrade_hyper + id = "shuttle_route_upgrade_hyper" + display_name = "Hyperlane Optimisation Upgrade" + description = "Research into bluespace hyperlane, allowing us to reduce flight times by up to 40%!" + prereq_ids = list("shuttle_route_upgrade", "micro_bluespace") + design_ids = list("disk_shuttle_route_hyper") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + export_price = 5000 + +/datum/techweb_node/shuttle_route_upgrade_void + id = "shuttle_route_upgrade_void" + display_name = "Nullspace Breaching Upgrade" + description = "Research into voidspace tunnelling, allowing us to significantly reduce flight times." + prereq_ids = list("shuttle_route_upgrade_hyper", "alientech") + design_ids = list("engine_void", "disk_shuttle_route_void") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + + /datum/techweb_node/syndicate_surgery id = "syndicate_surgery" display_name = "Syndicate Surgery" diff --git a/yogstation/code/modules/shuttle/syndicate.dm b/yogstation/code/modules/shuttle/syndicate.dm new file mode 100644 index 000000000000..4cf3ff40d40f --- /dev/null +++ b/yogstation/code/modules/shuttle/syndicate.dm @@ -0,0 +1,9 @@ +/obj/machinery/computer/shuttle/syndicate/cutter + name = "syndicate infiltration cutter control" + shuttleId = "syndicatecutter" + possible_destinations = "syndicatecutter_custom;syndicatecutter_home" + +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/cutter + name = "syndicate infiltration cutter navigation computer" + shuttleId = "syndicatecutter" + shuttlePortId = "syndicatecutter_custom" diff --git a/yogstation/code/modules/uplink/uplink_item.dm b/yogstation/code/modules/uplink/uplink_item.dm index 3a08ff67c87c..8636d72eb7fa 100644 --- a/yogstation/code/modules/uplink/uplink_item.dm +++ b/yogstation/code/modules/uplink/uplink_item.dm @@ -116,6 +116,7 @@ cost = 7 manufacturer = /datum/corporation/traitor/cybersun surplus = 20 + exclude_modes = list(/datum/game_mode/infiltration) /datum/uplink_item/implants/greytide name = "Greytide Implant" @@ -132,3 +133,51 @@ cost = 40 cant_discount = TRUE +// Events +/datum/uplink_item/services + category = "Services" + include_modes = list(/datum/game_mode/infiltration, /datum/game_mode/nuclear) + surplus = 0 + restricted = TRUE + +/datum/uplink_item/services/manifest_spoof + name = "Crew Manifest Spoof" + desc = "A button capable of adding a single person to the crew manifest." + item = /obj/item/service/manifest + cost = 15 //Maybe this is too cheap?? + +/datum/uplink_item/services/fake_ion + name = "Fake Ion Storm" + desc = "Fakes an ion storm announcment. A good distraction, especially if the AI is weird anyway." + item = /obj/item/service/ion + cost = 7 + +/datum/uplink_item/services/fake_meteor + name = "Fake Meteor Announcement" + desc = "Fakes an meteor announcment. A good way to get any C4 on the station exterior, or really any small explosion, brushed off as a meteor hit." + item = /obj/item/service/meteor + cost = 7 + +/datum/uplink_item/services/fake_rod + name = "Fake Immovable Rod" + desc = "Fakes an immovable rod announcement. Good for a short-lasting distraction." + item = /obj/item/service/rodgod + cost = 6 //less likely to be believed + +//Infiltrator shit +/datum/uplink_item/infiltration + category = "Infiltration Gear" + include_modes = list(/datum/game_mode/infiltration) + surplus = 0 + +/datum/uplink_item/infiltration/pinpointer_upgrade + name = "Pinpointer Upgrade" + desc = "An infiltration pinpointer upgrade that allows pinpointers to track objective targets." + item = /obj/item/infiltrator_pinpointer_upgrade + cost = 8 + +/datum/uplink_item/infiltration/extra_stealthsuit + name = "Extra Chameleon Hardsuit" + desc = "An infiltration hardsuit, capable of changing it's appearance instantly." + item = /obj/item/clothing/suit/space/hardsuit/infiltration + cost = 10 diff --git a/yogstation/icons/obj/device.dmi b/yogstation/icons/obj/device.dmi index 41d39b67c3f9..f2b9239705e9 100644 Binary files a/yogstation/icons/obj/device.dmi and b/yogstation/icons/obj/device.dmi differ diff --git a/yogstation/icons/obj/module.dmi b/yogstation/icons/obj/module.dmi new file mode 100644 index 000000000000..557d3d01b809 Binary files /dev/null and b/yogstation/icons/obj/module.dmi differ diff --git a/yogstation/sound/ambience/antag/infiltrator.ogg b/yogstation/sound/ambience/antag/infiltrator.ogg new file mode 100644 index 000000000000..1a5835c27474 Binary files /dev/null and b/yogstation/sound/ambience/antag/infiltrator.ogg differ