diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index c48ec6146e799..bea4f3d7c2e98 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -5356,7 +5356,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/item/xenoartifact_labeler, +/obj/item/xenoarchaeology_labeler, /turf/open/floor/engine, /area/ruin/unpowered/syndicate_lava_base/science) "Zw" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 03b17c286750f..fe28cd9abf4c3 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2,12 +2,6 @@ "aaa" = ( /turf/open/space/basic, /area/space) -"aac" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/science/research) "aae" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -109,19 +103,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/engine/atmos) -"abw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/science/explab) "abx" = ( /obj/machinery/door/airlock{ name = "Kitchen"; @@ -676,6 +657,12 @@ }, /turf/open/floor/iron, /area/hallway/primary/fore) +"ahV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "ahY" = ( /obj/effect/spawner/room/threexfive, /turf/open/floor/plating, @@ -1154,6 +1141,13 @@ "aph" = ( /turf/closed/wall, /area/lawoffice) +"apm" = ( +/obj/machinery/computer/xenoarchaeology_console{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/science/misc_lab) "apt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2190,6 +2184,14 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai_upload) +"aDx" = ( +/obj/structure/closet/bombcloset, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "aDH" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -3602,10 +3604,6 @@ "aSs" = ( /turf/closed/wall, /area/janitor) -"aSI" = ( -/obj/effect/spawner/room/fivexthree, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "aSK" = ( /obj/item/soap/nanotrasen, /obj/effect/turf_decal/delivery, @@ -4480,6 +4478,13 @@ /obj/machinery/camera/directional/east, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/service) +"bbr" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/science/misc_lab) "bbs" = ( /obj/structure/window/reinforced{ dir = 8 @@ -7405,6 +7410,13 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/hallway/primary/aft) +"bHR" = ( +/obj/structure/closet/crate, +/obj/item/clothing/under/color/lightpurple, +/obj/item/stack/spacecash/c200, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "bIe" = ( /obj/structure/disposalpipe/segment, /obj/machinery/status_display/evac{ @@ -10494,6 +10506,12 @@ /obj/effect/spawner/structure/window/reinforced/prison, /turf/open/floor/plating, /area/crew_quarters/heads/hos) +"cas" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "cax" = ( /obj/structure/closet/wardrobe/black, /obj/effect/decal/cleanable/cobweb, @@ -12362,6 +12380,17 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/medical/apothecary) +"coE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "coU" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment, @@ -12651,6 +12680,17 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/closed/wall/r_wall, /area/engine/supermatter) +"cqM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Air Supply Maintenance"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cqN" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -13901,14 +13941,6 @@ }, /turf/open/floor/iron/dark, /area/medical/surgery) -"cCA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/science/explab) "cCC" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -14960,6 +14992,9 @@ /obj/machinery/modular_fabricator/exosuit_fab, /turf/open/floor/iron, /area/science/robotics/lab) +"cHX" = ( +/turf/open/floor/iron, +/area/science/misc_lab) "cIa" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -15259,12 +15294,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/secondary/command) -"cNb" = ( -/obj/effect/turf_decal/delivery, -/obj/item/xenoartifact, -/obj/machinery/xenoartifact_inbox, -/turf/open/floor/engine, -/area/science/explab) "cNe" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -15430,15 +15459,6 @@ /obj/machinery/chem_master, /turf/open/floor/iron/white, /area/medical/apothecary) -"cQm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/explab) "cQo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -15832,12 +15852,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cWr" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "cWH" = ( /obj/machinery/power/apc/auto_name/directional/west{ pixel_x = -24 @@ -15895,6 +15909,13 @@ }, /turf/open/floor/iron/dark, /area/security/prison) +"cYR" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "cZF" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain/private) @@ -16220,13 +16241,6 @@ }, /turf/open/floor/iron/freezer, /area/crew_quarters/kitchen/coldroom) -"dhf" = ( -/obj/structure/rack, -/obj/item/multitool, -/obj/item/analyzer, -/obj/item/geiger_counter, -/turf/open/floor/iron/white, -/area/science/explab) "dhN" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -16372,12 +16386,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) -"djY" = ( -/obj/structure/cable/yellow, -/obj/machinery/vending/coffee, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/wood, -/area/crew_quarters/bar/atrium) "dkp" = ( /obj/effect/turf_decal/bot_white/left, /turf/open/floor/engine/light, @@ -17375,18 +17383,6 @@ }, /turf/open/floor/catwalk_floor/iron, /area/engine/gravity_generator) -"dHB" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 - }, -/turf/open/floor/iron/white, -/area/security/brig) "dHD" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 @@ -17469,17 +17465,6 @@ }, /turf/open/floor/iron/dark, /area/security/execution/transfer) -"dIp" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "dIs" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -17677,21 +17662,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"dMp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "dMv" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -17982,6 +17952,9 @@ }, /turf/open/floor/iron/dark, /area/crew_quarters/heads/hop) +"dQU" = ( +/turf/closed/wall/r_wall, +/area/science/misc_lab) "dRx" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; @@ -18055,6 +18028,21 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/dark, /area/medical/morgue) +"dSR" = ( +/obj/machinery/sparker{ + id = "testigniter"; + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "dTb" = ( /obj/machinery/advanced_airlock_controller{ pixel_y = 24 @@ -18560,17 +18548,6 @@ }, /turf/open/floor/iron, /area/storage/primary) -"edP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/explab) "edZ" = ( /obj/machinery/computer/prisoner/management{ dir = 4 @@ -18775,15 +18752,6 @@ /obj/item/pen, /turf/open/floor/carpet/grimy, /area/chapel/office) -"eis" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Air Supply Maintenance"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/layer_manifold/visible, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "eja" = ( /obj/effect/turf_decal/bot, /obj/machinery/computer/nanite_chamber_control{ @@ -19064,6 +19032,26 @@ }, /turf/open/floor/iron, /area/science/nanite) +"epM" = ( +/obj/machinery/magnetic_controller{ + autolink = 1; + pixel_y = 3 + }, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "eqc" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -19114,21 +19102,6 @@ }, /turf/open/floor/iron, /area/quartermaster/sorting) -"eqE" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/research{ - name = "Testing Lab"; - req_access_txt = "47" - }, -/turf/open/floor/iron, -/area/science/explab) "eqT" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -19973,17 +19946,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/hallway/primary/starboard) -"eHy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/explab) "eHB" = ( /obj/machinery/door/airlock/command{ name = "Head of Security's Quarters"; @@ -20452,6 +20414,13 @@ }, /turf/open/floor/iron/white, /area/medical/virology) +"eOR" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/science/research) "ePu" = ( /obj/structure/cable{ icon_state = "1-8" @@ -20581,17 +20550,6 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/dark, /area/security/prison) -"eRL" = ( -/obj/effect/turf_decal/caution{ - dir = 8 - }, -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) "eRQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -20822,18 +20780,6 @@ "eWC" = ( /turf/closed/wall, /area/maintenance/central) -"eWV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "eXl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering{ @@ -20871,28 +20817,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/secondary/command) -"eXC" = ( -/obj/structure/table, -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science Requests Console"; - pixel_y = 30; - receive_ore_updates = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science{ - pixel_y = 8 - }, -/obj/item/xenoartifact_labeler, -/obj/item/xenoartifact_labeler{ - pixel_x = -9 - }, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers, -/turf/open/floor/iron/white, -/area/science/explab) "eXP" = ( /obj/machinery/deepfryer, /obj/effect/turf_decal/siding/white{ @@ -21127,12 +21051,33 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/dark, /area/storage/tech) +"fdb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "fdh" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 1 }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"fdo" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "fdy" = ( /obj/item/target/alien/anchored, /obj/effect/turf_decal/stripes/line{ @@ -22659,16 +22604,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /turf/open/floor/iron, /area/hallway/secondary/exit) -"fJI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/explab) "fJP" = ( /turf/closed/wall, /area/medical/genetics) @@ -22920,18 +22855,6 @@ }, /turf/open/floor/iron/dark, /area/engine/atmos) -"fQv" = ( -/obj/structure/closet/crate, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/machinery/light, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, -/area/science/explab) "fRa" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted, /obj/structure/cable/yellow{ @@ -22949,6 +22872,21 @@ /obj/machinery/camera/directional/north, /turf/open/floor/iron, /area/engine/atmos) +"fRe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "fRr" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -23194,6 +23132,9 @@ }, /turf/open/floor/iron/dark, /area/teleporter) +"fVA" = ( +/turf/open/floor/iron/stairs, +/area/science/misc_lab) "fVH" = ( /obj/structure/closet/crate, /obj/machinery/light/small{ @@ -23812,18 +23753,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/science/mixing) -"gin" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "giD" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -24877,13 +24806,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/engine/engineering) -"gDB" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "gDE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -25498,6 +25420,12 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/engine/engineering) +"gPI" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "gPN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -25672,10 +25600,6 @@ /obj/effect/spawner/randomvend/snack, /turf/open/floor/iron, /area/hallway/primary/central) -"gUK" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/science/explab) "gUQ" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -26486,12 +26410,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/carpet/grimy, /area/chapel/office) -"hnJ" = ( -/obj/structure/closet/crate, -/obj/item/clothing/under/color/lightpurple, -/obj/item/stack/spacecash/c200, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "hnR" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/effect/turf_decal/stripes{ @@ -26825,6 +26743,21 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) +"hvn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "hvq" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance"; @@ -27057,6 +26990,10 @@ }, /turf/open/floor/iron, /area/hallway/primary/aft) +"hAq" = ( +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/misc_lab) "hAw" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible/layer4, @@ -27333,6 +27270,11 @@ }, /turf/open/floor/iron, /area/medical/medbay/lobby) +"hFQ" = ( +/obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/misc_lab) "hFT" = ( /mob/living/simple_animal/hostile/retaliate/goose/vomit, /turf/open/floor/plating, @@ -27622,6 +27564,15 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, /area/medical/cryo) +"hLP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "hLZ" = ( /obj/structure/rack, /obj/effect/turf_decal/delivery, @@ -27668,9 +27619,6 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat/hallway) -"hNK" = ( -/turf/closed/wall/r_wall, -/area/science/explab) "hNM" = ( /obj/item/wrench, /obj/effect/turf_decal/stripes/line{ @@ -28555,6 +28503,22 @@ }, /turf/open/floor/iron/white, /area/medical/genetics/cloning) +"idX" = ( +/obj/structure/table, +/obj/machinery/button/ignition{ + id = "testigniter"; + pixel_x = -6; + pixel_y = 2 + }, +/obj/machinery/button/door{ + id = "testlab"; + name = "Test Chamber Blast Doors"; + pixel_x = 4; + pixel_y = 2; + req_access_txt = "55" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "iea" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -29369,13 +29333,6 @@ }, /turf/open/floor/iron/dark, /area/crew_quarters/dorms) -"irm" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "irK" = ( /obj/machinery/door/airlock/external, /obj/machinery/atmospherics/pipe/layer_manifold{ @@ -29772,6 +29729,12 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white, /area/medical/surgery) +"iAV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "iBi" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -30217,6 +30180,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/crew_quarters/fitness) +"iJU" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "iJZ" = ( /obj/machinery/door/poddoor/preopen{ id = "maint2" @@ -30559,6 +30528,13 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) +"iRZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/science/misc_lab) "iSm" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -30658,18 +30634,6 @@ }, /turf/open/floor/wood, /area/lawoffice) -"iUg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/explab) "iUl" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -30829,11 +30793,6 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron, /area/security/brig) -"iYw" = ( -/obj/effect/turf_decal/box/corners, -/obj/machinery/camera/directional/east, -/turf/open/floor/engine, -/area/science/explab) "iYy" = ( /obj/machinery/computer/cryopod{ pixel_y = 25 @@ -31605,6 +31564,12 @@ /obj/item/toy/plush/moth/witchwing, /turf/open/floor/carpet/green, /area/medical/exam_room) +"jnU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "jnV" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -31967,10 +31932,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/vacant_room/commissary) -"jvb" = ( -/obj/machinery/light/small, -/turf/open/floor/engine, -/area/science/explab) "jvd" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -32052,25 +32013,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/janitor) -"jwC" = ( -/obj/machinery/computer/xenoartifact_console{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_x = 1; - pixel_y = 28 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_x = 24 - }, -/turf/open/floor/iron, -/area/science/explab) "jwN" = ( /obj/structure/table, /obj/item/aiModule/supplied/freeform, @@ -32746,6 +32688,21 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) +"jJo" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "jJp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/iron, @@ -33676,6 +33633,10 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) +"kaF" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/science/misc_lab) "kaV" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -34282,6 +34243,15 @@ }, /turf/open/floor/prison/dark, /area/security/prison) +"kpS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "kqg" = ( /obj/machinery/camera/directional/west, /turf/open/floor/iron/dark, @@ -34702,14 +34672,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"kvH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/xenoartifact, -/turf/open/floor/iron/white, -/area/science/explab) "kvS" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 @@ -35098,6 +35060,31 @@ }, /turf/open/floor/iron, /area/engine/atmos) +"kEl" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber"; + req_access_txt = "47" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "kEM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -35150,6 +35137,10 @@ /obj/machinery/oven, /turf/open/floor/iron/checker, /area/crew_quarters/kitchen) +"kFf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab) "kFl" = ( /obj/effect/landmark/start/medical_doctor, /obj/effect/turf_decal/tile/blue{ @@ -35476,12 +35467,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) -"kJV" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "kKt" = ( /obj/machinery/digital_clock/directional/east, /turf/open/floor/iron/white/side{ @@ -35976,16 +35961,6 @@ }, /turf/open/floor/iron, /area/crew_quarters/fitness) -"kTY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "kUg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -36250,6 +36225,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/prison, /area/security/prison) +"kZx" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "kZy" = ( /obj/effect/turf_decal/tile/white, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -37340,17 +37322,13 @@ }, /turf/open/floor/iron, /area/crew_quarters/dorms) -"lur" = ( -/obj/machinery/magnetic_controller{ - autolink = 1; - pixel_y = 3 - }, -/obj/structure/table, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +"luI" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, -/area/science/explab) +/area/science/misc_lab) "lvf" = ( /obj/machinery/door/airlock/public/glass{ name = "Cell 3" @@ -37517,6 +37495,19 @@ }, /turf/open/floor/iron/dark, /area/bridge) +"lyw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/science/misc_lab) "lyA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -38064,6 +38055,19 @@ }, /turf/open/floor/wood, /area/lawoffice) +"lLP" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "lMa" = ( /obj/structure/table, /obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, @@ -38345,19 +38349,6 @@ }, /turf/open/floor/wood, /area/library) -"lUw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "lUH" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -38383,6 +38374,9 @@ }, /turf/open/floor/iron/dark, /area/security/main) +"lVh" = ( +/turf/open/floor/engine, +/area/science/misc_lab) "lVr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -38941,6 +38935,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/hallway) +"mkq" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "mkw" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -40114,12 +40114,6 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) -"mMW" = ( -/obj/structure/target_stake, -/obj/machinery/magnetic_module, -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/science/explab) "mNg" = ( /obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 1 @@ -41053,6 +41047,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/iron/dark/textured_large, /area/maintenance/disposal/incinerator) +"neV" = ( +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/misc_lab) "nfd" = ( /obj/structure/table/reinforced, /obj/machinery/recharger{ @@ -41123,13 +41122,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/hallway/primary/starboard) -"nhM" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/item/storage/firstaid/regular, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/iron/white, -/area/science/explab) "nhO" = ( /obj/structure/closet/wardrobe/grey, /obj/machinery/requests_console{ @@ -41246,17 +41238,6 @@ }, /turf/open/floor/iron/dark, /area/bridge) -"nkR" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/science/explab) "nkW" = ( /obj/machinery/porta_turret/ai{ dir = 4; @@ -42405,10 +42386,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/grid/steel, /area/hydroponics) -"nHi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/science/explab) +"nHp" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "nHV" = ( /obj/machinery/light/small{ dir = 1 @@ -42859,6 +42843,23 @@ }, /turf/open/floor/iron, /area/engine/break_room) +"nQR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 6 + }, +/obj/item/taperecorder, +/obj/item/folder/white, +/obj/item/folder/white, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "nQW" = ( /obj/structure/table/wood, /obj/item/clothing/under/misc/burial, @@ -42961,6 +42962,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/science/storage) +"nSv" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nSD" = ( /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -43305,13 +43316,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/heads/hop) -"nYF" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/camera/directional/north, -/turf/open/floor/iron/white, -/area/science/explab) "nYO" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/item/shard, @@ -43778,6 +43782,19 @@ }, /turf/open/floor/prison/dark, /area/security/prison) +"oim" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/turf/open/floor/iron, +/area/science/misc_lab) "ojA" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /obj/effect/turf_decal/trimline/dark_blue/filled/shrink_cw{ @@ -44009,6 +44026,14 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/crew_quarters/dorms) +"opm" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "opv" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 4 @@ -44355,6 +44380,18 @@ }, /turf/open/floor/iron/dark, /area/crew_quarters/theatre/backstage) +"owP" = ( +/obj/structure/closet/crate, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/machinery/light, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "oxe" = ( /obj/machinery/requests_console{ department = "Cargo Bay"; @@ -44628,6 +44665,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/maintenance/disposal/incinerator) +"oDc" = ( +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley X, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley X"; + real_name = "Pugley X" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "oDF" = ( /obj/machinery/light, /turf/open/floor/plating, @@ -44656,6 +44702,10 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/vacant_room/commissary) +"oEN" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/misc_lab) "oER" = ( /obj/structure/chair/office/light, /obj/effect/landmark/start/chief_medical_officer, @@ -44717,6 +44767,13 @@ }, /turf/open/space/basic, /area/space) +"oFT" = ( +/obj/structure/target_stake, +/obj/machinery/magnetic_module, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/engine, +/area/science/misc_lab) "oGj" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -44919,17 +44976,6 @@ }, /turf/open/floor/prison, /area/security/prison) -"oKy" = ( -/obj/structure/closet/bombcloset, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/science/explab) "oKB" = ( /obj/effect/turf_decal/siding/thinplating_new/corner{ dir = 1 @@ -45319,6 +45365,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron/white, /area/medical/virology) +"oTg" = ( +/obj/machinery/camera/directional/north, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "oTT" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/closet, @@ -45968,6 +46018,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/maintenance/disposal/incinerator) +"pim" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "piw" = ( /obj/effect/turf_decal/siding/thinplating_new/corner{ dir = 8 @@ -46021,12 +46077,6 @@ }, /turf/open/floor/iron, /area/engine/engineering) -"plg" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "plh" = ( /obj/structure/disposalpipe/segment, /obj/structure/grille, @@ -46281,6 +46331,35 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/engine/engineering) +"poW" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber"; + req_access_txt = "47" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "ppc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -46408,6 +46487,15 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"pro" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "prs" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -46981,24 +47069,6 @@ }, /turf/open/floor/prison, /area/security/prison) -"pCg" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/power/apc/auto_name/directional/south{ - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/iron/white, -/area/science/explab) "pCj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -47015,23 +47085,15 @@ /obj/effect/landmark/start/captain, /turf/open/floor/iron/dark, /area/crew_quarters/heads/captain) -"pCL" = ( -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar, -/obj/effect/decal/cleanable/dirt, -/obj/item/hand_labeler, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/explab) "pCZ" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/item/reagent_containers/cup/glass/bottle/holywater, /turf/open/floor/carpet/grimy, /area/chapel/office) +"pDp" = ( +/turf/closed/wall, +/area/science/misc_lab) "pDu" = ( /obj/machinery/computer/nanite_cloud_controller, /obj/effect/turf_decal/bot, @@ -47065,23 +47127,18 @@ }, /turf/open/floor/iron, /area/science/lab) -"pDK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/science/explab) "pDL" = ( /obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/science/xenobiology) +"pDM" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "pEg" = ( /obj/structure/chair/fancy/corp{ dir = 4 @@ -47166,6 +47223,21 @@ dir = 8 }, /area/teleporter) +"pFz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Testing Lab Maintenance"; + req_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "pGq" = ( /obj/machinery/light{ dir = 8 @@ -48304,6 +48376,18 @@ dir = 5 }, /area/science/research) +"qft" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/white, +/area/security/brig) "qfD" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -48341,22 +48425,21 @@ /obj/effect/turf_decal/pool, /turf/open/floor/iron, /area/crew_quarters/fitness) -"qhe" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 2 +"qhc" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 }, -/turf/open/floor/iron, -/area/science/explab) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "qhk" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /obj/effect/turf_decal/tile/dark_green/half/contrasted{ @@ -48382,6 +48465,12 @@ }, /turf/open/floor/iron, /area/science/nanite) +"qhU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "qia" = ( /obj/machinery/door/airlock/science{ name = "exploration Shuttle Dock"; @@ -48463,6 +48552,16 @@ }, /turf/open/floor/iron/dark, /area/bridge) +"qjc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/vending/sticker, +/turf/open/floor/wood, +/area/crew_quarters/bar/atrium) "qjl" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -48829,6 +48928,18 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"qre" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "qrl" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -48925,16 +49036,6 @@ }, /turf/open/floor/grass, /area/security/prison) -"qto" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar/atrium) "qtv" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /obj/structure/cable/yellow{ @@ -48987,16 +49088,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/secondary/command) -"quz" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "quO" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -50032,18 +50123,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/genetics/cloning) -"qPT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/iron/white, -/area/science/explab) "qQb" = ( /obj/structure/chair/office{ dir = 1 @@ -50183,9 +50262,6 @@ }, /turf/open/floor/iron, /area/crew_quarters/fitness) -"qTI" = ( -/turf/open/floor/iron/white, -/area/science/explab) "qTN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -50371,15 +50447,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/storage/eva) -"qWW" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "qXc" = ( /obj/effect/turf_decal/tile/dark_green/half/contrasted{ dir = 4 @@ -50932,6 +50999,21 @@ /obj/item/food/donut/chaos, /turf/open/floor/prison, /area/security/prison) +"rfK" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "rfQ" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/hos) @@ -51466,6 +51548,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/techmaint, /area/teleporter) +"rqC" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron, +/area/science/misc_lab) "rqE" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/green/visible, @@ -51707,10 +51796,6 @@ }, /turf/open/floor/iron/dark, /area/crew_quarters/heads/captain) -"rte" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "rtv" = ( /obj/effect/landmark/start/ai, /obj/item/radio/intercom{ @@ -51795,6 +51880,15 @@ }, /turf/open/floor/iron/cafeteria_red, /area/crew_quarters/bar) +"ruw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "ruD" = ( /obj/machinery/gibber, /obj/effect/turf_decal/siding/white{ @@ -52982,21 +53076,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) -"rRH" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/iron, -/area/science/explab) "rRU" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -53063,17 +53142,6 @@ /obj/machinery/telecomms/bus/preset_four, /turf/open/floor/circuit/green, /area/tcommsat/server) -"rTw" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/science/explab) "rTO" = ( /obj/structure/table, /obj/item/taperecorder, @@ -53286,6 +53354,22 @@ }, /turf/open/floor/plating/rust, /area/maintenance/starboard/fore) +"rYQ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "rZb" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -53410,6 +53494,28 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/catwalk_floor, /area/hallway/secondary/entry) +"sbs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/structure/table, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "sbv" = ( /obj/effect/landmark/start/assistant, /obj/structure/chair/fancy/comfy{ @@ -53556,9 +53662,6 @@ "sdX" = ( /turf/closed/wall, /area/quartermaster/office) -"sei" = ( -/turf/open/floor/engine, -/area/science/explab) "sfk" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/stripes/line, @@ -54074,12 +54177,6 @@ }, /turf/open/floor/iron/white, /area/medical/virology) -"sqJ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "sqR" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 @@ -54474,21 +54571,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/aft) -"sBB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/maintenance{ - name = "Testing Lab Maintenance"; - req_access_txt = "47" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "sBN" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -54794,6 +54876,11 @@ }, /turf/open/floor/prison/dark, /area/security/execution/transfer) +"sFS" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "sFW" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -55134,6 +55221,16 @@ }, /turf/open/floor/iron, /area/crew_quarters/dorms) +"sLZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/stairs, +/area/science/misc_lab) "sMn" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -55168,6 +55265,16 @@ }, /turf/open/floor/catwalk_floor, /area/quartermaster/storage) +"sMA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "sMQ" = ( /obj/effect/decal/cleanable/oil, /obj/item/cigbutt, @@ -55924,6 +56031,22 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark, /area/crew_quarters/theatre/backstage) +"tbH" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "tcd" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -56636,6 +56759,12 @@ }, /turf/open/floor/iron/dark, /area/bridge) +"tpW" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron, +/area/science/misc_lab) "tqF" = ( /turf/closed/wall/r_wall, /area/maintenance/fore/secondary) @@ -57413,6 +57542,32 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/hor) +"tDD" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/mineral/plasma, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "tEj" = ( /obj/machinery/computer/objective{ dir = 8 @@ -57559,12 +57714,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/xenobiology) -"tGr" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "tGD" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -57712,6 +57861,14 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai) +"tIi" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "tIl" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -57737,19 +57894,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) -"tIA" = ( -/turf/closed/wall, -/area/science/explab) -"tIE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "tIL" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -57783,10 +57927,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) -"tJm" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "tJF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -57861,6 +58001,12 @@ }, /turf/open/floor/iron/dark, /area/teleporter) +"tKF" = ( +/obj/structure/cable/yellow, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/crew_quarters/bar/atrium) "tKV" = ( /obj/machinery/telecomms/broadcaster/preset_left, /obj/structure/cable/yellow{ @@ -59107,6 +59253,16 @@ }, /turf/open/floor/catwalk_floor, /area/maintenance/solars/port/aft) +"unl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron, +/area/science/misc_lab) "unH" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -59557,10 +59713,6 @@ }, /turf/open/floor/iron/white, /area/medical/patients_rooms) -"uuf" = ( -/obj/machinery/camera/directional/north, -/turf/open/floor/engine, -/area/science/explab) "uvs" = ( /obj/machinery/power/solar_control{ id = "auxsolareast"; @@ -59582,6 +59734,13 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/iron, /area/quartermaster/exploration_prep) +"uvZ" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/crowbar, +/obj/item/hand_labeler, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "uwn" = ( /obj/effect/landmark/event_spawn, /obj/machinery/holopad, @@ -59878,6 +60037,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/science/nanite) +"uCP" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/science/research) "uCW" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -60137,11 +60302,6 @@ }, /turf/open/floor/iron/dark, /area/engine/engineering) -"uIa" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "uIp" = ( /obj/machinery/camera/directional/north, /turf/open/floor/iron/white, @@ -60330,6 +60490,15 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, /area/security/prison) +"uOn" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/turf/open/floor/engine, +/area/science/misc_lab) "uOz" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -60613,6 +60782,12 @@ }, /turf/open/floor/iron, /area/security/brig) +"uVj" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/stairs, +/area/science/misc_lab) "uVJ" = ( /obj/effect/landmark/start/assistant, /obj/structure/chair/stool/directional/west, @@ -61196,6 +61371,11 @@ }, /turf/open/floor/iron/checker, /area/crew_quarters/kitchen) +"vgD" = ( +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/misc_lab) "vgU" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/iron/dark, @@ -61341,6 +61521,23 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron/dark, /area/medical/storage) +"vkr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "vkx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -61642,15 +61839,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"vpk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "vpD" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -61981,6 +62169,28 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/carpet/black, /area/crew_quarters/bar/atrium) +"vwW" = ( +/obj/structure/table, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science Requests Console"; + pixel_y = 30; + receive_ore_updates = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/item/clothing/neck/stethoscope, +/obj/item/storage/firstaid/regular, +/obj/item/healthanalyzer{ + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "vwZ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -62003,6 +62213,16 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/hydroponics) +"vxY" = ( +/obj/machinery/door/airlock/research{ + name = "Testing Lab"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/science/misc_lab) "vyz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -62315,6 +62535,11 @@ }, /turf/open/floor/wood, /area/lawoffice) +"vDJ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/turf/open/floor/engine, +/area/science/misc_lab) "vEj" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -62409,15 +62634,6 @@ }, /turf/open/floor/iron, /area/security/checkpoint/science) -"vFO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "vFT" = ( /obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ @@ -62560,19 +62776,6 @@ }, /turf/open/floor/iron, /area/security/brig) -"vHK" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/scientist, -/obj/machinery/computer/security/telescreen/research{ - pixel_y = 32 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "vHT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -62595,12 +62798,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"vIL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/explab) "vIR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -63099,14 +63296,6 @@ }, /turf/open/floor/plating/rust, /area/maintenance/starboard/fore) -"vSB" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "vSG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -63329,14 +63518,6 @@ }, /turf/open/floor/iron/white, /area/medical/genetics) -"vYA" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance/two, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "vYB" = ( /obj/machinery/light/small{ dir = 8 @@ -64228,6 +64409,22 @@ }, /turf/open/floor/carpet/blue, /area/bridge/meeting_room) +"woB" = ( +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/rack, +/obj/machinery/airalarm/directional/west{ + pixel_x = -23 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "woI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -65193,21 +65390,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/teleporter) -"wKO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "wKW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -66081,30 +66263,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) -"xeZ" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/machinery/airalarm/directional/west{ - pixel_x = -23 - }, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/explab) "xfs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 @@ -66203,20 +66361,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/noslip/standard, /area/security/prison) -"xhx" = ( -/obj/machinery/holopad, -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, -/turf/open/floor/iron/white, -/area/science/explab) "xhD" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance"; @@ -66271,11 +66415,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain) -"xjE" = ( -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/science/research) "xjG" = ( /obj/machinery/computer/crew, /obj/effect/turf_decal/tile/blue/fourcorners/contrasted, @@ -67349,6 +67488,21 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"xFY" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xFZ" = ( /obj/structure/closet/firecloset, /obj/machinery/light{ @@ -67546,10 +67700,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron, /area/quartermaster/office) -"xKf" = ( -/obj/machinery/light, -/turf/open/floor/engine, -/area/science/explab) "xKk" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -67590,14 +67740,6 @@ }, /turf/open/floor/iron, /area/construction/mining/aux_base) -"xLy" = ( -/obj/machinery/door/airlock/research{ - name = "Testing Lab"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/science/explab) "xLZ" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/item/clothing/under/costume/kilt, @@ -67709,13 +67851,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/rust, /area/maintenance/starboard/fore) -"xOj" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/explab) "xOk" = ( /obj/machinery/power/apc/auto_name/directional/east{ pixel_x = 24 @@ -67945,13 +68080,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/medical/virology) -"xSE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/science/explab) "xSY" = ( /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "8;12" @@ -67994,6 +68122,14 @@ /obj/item/clothing/mask/gas/sechailer, /turf/open/floor/iron/dark, /area/security/main) +"xTu" = ( +/obj/machinery/power/floodlight, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "xTE" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 @@ -68267,10 +68403,6 @@ }, /turf/open/floor/iron, /area/quartermaster/sorting) -"xZn" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "xZx" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -68637,6 +68769,14 @@ }, /turf/open/floor/iron/freezer, /area/security/prison) +"ygY" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab) "yha" = ( /obj/structure/sign/departments/minsky/supply/cargo{ pixel_x = -32 @@ -68797,6 +68937,17 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/security/brig) +"ykE" = ( +/obj/structure/rack, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ykJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -99001,7 +99152,7 @@ mTZ fZH vsD jvW -dHB +qft gBM eHR fEl @@ -102639,7 +102790,7 @@ ndY uSC cik qPv -qto +qjc prs prs tNl @@ -105984,7 +106135,7 @@ ruT sVx tgj tgj -djY +tKF hUm aYV xPB @@ -114504,16 +114655,16 @@ bJN bJN bJN bJN -tIA -tIA -tIA -tIA -tIA -tIA -hNK -hNK -hNK -hNK +bJN +bDb +bDb +bDb +bDb +bDb +bDb +cNW +cNW +cNW cNW cNW dAs @@ -114760,17 +114911,17 @@ nti bsX bzE bzE -xjE -rte -oKy -nkR -xeZ -pCL -tIA -rTw -lur -rRH -sBB +uCP +kFf +aDx +opm +woB +uvZ +dQU +pDM +cOe +xFY +gjW gjW ofL mkF @@ -115017,17 +115168,17 @@ uCI dJK sSq sSq -aac -xLy -gUK -cCA -qPT -lUw -eqE -edP -eHy -pDK -hNK +eOR +vxY +luI +bbr +lyw +lLP +pFz +gjW +coE +hvn +cNW cNW eOa cNW @@ -115274,17 +115425,17 @@ bBD xiZ bBD bBD -xjE -rte -nHi -vIL -kTY -xOj -vSB -iUg -cQm -abw -hNK +uCP +kFf +ahV +cHX +ruw +tIi +dQU +cNW +cqM +cNW +cNW cOe ene cOe @@ -115531,17 +115682,17 @@ bDn ldn bFS bJT -tIA -tIA -nYF -dhf -tIE -fQv -tIA -uuf -sei -sei -hNK +bhA +pDp +unl +vkr +ruw +owP +dQU +oTg +gPI +cOx +cNW cOe ene cOe @@ -115788,19 +115939,19 @@ bGc uPC bGc bEs -tIA -eXC -qTI -xhx -vpk -nhM -tIA -sqJ -sei -jvb -hNK +bEC +vwW +sMA +oim +kpS +nHp +dQU +cdR +sFS +cOe +cNW cOe -dMp +fRe jty jty cti @@ -116045,19 +116196,19 @@ mJd uht nWM bXr -tIA -vHK -nHi -qTI -vFO -pCg -tIA -sei -sei -sei -hNK +bEC +tDD +fdb +sbs +tpW +epM +dQU +cdR +pro +bNB +cNW cOe -gin +jVl cOe cOe cNW @@ -116302,19 +116453,19 @@ mPh uht bSh vDl -tIA -jwC -qhe -xSE -fJI -kvH -tIA -sei -mMW -sei -hNK +bEC +nQR +ahV +cHX +oDc +pDp +pDp +dQU +dQU +dQU +dQU cOe -gin +jVl cOe cOe cNW @@ -116559,19 +116710,19 @@ mPh uht bUn lEW -hNK -hNK -vSB -dIp -vSB -hNK -hNK -hNK -hNK -hNK -hNK +bEC +rYQ +ahV +kaF +cHX +jnU +lVh +cas +lVh +lVh +dQU cNW -wKO +qre cNW cNW cNW @@ -116816,19 +116967,19 @@ mPh uht bSh kwA -hNK -sei -tGr -eRL -plg -sei -hNK -cdR -vYA -cOx -cNW -bNB -gin +bEC +jJo +iAV +rqC +cHX +jnU +lVh +lVh +lVh +oFT +dQU +cOe +jVl cOT aaa cOT @@ -117073,19 +117224,19 @@ mPh uht bUo bNq -hNK -kJV -qWW -cNb -xZn -xKf -hNK -cdR -quz -tJm -eis -irm -eWV +bEC +rfK +iRZ +apm +idX +jnU +lVh +iJU +lVh +lVh +dQU +mkq +nSv cOT aaa cOT @@ -117330,17 +117481,17 @@ tjy uht piD uSl -hNK -sei -cWr -gDB -iYw -sei -hNK -cNW -cNW -cNW -cNW +dQU +kEl +dQU +ygY +ygY +ygY +ygY +dQU +dQU +dQU +dQU cNW chz cNW @@ -117587,19 +117738,19 @@ rxf uht bUn oUq -hNK -hNK -hNK -hNK -hNK -hNK -hNK -cOe -cOe -aSI +dQU +tbH +dQU +vgD +lVh +lVh +uOn +dQU +bHR +vuV +cOx cNW -uIa -jVl +ykE ciL ceR cBL @@ -117844,18 +117995,18 @@ pUL rxO bUn wfU -bEC -cOe -cOe -cOe -cOe -ahY +dQU +poW +dQU +neV +pim +hAq +vDJ +dQU +cNW +cbv cNW -cOe -cOe -cOe cNW -bNA oed vHT vHT @@ -118101,18 +118252,18 @@ pEC bFU vCt bVs -bEC -cOe -cOe -cOe +dQU +qhc +dSR +sLZ +hLP +lVh +oEN +dQU cOe cOe +ahO cNW -cOe -cOe -cOe -cbv -cOe vYY ciL cjE @@ -118358,18 +118509,18 @@ nWo bFU oks bGz -bEC +dQU +fdo +cYR +fVA +qhU +hFQ +lVh +dQU cOe cOe cOe -cOe -cOe -cNW -cOe -cOe -cOe -cNW -cOe +cbv vYY cNW cjD @@ -118615,18 +118766,18 @@ flc vPE kwK bVt -bEC -cNW -cNW -bYr -cNW -cNW -cNW +dQU +xTu +kZx +uVj +lVh +lVh +lVh +dQU cOe cOe cOe cNW -cOe vYY nDl cjD @@ -118872,18 +119023,18 @@ bEC bEC bEC bEC -bEC -hnJ -vuV -vuV -bMB -cOx +dQU +dQU +dQU +dQU +dQU +dQU +dQU +dQU cNW cNW cNW cNW -cNW -cOe uQB iQe pHT diff --git a/_maps/map_files/CorgStation/CorgStation.dmm b/_maps/map_files/CorgStation/CorgStation.dmm index 971e9078ca558..fe94c99729ac3 100644 --- a/_maps/map_files/CorgStation/CorgStation.dmm +++ b/_maps/map_files/CorgStation/CorgStation.dmm @@ -371,13 +371,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/engine/storage_shared) -"adH" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/closet/radiation, -/turf/open/floor/iron/dark, -/area/science/explab) "adI" = ( /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, @@ -1957,11 +1950,6 @@ dir = 5 }, /area/crew_quarters/heads/hor) -"axN" = ( -/obj/effect/turf_decal/caution, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) "axT" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, @@ -4367,17 +4355,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/science/research) -"bdQ" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "bdZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7450,6 +7427,10 @@ /obj/machinery/fax/eng, /turf/open/floor/iron, /area/engine/engineering) +"ceB" = ( +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/explab) "ceJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7538,15 +7519,6 @@ }, /turf/open/floor/wood, /area/library) -"cgx" = ( -/obj/machinery/camera{ - dir = 9 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "cgE" = ( /obj/machinery/mass_driver{ dir = 4; @@ -7655,6 +7627,13 @@ }, /turf/open/floor/iron/white, /area/medical/storage) +"chS" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "cic" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -8288,12 +8267,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/quartermaster/storage) -"cvq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "cvs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -9274,16 +9247,6 @@ }, /turf/open/floor/iron/white, /area/medical/cryo) -"cOb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "cOl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -10818,19 +10781,6 @@ }, /turf/open/floor/carpet/red, /area/security/detectives_office) -"dqf" = ( -/obj/structure/table/optable, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 - }, -/turf/open/floor/iron/white, -/area/security/brig/medbay) "dqj" = ( /obj/item/radio/intercom{ pixel_x = -28; @@ -11336,6 +11286,14 @@ }, /turf/open/floor/plating, /area/quartermaster/miningdock) +"dAw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/obj/machinery/camera{ + dir = 9 + }, +/turf/open/floor/engine, +/area/science/explab) "dAF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -11955,12 +11913,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/primary/central) -"dLw" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "dLB" = ( /obj/structure/chair/fancy/comfy{ color = "#666666"; @@ -12064,6 +12016,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/crew_quarters/toilet) +"dMy" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/xenoarchaeology_console, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "dMB" = ( /obj/structure/cable{ icon_state = "1-4" @@ -12175,6 +12136,23 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron/dark, /area/maintenance/starboard/secondary) +"dOv" = ( +/obj/item/storage/toolbox/mechanical, +/obj/structure/table, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "dOz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13977,6 +13955,19 @@ /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, /turf/open/floor/iron/white, /area/science/xenobiology) +"etp" = ( +/obj/structure/table/optable, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/white, +/area/security/brig/medbay) "etx" = ( /obj/structure/table/reinforced, /obj/item/clothing/suit/jacket/straight_jacket, @@ -14362,6 +14353,26 @@ /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms/server, /area/tcommsat/server) +"eyQ" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/table, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/science, +/turf/open/floor/iron/dark, +/area/science/explab) "eyV" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, @@ -14675,17 +14686,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, /turf/open/floor/iron, /area/medical/storage) -"eEH" = ( -/obj/machinery/camera/directional/west, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "eFA" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -15536,19 +15536,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"eYL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table/reinforced, -/obj/item/healthanalyzer, -/obj/item/storage/firstaid/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/science/explab) "eYN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance_hatch{ @@ -15677,10 +15664,6 @@ }, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) -"faR" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/science/explab) "fbb" = ( /obj/effect/turf_decal/plaque{ icon_state = "L7" @@ -16373,19 +16356,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"fkM" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/computer/xenoartifact_console, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_x = -24 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "fkQ" = ( /obj/machinery/power/smes/engineering{ charge = 2e+006 @@ -17504,14 +17474,6 @@ /obj/effect/spawner/room/threexthree, /turf/open/floor/plating, /area/maintenance/fore) -"fBV" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Experimentation Chamber"; - req_access_txt = "8"; - security_level = 6 - }, -/turf/open/floor/plating, -/area/science/explab) "fBX" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -17939,6 +17901,21 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) +"fKc" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "fKl" = ( /obj/machinery/firealarm{ dir = 8; @@ -18643,6 +18620,16 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) +"fWN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/engine, +/area/science/explab) "fXv" = ( /obj/machinery/door/airlock/research{ name = "Mech Bay"; @@ -19865,15 +19852,6 @@ }, /turf/open/floor/engine, /area/engine/engine_room) -"gqi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "gqA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -20161,19 +20139,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"gwz" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/assembly/signaler, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/item/stock_parts/cell, -/turf/open/floor/iron/dark, -/area/science/explab) "gwC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -20692,6 +20657,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/primary/fore) +"gES" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/scale, +/turf/open/floor/engine, +/area/science/explab) "gET" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -20806,15 +20776,6 @@ }, /turf/open/floor/iron/dark, /area/security/brig) -"gGS" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/engine, -/area/science/explab) "gHf" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -22054,6 +22015,13 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"hbS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "hbU" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -22443,18 +22411,6 @@ }, /turf/open/floor/wood, /area/security/detectives_office) -"hhO" = ( -/obj/structure/table/reinforced, -/obj/item/xenoartifact_labeler, -/obj/item/xenoartifact_labeler{ - pixel_x = -10 - }, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/science/explab) "hhV" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -23196,6 +23152,15 @@ }, /turf/open/floor/iron, /area/science/robotics/lab) +"htS" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/make_non_slip, +/turf/open/floor/iron/white, +/area/science/explab) "htT" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -25171,12 +25136,6 @@ /obj/item/storage/secure/briefcase, /turf/open/floor/iron/dark, /area/crew_quarters/heads/hos) -"hZJ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "hZM" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/bot_white, @@ -26444,6 +26403,15 @@ }, /turf/open/floor/iron, /area/science/mixing) +"isL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/bombcloset, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/science/explab) "isR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -26862,6 +26830,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/wood, /area/crew_quarters/bar) +"izJ" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "izP" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -28787,19 +28761,6 @@ }, /turf/open/floor/plating/asteroid, /area/maintenance/port) -"jfS" = ( -/obj/machinery/light_switch{ - pixel_x = 1; - pixel_y = 28 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/science/explab) "jfW" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -29221,6 +29182,15 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/engine/engine_room) +"jpj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "jpk" = ( /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, @@ -29610,15 +29580,6 @@ }, /turf/open/floor/iron/dark, /area/security/main) -"jwL" = ( -/obj/machinery/power/apc/auto_name/directional/west{ - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/iron/white, -/area/science/explab) "jwW" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -31410,10 +31371,6 @@ /obj/machinery/fax/sci, /turf/open/floor/iron, /area/science/lab) -"kcb" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/science/explab) "kcl" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -32171,6 +32128,10 @@ }, /turf/open/floor/iron/dark, /area/quartermaster/warehouse) +"knU" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "koc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -32198,6 +32159,9 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/lobby) +"koq" = ( +/turf/open/floor/plating, +/area/science/explab) "kox" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -32365,12 +32329,6 @@ }, /turf/open/floor/carpet/black, /area/crew_quarters/heads/hos) -"kqf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/explab) "kqo" = ( /obj/structure/chair/stool, /obj/structure/cable/yellow{ @@ -33712,6 +33670,18 @@ }, /turf/open/floor/iron, /area/engine/atmos) +"kND" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "kNN" = ( /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/iron/dark, @@ -34024,13 +33994,6 @@ }, /turf/open/floor/iron/dark, /area/quartermaster/miningdock) -"kUL" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/explab) "kUQ" = ( /obj/structure/window/reinforced{ dir = 1 @@ -34225,10 +34188,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/aft) -"kXF" = ( -/obj/structure/closet/bombcloset, -/turf/open/floor/iron/dark, -/area/science/explab) "kXG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -34818,6 +34777,10 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/carpet/green, /area/crew_quarters/bar) +"liC" = ( +/obj/machinery/vending/sticker, +/turf/open/floor/carpet/royalblue, +/area/crew_quarters/theatre) "liF" = ( /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/AIsatextAP) @@ -38420,15 +38383,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/hallway/secondary/entry) -"mmF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/xenoartifact, -/obj/structure/rack, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/science/explab) "mmK" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/tile/brown/half/contrasted, @@ -41830,6 +41784,15 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"nrc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "nre" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42553,10 +42516,6 @@ }, /turf/open/floor/iron, /area/hydroponics) -"nDQ" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "nEf" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron, @@ -43847,12 +43806,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat/foyer) -"nZd" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/xenoartifact_inbox, -/obj/item/xenoartifact, -/turf/open/floor/engine, -/area/science/explab) "nZl" = ( /obj/effect/turf_decal/tile/purple/half/contrasted, /turf/open/floor/iron, @@ -45430,6 +45383,18 @@ }, /turf/open/floor/iron/dark, /area/maintenance/starboard/central) +"ozw" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "ozK" = ( /obj/machinery/computer/holodeck, /obj/effect/turf_decal/delivery, @@ -46907,6 +46872,14 @@ }, /turf/open/floor/iron/dark/telecomms, /area/tcommsat/server) +"pbC" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/conductor, +/turf/open/floor/engine, +/area/science/explab) "pbP" = ( /obj/machinery/telecomms/server/presets/command, /turf/open/floor/circuit/telecomms/server, @@ -47279,19 +47252,6 @@ }, /turf/open/floor/iron, /area/engine/engine_room) -"piY" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/analyzer, -/obj/item/multitool, -/obj/item/geiger_counter, -/turf/open/floor/iron/dark, -/area/science/explab) "pjj" = ( /obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/components/trinary/filter/critical, @@ -47482,6 +47442,21 @@ /obj/structure/chair, /turf/open/floor/iron, /area/security/brig/dock) +"pon" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron/white, +/area/science/explab) "poB" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/manifold/supply/visible, @@ -48315,6 +48290,30 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"pBG" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "testlab"; + name = "Test Chamber Blast Doors"; + pixel_y = 38 + }, +/turf/open/floor/iron/white, +/area/science/explab) "pCa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -48401,6 +48400,18 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) +"pDI" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "pDP" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -48520,6 +48531,13 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron, /area/hallway/primary/central) +"pFE" = ( +/obj/item/radio/intercom{ + pixel_x = 29; + pixel_y = -2 + }, +/turf/open/floor/engine, +/area/science/explab) "pFF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -48878,6 +48896,14 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"pLM" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "pLO" = ( /obj/machinery/light{ dir = 4 @@ -49171,6 +49197,20 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) +"pPu" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "pPC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -49906,12 +49946,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/aft) -"qdF" = ( -/obj/effect/spawner/randomarcade{ - dir = 4 - }, -/turf/open/floor/carpet/royalblue, -/area/crew_quarters/theatre) "qdG" = ( /obj/item/crowbar/red, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -50166,6 +50200,14 @@ /obj/machinery/nanite_chamber, /turf/open/floor/circuit, /area/science/nanite) +"qiU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/radiation, +/turf/open/floor/iron/dark, +/area/science/explab) "qjd" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -50457,15 +50499,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, /turf/open/floor/iron/white, /area/science/xenobiology) -"qnC" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/turf/open/floor/engine, -/area/science/explab) "qnN" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/crate{ @@ -51576,6 +51609,14 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, /area/space/nearstation) +"qFz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/plating, +/area/science/explab) "qFK" = ( /obj/machinery/computer/cargo{ dir = 8 @@ -51827,14 +51868,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/crew_quarters/heads/hop) -"qJS" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/iron/white, -/area/science/explab) "qKk" = ( /obj/structure/chair/office{ dir = 4 @@ -51988,6 +52021,19 @@ /obj/effect/turf_decal/tile/green/fourcorners/contrasted, /turf/open/floor/iron, /area/hydroponics) +"qMY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/science/explab) "qNl" = ( /obj/machinery/door/airlock/research{ autoclose = 0; @@ -53297,15 +53343,6 @@ /obj/item/storage/lockbox/loyalty, /turf/open/floor/iron/dark, /area/security/main) -"rki" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/iron/white, -/area/science/explab) "rkq" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "shower1a" @@ -53658,6 +53695,18 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"rpI" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/iron/white, +/area/science/explab) "rqa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -54732,21 +54781,6 @@ }, /turf/open/floor/iron/dark, /area/security/main) -"rJj" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "rJB" = ( /obj/machinery/rnd/server, /obj/machinery/atmospherics/pipe/simple/general/hidden{ @@ -55255,6 +55289,11 @@ dir = 8 }, /area/medical/chemistry) +"rRA" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "rRL" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -55748,6 +55787,11 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"sap" = ( +/obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "saC" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -56382,6 +56426,12 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/engine/atmos) +"skS" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "skV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -56807,12 +56857,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) -"sqP" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/science/explab) "srF" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -56983,10 +57027,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/medical/genetics) -"stD" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/science/explab) "stJ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 @@ -57712,6 +57752,15 @@ /obj/item/camera, /turf/open/floor/carpet/royalblue, /area/crew_quarters/heads/captain/private) +"sGL" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Experimentation Chamber"; + req_access_txt = "8"; + security_level = 6 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/maintenance/department/science/central) "sGQ" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 @@ -58297,6 +58346,15 @@ }, /turf/open/floor/iron/dark, /area/science/nanite) +"sPO" = ( +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley XI, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley XI"; + real_name = "Pugley X" + }, +/turf/open/floor/engine, +/area/science/explab) "sQk" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -58897,6 +58955,16 @@ }, /turf/open/floor/iron/white, /area/medical/virology) +"tao" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, +/area/science/explab) "tap" = ( /obj/structure/closet/secure_closet/personal, /obj/item/clothing/under/suit/black/female, @@ -63117,6 +63185,14 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/hallway/primary/fore) +"uuY" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/explab) "uvd" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/tile/green, @@ -63741,6 +63817,13 @@ }, /turf/open/floor/iron, /area/engine/engineering) +"uFq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/engine, +/area/science/explab) "uFv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -63992,15 +64075,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) -"uIT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/science/explab) "uIY" = ( /obj/machinery/computer/shuttle_flight/mining{ dir = 8 @@ -64838,16 +64912,6 @@ }, /turf/open/floor/iron/white, /area/medical/storage) -"uWI" = ( -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "uWQ" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = "CloningDoor"; @@ -65563,11 +65627,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) -"vjE" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/science/explab) "vjM" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/brown/fourcorners/contrasted, @@ -65700,14 +65759,6 @@ }, /turf/open/space/basic, /area/solar/port/fore) -"vlH" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "vlQ" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/effect/turf_decal/box{ @@ -66850,13 +66901,6 @@ }, /turf/open/floor/iron/dark, /area/security/brig) -"vCo" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/science/explab) "vCq" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/white{ @@ -67571,9 +67615,6 @@ }, /turf/open/floor/iron/white, /area/crew_quarters/heads/cmo) -"vMW" = ( -/turf/open/floor/iron/dark, -/area/science/explab) "vNq" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -67969,15 +68010,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/carpet/grimy, /area/chapel/office) -"vVe" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "vVs" = ( /obj/effect/spawner/lootdrop/glowstick/lit, /turf/open/floor/iron, @@ -68103,17 +68135,6 @@ /obj/machinery/power/solar, /turf/open/floor/iron/solarpanel/airless, /area/solar/port/fore) -"vXK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/caution{ - dir = 1 - }, -/obj/effect/landmark/xeno_spawn, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/turf/open/floor/engine, -/area/science/explab) "vXL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -68448,6 +68469,19 @@ }, /turf/open/floor/iron, /area/crew_quarters/dorms) +"wea" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/clothing/neck/stethoscope, +/obj/item/healthanalyzer, +/turf/open/floor/iron/dark, +/area/science/explab) "wej" = ( /obj/machinery/vending/cola, /obj/effect/turf_decal/tile/yellow/fourcorners/contrasted, @@ -68481,16 +68515,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"weH" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/turf/open/floor/engine, -/area/science/explab) "weJ" = ( /turf/open/floor/plating, /area/maintenance/starboard/secondary) @@ -69095,6 +69119,21 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/engine/storage) +"wox" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "woC" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/eastleft{ @@ -71906,6 +71945,18 @@ }, /turf/open/floor/catwalk_floor/flat_white, /area/science/mixing/chamber) +"xng" = ( +/obj/machinery/requests_console{ + pixel_x = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/science/explab) "xnh" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -72002,6 +72053,18 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) +"xoT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "xpd" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -74231,18 +74294,6 @@ }, /turf/open/floor/iron, /area/janitor) -"xYv" = ( -/obj/structure/table/reinforced, -/obj/machinery/requests_console{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/paicard, -/obj/item/book/manual/wiki/xenoarchaeology, -/turf/open/floor/iron/dark, -/area/science/explab) "xYE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/engine/vacuum, @@ -102097,7 +102148,7 @@ fHv rdA mQA aNS -qdF +liC glo fpf aQQ @@ -102801,7 +102852,7 @@ mHr kIy lWn ejA -qnC +ejA ejA lWn lWn @@ -103056,15 +103107,15 @@ qJg nvc mHr kIy -lWn -dLw -nDQ -uWI -vlH -fkM -eEH -jwL -xYv +sGL +ejA +sap +ejA +pLM +dMy +pon +rpI +xng lWn cca gAn @@ -103314,15 +103365,15 @@ iUv mHr kIy lWn -vXK -nZd -axN -gGS -kcb -sqP -vVe -mmF -lWn +ejA +ejA +ejA +pLM +eyQ +xoT +ozw +dOv +nBB tNr gAn jpk @@ -103571,14 +103622,14 @@ oDm jvu ilJ lWn -cgx -nDQ -faR -vlH -hhO -kqf -hZJ -gwz +dAw +ceB +sPO +qFz +wea +nrc +izJ +htS lWn xrf gAn @@ -103828,15 +103879,15 @@ nzk jvu ilJ lWn +pbC ejA -weH -ejA +uFq +fWN +fKc +jpj +skS +chS lWn -bdQ -kUL -hZJ -stD -nBB tNr dgd dQJ @@ -104085,14 +104136,14 @@ uMR mHr kIy lWn +gES +pFE +uuY lWn -lWn -lWn -lWn -jfS -qJS -gqi -rki +pBG +qMY +tao +pDI ejd pce hzu @@ -104341,16 +104392,16 @@ ipn gBc mHr kwc -pOm -cRG -fBV -vMW -kcb -uIT -cvq -vCo -vjE -nBB +yak +yak +lWn +lWn +lWn +wox +hbS +knU +rRA +lWn tNr awk pnr @@ -104598,15 +104649,15 @@ ean tWI mHr dKh -nJu -kIy +pOm +cRG +koq +koq lWn -kXF -adH -cOb -piY -eYL -rJj +pPu +kND +isL +qiU lWn uyE gAn @@ -116142,7 +116193,7 @@ pqi ipZ ayh oXI -dqf +etp ovz ijU jfp diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c58b4878d5801..82daeef8a1519 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1271,6 +1271,16 @@ }, /turf/open/floor/iron/white/corner, /area/hallway/secondary/entry) +"akc" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/xenoarchaeology_console{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "akd" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -1918,6 +1928,11 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/hallway/secondary/entry) +"aon" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/explab) "aoq" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -6936,10 +6951,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/crew_quarters/bar/atrium) -"aSe" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/science/explab) "aSn" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -11614,22 +11625,6 @@ }, /turf/open/floor/iron/dark, /area/bridge) -"byF" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "byL" = ( /turf/open/floor/iron, /area/security/main) @@ -12824,12 +12819,6 @@ "bIV" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/captain) -"bIW" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/xenoartifact_inbox, -/obj/item/xenoartifact, -/turf/open/floor/engine, -/area/science/explab) "bIY" = ( /obj/machinery/computer/security/telescreen/entertainment, /turf/closed/wall/r_wall, @@ -18363,6 +18352,14 @@ }, /turf/open/floor/iron, /area/crew_quarters/locker) +"ctd" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/plating, +/area/science/explab) "ctk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -25990,6 +25987,22 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/patients_rooms) +"dsb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = -32 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/power/apc/auto_name/directional/west{ + pixel_x = -24 + }, +/obj/structure/rack, +/obj/item/xenoartifact, +/obj/structure/cable/yellow, +/turf/open/floor/iron/dark, +/area/science/explab) "dsf" = ( /obj/machinery/door/airlock/research{ name = "Mech Bay"; @@ -31356,12 +31369,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/goonplaque, /area/hallway/primary/fore) -"ekK" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "ekM" = ( /obj/structure/cable/yellow, /obj/effect/spawner/structure/window/reinforced, @@ -33112,6 +33119,10 @@ }, /turf/open/floor/iron, /area/hallway/secondary/command) +"eJA" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/science/explab) "eJB" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -33755,16 +33766,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"eUF" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/item/storage/firstaid/regular, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 - }, -/turf/open/floor/iron/white, -/area/security/brig/medbay) "eUW" = ( /obj/structure/cable/yellow{ icon_state = "0-4" @@ -33941,12 +33942,6 @@ }, /turf/open/floor/iron, /area/security/checkpoint/escape) -"eYD" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "eYO" = ( /obj/structure/table/wood, /obj/machinery/firealarm{ @@ -34955,6 +34950,15 @@ }, /turf/open/floor/iron/freezer, /area/security/prison) +"fmr" = ( +/obj/structure/sign/poster/official/science{ + pixel_x = -32 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/bombcloset/white, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/explab) "fmt" = ( /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -35592,6 +35596,25 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/execution/transfer) +"fzj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/iron/white, +/area/science/explab) "fzo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -39057,6 +39080,33 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/maintenance/port/fore) +"gzo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/nanite) "gzF" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ @@ -40524,6 +40574,10 @@ burnt = 1 }, /area/maintenance/port/fore) +"gWd" = ( +/obj/machinery/vending/sticker, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gWf" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -41462,6 +41516,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/science/nanite) +"hku" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "hkL" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -41973,6 +42031,35 @@ }, /turf/open/floor/iron/dark, /area/security/courtroom) +"htB" = ( +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/maintenance/department/science) "htI" = ( /obj/structure/window/reinforced{ dir = 8 @@ -42251,6 +42338,27 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"hyT" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/toolbox/mechanical, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "hyV" = ( /obj/machinery/door/airlock{ id_tag = "Dorm2"; @@ -43284,25 +43392,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/secondary/entry) -"hPA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "hPE" = ( /obj/structure/sign/painting/library{ pixel_x = 32 @@ -44431,18 +44520,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/primary/fore) -"ifA" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/rack, -/obj/item/geiger_counter, -/obj/item/multitool, -/obj/item/analyzer, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "ifF" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45167,11 +45244,6 @@ }, /turf/open/floor/iron, /area/medical/genetics) -"isp" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/xenobiology) "isu" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -45720,6 +45792,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/science/robotics/mechbay) +"iCt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair/office/light, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "iCJ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -45745,6 +45835,9 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) +"iDr" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/science) "iDv" = ( /obj/structure/table/reinforced, /obj/item/storage/box/donkpockets, @@ -46007,6 +46100,27 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"iHl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/iron/white, +/area/science/explab) "iHz" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -46115,15 +46229,6 @@ }, /turf/open/floor/iron, /area/science/robotics/lab) -"iJg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "iJi" = ( /obj/structure/bodycontainer/morgue, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -47151,11 +47256,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/library) -"jel" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "jep" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -47579,6 +47679,15 @@ }, /turf/open/floor/iron, /area/maintenance/disposal) +"jkO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/turf/open/floor/iron/dark, +/area/science/explab) "jlf" = ( /obj/docking_port/stationary{ dir = 8; @@ -48419,6 +48528,10 @@ }, /turf/open/floor/iron, /area/medical/patients_rooms) +"jBe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/iron/white, +/area/science/explab) "jBi" = ( /obj/machinery/light{ dir = 1 @@ -49782,11 +49895,6 @@ "jXV" = ( /turf/open/floor/iron, /area/maintenance/aft) -"jXZ" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/iron/dark, -/area/science/explab) "jYa" = ( /obj/item/clipboard, /obj/item/folder/yellow, @@ -50004,6 +50112,15 @@ }, /turf/open/floor/iron, /area/engine/atmos) +"kba" = ( +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/make_non_slip, +/obj/machinery/shower{ + dir = 8; + name = "emergency shower" + }, +/turf/open/floor/iron/white, +/area/science/explab) "kbc" = ( /obj/machinery/status_display/evac, /turf/closed/wall, @@ -50561,20 +50678,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"kia" = ( -/obj/item/storage/toolbox/mechanical, -/obj/item/flashlight, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/science{ - pixel_x = -32 - }, -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/item/stock_parts/cell, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "kib" = ( /obj/structure/punching_bag, /obj/effect/turf_decal/bot_white, @@ -51200,16 +51303,6 @@ }, /turf/open/floor/catwalk_floor/iron, /area/engine/atmos) -"ksy" = ( -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "ksC" = ( /obj/structure/closet/secure_closet/bar, /obj/machinery/status_display/evac{ @@ -51221,15 +51314,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/crew_quarters/bar) -"ksM" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/turf/open/floor/engine, -/area/science/explab) "ktc" = ( /obj/structure/cable/yellow{ icon_state = "0-8" @@ -51425,6 +51509,13 @@ }, /turf/open/floor/catwalk_floor/iron, /area/engine/atmospherics_engine) +"kwD" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/bot, +/obj/item/clothing/gloves/color/latex, +/obj/item/storage/box/bodybags, +/turf/open/floor/iron/tech, +/area/security/brig/medbay) "kwM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -51615,6 +51706,23 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai_upload) +"kBc" = ( +/obj/machinery/button/door{ + id = "testlab"; + name = "Experimentor Door Control"; + pixel_x = 24; + req_access_txt = "47" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/firstaid/regular, +/obj/item/clothing/neck/stethoscope, +/obj/item/healthanalyzer, +/obj/machinery/light, +/turf/open/floor/iron/dark, +/area/science/explab) "kBx" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -51895,16 +52003,6 @@ }, /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai) -"kFT" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/xenoartifact_console{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "kFY" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -52480,18 +52578,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/maintenance/disposal/incinerator) -"kRu" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/obj/structure/closet/bombcloset/white, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "kRI" = ( /obj/structure/chair/wood/normal{ dir = 8 @@ -55603,14 +55689,6 @@ }, /turf/open/floor/iron, /area/quartermaster/miningoffice) -"lSh" = ( -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/clothing/mask/gas, -/obj/structure/rack, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "lSl" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -56132,6 +56210,16 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"maU" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/item/storage/firstaid/regular, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/white, +/area/security/brig/medbay) "mbL" = ( /obj/machinery/light, /obj/effect/turf_decal/bot, @@ -56192,10 +56280,6 @@ }, /turf/open/floor/prison, /area/security/prison) -"mcw" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "mcH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -57147,22 +57231,6 @@ }, /turf/open/floor/iron, /area/crew_quarters/locker) -"mrr" = ( -/obj/structure/cable/white, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west{ - pixel_x = -24 - }, -/obj/structure/rack, -/obj/item/xenoartifact, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "mru" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -57650,6 +57718,11 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"mCi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/turf/open/floor/engine, +/area/science/explab) "mCl" = ( /obj/structure/sign/departments/minsky/supply/hydroponics, /turf/closed/wall, @@ -59251,6 +59324,15 @@ }, /turf/open/floor/iron, /area/vacant_room/office) +"nbA" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/turf/open/floor/iron/white, +/area/science/explab) "nbB" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -60645,22 +60727,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/crew_quarters/fitness/recreation) -"nvC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "nvD" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -63036,6 +63102,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/catwalk_floor/iron, /area/engine/atmospherics_engine) +"oiq" = ( +/obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "oiA" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -65267,6 +65338,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat_interior) +"oUK" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/explab) "oUR" = ( /obj/item/beacon, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -65402,12 +65481,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/crew_quarters/fitness/recreation) -"oWT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "oXc" = ( /obj/effect/turf_decal/tile/green/fourcorners/contrasted, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -66447,6 +66520,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/science/server) +"prl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/xenoarchaeology_pearl{ + pixel_y = 32 + }, +/obj/structure/closet/firecloset, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/dark, +/area/science/explab) "prw" = ( /obj/effect/landmark/blobstart, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -66554,30 +66637,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/chapel/office) -"ptR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/nanite) "ptS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, @@ -68175,23 +68234,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/engine/atmos) -"pTJ" = ( -/obj/machinery/light_switch{ - pixel_x = -26 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/clothing/neck/stethoscope, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "pTQ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -68226,6 +68268,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai) +"pUn" = ( +/obj/structure/table/reinforced, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "pUo" = ( /obj/effect/landmark/start/station_engineer, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -68407,14 +68469,6 @@ }, /turf/open/floor/iron, /area/quartermaster/warehouse) -"pXK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/caution{ - dir = 1 - }, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) "pXY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/siding/wood{ @@ -69598,35 +69652,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/bridge) -"qqX" = ( -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/maintenance/department/science) "qrh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -71394,6 +71419,23 @@ }, /turf/open/floor/iron, /area/engine/break_room) +"qSY" = ( +/obj/machinery/light_switch{ + pixel_x = -26 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/pug{ + name = "Swanson" + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "qTf" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -73749,6 +73791,12 @@ }, /turf/open/floor/iron, /area/storage/tools) +"rDY" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/scale, +/obj/machinery/camera/directional/east, +/turf/open/floor/engine, +/area/science/explab) "rEg" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 @@ -74790,6 +74838,22 @@ "rTO" = ( /turf/open/floor/iron/dark, /area/security/main) +"rUi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "rUk" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance/three, @@ -76492,6 +76556,22 @@ }, /turf/open/floor/iron, /area/engine/break_room) +"suw" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/turf/open/floor/iron/dark, +/area/science/explab) "suz" = ( /obj/machinery/conveyor{ dir = 1; @@ -76579,10 +76659,6 @@ /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) -"svy" = ( -/obj/effect/spawner/randomvend/snack, -/turf/open/floor/iron/dark, -/area/maintenance/department/science) "svB" = ( /obj/structure/window/reinforced{ dir = 8 @@ -77520,10 +77596,6 @@ }, /turf/open/floor/iron, /area/maintenance/port/aft) -"sKO" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "sKR" = ( /obj/structure/chair/fancy/bench{ dir = 4 @@ -77776,6 +77848,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/crew_quarters/fitness/recreation) +"sNx" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "sNC" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -80334,13 +80412,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/crew_quarters/heads/hor) -"tDm" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/iron/dark, -/area/security/brig/medbay) "tDJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -80704,6 +80775,13 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/prison, /area/security/prison) +"tLo" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/turf/open/floor/iron/dark, +/area/security/brig/medbay) "tLD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -81124,14 +81202,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"tTz" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "tTE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -81463,21 +81533,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/aft) -"tZE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/chair/office/light, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "tZH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -83176,6 +83231,12 @@ }, /turf/open/floor/iron, /area/crew_quarters/heads/hor) +"uCG" = ( +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "uCN" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_guide, @@ -83662,14 +83723,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/maintenance/disposal/incinerator) -"uIB" = ( -/obj/effect/turf_decal/caution, -/obj/effect/landmark/xeno_spawn, -/obj/item/radio/intercom{ - pixel_y = -28 - }, -/turf/open/floor/engine, -/area/science/explab) "uIK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -83786,6 +83839,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/security/checkpoint) +"uKS" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north{ + pixel_y = 23 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "uLi" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -84184,10 +84246,6 @@ /obj/machinery/light/floor, /turf/open/floor/grass, /area/quartermaster/exploration_prep) -"uSL" = ( -/obj/machinery/camera/directional/east, -/turf/open/floor/engine, -/area/science/explab) "uSR" = ( /obj/machinery/button/door{ id = "teleporterhubshutters"; @@ -85065,6 +85123,15 @@ /mob/living/carbon/monkey, /turf/open/floor/iron, /area/medical/genetics) +"vgM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/science/explab) "vgQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -85638,6 +85705,18 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/vacant_room/office) +"vqx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/engine, +/area/science/explab) "vqA" = ( /obj/structure/table/wood, /obj/item/storage/briefcase{ @@ -85781,25 +85860,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/hallway/primary/fore) -"vsB" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_x = 24 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "vsR" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -86322,21 +86382,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/crew_quarters/toilet/restrooms) -"vAq" = ( -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/xenoartifact_labeler, -/obj/item/xenoartifact_labeler, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "vAs" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -86535,16 +86580,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/security/execution/transfer) -"vES" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/turf/open/floor/engine, -/area/science/explab) "vEW" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -87436,6 +87471,22 @@ }, /turf/open/floor/carpet/grimy, /area/library) +"vTM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "vTR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -88051,6 +88102,16 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"wcM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron/dark, +/area/science/explab) "wdl" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -92522,6 +92583,11 @@ }, /turf/open/floor/plating, /area/bridge/meeting_room/council) +"xuT" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/conductor, +/turf/open/floor/engine, +/area/science/explab) "xvc" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/delivery, @@ -94093,22 +94159,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/engine/atmos) -"xQY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "xRN" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -94135,16 +94185,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/crew_quarters/bar/atrium) -"xSz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/engine, -/area/science/explab) "xSF" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -94533,6 +94573,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/quartermaster/office) +"xYm" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white, +/area/science/explab) "xYC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -94782,10 +94827,6 @@ }, /turf/open/floor/iron, /area/science/xenobiology) -"ycn" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/maintenance/department/science) "ycx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -94949,19 +94990,6 @@ }, /turf/open/floor/glass/reinforced, /area/hallway/secondary/entry) -"yeD" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Experimentation Lab"; - name = "science camera" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/directional/north{ - pixel_y = 23 - }, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "yeX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -94983,13 +95011,6 @@ }, /turf/open/floor/iron/white, /area/maintenance/aft) -"yfc" = ( -/obj/structure/bodycontainer/morgue, -/obj/effect/turf_decal/bot, -/obj/item/clothing/gloves/color/latex, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/tech, -/area/security/brig/medbay) "yfd" = ( /obj/structure/cable{ icon_state = "1-8" @@ -121503,7 +121524,7 @@ inh inh cub inh -isp +inh cMY mZU pRU @@ -123821,10 +123842,10 @@ inh cON rOs cMY -ycn -svy +iDr +iDr djA -qqX +htB djA djA djA @@ -124078,14 +124099,14 @@ inh inh inh cMY +fmr +nbA +qSY +fzj +dsb djA -djA -djA -hPA -mrr -djA +oUK duw -ksM duw djA lgV @@ -124335,15 +124356,15 @@ cNc cNc cNc cMY -kia -vAq -pTJ -nvC -iJg -tTz -eYD -sKO -ksy +uKS +sNx +xYm +iHl +wcM +vqx +vgM +oiq +aon djA oPM xUI @@ -124592,15 +124613,15 @@ ygs inh inh cMY -yeD -mcw -mcw -byF -oWT -xSz -pXK -bIW -uIB +prl +sNx +jBe +iCt +akc +ctd +duw +duw +duw djA rYh ceb @@ -124849,15 +124870,15 @@ inh cOM wDS cMY -kRu -mcw -jXZ -tZE -kFT -tTz -ekK -sKO -aSe +hyT +uCG +hku +rUi +pUn +ctd +duw +duw +duw djA jGQ xUI @@ -125106,15 +125127,15 @@ inh inh inh cMY -lSh -ifA -jel -xQY -vsB -djA -duw -vES -uSL +jkO +suw +kba +vTM +kBc +eJA +mCi +xuT +rDY djA lgV jXa @@ -125366,7 +125387,7 @@ cMY djF djF djF -ptR +gzo djF djF djF @@ -125810,7 +125831,7 @@ alf ary euy bbQ -alg +gWd beK bgj alf @@ -147929,7 +147950,7 @@ lfo sKR iGS sjv -yfc +kwD tNF tNF tNF @@ -148443,10 +148464,10 @@ thD dSZ pBM sjv -tDm +tLo kdd otP -eUF +maU tmj rEq lUj diff --git a/_maps/map_files/EchoStation/EchoStation.dmm b/_maps/map_files/EchoStation/EchoStation.dmm index 7d918b94e284b..6101f6926292f 100644 --- a/_maps/map_files/EchoStation/EchoStation.dmm +++ b/_maps/map_files/EchoStation/EchoStation.dmm @@ -96,23 +96,6 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/patients_rooms) -"abU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_y = 24 - }, -/obj/structure/rack, -/obj/item/healthanalyzer, -/obj/item/stack/medical/ointment, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/gauze, -/turf/open/floor/iron, -/area/science/explab) "acj" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -2986,6 +2969,11 @@ /obj/item/storage/box/bodybags, /turf/open/floor/iron/dark, /area/medical/morgue) +"bli" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/turf/open/floor/engine, +/area/science/explab) "blt" = ( /obj/structure/window/plasma/reinforced{ dir = 8 @@ -4121,6 +4109,21 @@ }, /turf/open/floor/plating/snowed/smoothed/planetary, /area/asteroid/paradise/surface) +"bNf" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/medical/medbay/central) "bOi" = ( /obj/structure/fence/corner{ dir = 4 @@ -4144,12 +4147,6 @@ /obj/item/circuitboard/machine/circulator, /turf/open/floor/iron/smooth_half, /area/engine/atmos) -"bOR" = ( -/obj/effect/turf_decal/delivery, -/obj/item/xenoartifact, -/obj/machinery/xenoartifact_inbox, -/turf/open/floor/engine, -/area/science/explab) "bPb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/purple, @@ -5614,6 +5611,21 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/iron, /area/maintenance/department/eva) +"cBH" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/structure/disposalpipe/sorting/mail/destination/cmo_office/flip{ + dir = 8 + }, +/turf/open/floor/iron, +/area/medical/medbay/central) "cBL" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -6976,6 +6988,26 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/science/lab) +"dkK" = ( +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/radio/intercom{ + pixel_y = 28 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "dlh" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair/office, @@ -7065,14 +7097,6 @@ /obj/structure/ladder, /turf/open/floor/pod/dark, /area/maintenance/department/bridge) -"dou" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/digital_clock/directional/north, -/turf/open/floor/engine, -/area/science/explab) "doY" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; @@ -7668,6 +7692,30 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) +"dGo" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/item/sticky_note_pile{ + pixel_y = 3; + pixel_x = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "dGt" = ( /obj/machinery/light, /turf/open/openspace, @@ -8218,13 +8266,6 @@ }, /turf/open/floor/iron/dark, /area/quartermaster/sorting) -"dSU" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/science/explab) "dTb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -8602,6 +8643,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/maint) +"egT" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/engine, +/area/science/explab) "eha" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt/dust, @@ -11159,6 +11207,12 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/sepia, /area/quartermaster/storage) +"fqX" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/machinery/camera/directional/east, +/turf/open/floor/engine, +/area/science/explab) "fru" = ( /turf/open/floor/iron/textured_edge, /area/engine/atmos) @@ -11578,6 +11632,20 @@ /obj/item/melee/skateboard, /turf/open/floor/carpet/green, /area/crew_quarters/cafeteria) +"fEv" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/machinery/light/small, +/obj/effect/turf_decal/siding/white{ + alpha = 100; + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron, +/area/medical/medbay/central) "fEQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -11879,18 +11947,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"fLs" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white, -/obj/machinery/vending/coffee, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/medical/medbay/central) "fLS" = ( /turf/closed/wall/r_wall, /area/ai_monitored/security/armory) @@ -12327,6 +12383,18 @@ }, /turf/open/floor/plating, /area/security/brig) +"fUo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" + }, +/obj/structure/bed/dogbed, +/turf/open/floor/engine, +/area/science/explab) "fUP" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -12443,17 +12511,6 @@ /obj/structure/fence, /turf/open/floor/plating/asteroid/snow/planetary, /area/asteroid/paradise/surface) -"fXL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/beacon, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/caution{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "fYE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, @@ -12739,6 +12796,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/techmaint/planetary, /area/asteroid/paradise/surface) +"ggh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/beacon, +/turf/open/floor/engine, +/area/science/explab) "ggi" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 @@ -14089,17 +14153,6 @@ "gOP" = ( /turf/open/floor/iron, /area/crew_quarters/dorms) -"gPf" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "gPt" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -14933,6 +14986,14 @@ "hjU" = ( /turf/open/openspace, /area/science/mixing) +"hkb" = ( +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -25 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/iron/white, +/area/science/explab) "hki" = ( /obj/structure/window/reinforced{ dir = 8 @@ -18684,21 +18745,6 @@ /obj/effect/spawner/structure/window/depleteduranium, /turf/open/floor/plating, /area/engine/engineering) -"jnX" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/structure/disposalpipe/sorting/mail/destination/cmo_office/flip{ - dir = 8 - }, -/turf/open/floor/iron, -/area/medical/medbay/central) "joc" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/portable_atmospherics/pump, @@ -18860,43 +18906,6 @@ /obj/machinery/camera/directional/south, /turf/open/floor/iron/tech, /area/science/mixing) -"jsc" = ( -/obj/structure/table/reinforced, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/healthanalyzer, -/obj/item/analyzer, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 3 - }, -/obj/item/multitool, -/obj/item/clothing/mask/gas, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/item/clothing/neck/stethoscope, -/obj/structure/extinguisher_cabinet{ - pixel_x = -28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 1; - pixel_y = -28 - }, -/turf/open/floor/iron, -/area/science/explab) "jso" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable/yellow{ @@ -19294,20 +19303,6 @@ /obj/structure/flora/tree/jungle/small, /turf/open/floor/grass/no_border, /area/hallway/primary/aft) -"jEr" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "jEu" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -20604,6 +20599,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/asteroid/planetary, /area/asteroid/paradise) +"kls" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/scale, +/turf/open/floor/engine, +/area/science/explab) "klz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/navbeacon{ @@ -21336,25 +21340,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) -"kBL" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/sorting/mail/destination/medbay/flip{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/medical/medbay/central) "kBM" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -22532,19 +22517,6 @@ /obj/structure/girder/displaced, /turf/open/floor/plating, /area/engine/atmos) -"lhu" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/south{ - pixel_y = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/iron/white, -/area/science/explab) "lhJ" = ( /obj/structure/window/reinforced{ dir = 1 @@ -23847,14 +23819,6 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"lRA" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "lRE" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/bot, @@ -24103,6 +24067,24 @@ /obj/structure/displaycase/labcage, /turf/open/floor/iron/white, /area/crew_quarters/heads/hor) +"lYs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/iron, +/area/science/explab) "lYA" = ( /turf/closed/mineral/random/air, /area/science/research/abandoned) @@ -24146,6 +24128,20 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"lZM" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/dark, +/area/science/explab) "mab" = ( /obj/structure/railing{ dir = 4 @@ -26096,6 +26092,18 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/asteroid/paradise/surface) +"mYp" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white, +/obj/machinery/vending/coffee, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/medical/medbay/central) "mYH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -29123,21 +29131,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/primary/fore) -"oDR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/medical/medbay/central) "oDU" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 8 @@ -33084,6 +33077,14 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/hallway/primary/aft) +"qHe" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "qHP" = ( /turf/closed/wall, /area/security/execution/education) @@ -34536,6 +34537,23 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"roS" = ( +/obj/machinery/computer/xenoarchaeology_console{ + dir = 8 + }, +/obj/item/book/manual/wiki/xenoarchaeology{ + pixel_x = -6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/iron/white, +/area/science/explab) "rpb" = ( /obj/structure/railing{ dir = 9 @@ -35517,6 +35535,19 @@ }, /turf/open/floor/iron, /area/security/brig) +"rPw" = ( +/obj/machinery/button/door{ + id = "testlab"; + name = "Test Chamber Blast Doors"; + pixel_y = -30 + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "rPI" = ( /obj/effect/spawner/room/threexfive, /turf/open/floor/plating, @@ -36871,6 +36902,10 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) +"szT" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/science/explab) "szZ" = ( /obj/machinery/camera/directional/west, /turf/open/openspace, @@ -37812,6 +37847,11 @@ }, /turf/closed/wall/r_wall, /area/crew_quarters/cafeteria) +"tbC" = ( +/obj/item/xenoartifact/tutorial, +/obj/effect/turf_decal/box, +/turf/open/floor/engine, +/area/science/explab) "tcb" = ( /obj/structure/railing/corner{ dir = 8 @@ -38793,8 +38833,16 @@ }, /turf/open/floor/iron/dark, /area/engineering/hallway) -"tyz" = ( -/turf/open/floor/engine, +"tyo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, /area/science/explab) "tyI" = ( /obj/structure/cable/yellow{ @@ -40660,11 +40708,6 @@ /obj/effect/landmark/start/head_of_personnel, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"uuH" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/science/explab) "uuN" = ( /obj/structure/table/reinforced, /obj/machinery/reagentgrinder{ @@ -40995,6 +41038,21 @@ }, /turf/open/floor/pod/dark, /area/maintenance/department/crew_quarters/dorms) +"uET" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/bombcloset/white, +/obj/item/storage/firstaid/radbgone, +/obj/item/geiger_counter, +/obj/effect/turf_decal/bot, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/suit/utility/radiation, +/turf/open/floor/iron/dark, +/area/science/explab) "uEY" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box, @@ -42850,18 +42908,6 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible/layer4, /turf/open/floor/iron/smooth_large, /area/engine/atmos) -"vsS" = ( -/obj/machinery/computer/xenoartifact_console, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/camera/directional/north, -/turf/open/floor/iron, -/area/science/explab) "vsU" = ( /obj/structure/railing, /turf/open/openspace, @@ -42908,20 +42954,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/central) -"vtT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/light_switch{ - pixel_x = -25; - pixel_y = -5 - }, -/turf/open/floor/iron/white, -/area/science/explab) "vun" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -43246,6 +43278,25 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/asteroid/paradise/surface) +"vFP" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/destination/medbay/flip{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/medical/medbay/central) "vFR" = ( /obj/structure/sign/warning/nosmoking/circle, /turf/closed/wall/r_wall, @@ -45250,10 +45301,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"wIp" = ( -/obj/machinery/camera/directional/east, -/turf/open/floor/engine, -/area/science/explab) "wIv" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, @@ -45404,19 +45451,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/cafeteria) -"wMa" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/bombcloset/white, -/obj/item/geiger_counter, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/storage/firstaid/radbgone, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/science/explab) "wMj" = ( /obj/structure/lattice/catwalk/over, /turf/open/openspace, @@ -46979,20 +47013,6 @@ }, /turf/open/floor/wood/broken, /area/library/abandoned) -"xAU" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/obj/machinery/light/small, -/obj/effect/turf_decal/siding/white{ - alpha = 100; - dir = 6 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/medical/medbay/central) "xBx" = ( /obj/structure/flora/ash/tall_shroom, /turf/open/floor/plating/asteroid/planetary, @@ -132504,8 +132524,8 @@ qpq bDW jTq aAV -wMa -jsc +dGo +uET aPc aPc esI @@ -132761,9 +132781,9 @@ wxb tcM pMZ aAV -vsS -dSU -vtT +lZM +hkb +tyo rAS tAL dPH @@ -133018,9 +133038,9 @@ olN ttD isW aAV -abU +dkK wjY -lhu +roS aPc xDH kTQ @@ -133275,9 +133295,9 @@ tss uWZ rZM aAV -lRA -gPf -lRA +qHe +lYs +rPw aAV plG fHy @@ -133533,8 +133553,8 @@ xny sSd nXU aYd -fXL -aYd +ggh +fUo aAV aJn xGI @@ -133789,9 +133809,9 @@ olN olN bSN nFR -dou -bOR -uuH +egT +tbC +szT aAV aBR tWP @@ -134046,9 +134066,9 @@ toA olN sik nFR -tyz -jEr -wIp +bli +kls +fqX aAV abC aoJ @@ -189810,8 +189830,8 @@ iyS iyS iyS kOC -oDR -fLs +bNf +mYp uhc qUt slT @@ -190067,8 +190087,8 @@ pcZ nlH iyS wEt -kBL -xAU +vFP +fEv aSN pEf pEf @@ -191866,7 +191886,7 @@ uQd yaL kxf tpg -jnX +cBH mFq rZs vGc diff --git a/_maps/map_files/FlandStation/FlandStation.dmm b/_maps/map_files/FlandStation/FlandStation.dmm index 3dc4ee0e86670..f376eaf5e201d 100644 --- a/_maps/map_files/FlandStation/FlandStation.dmm +++ b/_maps/map_files/FlandStation/FlandStation.dmm @@ -1363,6 +1363,20 @@ dir = 8 }, /area/hallway/primary/starboard) +"asv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Experimentor"; + name = "science camera" + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/engine, +/area/science/explab) "asw" = ( /obj/item/storage/pod{ pixel_x = 6; @@ -4809,6 +4823,19 @@ }, /turf/open/floor/iron/grid/steel, /area/science/xenobiology) +"bfI" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/status_display/ai{ + pixel_x = -32 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/explab) "bfN" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -5355,28 +5382,6 @@ }, /turf/open/floor/iron/ridged/steel, /area/science/xenobiology) -"bmD" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Experimentation Lab"; - name = "science camera" - }, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science RC"; - pixel_y = 30; - receive_ore_updates = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/geiger_counter, -/obj/item/multitool, -/obj/structure/table/reinforced, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "bmK" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Storage"; @@ -6965,6 +6970,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/library/lounge) +"bMt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/computer/xenoarchaeology_console{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "bMv" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -8104,6 +8119,22 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"cbr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "cbS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -8286,6 +8317,14 @@ "cer" = ( /turf/open/floor/plating/foam, /area/space/nearstation) +"cet" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/vending/sticker, +/turf/open/floor/iron/dark, +/area/crew_quarters/bar/atrium) "ceB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/effect/turf_decal/tile/bar/opposingcorners{ @@ -11296,6 +11335,18 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) +"cTC" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/shower{ + dir = 8; + name = "emergency shower" + }, +/obj/machinery/newscaster{ + pixel_y = -28 + }, +/obj/effect/mapping_helpers/make_non_slip, +/turf/open/floor/iron/white, +/area/science/explab) "cTE" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ @@ -12634,6 +12685,23 @@ "dmb" = ( /turf/open/floor/iron/grid/steel, /area/medical/virology) +"dmc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner, +/turf/open/floor/iron/white, +/area/science/explab) "dmp" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, @@ -12648,6 +12716,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/wood, /area/library) +"dmO" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/turf/open/floor/iron/techmaint, +/area/security/main) "dnd" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 8 @@ -13523,6 +13599,22 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/tech, /area/medical/virology) +"dAW" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/button/door{ + id = "telelab"; + name = "Test Chamber Toggle"; + pixel_y = 24 + }, +/obj/machinery/airalarm/directional/west{ + pixel_x = -22 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "dBk" = ( /obj/structure/sign/departments/minsky/engineering/engineering, /turf/closed/wall/r_wall, @@ -20532,19 +20624,6 @@ }, /turf/open/floor/iron/dark, /area/chapel/main) -"foY" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/scientist, -/obj/machinery/power/apc/auto_name/directional/west{ - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "fpa" = ( /obj/structure/table/wood, /obj/item/paper/fluff{ @@ -22030,27 +22109,6 @@ }, /turf/open/floor/iron, /area/security/checkpoint/medical) -"fGF" = ( -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_access_txt = "7" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, -/turf/open/floor/iron/techmaint, -/area/science/explab) "fGN" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -24410,6 +24468,11 @@ }, /turf/open/floor/iron/cafeteria, /area/crew_quarters/cafeteria) +"gjV" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/turf/open/floor/plating, +/area/science/explab) "gkd" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -26743,6 +26806,14 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"gNz" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/science/explab) "gNA" = ( /mob/living/basic/cockroach, /turf/open/floor/plating, @@ -27512,22 +27583,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) -"gXC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/wrench, -/obj/item/crowbar, -/obj/item/storage/firstaid/regular, -/obj/item/storage/toolbox/mechanical, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/machinery/newscaster{ - pixel_y = -28 - }, -/turf/open/floor/iron/ridged/steel, -/area/science/explab) "gXL" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -27880,6 +27935,17 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"hcQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "hdi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -28085,6 +28151,22 @@ "hge" = ( /turf/open/floor/glass/reinforced, /area/hallway/secondary/exit/departure_lounge) +"hgf" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/mob/living/simple_animal/pet/dog/pug{ + name = "Swanson" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) "hgy" = ( /obj/machinery/door/poddoor/preopen{ id = "bridgedoors"; @@ -28854,6 +28936,29 @@ "hrQ" = ( /turf/closed/wall, /area/bridge) +"hrR" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/iron/white, +/area/science/explab) "hrU" = ( /obj/effect/turf_decal/guideline/guideline_in/red{ dir = 8 @@ -29326,18 +29431,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) -"hzp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "hzz" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -34491,14 +34584,6 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/grid/steel, /area/science/shuttle) -"iNl" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/iron/techmaint, -/area/security/main) "iNo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -35917,18 +36002,6 @@ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, /area/docking/bridge) -"jhn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "jhs" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -35993,6 +36066,20 @@ }, /turf/open/floor/wood, /area/library) +"jiJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/light_switch{ + pixel_x = -24; + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/explab) "jiS" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -37021,9 +37108,6 @@ }, /turf/open/floor/iron/dark, /area/tcommsat/computer) -"jye" = ( -/turf/open/floor/engine/light, -/area/science/explab) "jyf" = ( /obj/effect/turf_decal/guideline/guideline_in_T/red{ dir = 5 @@ -41455,15 +41539,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron, /area/science/robotics/lab) -"kAC" = ( -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/engine/light, -/area/science/explab) "kAH" = ( /turf/open/floor/iron, /area/security/courtroom) @@ -42147,6 +42222,13 @@ }, /turf/open/floor/iron/dark, /area/maintenance/department/science) +"kJq" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) "kJH" = ( /obj/item/radio/intercom{ pixel_y = -28 @@ -42220,23 +42302,6 @@ }, /turf/open/floor/iron, /area/security/main) -"kKM" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 - }, -/turf/open/floor/iron/white, -/area/security/main) "kKQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -42262,6 +42327,18 @@ broken = 1 }, /area/maintenance/port/central) +"kLC" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/science/explab) "kMc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -44821,33 +44898,6 @@ /obj/item/stack/medical/gauze, /turf/open/floor/iron/white, /area/security/main) -"lod" = ( -/obj/machinery/button/door{ - id = "telelab"; - name = "Test Chamber Toggle"; - pixel_y = 24 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/item/folder{ - pixel_x = -6 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/directional/west{ - pixel_x = -22 - }, -/obj/item/storage/box/beakers{ - pixel_y = 5 - }, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "lof" = ( /obj/machinery/status_display/evac, /turf/closed/wall/r_wall, @@ -45224,19 +45274,6 @@ /obj/machinery/vending/boozeomat, /turf/closed/wall, /area/crew_quarters/bar) -"lsO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/machinery/light_switch{ - pixel_x = -24; - pixel_y = 24 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "lsS" = ( /turf/open/floor/engine/n2o/light, /area/engine/atmos) @@ -47511,31 +47548,6 @@ }, /turf/open/floor/plating, /area/security/prison) -"lZe" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/syringe, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Medbay" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/item/reagent_containers/blood/OPlus, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/iron/techmaint, -/area/security/main) "lZt" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /obj/structure/cable/yellow{ @@ -47634,6 +47646,12 @@ }, /turf/open/floor/plating, /area/medical/apothecary) +"maG" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/xenoarchaeology_machine/scale, +/obj/machinery/camera/directional/east, +/turf/open/floor/plating, +/area/science/explab) "maO" = ( /obj/effect/turf_decal/trimline/red/warning, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -49479,18 +49497,6 @@ }, /turf/open/floor/iron/techmaint, /area/maintenance/aft) -"mBP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "mBU" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -51061,6 +51067,13 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron/grid/steel, /area/medical/virology) +"mVD" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/science/explab) "mWm" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/kitchenspike, @@ -52253,6 +52266,14 @@ }, /turf/open/floor/iron/grid/steel, /area/science/mixing) +"nnp" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "nnq" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/red/filled/line, @@ -52508,12 +52529,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/techmaint, /area/maintenance/starboard/aft) -"nqH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ridged/steel, -/area/science/explab) "nrb" = ( /obj/machinery/newscaster{ pixel_y = 31 @@ -52586,14 +52601,6 @@ }, /turf/open/space/basic, /area/space) -"nss" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/beacon, -/mob/living/simple_animal/pet/dog/pug{ - name = "Swanson" - }, -/turf/open/floor/engine/light, -/area/science/explab) "nsJ" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -54740,10 +54747,6 @@ }, /turf/open/floor/iron/techmaint, /area/maintenance/department/security/brig) -"nXK" = ( -/obj/machinery/camera/directional/east, -/turf/open/floor/engine/light, -/area/science/explab) "nXL" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -57463,6 +57466,15 @@ }, /turf/open/floor/iron/freezer, /area/crew_quarters/toilet/restrooms) +"oHX" = ( +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_y = 32 + }, +/obj/structure/closet/bombcloset/white, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/explab) "oIc" = ( /obj/machinery/telecomms/processor/preset_two, /obj/effect/turf_decal/stripes/end{ @@ -59991,6 +60003,25 @@ /obj/machinery/vendor/exploration, /turf/open/floor/iron/techmaint, /area/quartermaster/exploration_prep) +"psP" = ( +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/science/explab) "ptb" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -60492,15 +60523,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/lobby) -"pzd" = ( -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/engine/light, -/area/science/explab) "pzg" = ( /obj/structure/table/reinforced, /obj/item/pipe_dispenser, @@ -61599,6 +61621,18 @@ }, /turf/open/floor/prison, /area/security/prison) +"pMY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/science/explab) "pNp" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp, @@ -64917,6 +64951,28 @@ }, /turf/open/floor/iron/dark, /area/quartermaster/storage) +"qES" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/eastright{ + dir = 1; + name = "Artifact Containment"; + req_access_txt = "47" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/engine, +/area/science/explab) "qEZ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/unres{ @@ -66301,16 +66357,6 @@ }, /turf/open/floor/carpet/green, /area/crew_quarters/dorms) -"qVU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/engine, -/area/science/explab) "qVX" = ( /obj/structure/closet/secure_closet/personal, /obj/effect/turf_decal/bot, @@ -67011,6 +67057,18 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/storage/primary) +"rgB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) "rgC" = ( /obj/structure/cable/yellow, /obj/effect/spawner/structure/window/reinforced, @@ -67627,20 +67685,6 @@ dir = 4 }, /area/hallway/primary/port) -"rpX" = ( -/obj/item/radio/intercom{ - pixel_x = 28 - }, -/obj/structure/table/reinforced, -/obj/item/xenoartifact_labeler, -/obj/item/xenoartifact_labeler, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "rpY" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -68910,22 +68954,6 @@ }, /turf/open/floor/grass/no_border, /area/science/shuttledock) -"rGw" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_y = -24 - }, -/turf/open/floor/noslip/dark, -/area/science/explab) "rGy" = ( /turf/closed/wall, /area/medical/virology) @@ -70409,6 +70437,16 @@ dir = 4 }, /area/maintenance/department/engine) +"rXP" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/firealarm/directional/west, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/turf/open/floor/plating, +/area/science/explab) "rXY" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -70598,14 +70636,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"sao" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "sax" = ( /turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) @@ -70756,14 +70786,6 @@ "scg" = ( /turf/open/floor/iron, /area/security/main) -"sch" = ( -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_y = 32 - }, -/obj/structure/closet/bombcloset/white, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/grid/steel, -/area/science/explab) "scj" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -71852,6 +71874,28 @@ broken = 1 }, /area/space/nearstation) +"srt" = ( +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science RC"; + pixel_y = 30; + receive_ore_updates = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/item/multitool, +/obj/structure/table/reinforced, +/obj/item/geiger_counter, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/dark, +/area/science/explab) "srw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, @@ -72125,6 +72169,27 @@ /obj/structure/sign/departments/minsky/medical/medical2, /turf/closed/wall/r_wall, /area/crew_quarters/heads/cmo) +"suW" = ( +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_access_txt = "7" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, +/turf/open/floor/iron/white, +/area/science/explab) "sve" = ( /obj/structure/cable{ icon_state = "1-2" @@ -72236,15 +72301,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) -"swG" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine/light, -/area/science/explab) "swI" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -73084,6 +73140,13 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/port/central) +"sGo" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/science/explab) "sGH" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Locker Room"; @@ -73093,12 +73156,6 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/techmaint, /area/engine/engineering) -"sGM" = ( -/obj/machinery/xenoartifact_inbox, -/obj/effect/turf_decal/delivery, -/obj/item/xenoartifact, -/turf/open/floor/engine, -/area/science/explab) "sGX" = ( /obj/machinery/rnd/production/techfab/department/cargo, /obj/machinery/light{ @@ -73214,6 +73271,17 @@ }, /turf/open/floor/dock/drydock, /area/drydock/security) +"sIK" = ( +/obj/item/radio/intercom{ + pixel_x = 28 + }, +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/line, +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/turf/open/floor/iron/dark, +/area/science/explab) "sIS" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/delivery, @@ -73941,15 +74009,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) -"sSm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution{ - dir = 8 - }, -/turf/open/floor/engine/light, -/area/science/explab) "sSw" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 10 @@ -74446,13 +74505,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"sYN" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine/light, -/area/science/explab) "sYO" = ( /obj/structure/lattice/catwalk/over, /obj/machinery/conveyor{ @@ -75519,20 +75571,6 @@ /obj/item/stock_parts/cell/crap, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"toB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Experimentor"; - name = "science camera" - }, -/obj/item/radio/intercom{ - pixel_y = -28 - }, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/engine/light, -/area/science/explab) "toF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -77429,6 +77467,18 @@ dir = 4 }, /area/hallway/primary/port) +"tNQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) "tNT" = ( /turf/open/floor/iron, /area/hallway/secondary/entry) @@ -77718,6 +77768,15 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/bridge) +"tQp" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) "tQu" = ( /obj/machinery/camera/directional/south{ c_tag = "Port Primary Hallway - Checkpoint"; @@ -77877,15 +77936,6 @@ /obj/machinery/light, /turf/open/floor/iron, /area/hallway/secondary/entry) -"tSW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/xenoartifact_console{ - dir = 1 - }, -/turf/open/floor/iron/ridged/steel, -/area/science/explab) "tTc" = ( /obj/effect/turf_decal/guideline/guideline_in_arrow_con/red, /obj/effect/turf_decal/guideline/guideline_mid_arrow_con/purple, @@ -77899,6 +77949,20 @@ /obj/effect/turf_decal/guideline/guideline_out/yellow, /turf/open/floor/iron, /area/hallway/primary/port) +"tTe" = ( +/obj/structure/lattice/catwalk/over, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/machinery/status_display/evac{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/xenoarchaeology_machine/conductor, +/turf/open/floor/plating, +/area/science/explab) "tTj" = ( /obj/effect/turf_decal/stripes/corner{ dir = 10 @@ -79718,6 +79782,21 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/grid, /area/crew_quarters/toilet/restrooms) +"urX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/purple/filled/end{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "usf" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -81868,6 +81947,31 @@ }, /turf/open/floor/iron/dark, /area/security/brig) +"uSD" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/storage/firstaid/regular, +/obj/item/reagent_containers/syringe, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Medbay" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/item/reagent_containers/blood/OPlus, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron/techmaint, +/area/security/main) "uSM" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/orange, @@ -83095,6 +83199,23 @@ "vhU" = ( /turf/closed/wall, /area/medical/apothecary) +"vhZ" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/white, +/area/security/main) "vie" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 @@ -84936,20 +85057,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/aft) -"vyQ" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/iron/techmaint, -/area/science/explab) "vyZ" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, @@ -85881,13 +85988,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) -"vKy" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine/light, -/area/science/explab) "vKA" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden{ dir = 6 @@ -86276,15 +86376,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/department/engine) -"vOy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/engine/light, -/area/science/explab) "vOz" = ( /obj/machinery/camera/directional/north, /turf/open/floor/iron/sepia, @@ -92889,6 +92980,22 @@ /obj/structure/lattice/catwalk/over, /turf/open/floor/plating, /area/engine/gravity_generator) +"xqo" = ( +/obj/effect/turf_decal/trimline/purple/filled/end{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/obj/machinery/power/apc/auto_name/directional/west{ + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/iron/white, +/area/science/explab) "xqp" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 8 @@ -93148,15 +93255,6 @@ }, /turf/open/floor/iron/grid/steel, /area/engine/storage_shared) -"xsY" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine/light, -/area/science/explab) "xtd" = ( /obj/machinery/light{ dir = 1 @@ -96710,19 +96808,6 @@ "yeb" = ( /turf/closed/wall/r_wall, /area/bridge) -"yec" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron/ridged/steel, -/area/science/explab) "yed" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -119849,7 +119934,7 @@ amj vmw kwn jOJ -nva +cet mBZ nva jOJ @@ -131652,7 +131737,7 @@ wqJ sDy wrM vUR -kKM +vhZ alr eNY fkN @@ -132680,8 +132765,8 @@ vBi mTT oEj vUR -lZe -iNl +uSD +dmO oYn xIV iZK @@ -132744,13 +132829,13 @@ usz ggz cQD kcS -lod -foY -gXC +dAW +xqo +psP kcS -jye -pzd -jye +rXP +bfI +gjV kcS xEK eUi @@ -133001,13 +133086,13 @@ iqB hMO dSy kcS -lsO -mBP -yec -sao -vKy -sSm -swG +jiJ +cbr +bMt +nnp +sGo +tNQ +tQp kcS gmR eUi @@ -133258,13 +133343,13 @@ awf kqu uKz kcS -sch -vyQ -nqH -qVU -nss -sGM -toB +oHX +hrR +pMY +qES +hgf +hcQ +asv kcS iHt ovW @@ -133515,13 +133600,13 @@ jZn wyr tXJ kcS -bmD -jhn -tSW -sao -xsY -vOy -sYN +srt +dmc +mVD +nnp +kLC +rgB +kJq kcS oDs fqT @@ -133772,13 +133857,13 @@ jqc kIQ tHw kcS -rpX -hzp -rGw +sIK +urX +cTC kcS -jye -kAC -nXK +gNz +tTe +maG kcS kUt kUt @@ -134030,7 +134115,7 @@ nou vEX kcS kcS -fGF +suW kcS wUG wUG diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 2434aa7bd181c..407b6d6dfa1c1 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -748,14 +748,6 @@ "ahh" = ( /turf/closed/wall/r_wall, /area/tcommsat/server) -"ahs" = ( -/obj/structure/closet/bombcloset, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "ahx" = ( /obj/structure/sign/poster/official/random, /turf/closed/wall, @@ -2732,6 +2724,13 @@ luminosity = 2 }, /area/science/robotics/mechbay) +"aAq" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/decal/remains/human, +/obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "aAx" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/beebox, @@ -5312,6 +5311,16 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"bcM" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/computer/xenoarchaeology_console{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "bcO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -9104,6 +9113,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/hallway/primary/aft) +"bOn" = ( +/obj/machinery/door/window/southright{ + name = "Testing Chamber" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/engine, +/area/science/explab) "bOo" = ( /obj/structure/sign/departments/custodian, /turf/closed/wall/rust, @@ -12915,17 +12931,6 @@ /obj/structure/sign/departments/cargo, /turf/closed/wall, /area/maintenance/starboard/fore) -"cEH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch{ - pixel_y = -27 - }, -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "cEM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -13313,11 +13318,6 @@ }, /turf/open/floor/carpet/green, /area/crew_quarters/bar) -"cHX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/port/aft) "cHY" = ( /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ @@ -19233,24 +19233,6 @@ burnt = 1 }, /area/maintenance/starboard/aft) -"elR" = ( -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = -7 - }, -/obj/item/analyzer, -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/explab) "elY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/box/corners{ @@ -22288,29 +22270,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/gateway) -"fkS" = ( -/obj/structure/table, -/obj/item/clothing/glasses/science{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_x = 2; - pixel_y = -13 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 5; - pixel_y = 15 - }, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "fkX" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -23870,6 +23829,13 @@ burnt = 1 }, /area/maintenance/port) +"fLM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plating, +/area/maintenance/port/aft) "fMr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -24225,24 +24191,6 @@ }, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai_upload) -"fQL" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced, -/obj/structure/rack, -/obj/machinery/door/window/northleft{ - dir = 8; - name = "Secure Artifact Storage"; - req_one_access_txt = "8;49" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/explab) "fQQ" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 @@ -24939,6 +24887,17 @@ }, /turf/open/floor/iron/dark, /area/bridge) +"gdu" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/vending/sticker, +/turf/open/floor/iron/dark, +/area/crew_quarters/locker) "gdx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -26433,6 +26392,17 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/hallway/primary/starboard) +"gDx" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "gDS" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 24 @@ -26586,6 +26556,20 @@ }, /turf/open/floor/iron/dark, /area/medical/storage) +"gHf" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/item/radio/intercom{ + pixel_x = -28 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "gHl" = ( /obj/item/stack/sheet/iron, /obj/structure/cable/yellow{ @@ -28124,6 +28108,24 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/floor/iron, /area/bridge) +"heG" = ( +/obj/machinery/power/apc{ + areastring = "/area/science/explab"; + dir = 1; + name = "Xenoarchaeology Lab APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "heK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 5 @@ -30933,6 +30935,20 @@ }, /turf/open/floor/iron/dark, /area/teleporter) +"hZX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "iaj" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -31622,16 +31638,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/surgery) -"ilF" = ( -/obj/machinery/computer/xenoartifact_console{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "ilL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -32006,6 +32012,28 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"isG" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced, +/obj/machinery/door/window/northleft{ + dir = 8; + name = "Secure Artifact Storage"; + req_one_access_txt = "8;49" + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "isN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36368,6 +36396,17 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron, /area/hallway/primary/port) +"jKq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch{ + pixel_y = -27 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "jKB" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -36659,6 +36698,18 @@ /obj/effect/turf_decal/siding/wideplating_new/corner, /turf/open/floor/iron, /area/crew_quarters/fitness/recreation) +"jPu" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8; + pixel_y = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/turf/open/floor/engine, +/area/science/explab) "jPx" = ( /obj/structure/window/reinforced, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -38443,17 +38494,6 @@ broken = 1 }, /area/maintenance/port/aft) -"kvl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "kvm" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8; @@ -40384,6 +40424,31 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/dark, /area/maintenance/starboard) +"leI" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/window/southright{ + dir = 8; + name = "Secure Artifact Storage"; + req_one_access_txt = "8;49" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/effect/mapping_helpers/tile_breaker, +/obj/item/xenoartifact, +/turf/open/floor/iron/dark, +/area/science/explab) "leQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset/anchored, @@ -40835,14 +40900,6 @@ }, /turf/open/floor/iron/dark, /area/construction/mining/aux_base) -"lmA" = ( -/obj/machinery/xenoartifact_inbox, -/obj/item/xenoartifact, -/obj/effect/turf_decal/delivery, -/obj/effect/landmark/xeno_spawn, -/obj/effect/decal/remains/human, -/turf/open/floor/engine, -/area/science/explab) "lmS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, @@ -42328,16 +42385,6 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/dark, /area/hallway/primary/fore) -"lLa" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8; - pixel_y = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "lLe" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -44224,6 +44271,26 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/crew_quarters/heads/chief) +"moN" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "moO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -46272,6 +46339,17 @@ broken = 1 }, /area/maintenance/fore) +"naL" = ( +/obj/structure/closet/bombcloset, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "naP" = ( /obj/machinery/newscaster{ pixel_x = 30 @@ -46438,6 +46516,14 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/dark, /area/hallway/primary/aft) +"ncS" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/scale, +/turf/open/floor/engine, +/area/science/explab) "ndb" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable/yellow{ @@ -46712,22 +46798,6 @@ "nhy" = ( /turf/open/floor/iron/dark, /area/quartermaster/exploration_dock) -"nhS" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -24 - }, -/obj/structure/table, -/obj/item/xenoartifact_labeler{ - pixel_y = 2 - }, -/obj/item/xenoartifact_labeler{ - pixel_x = -9 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "nie" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -48451,6 +48521,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/primary/central) +"nMT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "nNd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ @@ -49304,22 +49388,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/science/xenobiology) -"nZr" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/item/radio/intercom{ - pixel_x = -28 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/camera{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "nZt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ @@ -49600,6 +49668,17 @@ }, /turf/open/floor/iron, /area/crew_quarters/fitness/recreation) +"odc" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/conductor, +/turf/open/floor/engine, +/area/science/explab) "odf" = ( /obj/effect/turf_decal/caution/stand_clear{ dir = 4 @@ -51715,27 +51794,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) -"oKz" = ( -/obj/structure/rack, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_x = 8 - }, -/obj/item/geiger_counter, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/explab) "oKS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -52088,21 +52146,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/engine/atmos) -"oQI" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/explab"; - dir = 1; - name = "Xenoarchaeology Lab APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "oQU" = ( /obj/machinery/door/airlock/external{ name = "Satellite External Airlock"; @@ -52791,14 +52834,6 @@ burnt = 1 }, /area/maintenance/starboard/aft) -"pdx" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "pdD" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -52850,16 +52885,6 @@ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, /area/docking/arrival) -"peN" = ( -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/science/explab) "pfo" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/bot, @@ -53159,6 +53184,12 @@ /mob/living/simple_animal/pet/hamster/vector, /turf/open/floor/iron/freezer, /area/medical/virology) +"pkS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plating, +/area/maintenance/port/aft) "plt" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -54267,6 +54298,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/hallway/primary/port) +"pAy" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/airalarm/directional/north, +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/turf/open/floor/iron/showroomfloor, +/area/security/main) "pAB" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 @@ -54497,6 +54539,26 @@ }, /turf/open/floor/plating, /area/quartermaster/warehouse) +"pDo" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "pDt" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "cmoprivacy"; @@ -54852,21 +54914,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/showroomfloor, /area/medical/medbay/central) -"pKh" = ( -/obj/structure/sign/poster/official/bless_this_spess{ - pixel_x = 32 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/obj/effect/mapping_helpers/make_non_slip, -/turf/open/floor/iron/dark/textured, -/area/science/explab) "pKs" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ @@ -57969,18 +58016,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/medical/medbay/central) -"qJK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/vending/wardrobe/science_wardrobe, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/science/explab) "qJM" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/landmark/start/depsec/medical, @@ -60121,20 +60156,6 @@ broken = 1 }, /area/maintenance/port/fore) -"ruI" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_y = 4 - }, -/obj/item/healthanalyzer{ - pixel_x = -4; - pixel_y = 22 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "ruO" = ( /obj/machinery/door/airlock/maintenance{ name = "security Maintenance"; @@ -62266,6 +62287,22 @@ }, /turf/open/floor/iron/showroomfloor, /area/medical/genetics/cloning) +"sgq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/mapping_helpers/tile_breaker, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/science/explab) "sgH" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/light/small{ @@ -62406,15 +62443,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/ai_monitored/turret_protected/ai) -"sie" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "sir" = ( /obj/structure/chair{ dir = 8 @@ -63059,6 +63087,19 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/security/courtroom) +"stE" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/obj/item/clothing/neck/stethoscope, +/obj/item/healthanalyzer, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "stJ" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/machinery/airalarm/directional/east, @@ -64631,23 +64672,6 @@ /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, /area/space/nearstation) -"sRC" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/window/southright{ - dir = 8; - name = "Secure Artifact Storage"; - req_one_access_txt = "8;49" - }, -/obj/structure/rack, -/obj/item/xenoartifact, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/explab) "sRI" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -64796,6 +64820,35 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"sTC" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "xenoarch"; + name = "containment shutters"; + pixel_x = -27; + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/item/book/manual/wiki/xenoarchaeology{ + pixel_x = -5; + pixel_y = 6 + }, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "sUq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/vending/hydroseeds{ @@ -65127,6 +65180,23 @@ }, /turf/open/space/basic, /area/space/nearstation) +"sYR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/purple/anticorner/contrasted, +/obj/structure/bed/dogbed, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley III, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley III"; + real_name = "Pugley III" + }, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "sZh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -66324,17 +66394,6 @@ }, /turf/open/floor/iron/dark, /area/hallway/primary/aft) -"twc" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/airalarm/directional/north, -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/iron/showroomfloor, -/area/security/main) "twq" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -66608,6 +66667,13 @@ }, /turf/open/floor/iron/dark, /area/crew_quarters/locker) +"tBp" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/dark, +/area/science/explab) "tBv" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -68713,6 +68779,22 @@ }, /turf/open/floor/iron, /area/security/brig/aft) +"umS" = ( +/obj/structure/sign/poster/official/bless_this_spess{ + pixel_x = 32 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/shower{ + dir = 8; + name = "emergency shower" + }, +/obj/effect/turf_decal/bot, +/obj/effect/mapping_helpers/make_non_slip, +/turf/open/floor/noslip/white, +/area/science/explab) "unh" = ( /obj/machinery/light{ dir = 8 @@ -69188,17 +69270,6 @@ /obj/effect/turf_decal/tile/dark/half, /turf/open/floor/iron/dark, /area/medical/medbay/central) -"usy" = ( -/obj/item/book/manual/wiki/xenoarchaeology{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "usz" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -74911,13 +74982,6 @@ broken = 1 }, /area/maintenance/port/fore) -"whj" = ( -/obj/machinery/door/window/southright{ - name = "Testing Chamber" - }, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) "whx" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, @@ -76165,21 +76229,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/chapel/main) -"wAI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/explab) "wAS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -77327,13 +77376,6 @@ }, /turf/open/floor/iron/dark, /area/science/explab) -"wRZ" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine, -/area/science/explab) "wSl" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark/corner, @@ -77392,11 +77434,6 @@ }, /turf/open/floor/iron/dark, /area/security/courtroom) -"wTc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/plating, -/area/maintenance/port/aft) "wTd" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -80146,6 +80183,18 @@ /obj/item/restraints/handcuffs, /turf/open/floor/iron/showroomfloor, /area/security/main) +"xEG" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -24 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/turf/open/floor/iron/showroomfloor, +/area/science/explab) "xEI" = ( /obj/machinery/light/small{ dir = 1 @@ -80699,17 +80748,6 @@ burnt = 1 }, /area/maintenance/port) -"xPR" = ( -/obj/effect/spawner/randomvend/cola, -/obj/effect/turf_decal/delivery, -/obj/structure/sign/poster/official/no_erp{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/crew_quarters/locker) "xPT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -94746,7 +94784,7 @@ eaw vUW ajd rcS -wTc +fLM ajd ajd oOp @@ -96030,7 +96068,7 @@ awD ouv jEm ajd -cHX +pkS vPK ajd mth @@ -98869,7 +98907,7 @@ aav pHV fFk mzE -twc +pAy qUS dDF exu @@ -104760,7 +104798,7 @@ aHN sNW myO kKb -xPR +gdu bIV bLu bIV @@ -119373,7 +119411,7 @@ ctJ nRz aWY wxE -peN +tBp qDP nuW pSq @@ -122180,9 +122218,9 @@ aeu aWY aWY aWY -fkS -nhS -wAI +stE +xEG +pDo mFy roF iic @@ -122435,12 +122473,12 @@ aaa acm aWY aWY -ilF -usy -ruI +bcM +sTC +moN iZp tmh -cEH +jKq aWY vwf gAc @@ -122691,12 +122729,12 @@ acm acm acm aWY -nZr +gHf pHv qSw wZU sPa -kvl +sYR uSg pYn dsL @@ -122949,11 +122987,11 @@ aaa acm gCl lui -lLa +jPu nzA pTb lNK -qJK +sgq btR kOd wdB @@ -123206,11 +123244,11 @@ aaa acm gCl lui -wRZ -lmA -whj +ncS +aAq +bOn lNK -oKz +nMT btR iKB rBh @@ -123463,11 +123501,11 @@ acm acm gCl lui -sie +odc hZD sBr rAf -elR +hZX uSg cEm xqW @@ -123724,7 +123762,7 @@ eRv iRu rVo ozc -pdx +gDx aWY aeu aeu @@ -123977,11 +124015,11 @@ aaa aaa aWY aWY -oQI -sRC -fQL -pKh -ahs +heG +leI +isG +umS +naL aWY aeu aeu diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 2f6251821af00..f8d68c5dd8100 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -172,6 +172,14 @@ "aaZ" = ( /turf/closed/wall/r_wall, /area/security/execution/education) +"abd" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white, +/area/science/explab) "abe" = ( /turf/closed/wall, /area/security/prison) @@ -838,6 +846,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/disposal) +"ahw" = ( +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" + }, +/obj/structure/bed/dogbed, +/turf/open/floor/iron/dark, +/area/science/explab) "ahx" = ( /turf/closed/wall, /area/security/brig) @@ -3204,9 +3221,29 @@ "aDu" = ( /turf/closed/wall, /area/hallway/primary/fore) +"aDB" = ( +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/science/explab) "aDC" = ( /turf/open/floor/iron, /area/hallway/primary/fore) +"aDI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/xenoarchaeology_pearl{ + pixel_y = 32 + }, +/turf/open/floor/iron/white, +/area/science/explab) "aDQ" = ( /obj/machinery/door/airlock{ id_tag = "Toilet3"; @@ -9291,25 +9328,6 @@ }, /turf/open/floor/iron/dark/textured, /area/ai_monitored/security/armory) -"boj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "bok" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -9679,16 +9697,6 @@ /obj/item/stack/cable_coil/random, /turf/open/floor/iron, /area/storage/art) -"brp" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/closet/crate{ - opened = 1 - }, -/obj/item/wirecutters, -/obj/item/weldingtool, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/iron, -/area/maintenance/starboard/secondary) "bry" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/yellow{ @@ -16669,9 +16677,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/science/research) -"cmP" = ( -/turf/closed/wall, -/area/science/explab) "cmX" = ( /obj/structure/window/reinforced, /obj/machinery/holopad, @@ -17008,20 +17013,6 @@ }, /turf/open/floor/iron/white, /area/science/research) -"cqR" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/explab"; - name = "Experimentation Lab APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/science/explab) -"cqV" = ( -/turf/open/floor/iron/white, -/area/science/explab) "cqX" = ( /obj/structure/bed/roller, /obj/effect/decal/cleanable/blood/old, @@ -18722,22 +18713,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/central) -"cJp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Experimentation Lab Maintenance"; - req_one_access_txt = "8;49" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "cJr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, @@ -19934,6 +19909,18 @@ }, /turf/open/space, /area/space/nearstation) +"cSZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "cTi" = ( /obj/item/stack/rods/fifty, /obj/item/stack/sheet/glass/fifty, @@ -20088,21 +20075,6 @@ }, /turf/open/space/basic, /area/space) -"cVk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/machinery/computer/operating{ - dir = 1 - }, -/turf/open/floor/iron/white/smooth_half, -/area/security/brig) "cVw" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -20188,6 +20160,12 @@ }, /turf/open/floor/iron, /area/hallway/primary/fore) +"cWv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) "cWx" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, @@ -20606,26 +20584,6 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste, /turf/open/floor/plating/airless, /area/engine/engineering) -"dec" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/maintenance/starboard/secondary) "def" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -21081,6 +21039,12 @@ /obj/item/wrench, /turf/open/floor/iron/dark, /area/engine/engineering) +"dgc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron/dark, +/area/science/explab) "dgf" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -22282,10 +22246,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/hallway/primary/central) -"dua" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/science/explab) "due" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -23174,17 +23134,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dKY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/science/explab) "dLb" = ( /obj/machinery/chem_dispenser/drinks/beer, /obj/structure/table/reinforced, @@ -23380,33 +23329,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"dNT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; - req_one_access_txt = "8;49" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, -/turf/open/floor/iron/white, -/area/science/explab) "dOd" = ( /obj/structure/window/reinforced{ dir = 1 @@ -23414,6 +23336,26 @@ /obj/machinery/camera/directional/south, /turf/open/space, /area/space/nearstation) +"dOl" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = -32 + }, +/obj/item/paicard{ + pixel_x = -7 + }, +/obj/item/book/manual/wiki/xenoarchaeology{ + pixel_x = -6 + }, +/obj/item/sticky_note_pile{ + pixel_y = 3; + pixel_x = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "dOr" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -23846,6 +23788,24 @@ }, /turf/open/floor/iron/white, /area/science/research) +"dWz" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science Requests Console"; + pixel_x = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "dWF" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -24643,6 +24603,14 @@ /obj/item/bedsheet/medical, /turf/open/floor/iron/white, /area/medical/surgery) +"epk" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "epn" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -25184,15 +25152,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/starboard) -"ezt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/xenoartifact_console{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "ezw" = ( /obj/machinery/camera/directional/west{ c_tag = "Departure Lounge - Port Aft" @@ -26902,6 +26861,9 @@ }, /turf/open/floor/iron, /area/storage/primary) +"fjR" = ( +/turf/open/floor/iron/dark, +/area/science/explab) "fka" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -27904,16 +27866,6 @@ }, /turf/open/floor/iron/white, /area/crew_quarters/heads/cmo) -"fBw" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/closet/radiation, -/turf/open/floor/iron/white, -/area/science/explab) "fBI" = ( /obj/structure/window/reinforced{ dir = 4 @@ -28701,6 +28653,12 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat_interior) +"fPn" = ( +/obj/machinery/vending/medical{ + pixel_x = -2 + }, +/turf/open/floor/iron/dark, +/area/security/brig) "fPo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -29568,6 +29526,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gdG" = ( +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/tile_breaker, +/turf/open/floor/iron/white, +/area/science/explab) "gej" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -30397,6 +30364,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/engine/break_room) +"gyI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/explab) "gyM" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -31102,18 +31075,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) -"gOu" = ( -/obj/effect/turf_decal/caution, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) -"gOz" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "gPd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -33012,6 +32973,21 @@ }, /turf/open/floor/prison, /area/security/prison) +"hyZ" = ( +/obj/structure/sink{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/explab"; + name = "Experimentation Lab APC"; + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/science/explab) "hzl" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -33179,15 +33155,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"hDh" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/engine, -/area/science/explab) "hDi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -33257,20 +33224,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/kitchen) -"hEu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/table/reinforced, -/obj/item/storage/firstaid/regular, -/obj/item/clothing/neck/stethoscope, -/obj/machinery/airalarm/directional/east, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "hEL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -33602,6 +33555,14 @@ }, /turf/open/floor/iron, /area/storage/primary) +"hJw" = ( +/obj/structure/closet/bombcloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white, +/area/science/explab) "hJA" = ( /obj/structure/closet/secure_closet/hos, /obj/machinery/light{ @@ -35594,14 +35555,6 @@ }, /turf/open/floor/iron/white, /area/science/mixing) -"isb" = ( -/obj/structure/chair/office/light, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/science/explab) "ise" = ( /obj/structure/sign/departments/minsky/engineering/atmospherics{ pixel_y = -32 @@ -35708,6 +35661,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/science/central) +"iuG" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/white, +/area/science/explab) "iuL" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -35727,6 +35688,22 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron, /area/medical/surgery) +"ivz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/structure/table/optable, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/white/smooth_half, +/area/security/brig) "ivE" = ( /obj/machinery/newscaster{ pixel_x = -30 @@ -37381,6 +37358,13 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"jfa" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/science/explab) "jfz" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -37705,6 +37689,27 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/patients_rooms) +"jkV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "jkY" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -37729,6 +37734,10 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/security/brig) +"jmi" = ( +/obj/machinery/iv_drip, +/turf/open/floor/iron/white/textured_large, +/area/security/brig) "jmN" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -37737,10 +37746,6 @@ }, /turf/open/floor/iron, /area/maintenance/aft) -"jny" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/science/explab) "jnJ" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -38231,6 +38236,26 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/virology) +"jxA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/end{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white, +/area/science/explab) "jxC" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -38386,25 +38411,6 @@ "jAi" = ( /turf/open/floor/iron/tech/grid, /area/security/main) -"jAj" = ( -/obj/structure/rack, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/assembly/igniter, -/obj/item/analyzer, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/geiger_counter, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/iron/dark, -/area/science/explab) "jAk" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -39126,15 +39132,6 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/virology) -"jOm" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "jOD" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -40360,6 +40357,21 @@ /obj/item/vending_refill/cigarette, /turf/open/floor/wood/big, /area/crew_quarters/bar) +"kla" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) "klm" = ( /obj/structure/closet/secure_closet/miner, /obj/structure/extinguisher_cabinet{ @@ -41199,6 +41211,9 @@ }, /turf/open/floor/carpet/grimy, /area/hallway/primary/port) +"kBb" = ( +/turf/open/floor/iron, +/area/maintenance/starboard/secondary) "kBz" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -41216,10 +41231,6 @@ }, /turf/open/floor/iron/white, /area/medical/chemistry) -"kBJ" = ( -/obj/machinery/iv_drip, -/turf/open/floor/iron/white/textured_large, -/area/security/brig) "kBS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -41777,6 +41788,25 @@ /obj/structure/closet/secure_closet/chemical, /turf/open/floor/iron, /area/medical/chemistry) +"kKW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Experimentation Lab Maintenance"; + req_one_access_txt = "8;49" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) "kKX" = ( /obj/structure/cable{ icon_state = "1-2" @@ -42162,24 +42192,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/hallway/primary/central) -"kTH" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/syringe, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/item/stack/medical/gauze, -/obj/item/clothing/under/rank/medical/doctor/purple{ - pixel_y = -4 - }, -/turf/open/floor/iron/white/smooth_half{ - dir = 1 - }, -/area/security/brig) "kTP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -42777,17 +42789,6 @@ }, /turf/open/floor/iron/dark, /area/science/xenobiology) -"lic" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Club - Aft" - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -29 - }, -/obj/item/clothing/mask/cigarette/pipe, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/crew_quarters/bar) "lik" = ( /obj/machinery/door/airlock/external, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -42905,6 +42906,16 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /turf/open/floor/iron/dark, /area/aisat) +"lkm" = ( +/obj/machinery/computer/xenoarchaeology_console{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "llo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43283,6 +43294,24 @@ }, /turf/open/floor/carpet/grimy, /area/tcommsat/computer) +"lsZ" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/reagent_containers/syringe, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/item/stack/medical/gauze, +/obj/item/clothing/under/rank/medical/doctor/purple{ + pixel_y = -4 + }, +/turf/open/floor/iron/white/smooth_half{ + dir = 1 + }, +/area/security/brig) "ltc" = ( /obj/machinery/photocopier{ pixel_y = 3 @@ -43315,6 +43344,12 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) +"ltG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/explab) "ltK" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -43394,6 +43429,30 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/port/fore) +"luQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "luX" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -43460,6 +43519,11 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) +"lwa" = ( +/turf/open/floor/iron/stairs{ + dir = 1 + }, +/area/science/explab) "lwb" = ( /obj/machinery/camera/directional/east{ c_tag = "Gravity Generator Room" @@ -43920,6 +43984,11 @@ }, /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) +"lEU" = ( +/obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "lFc" = ( /obj/structure/table, /obj/item/electropack, @@ -44049,18 +44118,6 @@ }, /turf/open/floor/carpet/royalblack, /area/security/main) -"lHL" = ( -/obj/item/radio/intercom{ - pixel_y = -29 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Experimentation Lab" - }, -/obj/machinery/light, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/iron/white, -/area/science/explab) "lHU" = ( /obj/machinery/computer/card, /obj/machinery/requests_console{ @@ -44468,21 +44525,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"lMX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "lNb" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -44527,14 +44569,6 @@ /obj/structure/easel, /turf/open/floor/iron, /area/maintenance/starboard/fore) -"lNH" = ( -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_y = 24 - }, -/turf/open/floor/iron/white, -/area/science/explab) "lNP" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -46189,15 +46223,6 @@ }, /turf/open/floor/iron/white, /area/science/xenobiology) -"mvP" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/status_display/ai{ - pixel_x = -32 - }, -/turf/open/floor/engine, -/area/science/explab) "mvU" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, @@ -46369,23 +46394,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai) -"myO" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = 21 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12 - }, -/turf/open/floor/iron/white, -/area/science/explab) "mze" = ( /obj/machinery/light/small{ dir = 8 @@ -46424,16 +46432,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/starboard/aft) -"mzG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "mAd" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -47244,6 +47242,14 @@ }, /turf/open/floor/iron, /area/quartermaster/qm) +"mLS" = ( +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "mLT" = ( /obj/structure/window/reinforced{ dir = 1 @@ -47463,6 +47469,10 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/patients_rooms) +"mQL" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/science/explab) "mQS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -47494,16 +47504,6 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) -"mQV" = ( -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "mRb" = ( /obj/structure/bed/dogbed/runtime, /mob/living/simple_animal/pet/cat/Runtime, @@ -48016,9 +48016,6 @@ }, /turf/open/floor/iron, /area/engine/engineering) -"mZQ" = ( -/turf/open/floor/engine, -/area/science/explab) "mZR" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -48072,6 +48069,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/lawoffice) +"naH" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -29 + }, +/obj/machinery/vending/sticker, +/obj/machinery/camera/directional/south{ + c_tag = "Club - Aft" + }, +/turf/open/floor/carpet, +/area/crew_quarters/bar) "naS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -48775,6 +48782,12 @@ }, /turf/open/floor/iron/grid/steel, /area/medical/virology) +"nqg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/science/explab) "nqq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -48906,6 +48919,11 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/medical/medbay/central) +"nts" = ( +/obj/structure/chair/office/light, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/iron/white, +/area/science/explab) "nuw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -48998,6 +49016,22 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) +"nvz" = ( +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/effect/mapping_helpers/tile_breaker, +/turf/open/floor/iron/dark, +/area/science/explab) "nvB" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Space Access Airlock"; @@ -49599,17 +49633,17 @@ /obj/effect/turf_decal/tile/red/fourcorners/contrasted, /turf/open/floor/prison, /area/security/prison) -"nHL" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +"nHQ" = ( +/obj/machinery/shower{ + dir = 1 }, -/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/make_non_slip, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/light, +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/directional/south, /turf/open/floor/iron/white, /area/science/explab) "nIo" = ( @@ -50214,6 +50248,15 @@ }, /turf/open/floor/carpet, /area/crew_quarters/theatre) +"nRX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/science/explab) "nSk" = ( /obj/machinery/airalarm/directional/west{ pixel_x = -23 @@ -51646,15 +51689,6 @@ }, /turf/open/floor/iron, /area/maintenance/port/fore) -"ore" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "ori" = ( /obj/effect/turf_decal/pool/corner{ dir = 8 @@ -52264,6 +52298,31 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/medical/morgue) +"oAC" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "oAW" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -52421,14 +52480,6 @@ }, /turf/open/floor/iron/dark, /area/medical/morgue) -"oDr" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/xenoartifact, -/turf/open/floor/iron/dark, -/area/science/explab) "oDB" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -52795,16 +52846,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/medical/medbay/lobby) -"oJn" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/structure/closet/bombcloset, -/turf/open/floor/iron/white, -/area/science/explab) "oJA" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -52881,25 +52922,6 @@ }, /turf/open/floor/iron, /area/quartermaster/office) -"oKt" = ( -/obj/machinery/light, -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science{ - pixel_y = 9 - }, -/obj/item/xenoartifact_labeler{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/xenoartifact_labeler, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/explab) "oKC" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -53292,15 +53314,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron, /area/engine/engineering) -"oSU" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/explab) "oTf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -54257,12 +54270,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"ppH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/xenoartifact_inbox, -/obj/item/xenoartifact, -/turf/open/floor/engine, -/area/science/explab) "ppV" = ( /obj/structure/disposalpipe/segment, /obj/machinery/holopad, @@ -54407,6 +54414,32 @@ dir = 1 }, /area/engine/engineering) +"psl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Xenoarchaeology Lab"; + req_one_access_txt = "8;49" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "psm" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54594,6 +54627,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) +"puY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/security/brig) "pvg" = ( /obj/machinery/light/small{ dir = 4 @@ -55280,6 +55328,36 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"pJu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "pJB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -55722,6 +55800,19 @@ }, /turf/open/floor/iron/white/corner, /area/hallway/secondary/entry) +"pSj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/science/explab) "pSs" = ( /obj/structure/table, /obj/item/clipboard, @@ -56424,15 +56515,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/starboard) -"qdM" = ( -/obj/machinery/camera{ - dir = 9 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "qdO" = ( /obj/machinery/power/solar_control{ id = "forestarboard"; @@ -56814,17 +56896,6 @@ }, /turf/open/floor/iron, /area/hydroponics) -"qkz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/light_switch{ - pixel_x = 7; - pixel_y = -26 - }, -/turf/open/floor/iron/white, -/area/science/explab) "qkK" = ( /obj/machinery/portable_atmospherics/pump, /obj/structure/window/reinforced{ @@ -57390,6 +57461,25 @@ }, /turf/open/floor/iron, /area/engine/engineering) +"qxe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "qxo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -57476,15 +57566,6 @@ }, /turf/open/floor/iron/white/corner, /area/hallway/secondary/entry) -"qyP" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/iron, -/area/maintenance/starboard/secondary) "qzm" = ( /obj/item/cigbutt, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -58417,13 +58498,6 @@ dir = 1 }, /area/security/courtroom) -"qPP" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/iron, -/area/maintenance/starboard/secondary) "qPQ" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -58740,12 +58814,6 @@ }, /turf/open/floor/iron, /area/quartermaster/office) -"qVm" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "qVH" = ( /obj/machinery/power/smes{ capacity = 9e+006; @@ -59323,6 +59391,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/department/medical/central) +"rgr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "rgC" = ( /obj/structure/sign/poster/official/suit_sensors{ pixel_x = -32; @@ -59415,16 +59504,6 @@ }, /turf/open/floor/noslip/dark, /area/science/shuttledock) -"riy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/maintenance/starboard/secondary) "rjv" = ( /obj/effect/turf_decal/numbers/two_nine, /turf/open/floor/iron/grid/steel, @@ -59488,6 +59567,12 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) +"rjW" = ( +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "rkd" = ( /obj/machinery/light/small{ dir = 4 @@ -59628,6 +59713,16 @@ }, /turf/open/floor/iron/dark, /area/science/xenobiology) +"rnh" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/wood/poker, +/obj/item/clothing/mask/cigarette/cigar, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/wood, +/area/crew_quarters/bar) "rnn" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -59836,12 +59931,6 @@ }, /turf/open/floor/iron, /area/medical/chemistry) -"rrR" = ( -/obj/machinery/vending/medical{ - pixel_x = -2 - }, -/turf/open/floor/iron/dark, -/area/security/brig) "rrW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -59932,16 +60021,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) -"rtI" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/status_display/evac{ - pixel_x = 32 - }, -/turf/open/floor/engine, -/area/science/explab) "rub" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -60739,6 +60818,13 @@ }, /turf/open/floor/iron/dark, /area/chapel/office) +"rJw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/iron/white, +/area/science/explab) "rJX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -60849,22 +60935,12 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/security/brig) -"rMU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/structure/table/optable, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 +"rMG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/turf/open/floor/iron/white/smooth_half, -/area/security/brig) +/turf/open/floor/engine, +/area/science/explab) "rMV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/tile/blue{ @@ -64215,6 +64291,10 @@ }, /turf/open/floor/iron/techmaint, /area/science/shuttledock) +"sXe" = ( +/obj/structure/sign/warning/explosives, +/turf/closed/wall/r_wall, +/area/science/explab) "sXs" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -65352,6 +65432,27 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"tqO" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "tqQ" = ( /obj/structure/closet/secure_closet/evidence, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -66348,6 +66449,21 @@ /obj/item/clothing/under/misc/assistantformal, /turf/open/floor/wood, /area/crew_quarters/dorms) +"tKc" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/obj/item/clothing/neck/stethoscope, +/obj/item/healthanalyzer{ + pixel_y = 7 + }, +/obj/machinery/light_switch{ + pixel_x = 23 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "tKB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plating, @@ -66594,6 +66710,27 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) +"tNQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/explab) "tNW" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -67022,13 +67159,6 @@ }, /turf/open/floor/wood/big, /area/crew_quarters/bar) -"tVX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/science/explab) "tWo" = ( /obj/machinery/modular_fabricator/exosuit_fab, /obj/machinery/camera/directional/north{ @@ -67218,21 +67348,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain/private) -"uan" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/science/explab) "uaJ" = ( /obj/machinery/camera/directional/south{ c_tag = "Cargo Bay - Aft" @@ -67246,6 +67361,16 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) +"uaY" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/turf/open/floor/iron/white, +/area/science/explab) "ube" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -68876,14 +69001,6 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/science/research) -"uEf" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/explab) "uEk" = ( /obj/machinery/suit_storage_unit/exploration, /obj/structure/window/reinforced, @@ -69307,16 +69424,6 @@ /obj/machinery/ntnet_relay, /turf/open/floor/iron/dark/telecomms, /area/tcommsat/server) -"uMx" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/tank/internals/oxygen, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/book/manual/wiki/xenoarchaeology, -/turf/open/floor/iron/dark, -/area/science/explab) "uNf" = ( /obj/item/radio/intercom{ pixel_y = 24 @@ -70561,10 +70668,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/crew_quarters/heads/chief) -"vkc" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "vkd" = ( /obj/structure/closet/emcloset, /turf/open/floor/iron, @@ -70787,6 +70890,15 @@ }, /turf/open/floor/iron, /area/construction/storage_wing) +"vnT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plating, +/area/maintenance/starboard/secondary) "vnZ" = ( /obj/machinery/firealarm{ dir = 1; @@ -71121,17 +71233,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"vtU" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "vuc" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -71318,24 +71419,6 @@ /obj/effect/turf_decal/tile/dark_red, /turf/open/floor/iron/smooth_corner, /area/security/prison) -"vxn" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/science/explab) "vxo" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -72379,6 +72462,19 @@ }, /turf/open/floor/iron/white, /area/medical/genetics/cloning) +"vPg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, +/area/science/explab) "vPl" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -72727,17 +72823,6 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"vXi" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/caution{ - dir = 1 - }, -/obj/effect/landmark/xeno_spawn, -/obj/item/radio/intercom{ - pixel_y = 21 - }, -/turf/open/floor/engine, -/area/science/explab) "vXq" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -73477,6 +73562,12 @@ }, /turf/open/floor/iron, /area/engine/break_room) +"wnE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) "wnH" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -73646,6 +73737,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"wqQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) "wqY" = ( /obj/machinery/door/airlock/mining{ name = "Cargo Bay"; @@ -73726,12 +73823,6 @@ "wsV" = ( /turf/closed/wall/r_wall, /area/medical/chemistry) -"wto" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "wtq" = ( /turf/closed/wall, /area/maintenance/aft/secondary) @@ -74163,17 +74254,6 @@ }, /turf/open/floor/engine, /area/engine/supermatter) -"wAX" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "wBJ" = ( /obj/structure/window/reinforced, /obj/machinery/modular_fabricator/autolathe, @@ -74535,6 +74615,17 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/maintenance/port) +"wIp" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "wIz" = ( /obj/structure/cable, /obj/machinery/power/solar{ @@ -74702,6 +74793,14 @@ }, /turf/open/floor/iron/dark, /area/teleporter) +"wLj" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/obj/machinery/camera{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "wLm" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -75573,6 +75672,26 @@ /obj/structure/cable/yellow, /turf/open/floor/iron/dark, /area/medical/surgery) +"xaZ" = ( +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/science/explab) "xbd" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -76073,6 +76192,18 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"xjC" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Brig - Infirmary" + }, +/obj/effect/turf_decal/tile/red/half, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half{ + dir = 1 + }, +/area/security/brig) "xjG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -76160,16 +76291,6 @@ /obj/machinery/portable_thermomachine, /turf/open/floor/iron, /area/maintenance/port) -"xkC" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "xkM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -77082,15 +77203,6 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/security/checkpoint/customs) -"xzS" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/wood/poker, -/obj/item/clothing/mask/cigarette/cigar, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "xAf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/circuit/green, @@ -77216,19 +77328,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/hallway/primary/fore) -"xCg" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/machinery/requests_console{ - pixel_x = -32 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "xCh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -77338,17 +77437,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/dark, /area/aisat) -"xFt" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/starboard/secondary) "xFu" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -77416,18 +77504,6 @@ }, /turf/open/floor/iron/dark, /area/science/shuttledock) -"xGs" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Brig - Infirmary" - }, -/obj/effect/turf_decal/tile/red/half, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/white/smooth_half{ - dir = 1 - }, -/area/security/brig) "xGC" = ( /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;27;37;5" @@ -105290,7 +105366,7 @@ aaa lMJ ajm wdz -kTH +lsZ lTw hbB xfg @@ -105549,8 +105625,8 @@ ajm fIy xXp qpd -kBJ -rMU +jmi +ivz ahx gTN ekb @@ -105807,7 +105883,7 @@ sop uYl ljd vDB -cVk +puY ajm tqQ hDA @@ -106060,10 +106136,10 @@ aaa aaf aaf ajm -rrR +fPn tpo dEf -xGs +xjC aqa aqa aqa @@ -113335,9 +113411,9 @@ cgq cgq cgq cgq -jny -dNT -cmP +cgq +psl +sXe thn kac xMM @@ -113587,14 +113663,14 @@ tYS bST qfF cgq -mZQ -mvP -mZQ -cgq -myO -oSU -vxn -xCg +hJw +dWz +abd +iuG +gdG +uaY +tNQ +wIp thn pkb wqi @@ -113844,14 +113920,14 @@ ccw bST xId cgq -wto -vkc -mQV -uEf -tVX -uMx -boj -cqR +aDI +cSZ +cSZ +cSZ +cSZ +vPg +tqO +hyZ thn hGH fYI @@ -114101,14 +114177,14 @@ ccv bST vcc cgq -vXi -ppH -gOu -hDh -gOz -jAj -dKY -lHL +rjW +fjR +fjR +fjR +ahw +pSj +oAC +nHQ thn dPF skB @@ -114358,14 +114434,14 @@ nmp bST hcQ cgq -qdM -vkc -dua -uEf -ore -oDr -lMX -qkz +wLj +nqg +wqQ +rMG +fjR +lwa +luQ +nRX thn thn thn @@ -114615,15 +114691,15 @@ tYS bST xId cgq -mZQ -rtI -mZQ -cgq -lNH -cqV -nHL -isb -ezt +aDB +wnE +lEU +mQL +fjR +lwa +rgr +nts +lkm cgq jRr fBQ @@ -114872,15 +114948,15 @@ ccy bST hMg cgq -cgq -cgq -cgq -cgq -oJn -fBw -uan -hEu -oKt +mLS +gyI +cWv +ltG +fjR +lwa +jkV +rJw +dOl cgq lal jVZ @@ -115128,16 +115204,16 @@ hFA dbE bST sqD -ovj -brp -nbv -qPP -cgq -cgq -cgq -cJp -cgq cgq +epk +qxe +nvz +xaZ +dgc +jxA +pJu +jfa +tKc cgq sqH qFY @@ -115385,19 +115461,19 @@ lKE ccz bST fUm -jOm -riy -xFt -riy -wAX -mzG -jOm -dec -qyP -vtU -xkC -ror -jnJ +cgq +cgq +cgq +cgq +cgq +cgq +cgq +kKW +cgq +cgq +cgq +kBb +hMg mjJ mjJ mjJ @@ -115626,7 +115702,7 @@ cTR byC bwS cWx -lic +naH bKe bNF bOZ @@ -115649,12 +115725,12 @@ uJg qZL bEY uJg -nbv -ogE -vTs -nbv -nbv -qVm +kla +ror +vnT +vnT +ror +jnJ mjJ ygk ygk @@ -115909,8 +115985,8 @@ ovj ovj ovj ovj -nbv -sEo +ogE +vTs mHa mjJ sez @@ -116136,7 +116212,7 @@ jDS etX cii igE -xzS +rnh irz hGt qEx diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 031b450cf6cc6..7097a511cdff5 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1,17 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"ae" = ( -/obj/structure/ore_box, -/obj/machinery/airalarm/directional/west{ - pixel_x = -22 - }, -/turf/open/floor/iron/dark, -/area/mine/production) "ag" = ( /obj/structure/stone_tile{ dir = 1 @@ -33,10 +20,6 @@ }, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) -"an" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/mine/gateway) "ap" = ( /obj/machinery/recharge_station, /turf/open/floor/iron, @@ -61,6 +44,16 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"at" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/lattice/catwalk/over, +/turf/open/floor/plating, +/area/mine/production) "aw" = ( /obj/machinery/light/small, /obj/item/kirbyplants/random, @@ -69,10 +62,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"ax" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron/techmaint, -/area/mine/production) "az" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -82,6 +71,10 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"aA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/gateway) "aB" = ( /obj/structure/table/reinforced, /obj/structure/spider/stickyweb, @@ -103,10 +96,35 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/iron, /area/mine/living_quarters) +"aF" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/mine/gateway) "aG" = ( /obj/structure/stone_tile/cracked, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"aI" = ( +/obj/structure/barricade/wooden/crude, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/turf/open/floor/plating, +/area/mine/science) "aJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 @@ -119,6 +137,19 @@ }, /turf/open/floor/iron, /area/mine/science) +"aL" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Communications"; + req_one_access_txt = "54;61" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/maintenance) "aN" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/closeup{ @@ -133,10 +164,22 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/noslip/standard, /area/mine/laborcamp) +"aS" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "aT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) +"aU" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/iron, +/area/mine/gateway) "aV" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -150,13 +193,6 @@ }, /turf/open/floor/iron/techmaint, /area/mine/science) -"aW" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/mine/gateway) "aZ" = ( /obj/structure/showcase/cyborg, /turf/open/floor/carpet/royalblue, @@ -214,38 +250,15 @@ }, /turf/open/floor/iron/dark/telecomms, /area/mine/maintenance) -"bu" = ( -/obj/machinery/door/airlock/research/glass{ - name = "EVA Atrium" - }, -/obj/structure/barricade/wooden/crude, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 +"by" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ +/obj/machinery/light/small{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, /turf/open/floor/iron/techmaint, -/area/mine/science) -"bx" = ( -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/turf/open/floor/plating, -/area/mine/science) +/area/mine/production) "bz" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -254,57 +267,18 @@ /obj/structure/fluff/drake_statue, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"bD" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/iron, -/area/mine/production) "bF" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"bJ" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) -"bL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, +"bH" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/mine/production) -"bN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/door/airlock/mining{ - name = "Mining Station Storage"; - req_one_access_txt = "54;18" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/closeup, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/techmaint, -/area/mine/production) "bO" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -348,21 +322,14 @@ /obj/structure/stone_tile/center, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"bV" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "mining Relay Room"; - req_one_access_txt = "54;61" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/maintenance) "ca" = ( /obj/effect/spawner/randomvend/snack, /turf/open/floor/iron, /area/mine/living_quarters) +"cb" = ( +/obj/effect/spawner/structure/window/depleteduranium, +/turf/open/floor/plating, +/area/mine/production) "ce" = ( /obj/structure/chair/office{ dir = 8 @@ -433,19 +400,6 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron, /area/mine/production) -"cz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "cC" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -465,16 +419,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/mine/science) -"cI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/iron, -/area/mine/production) +"cO" = ( +/obj/machinery/gateway/away, +/turf/open/floor/iron/dark, +/area/mine/gateway) "cT" = ( /obj/structure/stone_tile{ dir = 4 @@ -484,6 +432,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"cV" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/mine/gateway) "cX" = ( /obj/machinery/light{ dir = 4 @@ -516,12 +473,6 @@ "dt" = ( /turf/open/floor/carpet/royalblue, /area/mine/science) -"dA" = ( -/obj/structure/sign/poster/official/science{ - pixel_x = 32 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) "dG" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 8 @@ -535,6 +486,10 @@ /obj/structure/stone_tile/block/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"dK" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/floor/iron/techmaint, +/area/mine/production) "dL" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -577,15 +532,6 @@ /obj/item/stack/cable_coil/cut/white, /turf/open/floor/iron, /area/mine/science) -"dW" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/gateway) "ea" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -593,28 +539,19 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"ed" = ( -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/command{ - name = "Research Director's Office" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/science) -"ef" = ( +"ee" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/catwalk_floor, -/area/mine/science) +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/mine/production) "eg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -627,28 +564,25 @@ }, /turf/open/floor/iron/dark, /area/mine/science) -"ei" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark, -/area/mine/eva) "ek" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/mine/living_quarters) -"eq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/portable_thermomachine, -/obj/structure/sign/poster/contraband/random{ - pixel_y = -32 +"ep" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, -/turf/open/floor/plating, -/area/mine/gateway) +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/iron, +/area/mine/production) "er" = ( /obj/structure/stone_tile{ dir = 8 @@ -695,45 +629,16 @@ /turf/open/floor/iron, /area/mine/laborcamp/security) "ew" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/table, -/obj/item/resonator{ - pixel_x = -4 - }, -/obj/item/resonator{ - pixel_x = 4 - }, -/turf/open/floor/iron, -/area/mine/gateway) -"ey" = ( -/obj/structure/barricade/wooden/crude, -/obj/effect/decal/cleanable/oil/slippery, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plating, +/obj/item/stack/cable_coil/cut/yellow, +/obj/item/stack/rods, +/turf/open/floor/catwalk_floor, /area/mine/science) -"eB" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/mine/gateway) "eC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -746,6 +651,15 @@ }, /turf/open/floor/iron, /area/mine/eva) +"eI" = ( +/obj/effect/turf_decal/stripes/closeup, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external/glass{ + name = "Science Outpost Airlock"; + req_one_access_txt = "54;18;47" + }, +/turf/open/floor/iron/techmaint, +/area/mine/science) "eK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -785,6 +699,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) +"eQ" = ( +/obj/machinery/recharge_station, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/mine/eva) "eS" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile/cracked{ @@ -803,15 +722,10 @@ }, /turf/open/floor/iron/dark, /area/mine/science) -"eX" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron, -/area/mine/gateway) +"eW" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "eY" = ( /turf/open/floor/plating, /area/mine/production) @@ -853,6 +767,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"fl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "fw" = ( /obj/structure/closet/crate, /obj/item/dice/d6/space, @@ -898,6 +819,17 @@ }, /turf/open/floor/iron, /area/mine/science) +"fJ" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/full, +/obj/effect/turf_decal/stripes/red/full, +/obj/machinery/power/rtg/advanced{ + power_gen = 11000 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "fK" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/closeup, @@ -953,12 +885,26 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"fW" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/iron, +/area/mine/laborcamp) "fX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"fY" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "ga" = ( /obj/structure/window/reinforced{ dir = 8 @@ -967,11 +913,6 @@ /obj/structure/bookcase, /turf/open/floor/iron, /area/mine/science) -"gb" = ( -/obj/machinery/recharge_station, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/mine/eva) "ge" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/stripes/line, @@ -996,22 +937,9 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/mine/living_quarters) -"gm" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/science) "go" = ( /turf/closed/mineral/random/high_chance/volcanic, /area/lavaland/surface/outdoors/unexplored/danger) -"gp" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) "gs" = ( /obj/machinery/button/door{ id = "miningdorm3"; @@ -1026,12 +954,6 @@ }, /turf/open/floor/carpet/red, /area/mine/living_quarters) -"gu" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot, -/obj/item/toy/plush/moth/punished, -/turf/open/floor/iron, -/area/mine/laborcamp) "gx" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -1074,18 +996,6 @@ }, /turf/open/floor/iron, /area/mine/living_quarters) -"gM" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/iron/techmaint, -/area/mine/eva) "gR" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -1128,16 +1038,6 @@ /obj/structure/table/wood/fancy/royalblack, /turf/open/floor/carpet/royalblue, /area/mine/science) -"he" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/iron/techmaint, -/area/mine/gateway) "hf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -1159,6 +1059,15 @@ /obj/item/storage/firstaid/regular, /turf/open/floor/iron/white, /area/mine/laborcamp) +"hp" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station"; + req_one_access_txt = "54;18" + }, +/turf/open/floor/iron/techmaint, +/area/mine/eva) "ht" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -1200,6 +1109,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/mine/living_quarters) +"hF" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/mine/production) "hG" = ( /obj/structure/chair/fancy/sofa/old/left{ dir = 1 @@ -1233,6 +1148,26 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"hW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station EVA"; + req_one_access_txt = "54;18" + }, +/turf/open/floor/iron/techmaint, +/area/mine/eva) +"hZ" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "ia" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 4 @@ -1326,23 +1261,6 @@ /obj/structure/stone_tile, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"iB" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "gulag" - }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"iC" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/mine/eva) "iF" = ( /obj/machinery/firealarm{ pixel_y = 26 @@ -1356,12 +1274,12 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/carpet/purple, /area/mine/living_quarters) -"iP" = ( -/obj/structure/sign/poster/official/help_others{ - pixel_x = 32 +"iL" = ( +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "iQ" = ( /obj/structure/chair/fancy/comfy{ buildstackamount = 0; @@ -1387,12 +1305,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"iW" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "iY" = ( /obj/machinery/firealarm{ dir = 1; @@ -1435,14 +1347,26 @@ }, /turf/open/floor/iron, /area/mine/eva) +"jf" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/techmaint, +/area/mine/production) "jh" = ( /turf/closed/wall, /area/mine/science) -"jm" = ( -/obj/effect/turf_decal/bot, -/obj/structure/ore_box, -/turf/open/floor/iron/dark, -/area/mine/gateway) +"jj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/stack/rods, +/turf/open/floor/catwalk_floor, +/area/mine/science) "jq" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -1475,6 +1399,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) +"jE" = ( +/obj/effect/spawner/randomarcade{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "jG" = ( /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Security Airlock"; @@ -1514,13 +1445,31 @@ }, /turf/open/floor/iron, /area/mine/science) -"jQ" = ( -/obj/structure/closet/secure_closet/miner, -/obj/machinery/camera/directional/north{ - c_tag = "Storage and Locker room" +"jR" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "Station Intercom (General)"; + pixel_x = -28; + pixel_y = -6 }, -/turf/open/floor/iron/dark, +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light_switch{ + pixel_x = -21; + pixel_y = 8 + }, +/turf/open/floor/iron/checker, /area/mine/production) +"jT" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Mining Station Gateway Maintenance"; + req_one_access_txt = "54;64;12" + }, +/turf/open/floor/iron/techmaint, +/area/mine/gateway) "jY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/stripes/line{ @@ -1531,12 +1480,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"ka" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/gateway) "ke" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ external_pressure_bound = 120; @@ -1554,18 +1497,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"ki" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "kk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -1580,6 +1511,13 @@ }, /turf/open/floor/iron, /area/mine/science) +"km" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/camera/directional/north{ + c_tag = "Storage and Locker room" + }, +/turf/open/floor/iron/dark, +/area/mine/production) "kn" = ( /obj/structure/chair/fancy/plastic, /obj/item/toy/plush/flushed, @@ -1611,6 +1549,20 @@ "kw" = ( /turf/open/floor/iron/white, /area/mine/laborcamp) +"kx" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/structure/chair/stool, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "kD" = ( /obj/structure/stone_tile/block, /turf/open/lava/smooth/lava_land_surface, @@ -1641,25 +1593,12 @@ }, /turf/open/floor/iron, /area/mine/production) -"kS" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/cup/glass/drinkingglass, -/obj/item/reagent_containers/cup/glass/drinkingglass, -/obj/item/reagent_containers/cup/glass/drinkingglass, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - desc = "Whatever it is, it reeks of foul, putrid froth."; - list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); - name = "Delta-Down"; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/bottle/champagne, -/obj/item/reagent_containers/cup/glass/bottle/cognac, -/obj/item/reagent_containers/cup/glass/bottle/lizardwine, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/carpet/black, -/area/mine/science) +"kT" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot, +/obj/item/toy/plush/moth/punished, +/turf/open/floor/iron, +/area/mine/laborcamp) "kU" = ( /obj/machinery/portable_thermomachine, /obj/machinery/atmospherics/components/unary/outlet_injector/on, @@ -1675,30 +1614,27 @@ }, /turf/open/floor/iron/grid/steel, /area/mine/living_quarters) +"lb" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "ld" = ( /turf/closed/wall/r_wall, /area/lavaland/surface/outdoors) "lf" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/gateway) -"li" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/components/unary/tank/air{ dir = 8 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) -"lk" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, +/obj/structure/lattice/catwalk/over, +/turf/open/floor/plating, /area/mine/production) "lp" = ( /obj/machinery/button/door{ @@ -1753,12 +1689,6 @@ "lv" = ( /turf/closed/wall/r_wall, /area/mine/science) -"lw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/gateway) "lx" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/block/cracked{ @@ -1766,15 +1696,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"ly" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "lz" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -1807,17 +1728,15 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/engine, /area/mine/science) -"lV" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/research{ - name = "Robotics Lab" +"lL" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/science) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron, +/area/mine/gateway) "lX" = ( /obj/item/toy/plush/lizard_plushie{ pixel_x = 5; @@ -1825,19 +1744,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"lY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "ma" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -1851,6 +1757,13 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) +"mf" = ( +/obj/machinery/iv_drip, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/iron/white, +/area/mine/living_quarters) "mh" = ( /obj/structure/stone_tile/block, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -1862,6 +1775,14 @@ }, /turf/open/floor/iron, /area/mine/living_quarters) +"mm" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/mine/gateway) "mp" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1892,6 +1813,15 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"mA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/iron, +/area/mine/gateway) "mB" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -1916,6 +1846,13 @@ }, /turf/open/floor/iron, /area/mine/science) +"mJ" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark, +/area/mine/eva) "mK" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -1937,14 +1874,6 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/plating/asteroid, /area/mine/living_quarters) -"mP" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/machinery/door/airlock/research/glass{ - name = "Research Division Atrium" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/science) "mR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4/lavaland{ dir = 8 @@ -1960,32 +1889,31 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/lavaland, /area/mine/laborcamp) -"nb" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/turf_decal/box/corners{ - dir = 8 +"nc" = ( +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station EVA"; + req_one_access_txt = "54;18" }, -/turf/open/floor/iron/dark, -/area/mine/gateway) +/turf/open/floor/iron/techmaint, +/area/mine/eva) "nf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, /turf/open/floor/iron/white, /area/mine/living_quarters) -"nl" = ( +"ng" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) -"nn" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/item/book/manual/chef_recipes{ + pixel_x = -4 }, -/turf/open/floor/plating, -/area/mine/production) +/obj/item/book/granter/crafting_recipe/cooking_sweets_101, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/iron/grid/steel, +/area/mine/laborcamp) "np" = ( /turf/open/floor/iron, /area/mine/laborcamp) @@ -2009,6 +1937,20 @@ }, /turf/open/floor/carpet/royalblue, /area/mine/science) +"ny" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) +"nB" = ( +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor, +/area/mine/gateway) "nE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/item/radio/intercom{ @@ -2068,26 +2010,15 @@ "nO" = ( /turf/closed/indestructible/riveted/boss, /area/lavaland/surface/outdoors) -"nQ" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 8 - }, -/obj/structure/lattice/catwalk/over, -/turf/open/floor/plating, -/area/mine/production) -"nU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +"nT" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station"; + req_one_access_txt = "54;18" }, -/obj/item/stack/rods, -/turf/open/floor/catwalk_floor, -/area/mine/science) +/obj/effect/turf_decal/stripes/closeup, +/obj/structure/fans/tiny, +/turf/open/floor/iron/techmaint, +/area/mine/eva) "nV" = ( /obj/machinery/light_switch{ pixel_x = 1; @@ -2095,14 +2026,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"ob" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/airalarm/directional/north{ - pixel_y = 22 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "oc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron, @@ -2120,6 +2043,14 @@ /obj/structure/stone_tile/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"ol" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "oq" = ( /obj/structure/table, /obj/item/stack/ore/slag{ @@ -2136,6 +2067,12 @@ /obj/item/pen, /turf/open/floor/iron, /area/mine/science) +"os" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/mine/gateway) "ov" = ( /obj/structure/stone_tile/slab/cracked{ dir = 5 @@ -2145,6 +2082,15 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"oB" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/structure/barricade/wooden/crude, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/science) "oN" = ( /obj/machinery/shower{ dir = 8 @@ -2186,13 +2132,17 @@ /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) "pk" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/obj/machinery/light, -/mob/living/simple_animal/turtle{ - dir = 4 +/obj/machinery/light/small{ + dir = 8 }, -/turf/open/floor/iron, -/area/mine/gateway) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = -32 + }, +/turf/open/floor/iron/techmaint, +/area/mine/eva) "po" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2204,14 +2154,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"pr" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/mine/gateway) "pu" = ( /obj/machinery/camera/directional/south{ c_tag = "Labor Camp Processing Area" @@ -2253,6 +2195,13 @@ /obj/structure/stone_tile, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"pD" = ( +/obj/machinery/light/small, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/eva) "pF" = ( /obj/machinery/camera{ c_tag = "Labor Camp External"; @@ -2302,15 +2251,6 @@ /obj/structure/flora/ausbushes/fernybush, /turf/open/floor/plating/asteroid, /area/mine/science) -"pN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron, -/area/mine/gateway) "pQ" = ( /obj/machinery/door/poddoor/preopen{ id = "labor"; @@ -2324,18 +2264,13 @@ /obj/structure/frame/machine, /turf/open/floor/engine, /area/mine/science) -"pS" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/coffee, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/machinery/airalarm/directional/south{ - pixel_y = -22 +"pU" = ( +/obj/structure/ore_box, +/obj/machinery/airalarm/directional/west{ + pixel_x = -22 }, -/turf/open/floor/iron, -/area/mine/science) +/turf/open/floor/iron/dark, +/area/mine/production) "pX" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/explored) @@ -2346,6 +2281,16 @@ }, /turf/open/floor/iron, /area/mine/living_quarters) +"pZ" = ( +/obj/structure/barricade/wooden/crude, +/obj/machinery/door/airlock/command{ + name = "Research Director's Office" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/science) "qa" = ( /obj/machinery/light/small{ dir = 8 @@ -2353,6 +2298,20 @@ /obj/machinery/mech_bay_recharge_port, /turf/open/floor/iron/dark, /area/mine/science) +"qb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = -24; + pixel_y = -24 + }, +/turf/open/floor/iron, +/area/mine/production) "qd" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4/lavaland{ @@ -2389,16 +2348,30 @@ "qt" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/unexplored) -"qw" = ( -/obj/machinery/vendor/mining, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/mine/gateway) "qy" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/chem_heater, /turf/open/floor/engine, /area/mine/science) +"qB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance"; + req_one_access_txt = "54;18" + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/techmaint, +/area/mine/production) +"qH" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/mine/gateway) "qI" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, @@ -2424,10 +2397,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"qO" = ( -/obj/machinery/vendor/mining, -/turf/open/floor/iron/dark, -/area/mine/gateway) "qR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -2463,14 +2432,21 @@ "rf" = ( /turf/open/floor/plating/lavaland, /area/lavaland/surface/outdoors) -"rh" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station EVA"; - req_one_access_txt = "54;18" +"rn" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 }, -/obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/techmaint, -/area/mine/eva) +/area/mine/laborcamp) "rq" = ( /obj/item/kirbyplants/random, /obj/machinery/camera/directional/north{ @@ -2487,19 +2463,30 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"ru" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Infirmary"; - req_one_access_txt = "54;5" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/living_quarters) "rw" = ( /turf/closed/wall, /area/mine/laborcamp) +"rx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron, +/area/mine/production) +"ry" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/iron, +/area/mine/living_quarters) "rz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small{ @@ -2534,17 +2521,6 @@ "rL" = ( /turf/open/floor/iron/techmaint, /area/mine/science) -"rM" = ( -/obj/structure/table, -/obj/item/book/manual/chef_recipes{ - pixel_x = -4 - }, -/obj/item/book/granter/crafting_recipe/cooking_sweets_101, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/iron/grid/steel, -/area/mine/laborcamp) "rN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -2607,19 +2583,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"sl" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Communications"; - req_one_access_txt = "54;61" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/maintenance) "sm" = ( /obj/machinery/light{ dir = 8 @@ -2666,6 +2629,11 @@ }, /turf/open/floor/iron/dark, /area/mine/eva) +"sG" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/turf/open/floor/iron/dark, +/area/mine/gateway) "sH" = ( /obj/effect/turf_decal/stripes/closeup, /obj/machinery/door/airlock/public/glass{ @@ -2685,9 +2653,12 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/laborcamp) "sQ" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/machinery/light, +/mob/living/simple_animal/turtle{ + dir = 4 + }, +/turf/open/floor/iron, /area/mine/gateway) "sR" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -2701,11 +2672,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/mine/production) -"tb" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) +"tg" = ( +/obj/machinery/mineral/mint, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/mine/gateway) "tk" = ( /obj/machinery/camera/directional/north, /turf/open/floor/iron, @@ -2719,10 +2695,24 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"tu" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/mine/living_quarters) "tz" = ( /obj/effect/decal/cleanable/insectguts, /turf/open/floor/carpet/royalblue, /area/mine/science) +"tB" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary"; + req_one_access_txt = "54;5" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/living_quarters) "tC" = ( /obj/structure/stone_tile/cracked{ dir = 4 @@ -2741,23 +2731,17 @@ /obj/item/bedsheet/medical, /turf/open/floor/iron/white, /area/mine/laborcamp) -"tI" = ( -/turf/closed/wall, -/area/mine/gateway) -"tK" = ( -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/living_quarters) "tL" = ( /turf/open/floor/iron/techmaint, /area/mine/laborcamp) +"tM" = ( +/obj/structure/table, +/obj/effect/landmark/event_spawn, +/obj/item/reagent_containers/cup/beaker, +/obj/item/shovel/spade, +/obj/item/cultivator, +/turf/open/floor/iron/grid/steel, +/area/mine/laborcamp) "tP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -2798,13 +2782,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron, /area/mine/laborcamp/security) -"ub" = ( -/obj/structure/closet/secure_closet/miner, -/obj/machinery/light{ +"ua" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, -/turf/open/floor/iron/dark, -/area/mine/production) +/turf/open/floor/iron, +/area/mine/gateway) "uc" = ( /obj/structure/stone_tile/block{ dir = 1 @@ -2815,16 +2798,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"ue" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/iron, -/area/mine/gateway) -"ug" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/mine/gateway) "uh" = ( /obj/structure/stone_tile, /obj/structure/stone_tile/cracked{ @@ -2839,12 +2812,6 @@ }, /turf/open/floor/iron/white, /area/mine/living_quarters) -"us" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "uu" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -2865,10 +2832,6 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) -"uw" = ( -/obj/machinery/gateway/away, -/turf/open/floor/iron/dark, -/area/mine/gateway) "uA" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood, @@ -2924,10 +2887,32 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"uL" = ( +/obj/item/reagent_containers/cup/bucket, +/obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/watertank/high, +/turf/open/floor/iron/grid/steel, +/area/mine/laborcamp) "uP" = ( /obj/structure/closet/crate/critter, /turf/open/floor/iron, /area/mine/science) +"uQ" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium" + }, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/techmaint, +/area/mine/living_quarters) "uR" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -2956,16 +2941,6 @@ /obj/structure/stone_tile, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"uZ" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/lattice/catwalk/over, -/turf/open/floor/plating, -/area/mine/production) "vb" = ( /obj/machinery/button/door{ id = "labor"; @@ -2993,6 +2968,12 @@ /obj/structure/stone_tile/slab, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"vk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/mine/production) "vs" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -3014,11 +2995,24 @@ "vy" = ( /turf/closed/wall/r_wall, /area/mine/maintenance) -"vz" = ( +"vB" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, /obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 + dir = 1 + }, +/obj/structure/table, +/obj/item/pickaxe{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pickaxe, +/obj/item/pickaxe{ + pixel_x = 4; + pixel_y = -4 }, -/obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/mine/gateway) "vG" = ( @@ -3040,6 +3034,13 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) +"vJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/iron/techmaint, +/area/mine/laborcamp) "vL" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/techmaint, @@ -3068,21 +3069,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/mine/science) -"vW" = ( -/obj/item/radio/intercom{ - dir = 8; - name = "Station Intercom (General)"; - pixel_x = -28; - pixel_y = -6 - }, -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light_switch{ - pixel_x = -21; - pixel_y = 8 - }, -/turf/open/floor/iron/checker, -/area/mine/production) "vX" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 4 @@ -3118,24 +3104,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"wg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/iron, -/area/mine/production) -"wk" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "wn" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3148,17 +3116,6 @@ }, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) -"wp" = ( -/obj/structure/noticeboard{ - dir = 8; - pixel_x = 26 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "wq" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -3172,6 +3129,27 @@ /obj/structure/stone_tile/slab, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"wu" = ( +/obj/machinery/light{ + bulb_colour = "#22bfa2"; + bulb_vacuum_colour = "#22bfa2"; + dir = 4; + nightshift_light_color = "#22bfa2" + }, +/obj/structure/table, +/obj/item/clothing/glasses/meson{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 2 + }, +/obj/item/clothing/glasses/meson{ + pixel_x = 6; + pixel_y = -3 + }, +/turf/open/floor/iron/dark, +/area/mine/gateway) "wv" = ( /obj/machinery/light{ dir = 8; @@ -3206,6 +3184,15 @@ /obj/item/target/alien/anchored, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored) +"wJ" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/mine/eva) "wK" = ( /obj/machinery/vendor/mining, /turf/open/floor/iron/dark, @@ -3238,17 +3225,6 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"xk" = ( -/obj/structure/closet/crate{ - opened = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/mine/gateway) "xl" = ( /obj/structure/bed, /obj/item/bedsheet/brown, @@ -3258,16 +3234,6 @@ "xm" = ( /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors) -"xn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "xp" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -3334,6 +3300,18 @@ }, /turf/open/floor/plating/asteroid, /area/mine/science) +"xJ" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Science Shuttle Airlock"; + req_one_access_txt = "54;18;47;49" + }, +/obj/structure/fans/tiny, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/science) "xL" = ( /obj/effect/decal/cleanable/robot_debris, /obj/item/bot_assembly/cleanbot{ @@ -3354,17 +3332,25 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"xQ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "xT" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"xW" = ( -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station EVA"; - req_one_access_txt = "54;18" - }, -/turf/open/floor/iron/techmaint, -/area/mine/eva) "xX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -3398,6 +3384,41 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/carpet/red, /area/mine/living_quarters) +"yi" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "mining Relay Room"; + req_one_access_txt = "54;61" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/maintenance) +"yl" = ( +/obj/structure/ore_box, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/turf/open/floor/iron/dark, +/area/mine/production) +"yo" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium" + }, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/iron/techmaint, +/area/mine/science) "yv" = ( /turf/closed/mineral/random/labormineral/volcanic, /area/lavaland/surface/outdoors/explored) @@ -3410,6 +3431,18 @@ }, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) +"yD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor, +/area/mine/science) "yF" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 8 @@ -3430,10 +3463,6 @@ }, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) -"yP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/gateway) "yS" = ( /obj/structure/spider/stickyweb, /obj/structure/table/wood/bar, @@ -3449,6 +3478,16 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"za" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/iron, +/area/mine/production) "zc" = ( /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) @@ -3463,6 +3502,17 @@ /obj/structure/stone_tile/center, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"zk" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/food/tofu/prison, +/obj/item/knife/kitchen, +/obj/item/reagent_containers/condiment/enzyme, +/obj/item/kitchen/rollingpin, +/obj/item/wrench, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "zm" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -3478,6 +3528,15 @@ /obj/item/pen, /turf/open/floor/carpet/royalblue, /area/mine/science) +"zo" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "zp" = ( /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" @@ -3489,14 +3548,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/mine/science) -"zx" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/mine/gateway) "zy" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -3540,6 +3591,10 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) +"zI" = ( +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/iron/dark, +/area/mine/production) "zK" = ( /obj/machinery/conveyor{ dir = 1; @@ -3578,11 +3633,20 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"Ab" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/cobweb, +"Af" = ( +/obj/structure/barricade/wooden/crude, +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry Lab" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, /turf/open/floor/plating, -/area/mine/gateway) +/area/mine/science) "Ah" = ( /obj/structure/chair/office{ dir = 1 @@ -3603,20 +3667,6 @@ }, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) -"Au" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/chair/stool, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "AA" = ( /obj/structure/table, /obj/item/paper_bin, @@ -3680,6 +3730,14 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/mine/science) +"AS" = ( +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/airlock/external{ + name = "Science Outpost Airlock"; + req_one_access_txt = "54;18;47" + }, +/turf/open/floor/iron/techmaint, +/area/mine/science) "Ba" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -3693,12 +3751,14 @@ }, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) -"Bg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/iron/techmaint, +"Bc" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/iron, /area/mine/gateway) "Bi" = ( /obj/structure/stone_tile, @@ -3717,25 +3777,16 @@ }, /turf/open/floor/iron, /area/mine/production) -"Bo" = ( -/obj/structure/railing, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/turf/open/floor/iron/techmaint, -/area/mine/laborcamp) "Bq" = ( /obj/structure/fence, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Bs" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/box/corners, +/turf/open/floor/iron/dark, +/area/mine/gateway) "Bv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -3761,23 +3812,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"By" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"BA" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "BC" = ( /obj/machinery/light/small{ dir = 4 @@ -3785,16 +3819,18 @@ /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/iron/techmaint, /area/mine/science) -"BH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"BF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/iron, -/area/mine/gateway) +/area/mine/production) "BL" = ( /obj/machinery/light{ dir = 8; @@ -3802,6 +3838,13 @@ }, /turf/open/floor/iron, /area/mine/science) +"BN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron/techmaint, +/area/mine/gateway) "BR" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/cracked{ @@ -3836,15 +3879,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"Cc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/iron, -/area/mine/gateway) "Ce" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile{ @@ -3870,16 +3904,6 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) -"Ch" = ( -/obj/machinery/light/small, -/obj/machinery/camera/directional/south{ - c_tag = "Mining area External" - }, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/mine/eva) "Cj" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -3906,16 +3930,6 @@ /obj/item/target/alien/anchored, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored) -"Cs" = ( -/obj/machinery/mineral/mint, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/mine/gateway) "Ct" = ( /obj/docking_port/stationary{ dir = 2; @@ -3927,20 +3941,6 @@ }, /turf/open/floor/plating/lavaland, /area/lavaland/surface/outdoors) -"Cv" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/mine/gateway) -"CC" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station"; - req_one_access_txt = "54;18" - }, -/obj/effect/turf_decal/stripes/closeup, -/obj/structure/fans/tiny, -/turf/open/floor/iron/techmaint, -/area/mine/eva) "CD" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -3992,12 +3992,25 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"CV" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/science) "CX" = ( /obj/structure/bed, /obj/item/bedsheet/brown, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/carpet/purple, /area/mine/living_quarters) +"Dd" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/turf/open/floor/iron/dark, +/area/mine/gateway) "De" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -4014,13 +4027,6 @@ /obj/machinery/light/small, /turf/open/floor/carpet/red, /area/mine/living_quarters) -"Di" = ( -/obj/machinery/light/small, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/mine/eva) "Dj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4/lavaland, /turf/open/floor/iron, @@ -4035,6 +4041,14 @@ "Do" = ( /turf/closed/wall/r_wall, /area/lavaland/surface/outdoors/unexplored) +"Dq" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "Dr" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -4050,6 +4064,26 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"DC" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) +"DD" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron/techmaint, +/area/mine/gateway) "DF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -4068,26 +4102,6 @@ "DN" = ( /turf/open/floor/iron, /area/mine/production) -"DO" = ( -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_y = 4; - pixel_x = 1 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 6; - pixel_y = -1 - }, -/obj/machinery/camera{ - c_tag = "Gateway"; - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/mine/gateway) "DS" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /obj/effect/turf_decal/siding/wood, @@ -4114,6 +4128,25 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"Ep" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) +"Er" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "Es" = ( /obj/structure/sink{ dir = 4; @@ -4138,22 +4171,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"EJ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = -1; - pixel_y = 9 - }, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "EK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -4170,6 +4187,10 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) +"EP" = ( +/obj/machinery/vendor/mining, +/turf/open/floor/iron/dark, +/area/mine/gateway) "ER" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -4177,16 +4198,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"ET" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/shuttle_flight/science, -/obj/machinery/button/door{ - id = "lavasci"; - name = "Science shuttle shutters"; - pixel_y = 28 - }, -/turf/open/floor/iron, -/area/mine/science) "EV" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/closeup{ @@ -4208,17 +4219,6 @@ }, /turf/open/floor/engine, /area/mine/science) -"EX" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Radioisotope Containment Room"; - req_one_access_txt = "54;18;10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Fa" = ( /obj/structure/chair/fancy/sofa/old/right{ dir = 1 @@ -4262,6 +4262,18 @@ }, /turf/open/floor/carpet/royalblue, /area/mine/science) +"Fh" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "Fl" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -4324,14 +4336,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"FE" = ( -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/catwalk_floor, -/area/mine/gateway) "FI" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small{ @@ -4361,13 +4365,6 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"FL" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "FM" = ( /obj/machinery/washing_machine, /turf/open/floor/iron/grid/steel, @@ -4397,13 +4394,13 @@ /turf/open/floor/iron/white, /area/mine/living_quarters) "FZ" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/box/corners{ + dir = 1 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) +/turf/open/floor/iron/dark, +/area/mine/gateway) "Gc" = ( /obj/structure/table, /obj/item/paper_bin, @@ -4421,6 +4418,18 @@ }, /turf/open/floor/iron/dark, /area/mine/maintenance) +"Ge" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "Gf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -4430,6 +4439,12 @@ }, /turf/open/floor/iron, /area/mine/science) +"Gj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/mine/production) "Gl" = ( /obj/machinery/chem_master, /obj/effect/decal/cleanable/dirt/dust, @@ -4441,33 +4456,22 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"Gs" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot, -/obj/machinery/light, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/mine/gateway) "Gw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/white, /area/mine/living_quarters) -"Gy" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" +"Gx" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/structure/barricade/wooden/crude, +/obj/machinery/door/airlock/research{ + name = "Robotics Lab" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/techmaint, -/area/mine/production) +/area/mine/science) "GB" = ( /obj/machinery/light/small, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -4499,16 +4503,6 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"GM" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/structure/lattice/catwalk/over, -/turf/open/floor/plating, -/area/mine/production) "GR" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -4516,18 +4510,13 @@ /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/iron/grid/steel, /area/mine/living_quarters) -"GV" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Division Atrium" - }, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"GW" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/turf/open/floor/iron/techmaint, -/area/mine/science) +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron, +/area/mine/gateway) "GY" = ( /obj/structure/stone_tile/center, /obj/structure/stone_tile/surrounding_tile, @@ -4539,34 +4528,25 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Hb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/iron, -/area/mine/production) "Hd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/mine/laborcamp) "Hj" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, /area/mine/production) -"Hl" = ( -/obj/machinery/iv_drip, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 +"Hm" = ( +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/catwalk_floor, +/area/mine/gateway) "Ho" = ( /obj/structure/necropolis_gate/legion_gate, /obj/structure/necropolis_arch, @@ -4604,6 +4584,13 @@ /obj/structure/easel, /turf/open/floor/iron, /area/mine/science) +"Hv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron, +/area/mine/production) "Hx" = ( /obj/machinery/computer/shuttle_flight/mining{ dir = 1; @@ -4623,16 +4610,16 @@ }, /turf/open/floor/iron, /area/mine/science) -"Hz" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/airalarm/directional/west{ - pixel_x = -22 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"HB" = ( +/obj/effect/turf_decal/stripes/closeup{ dir = 1 }, -/turf/open/floor/iron, -/area/mine/gateway) +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external/glass{ + name = "Mining Shuttle Airlock" + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "HC" = ( /obj/machinery/light{ dir = 1 @@ -4665,12 +4652,6 @@ /obj/machinery/camera/directional/west, /turf/open/floor/iron, /area/mine/science) -"HM" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/gateway) "HR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -4696,21 +4677,16 @@ }, /turf/open/floor/iron, /area/mine/science) -"HV" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 +"Ia" = ( +/obj/structure/barricade/wooden/crude, +/obj/machinery/door/airlock/research{ + name = "tachyon-doppler Array Booth" }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/mine/eva) -"Ic" = ( -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/sign/poster/official/moth1{ - pixel_y = -32 +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 }, -/turf/open/floor/iron/checker, -/area/mine/production) +/turf/open/floor/iron/techmaint, +/area/mine/science) "Ih" = ( /obj/structure/spider/stickyweb, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -4746,15 +4722,6 @@ }, /turf/open/floor/iron, /area/mine/production) -"IC" = ( -/obj/structure/fans/tiny, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station"; - req_one_access_txt = "54;18" - }, -/turf/open/floor/iron/techmaint, -/area/mine/eva) "ID" = ( /obj/structure/ore_box, /obj/effect/turf_decal/bot, @@ -4776,14 +4743,6 @@ "IJ" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors) -"IL" = ( -/obj/structure/ore_box, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/turf/open/floor/iron/dark, -/area/mine/production) "IQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -4818,6 +4777,17 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/mine/laborcamp/security) +"IX" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_y = 2 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 2 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/living_quarters) "IY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -4884,13 +4854,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"Jq" = ( -/obj/structure/closet/crate, -/obj/item/toy/plush/moth/bluespace, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/poster/random_official, -/turf/open/floor/plating, -/area/mine/gateway) "Jr" = ( /obj/machinery/computer/shuttle_flight/labor/one_way{ dir = 4 @@ -4908,15 +4871,6 @@ }, /turf/open/floor/circuit/telecomms, /area/mine/maintenance) -"Jw" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Jx" = ( /obj/structure/cable, /obj/machinery/bluespace_beacon, @@ -4928,19 +4882,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/mine/maintenance) -"Jy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Maintenance"; - req_one_access_txt = "54;18" - }, -/obj/machinery/atmospherics/pipe/layer_manifold, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Jz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -4991,12 +4932,15 @@ /obj/effect/decal/cleanable/oil/slippery, /turf/open/floor/iron, /area/mine/science) -"JP" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/turf_decal/box/corners, -/turf/open/floor/iron/dark, -/area/mine/gateway) +"JL" = ( +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Mining Shuttle Airlock" + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "JW" = ( /obj/structure/extinguisher_cabinet{ pixel_y = 30 @@ -5018,17 +4962,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Ke" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/mine/production) "Kf" = ( /obj/structure/railing{ dir = 4 @@ -5037,6 +4970,12 @@ dir = 1 }, /area/mine/living_quarters) +"Kg" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/production) "Kh" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/stripes/line, @@ -5079,9 +5018,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Ku" = ( -/turf/open/floor/iron, -/area/mine/gateway) "Kw" = ( /obj/machinery/doppler_array/research/science{ dir = 4 @@ -5146,13 +5082,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"KW" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/catwalk_floor, -/area/mine/gateway) "KX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light{ @@ -5182,27 +5111,32 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Lk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"Ll" = ( +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = -5; + pixel_y = 8 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/machinery/camera{ + c_tag = "Gateway"; + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/mine/gateway) "Ln" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"Lp" = ( -/obj/item/reagent_containers/cup/bucket, -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/iron/grid/steel, -/area/mine/laborcamp) "Lq" = ( /obj/structure/rack, /obj/item/clothing/suit/toggle/labcoat/science{ @@ -5223,6 +5157,18 @@ }, /turf/open/floor/iron, /area/mine/science) +"LG" = ( +/obj/machinery/camera{ + c_tag = "Crew Area"; + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/iron/checker, +/area/mine/production) "LI" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/reagent_dispensers/watertank, @@ -5271,27 +5217,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/mine/science) -"LX" = ( -/obj/machinery/light{ - bulb_colour = "#22bfa2"; - bulb_vacuum_colour = "#22bfa2"; - dir = 4; - nightshift_light_color = "#22bfa2" - }, -/obj/structure/table, -/obj/item/clothing/glasses/meson{ - pixel_x = -6; - pixel_y = 7 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 2 - }, -/obj/item/clothing/glasses/meson{ - pixel_x = 6; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/mine/gateway) "Mb" = ( /obj/structure/table, /obj/item/paper_bin, @@ -5301,19 +5226,27 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) -"Mc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"Md" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot, +/obj/machinery/light, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 }, +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, -/area/mine/production) +/area/mine/gateway) "Mi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /turf/open/floor/iron, /area/mine/eva) +"Mk" = ( +/obj/machinery/vendor/mining, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/mine/gateway) "Ml" = ( /obj/structure/toilet{ pixel_y = 8 @@ -5339,6 +5272,18 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"MA" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Research Division Atrium" + }, +/obj/effect/turf_decal/stripes/closeup, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron/techmaint, +/area/mine/science) "MC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 @@ -5360,11 +5305,10 @@ }, /turf/open/floor/iron, /area/mine/science) -"MM" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +"MP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/machinery/atmospherics/components/binary/pump/on, /turf/open/floor/iron/techmaint, /area/mine/production) "MR" = ( @@ -5385,14 +5329,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/carpet/royalblue, /area/mine/science) -"MY" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "MZ" = ( /turf/open/floor/iron, /area/mine/living_quarters) @@ -5418,11 +5354,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, /area/mine/science) -"Nj" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/dark, -/area/mine/gateway) "No" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -5430,27 +5361,44 @@ /obj/machinery/light/small, /turf/open/floor/carpet/blue, /area/mine/living_quarters) -"Nq" = ( -/obj/machinery/door/airlock/research{ - name = "Subspace Listening Lab" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 +"Np" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/kitchen/fork, +/obj/item/reagent_containers/cup/glass/britcup{ + pixel_x = -5; + pixel_y = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 +/turf/open/floor/iron/grid/steel, +/area/mine/laborcamp) +"Ns" = ( +/obj/machinery/light/small, +/obj/machinery/camera/directional/south{ + c_tag = "Mining area External" }, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_y = -32 }, -/turf/open/floor/iron/techmaint, -/area/mine/science) +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/eva) +"Nu" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/mine/gateway) +"Ny" = ( +/obj/machinery/processor, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "NB" = ( /obj/structure/chair/foldable, /obj/machinery/camera/directional/north, /turf/open/floor/iron/dark, /area/mine/science) +"NC" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/mine/production) "ND" = ( /turf/closed/wall/r_wall, /area/mine/production) @@ -5477,17 +5425,14 @@ /turf/open/floor/iron, /area/mine/science) "NI" = ( -/obj/machinery/camera{ - c_tag = "Crew Area"; - dir = 9 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/turf/open/floor/iron/checker, -/area/mine/production) +/turf/open/floor/iron, +/area/mine/gateway) "NL" = ( /obj/machinery/button/door{ id = "miningdorm1"; @@ -5502,6 +5447,9 @@ }, /turf/open/floor/carpet/blue, /area/mine/living_quarters) +"NN" = ( +/turf/open/floor/iron, +/area/mine/gateway) "NQ" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -5521,16 +5469,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"NT" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "NU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -5547,17 +5485,14 @@ /obj/structure/closet/crate/critter, /turf/open/floor/iron/dark, /area/mine/science) -"Oo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +"Of" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/airalarm/directional/north{ + pixel_y = 22 }, -/obj/item/stack/cable_coil/cut/yellow, -/obj/item/stack/rods, -/turf/open/floor/catwalk_floor, -/area/mine/science) +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "Oq" = ( /obj/machinery/door/airlock{ id_tag = "miningdorm1"; @@ -5574,15 +5509,6 @@ }, /turf/open/floor/iron/techmaint, /area/mine/living_quarters) -"Or" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Os" = ( /obj/structure/stone_tile/cracked{ dir = 8 @@ -5596,6 +5522,25 @@ /obj/structure/stone_tile, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Ow" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) +"Ox" = ( +/obj/effect/turf_decal/loading_area, +/obj/machinery/airalarm/directional/west{ + pixel_x = -22 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/mine/gateway) "Oy" = ( /obj/machinery/light{ dir = 8 @@ -5612,6 +5557,19 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/mine/science) +"OD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "OE" = ( /obj/item/bot_assembly/atmosbot{ created_name = "Fastmosky Senior"; @@ -5649,23 +5607,6 @@ }, /turf/open/floor/iron/techmaint, /area/mine/production) -"OP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/public/glass, -/turf/open/floor/iron/techmaint, -/area/mine/production) "OT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -5696,24 +5637,10 @@ }, /turf/open/floor/carpet/royalblue, /area/mine/science) -"Pa" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Pb" = ( /obj/structure/stone_tile/slab/cracked, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"Pe" = ( -/obj/structure/table, -/obj/effect/landmark/event_spawn, -/obj/item/reagent_containers/cup/beaker, -/obj/item/shovel/spade, -/obj/item/cultivator, -/turf/open/floor/iron/grid/steel, -/area/mine/laborcamp) "Ph" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/matter_bin{ @@ -5735,41 +5662,29 @@ /turf/open/floor/iron, /area/mine/laborcamp) "Po" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, +/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, -/area/mine/production) +/area/mine/gateway) "Pz" = ( /obj/machinery/airalarm/directional/north{ pixel_y = 22 }, /turf/open/floor/iron, /area/mine/production) -"PA" = ( -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/glass{ - name = "Mining Shuttle Airlock" - }, -/turf/open/floor/iron/techmaint, +"PB" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, /area/mine/production) -"PH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 +"PF" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Station EVA"; + req_one_access_txt = "54;18" }, +/obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/techmaint, -/area/mine/laborcamp) +/area/mine/eva) "PI" = ( /obj/machinery/airalarm/directional/south{ pixel_y = -22 @@ -5793,6 +5708,14 @@ }, /turf/open/floor/noslip/dark, /area/mine/eva) +"PS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/portable_thermomachine, +/obj/structure/sign/poster/contraband/random{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/mine/gateway) "PV" = ( /obj/structure/fence/door, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -5817,6 +5740,18 @@ /obj/structure/stone_tile/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Qc" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/coffee, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/machinery/airalarm/directional/south{ + pixel_y = -22 + }, +/turf/open/floor/iron, +/area/mine/science) "Qd" = ( /turf/open/floor/iron/dark, /area/mine/laborcamp) @@ -5833,16 +5768,29 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) -"Qi" = ( -/obj/structure/closet/secure_closet/miner, -/turf/open/floor/iron/dark, -/area/mine/production) "Qj" = ( /obj/machinery/light/small{ dir = 8 }, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) +"Qr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron/techmaint, +/area/mine/production) "Qs" = ( /turf/closed/mineral/random/high_chance/volcanic, /area/lavaland/surface/outdoors) @@ -5873,6 +5821,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Qx" = ( +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/mine/eva) "QC" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -5898,15 +5853,21 @@ /turf/open/floor/iron/techmaint, /area/mine/living_quarters) "QH" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/kitchen/fork, -/obj/item/reagent_containers/cup/glass/britcup{ - pixel_x = -5; - pixel_y = 1 +/obj/machinery/door/airlock/research{ + name = "Subspace Listening Lab" }, -/turf/open/floor/iron/grid/steel, -/area/mine/laborcamp) +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/turf/open/floor/iron/techmaint, +/area/mine/science) "QI" = ( /obj/structure/table/reinforced, /obj/item/flashbulb/recharging/revolution{ @@ -5916,16 +5877,9 @@ /obj/item/bodypart/head/robot, /turf/open/floor/carpet/black, /area/mine/science) -"QN" = ( -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/airlock/research{ - name = "tachyon-doppler Array Booth" - }, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/turf/open/floor/iron/techmaint, -/area/mine/science) +"QU" = ( +/turf/closed/wall, +/area/mine/gateway) "QV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -5933,21 +5887,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/mine/living_quarters) +"QX" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/mine/gateway) "Rb" = ( /obj/structure/stone_tile/block/cracked, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Rh" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) +"Rf" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/mine/gateway) "Rj" = ( /obj/effect/turf_decal/arrows{ dir = 1 @@ -5974,16 +5927,34 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"Rq" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating, +"Rs" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, /area/mine/production) "Rt" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) +"Ru" = ( +/obj/structure/sign/poster/official/help_others{ + pixel_x = 32 + }, +/turf/open/floor/iron/white, +/area/mine/living_quarters) +"Rv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "Rw" = ( /obj/item/storage/firstaid/toxin{ pixel_x = 3; @@ -6007,6 +5978,14 @@ /obj/item/target/syndicate, /turf/open/floor/iron, /area/mine/science) +"RA" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/sign/poster/official/moth1{ + pixel_y = -32 + }, +/turf/open/floor/iron/checker, +/area/mine/production) "RF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -6044,9 +6023,39 @@ /obj/effect/turf_decal/stripes/closeup, /turf/open/floor/iron/techmaint, /area/mine/laborcamp) +"RO" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) "RR" = ( /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"RT" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/mine/production) +"RW" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/iron, +/area/mine/production) "RX" = ( /obj/structure/bookcase/manuals/research_and_development, /turf/open/floor/iron, @@ -6075,10 +6084,6 @@ }, /turf/open/floor/engine, /area/mine/science) -"Sh" = ( -/obj/structure/closet/crate/secure/loot, -/turf/open/floor/iron/techmaint, -/area/mine/production) "Sm" = ( /obj/docking_port/stationary{ dwidth = 3; @@ -6163,6 +6168,34 @@ }, /turf/open/floor/wood, /area/mine/living_quarters) +"SO" = ( +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 26 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/checker, +/area/mine/production) +"SV" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/item/resonator{ + pixel_x = -4 + }, +/obj/item/resonator{ + pixel_x = 4 + }, +/turf/open/floor/iron, +/area/mine/gateway) "SX" = ( /obj/effect/turf_decal/stripes/closeup{ dir = 5 @@ -6201,11 +6234,6 @@ /obj/structure/ore_box, /turf/open/floor/iron, /area/mine/eva) -"To" = ( -/obj/machinery/processor, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "Tr" = ( /obj/machinery/conveyor{ dir = 1; @@ -6249,34 +6277,20 @@ }, /turf/open/floor/iron/grid/steel, /area/mine/laborcamp) -"TD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"TJ" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "gulag" }, -/obj/machinery/light_switch{ - pixel_x = -24; - pixel_y = -24 +/obj/structure/sign/poster/official/random{ + pixel_y = -32 }, /turf/open/floor/iron, -/area/mine/production) +/area/mine/laborcamp) "TL" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"TQ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Mining Station Gateway Maintenance"; - req_one_access_txt = "54;64;12" - }, -/turf/open/floor/iron/techmaint, -/area/mine/gateway) "TR" = ( /obj/effect/turf_decal/stripes/closeup, /obj/machinery/door/airlock/public/glass{ @@ -6295,14 +6309,12 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) "TU" = ( -/obj/effect/turf_decal/stripes/closeup, -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/glass{ - name = "Science Outpost Airlock"; - req_one_access_txt = "54;18;47" +/obj/structure/cable/yellow{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/components/binary/pump/on, /turf/open/floor/iron/techmaint, -/area/mine/science) +/area/mine/production) "TX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -6322,18 +6334,22 @@ /obj/machinery/camera/directional/north, /turf/open/floor/engine, /area/mine/science) -"Ui" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) -"Uk" = ( -/obj/effect/spawner/randomarcade{ +"Ul" = ( +/obj/machinery/door/airlock/research/glass{ + name = "EVA Atrium" + }, +/obj/structure/barricade/wooden/crude, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) +/turf/open/floor/iron/techmaint, +/area/mine/science) "Uo" = ( /obj/structure/frame/machine, /obj/effect/decal/cleanable/dirt/dust, @@ -6343,12 +6359,35 @@ /obj/structure/closet/crate/radiation, /turf/open/floor/iron, /area/mine/science) +"Uu" = ( +/obj/structure/closet/crate{ + opened = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/mine/gateway) "Ux" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored) +"UD" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/reagent_containers/condiment/flour{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/flour, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/iron/grid/steel, +/area/mine/laborcamp) "UE" = ( /obj/structure/spider/stickyweb, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -6407,12 +6446,6 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"UR" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) "UU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -6434,26 +6467,6 @@ /obj/item/pickaxe, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"UZ" = ( -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/table, -/obj/item/pickaxe{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pickaxe, -/obj/item/pickaxe{ - pixel_x = 4; - pixel_y = -4 - }, -/turf/open/floor/iron, -/area/mine/gateway) "Vb" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -6515,6 +6528,16 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Vo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/shuttle_flight/science, +/obj/machinery/button/door{ + id = "lavasci"; + name = "Science shuttle shutters"; + pixel_y = 28 + }, +/turf/open/floor/iron, +/area/mine/science) "Vr" = ( /obj/machinery/light/small{ dir = 4 @@ -6529,33 +6552,6 @@ }, /turf/open/floor/iron, /area/mine/living_quarters) -"VH" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Division Atrium" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/techmaint, -/area/mine/living_quarters) -"VL" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/full, -/obj/effect/turf_decal/stripes/red/full, -/obj/machinery/power/rtg/advanced{ - power_gen = 11000 - }, -/turf/open/floor/iron/techmaint, -/area/mine/production) "VM" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/bot_white, @@ -6587,10 +6583,33 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"VX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/techmaint, +/area/mine/production) "VZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"Wc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/mining{ + name = "Mining Station Storage"; + req_one_access_txt = "54;18" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/closeup, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/techmaint, +/area/mine/production) "Wd" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -6624,6 +6643,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron, /area/mine/living_quarters) +"Wi" = ( +/obj/structure/sign/poster/official/science{ + pixel_x = 32 + }, +/turf/open/floor/iron, +/area/mine/living_quarters) "Wm" = ( /obj/item/cigbutt{ pixel_x = 1; @@ -6659,6 +6684,13 @@ }, /turf/open/floor/iron/dark, /area/mine/eva) +"Wo" = ( +/obj/structure/closet/crate, +/obj/item/toy/plush/moth/bluespace, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/poster/random_official, +/turf/open/floor/plating, +/area/mine/gateway) "Wp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 @@ -6735,6 +6767,17 @@ /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/asteroid, /area/mine/science) +"WK" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Radioisotope Containment Room"; + req_one_access_txt = "54;18;10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/closeup, +/turf/open/floor/iron/techmaint, +/area/mine/production) "WS" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/block{ @@ -6743,17 +6786,14 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "WU" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Science Shuttle Airlock"; - req_one_access_txt = "54;18;47;49" +/obj/machinery/light{ + dir = 4 }, -/obj/structure/fans/tiny, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/light_switch{ + pixel_x = 25 }, -/obj/effect/turf_decal/stripes/closeup, -/turf/open/floor/iron/techmaint, -/area/mine/science) +/turf/open/floor/iron, +/area/mine/eva) "WV" = ( /obj/structure/closet/crate/science, /obj/effect/decal/cleanable/dirt/dust, @@ -6763,15 +6803,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"Xa" = ( -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 +"WZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 }, -/obj/machinery/door/airlock/external/glass{ - name = "Mining Shuttle Airlock" +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/iron/techmaint, -/area/mine/production) +/turf/open/floor/iron, +/area/mine/gateway) "Xb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -6779,9 +6820,24 @@ /turf/open/floor/iron, /area/mine/science) "Xd" = ( -/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/mine/production) +"Xf" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/mine/gateway) "Xh" = ( /obj/structure/toilet{ dir = 4 @@ -6799,22 +6855,6 @@ "Xj" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp/security) -"Xq" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Division Atrium" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/iron/techmaint, -/area/mine/science) "Xs" = ( /obj/structure/spider/stickyweb, /obj/structure/spider/stickyweb, @@ -6823,15 +6863,6 @@ }, /turf/open/floor/carpet/royalblue, /area/mine/science) -"Xt" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_x = 25 - }, -/turf/open/floor/iron, -/area/mine/eva) "Xy" = ( /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Prisoner Airlock" @@ -6846,6 +6877,11 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"XB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark, +/area/mine/gateway) "XF" = ( /obj/structure/stone_tile/block/cracked{ dir = 4 @@ -6889,44 +6925,25 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"XM" = ( -/obj/effect/spawner/structure/window/depleteduranium, -/turf/open/floor/plating, -/area/mine/production) -"XQ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) -"XR" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 +"XP" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + desc = "Whatever it is, it reeks of foul, putrid froth."; + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing=15); + name = "Delta-Down"; + pixel_x = 5; + pixel_y = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/mine/production) -"XT" = ( -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/food/tofu/prison, -/obj/item/knife/kitchen, -/obj/item/reagent_containers/condiment/enzyme, -/obj/item/kitchen/rollingpin, -/obj/item/wrench, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/checker, -/area/mine/production) +/obj/item/reagent_containers/cup/glass/bottle/champagne, +/obj/item/reagent_containers/cup/glass/bottle/cognac, +/obj/item/reagent_containers/cup/glass/bottle/lizardwine, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/carpet/black, +/area/mine/science) "XV" = ( /obj/structure/stone_tile{ dir = 1 @@ -6971,19 +6988,16 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/mine/eva) -"Yo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"Ym" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 }, -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station EVA"; - req_one_access_txt = "54;18" +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 }, -/turf/open/floor/iron/techmaint, -/area/mine/eva) +/obj/structure/lattice/catwalk/over, +/turf/open/floor/plating, +/area/mine/production) "Yq" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -7027,14 +7041,6 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp) -"YD" = ( -/obj/effect/turf_decal/stripes/closeup, -/obj/machinery/door/airlock/external{ - name = "Science Outpost Airlock"; - req_one_access_txt = "54;18;47" - }, -/turf/open/floor/iron/techmaint, -/area/mine/science) "YF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table, @@ -7050,18 +7056,6 @@ }, /turf/open/floor/iron, /area/mine/science) -"YI" = ( -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/reagent_containers/condiment/flour{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/flour, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, -/turf/open/floor/iron/grid/steel, -/area/mine/laborcamp) "YM" = ( /turf/closed/wall/mineral/wood, /area/mine/living_quarters) @@ -7099,6 +7093,12 @@ }, /turf/open/floor/iron, /area/mine/eva) +"Zb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/turf/open/floor/iron, +/area/mine/gateway) "Zd" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) @@ -30336,7 +30336,7 @@ BZ BZ jK ZK -gu +kT BZ IJ IJ @@ -30586,7 +30586,7 @@ BZ mB mB NQ -By +fW np DB wv @@ -31364,7 +31364,7 @@ RZ rw np HS -iB +TJ BZ BZ BZ @@ -31625,7 +31625,7 @@ JF rw gx Fb -Bo +rn BZ IJ IJ @@ -32650,8 +32650,8 @@ jA KP lq Ap -rM -Lp +ng +uL WB pj TR @@ -33421,8 +33421,8 @@ zc Iq zc ZT -QH -Pe +Np +tM ar pj sH @@ -33927,7 +33927,7 @@ fM jG tL RN -PH +vJ nE bO CL @@ -34452,7 +34452,7 @@ Xj ge yJ Ne -YI +UD CL lz PI @@ -35466,9 +35466,9 @@ RR RR xT RR -tI -Ab -eq +QU +Rf +PS Xj qT Sy @@ -35723,9 +35723,9 @@ RR RR RR RR -tI -KW -Cv +QU +Hm +QX Xj Mb IY @@ -35980,9 +35980,9 @@ RR RR RR RR -tI -FE -Jq +QU +nB +Wo Xj NF IV @@ -36233,13 +36233,13 @@ RR RR RR RR -tI -tI -tI -tI -tI -TQ -tI +QU +QU +QU +QU +QU +jT +QU Xj GI Wt @@ -36490,14 +36490,14 @@ RR RR RR RR -tI -Cs -Hz -UZ -ew -eX -Gs -tI +QU +tg +Ox +vB +SV +lL +Md +QU kO xX DN @@ -36747,14 +36747,14 @@ RR RR Zd Zd -yP -dW -Ku -Ku -Ku -pN -xk -tI +aA +cV +NN +NN +NN +NI +Uu +QU CF uF DN @@ -37004,16 +37004,16 @@ Zd Zd Zd Zd -yP -ka -zx -sQ -nb -Cc -BH -he -cI -wg +aA +ua +FZ +sG +mm +mA +WZ +DD +rx +ep DN aT EH @@ -37261,16 +37261,16 @@ Zd hu Bq Bq -tI -lf -sQ -uw -Nj -Ku -HM -an +QU +Bc +sG +cO +XB +NN +qH +Nu CF -Po +ee Rl jw Wu @@ -37518,16 +37518,16 @@ Zd Mw Zd Zd -yP -ka -pr -sQ -JP -ue -aW -Bg -XR -Ke +aA +ua +Xf +sG +Bs +Zb +aU +BN +RW +Xd DN aT mz @@ -37775,14 +37775,14 @@ Zd Mw Zd Zd -yP -ka -Ku -Ku -Ku -lw -vz -tI +aA +ua +NN +NN +NN +os +GW +QU DX AE eU @@ -38032,14 +38032,14 @@ Zd PV Zd TL -tI -eB -ug -ug -ug -ug -pk -tI +QU +aF +Po +Po +Po +Po +sQ +QU OO nM OO @@ -38289,15 +38289,15 @@ Zd Mw Zd TL -tI -jm -jm -LX -DO -qO -qw -tI -Xd +QU +Dd +Dd +wu +Ll +EP +Mk +QU +NC uF DN aT @@ -38800,7 +38800,7 @@ Zd Zd Zd Zd -Ch +Ns wS wS wS @@ -38808,8 +38808,8 @@ qs Yk Zz gz -gb -ei +eQ +wJ wS HC uF @@ -39058,23 +39058,23 @@ Zd Zd Zd Zd -IC -gM +hp +pk wa -xW +nc Sf iu Sf Sf Sf -xW +nc CF gf Yq -Xa +JL hb SX -PA +HB Ct rf rf @@ -39315,16 +39315,16 @@ Zd Zd Zd Zd -CC +nT LP vL -rh +PF Sf CD YX je wA -Yo +hW Ix jJ iY @@ -39580,7 +39580,7 @@ Te SE Mi eD -Xt +WU Zt CF uF @@ -39828,7 +39828,7 @@ Zd Zd Zd Zd -Di +pD wS wS wS @@ -40604,14 +40604,14 @@ IJ IJ IJ wS -iC +mJ Yl sE -HV +Qx AF wS jw -OP +Qr aT jw jw @@ -40867,13 +40867,13 @@ wS wS wS wS -Uk -lY -wk -vW -ki -MY -Ic +jE +Rv +eW +jR +Ge +Dq +RA jw Zd Zd @@ -41116,21 +41116,21 @@ ND ND ND ND -bJ -Jw -Sh +Fh +by +dK jw wK -ae -IL +pU +yl jw -ob -lY -wk -tb -tK -wk -lk +Of +Rv +eW +Rs +IX +eW +bH aT Zd Zd @@ -41370,24 +41370,24 @@ IJ IJ ND eY -nn +Kg eY -XM -Gy -Or -MM -Jy -bD -Mc -TD -bN -ly -XQ -Lk -Au -nl -bL -UR +cb +lb +zo +TU +qB +BF +Hv +qb +Wc +Er +RO +Ow +kx +PB +Hj +ny aT Zd RR @@ -41627,24 +41627,24 @@ IJ IJ ND eY -VL -Hj -EX -Pa -FL -ax +fJ +vk +WK +fY +hZ +jf jw -Hb +za DN -aa +Gj aT -Ui -EJ -li -cz -wk -wk -To +aS +xQ +fl +OD +eW +eW +Ny aT Zd RR @@ -41884,24 +41884,24 @@ IJ IJ ND eY -Rq +hF eY -XM -us -BA -xn +cb +MP +VX +Ep jw -jQ -ub -Qi +km +RT +zI jw -NI -NT -wk -cz -FZ -wp -XT +LG +DC +eW +OD +ol +SO +zk jw Zd Zd @@ -42144,9 +42144,9 @@ ND ND ND ND -GM -uZ -nQ +Ym +at +lf jw jw jw @@ -42407,7 +42407,7 @@ jw jw aD LL -Rh +ry fT HR Oy @@ -44204,11 +44204,11 @@ kV YN oN ZH -gp +tu Wg QV wz -Hl +mf OT Ki un @@ -44464,7 +44464,7 @@ ZH OJ hD RF -ru +tB Gw Qe nf @@ -44724,7 +44724,7 @@ MZ wz lt Rw -iP +Ru uA ZH IJ @@ -45485,10 +45485,10 @@ IJ vy br Jx -bV +yi ce FQ -sl +aL Nf MR MZ @@ -45748,7 +45748,7 @@ xy vy gl EK -dA +Wi Fa ZH IJ @@ -46004,7 +46004,7 @@ vy vy vy ZH -VH +uQ ZH ZH ZH @@ -46261,7 +46261,7 @@ IJ Zd Zd mp -ef +yD mp Zd Zd @@ -46518,7 +46518,7 @@ Zd Zd RR mp -nU +jj mp RR RR @@ -46775,7 +46775,7 @@ Zd RR RR mp -ef +yD mp RR RR @@ -47289,7 +47289,7 @@ Zd Zd Zd mp -Oo +ew mp RR RR @@ -47546,7 +47546,7 @@ RR RR RR mp -ef +yD mp Zd RR @@ -47803,7 +47803,7 @@ RR RR RR mp -ef +yD mp Zd Zd @@ -48060,7 +48060,7 @@ RR RR Zd jh -Xq +yo jh jh jh @@ -48576,13 +48576,13 @@ jh jh Wm NH -pS +Qc jh Ry Ji jh jh -Nq +QH jh jh Zd @@ -48824,7 +48824,7 @@ lu xA aJ Zg -GV +MA xw Sx Jm @@ -49078,10 +49078,10 @@ rf rf rf jh -ET +Vo Hy im -mP +CV im LJ im @@ -49091,7 +49091,7 @@ NH rK wq LW -lV +Gx LW Wv LW @@ -49591,7 +49591,7 @@ rf rf rf ss -WU +xJ Rj Jz Uq @@ -49864,7 +49864,7 @@ aV EV jh jh -ey +Af jh jh jh @@ -50112,7 +50112,7 @@ TY lv Yx Yx -kS +XP aB vP lv @@ -50364,7 +50364,7 @@ dQ dQ jh jh -bu +Ul jh lv wV @@ -50633,7 +50633,7 @@ lv Lq gS im -gm +oB ZA jd Kh @@ -51130,10 +51130,10 @@ Zd Zd Zd Zd -TU +eI OE rL -YD +AS iU mH KR @@ -51143,7 +51143,7 @@ Ff hd UE MX -ed +pZ Pk zv RX @@ -51402,7 +51402,7 @@ tU aZ lv jh -bx +aI jh jh pR @@ -51643,7 +51643,7 @@ Zd Zd Zd Zd -iW +iL jh mp jh @@ -51906,7 +51906,7 @@ Zd Zd jh jh -QN +Ia jh lv dt diff --git a/_maps/map_files/RadStation/RadStation.dmm b/_maps/map_files/RadStation/RadStation.dmm index 55e1275600a51..d578e92ea0231 100644 --- a/_maps/map_files/RadStation/RadStation.dmm +++ b/_maps/map_files/RadStation/RadStation.dmm @@ -342,6 +342,14 @@ }, /turf/open/floor/wood, /area/security/prison) +"adn" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/effect/mapping_helpers/tile_breaker, +/turf/open/floor/wood, +/area/maintenance/central) "ads" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/bot{ @@ -1289,6 +1297,20 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) +"atj" = ( +/obj/machinery/airalarm/directional/south, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/healthanalyzer, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/rack, +/obj/machinery/camera/directional/south, +/turf/open/floor/iron/white, +/area/science/explab) "aty" = ( /obj/structure/railing/corner{ dir = 8 @@ -2593,6 +2615,21 @@ "aNU" = ( /turf/closed/wall/r_wall, /area/ai_monitored/storage/satellite) +"aOg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/radiation, +/obj/item/radio/intercom{ + pixel_x = -30; + pixel_y = -4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -34 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "aOq" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners/contrasted{ alpha = 180; @@ -3462,12 +3499,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark/corner, /area/hallway/secondary/exit/departure_lounge) -"beb" = ( -/obj/structure/chair/fancy/sofa/old{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/central) "bed" = ( /obj/machinery/requests_console{ department = "Security"; @@ -5867,32 +5898,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) -"bQR" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/healthanalyzer, -/obj/item/analyzer, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/science/explab) "bRf" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -6917,6 +6922,15 @@ /obj/structure/rack, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"ciJ" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) "ciQ" = ( /obj/effect/turf_decal/guideline/guideline_in/yellow{ dir = 4 @@ -7156,14 +7170,6 @@ dir = 4 }, /area/hallway/primary/central) -"cnr" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/computer/slot_machine, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cafeteria) "cnx" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -7378,6 +7384,19 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/engine/atmos) +"cph" = ( +/obj/item/paicard, +/obj/item/book/manual/wiki/xenoarchaeology, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/iron/dark, +/area/science/explab) "cpx" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -7821,10 +7840,6 @@ }, /turf/open/floor/iron, /area/engine/engine_room) -"cwG" = ( -/obj/effect/mapping_helpers/tile_breaker, -/turf/open/floor/wood, -/area/vacant_room/office) "cwJ" = ( /obj/machinery/door/airlock/grunge{ name = "Chapel Morgue"; @@ -8652,14 +8667,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai_upload) -"cLF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/xenoartifact, -/turf/open/floor/iron/white, -/area/science/explab) "cLG" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 @@ -8923,11 +8930,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/maintenance/department/security) -"cQm" = ( -/turf/open/floor/wood{ - broken = 1 - }, -/area/vacant_room/office) "cQA" = ( /obj/effect/turf_decal/bot, /obj/machinery/gravity_generator/main/station, @@ -9149,6 +9151,15 @@ /obj/machinery/modular_computer/console/preset/engineering, /turf/open/floor/iron/dark, /area/crew_quarters/heads/chief) +"cTu" = ( +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/science/explab) "cTF" = ( /obj/machinery/camera/directional/north, /obj/machinery/conveyor{ @@ -10135,6 +10146,12 @@ /obj/structure/curtain/bounty, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"dku" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/explab) "dkL" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -12724,6 +12741,13 @@ "eaN" = ( /turf/open/floor/iron, /area/engine/atmospherics_engine) +"eaO" = ( +/obj/machinery/defibrillator_mount{ + pixel_x = -32 + }, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron/white, +/area/security/brig/medbay) "eaR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -18906,6 +18930,15 @@ }, /turf/open/floor/iron, /area/science/storage) +"fTL" = ( +/obj/effect/turf_decal/box, +/obj/item/beacon, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/xenoartifact/tutorial, +/turf/open/floor/engine, +/area/science/explab) "fUj" = ( /obj/machinery/door/firedoor, /obj/structure/cable/yellow{ @@ -19691,18 +19724,6 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15" }, /area/tcommsat/computer) -"ghh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/bombcloset/white, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/explab) "ghj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19829,6 +19850,18 @@ /obj/structure/curtain/bounty, /turf/open/floor/eighties, /area/crew_quarters/heads/hos) +"gjn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/iron/white, +/area/science/explab) "gjo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, @@ -21084,17 +21117,6 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) -"gFy" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "gFH" = ( /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, /obj/structure/cable/yellow{ @@ -22852,17 +22874,6 @@ /obj/effect/spawner/room/tenxfive, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"hhq" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test Chamber Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/closeup{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "hhv" = ( /turf/closed/wall/r_wall, /area/maintenance/department/bridge) @@ -22997,6 +23008,17 @@ }, /turf/open/floor/iron/tech, /area/engine/engine_room) +"hjf" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "hjl" = ( /obj/structure/chair/wood{ dir = 4 @@ -26745,21 +26767,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"iyT" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/mask/gas, -/obj/item/multitool, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/iron, -/area/science/explab) "izg" = ( /obj/machinery/door/airlock/research{ name = "Genetics Lab"; @@ -27804,6 +27811,16 @@ }, /turf/open/floor/iron/tech, /area/engine/engine_room) +"iRp" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/machinery/light, +/turf/open/floor/engine, +/area/science/explab) "iRv" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -27901,6 +27918,15 @@ "iST" = ( /turf/closed/wall/r_wall, /area/tcommsat/computer) +"iSX" = ( +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley III, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley III"; + real_name = "Pugley III" + }, +/obj/structure/bed/dogbed, +/turf/open/floor/engine, +/area/science/explab) "iSZ" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners/contrasted{ alpha = 180; @@ -28159,6 +28185,10 @@ /obj/structure/table_frame, /turf/open/floor/plating/rust, /area/maintenance/starboard/aft) +"iYN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/science/explab) "iZa" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -28434,17 +28464,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) -"jcs" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/rack, -/obj/item/storage/firstaid/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/healthanalyzer, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron/white, -/area/science/explab) "jcv" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/light, @@ -29026,10 +29045,6 @@ /obj/item/pen, /turf/open/floor/iron, /area/medical/break_room) -"jlb" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/engine, -/area/science/explab) "jlg" = ( /obj/structure/table/reinforced, /obj/item/toy/figure/chef, @@ -29519,22 +29534,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"juZ" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/science/explab) "jvl" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ @@ -30313,13 +30312,6 @@ }, /turf/open/floor/iron/dark, /area/engine/engine_room) -"jHo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/science/explab) "jHs" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 @@ -30592,16 +30584,6 @@ }, /turf/open/floor/iron/dark, /area/engine/storage) -"jMN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "jMT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -33855,6 +33837,13 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"kPn" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, +/area/science/explab) "kPo" = ( /obj/machinery/airalarm/directional/south{ pixel_y = -22 @@ -33988,12 +33977,6 @@ broken = 1 }, /area/engine/engine_room) -"kSG" = ( -/obj/effect/turf_decal/delivery, -/obj/item/xenoartifact, -/obj/machinery/xenoartifact_inbox, -/turf/open/floor/engine, -/area/science/explab) "kSP" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -35387,16 +35370,6 @@ }, /turf/open/floor/iron, /area/crew_quarters/dorms) -"lpa" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/explab) "lph" = ( /turf/closed/wall/r_wall, /area/crew_quarters/heads/cmo) @@ -35500,6 +35473,14 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat/foyer) +"lrq" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white, +/area/science/explab) "lrB" = ( /obj/effect/turf_decal/guideline/guideline_in/red{ dir = 4 @@ -37780,6 +37761,15 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/hallway/primary/starboard) +"meH" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "mfj" = ( /obj/structure/bookcase/random/reference, /obj/structure/disposalpipe/segment{ @@ -38388,6 +38378,19 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/crew_quarters/kitchen/coldroom) +"moe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "mou" = ( /turf/open/floor/iron/dark, /area/science/misc_lab/range) @@ -38421,6 +38424,26 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/techmaint, /area/gateway) +"mpo" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "mpz" = ( /obj/machinery/telecomms/broadcaster/preset_left{ density = 0 @@ -39492,13 +39515,6 @@ }, /turf/open/floor/iron, /area/engine/engine_room) -"mFb" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/caution{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "mFm" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/bot, @@ -40326,6 +40342,20 @@ /obj/effect/landmark/start/cyborg, /turf/open/floor/circuit, /area/science/robotics/mechbay) +"mRh" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/closeup{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/science/explab) "mRk" = ( /turf/closed/wall, /area/science/server) @@ -40386,12 +40416,6 @@ "mRV" = ( /turf/closed/wall/mineral/plastitanium, /area/security/brig/medbay) -"mSh" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/science/explab) "mSo" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -41732,6 +41756,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/department/security) +"nmg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/tile_breaker, +/turf/open/floor/wood{ + broken = 1 + }, +/area/vacant_room/office) "nml" = ( /obj/machinery/dna_scannernew, /obj/structure/window/reinforced{ @@ -41896,6 +41927,14 @@ }, /turf/open/floor/iron, /area/hydroponics) +"nph" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/science/explab) "npv" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/orange{ @@ -42980,6 +43019,10 @@ }, /turf/open/floor/plating, /area/security/checkpoint/engineering) +"nFF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "nFI" = ( /obj/machinery/light{ dir = 8 @@ -47907,6 +47950,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/hallway/primary/aft) +"phs" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/security/brig/medbay) "phH" = ( /obj/item/kirbyplants/random{ pixel_y = 6 @@ -48828,6 +48885,14 @@ }, /turf/open/floor/iron, /area/engine/engine_room) +"pxV" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/vending/sticker, +/turf/open/floor/carpet, +/area/crew_quarters/cafeteria) "pym" = ( /obj/effect/turf_decal/tile/red/fourcorners/contrasted, /mob/living/simple_animal/kalo{ @@ -49247,13 +49312,6 @@ /obj/structure/curtain/directional, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"pEW" = ( -/obj/effect/landmark/start/scientist, -/obj/structure/chair/office/light{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/explab) "pFb" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/effect/turf_decal/bot, @@ -49606,6 +49664,12 @@ dir = 8 }, /area/science/mixing) +"pKr" = ( +/obj/effect/mapping_helpers/tile_breaker, +/turf/open/floor/wood{ + broken = 1 + }, +/area/vacant_room/office) "pKx" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -49958,25 +50022,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat_interior) -"pQV" = ( -/obj/machinery/computer/xenoartifact_console{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_x = 1; - pixel_y = 28 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_x = 24 - }, -/turf/open/floor/iron, -/area/science/explab) "pQZ" = ( /obj/machinery/atmospherics/components/unary/cryo_cell{ dir = 4; @@ -50446,6 +50491,11 @@ }, /turf/open/floor/iron, /area/hallway/primary/fore) +"pXm" = ( +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/explab) "pXK" = ( /turf/closed/wall, /area/bridge) @@ -51091,6 +51141,18 @@ "qgU" = ( /turf/open/floor/engine/co2, /area/engine/atmos) +"qhc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "qhe" = ( /obj/effect/turf_decal/tile/blue{ alpha = 200; @@ -52043,6 +52105,12 @@ }, /turf/open/floor/iron, /area/maintenance/department/security) +"qyP" = ( +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "qzd" = ( /obj/structure/sign/poster/official/work_for_a_future{ pixel_y = -32 @@ -54668,6 +54736,12 @@ }, /turf/open/floor/plating, /area/science/server) +"roR" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/science/explab) "roY" = ( /obj/structure/flora/tree/jungle/small, /turf/open/floor/grass, @@ -54853,12 +54927,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/quartermaster/exploration_prep) -"rrb" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "rri" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -55517,6 +55585,20 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/teleporter) +"rBM" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/iron/white, +/area/science/explab) "rBT" = ( /obj/item/storage/book/bible{ pixel_x = 6; @@ -56933,12 +57015,6 @@ }, /turf/open/floor/plating, /area/maintenance/central) -"saA" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "saH" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -57068,13 +57144,6 @@ dir = 10 }, /area/science/research) -"scM" = ( -/obj/machinery/defibrillator_mount{ - pixel_x = -32 - }, -/obj/machinery/camera/directional/west, -/turf/open/floor/iron/white, -/area/security/brig/medbay) "scT" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/structure/disposalpipe/segment{ @@ -57987,12 +58056,6 @@ /obj/item/key/janitor, /turf/open/floor/iron, /area/janitor) -"ssN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - broken = 1 - }, -/area/vacant_room/office) "ssS" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -59115,10 +59178,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"sNx" = ( -/obj/machinery/light, -/turf/open/floor/engine, -/area/science/explab) "sNB" = ( /obj/item/kirbyplants/random{ pixel_x = -3; @@ -62056,6 +62115,18 @@ }, /turf/open/floor/iron, /area/medical/break_room) +"tFM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/closet/bombcloset/white, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "tFT" = ( /obj/effect/turf_decal/bot, /obj/machinery/vending/wardrobe/viro_wardrobe, @@ -64399,12 +64470,6 @@ }, /turf/closed/wall/r_wall, /area/science/test_area) -"uve" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/science/explab) "uvn" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -65244,6 +65309,35 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) +"uIM" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/button/door{ + id = "telelab"; + name = "Test Chamber Blast Doors"; + pixel_x = -1; + pixel_y = 36 + }, +/obj/structure/table/reinforced, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/explab) "uIX" = ( /obj/item/radio/intercom{ dir = 1; @@ -65802,11 +65896,6 @@ dir = 1 }, /area/medical/sleeper) -"uRO" = ( -/obj/effect/turf_decal/box/corners, -/obj/machinery/camera/directional/east, -/turf/open/floor/engine, -/area/science/explab) "uSu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/effect/turf_decal/guideline/guideline_edge/purple{ @@ -65904,6 +65993,15 @@ }, /turf/open/floor/iron, /area/vacant_room/commissary/commissary1) +"uUQ" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/engine, +/area/science/explab) "uUZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -66440,6 +66538,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/white, /area/medical/sleeper) +"veJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/camera/directional/east, +/turf/open/floor/engine, +/area/science/explab) "vfm" = ( /obj/structure/cable{ icon_state = "2-4" @@ -67442,6 +67547,11 @@ /obj/effect/turf_decal/siding/wideplating/dark, /turf/open/floor/iron/dark, /area/crew_quarters/bar) +"vyv" = ( +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/science/explab) "vyO" = ( /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, /obj/structure/cable/yellow{ @@ -68003,6 +68113,16 @@ }, /turf/open/floor/plating, /area/security/brig/medbay) +"vHM" = ( +/obj/machinery/light_switch{ + pixel_x = 1; + pixel_y = 28 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/explab) "vHU" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon, @@ -68488,21 +68608,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/maintenance/port/central) -"vRd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/radiation, -/obj/item/radio/intercom{ - pixel_x = -30; - pixel_y = -4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -34 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/science/explab) "vRg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -68605,6 +68710,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron/white, /area/medical/surgery) +"vSA" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/explab) "vST" = ( /obj/effect/turf_decal/tile/blue/fourcorners/contrasted, /obj/structure/disposalpipe/segment{ @@ -69478,17 +69591,6 @@ dir = 1 }, /area/hallway/primary/central) -"whS" = ( -/obj/effect/turf_decal/caution{ - dir = 8 - }, -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, -/obj/item/beacon, -/turf/open/floor/engine, -/area/science/explab) "wiy" = ( /obj/structure/weightmachine/weightlifter, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -69930,12 +70032,6 @@ }, /turf/open/floor/iron/dark, /area/security/main) -"wrB" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "wrO" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -70801,17 +70897,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/tech/grid, /area/engine/gravity_generator) -"wFq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/explab) "wFC" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -70994,20 +71079,6 @@ burnt = 1 }, /area/maintenance/port/aft) -"wIb" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 7 - }, -/turf/open/floor/iron/dark, -/area/security/brig/medbay) "wId" = ( /obj/machinery/button/door/incinerator_vent_atmos_aux{ pixel_y = 4; @@ -71817,6 +71888,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/engine/engine_room) +"wXs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/explab) "wXE" = ( /obj/structure/disposalpipe/segment{ dir = 1 @@ -72128,6 +72205,16 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"xcK" = ( +/obj/machinery/computer/xenoarchaeology_console{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/explab) "xcR" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -74502,13 +74589,6 @@ dir = 8 }, /area/hallway/primary/central) -"xPu" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/central) "xPv" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -75141,12 +75221,6 @@ }, /turf/open/floor/iron, /area/medical/apothecary) -"yaq" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "yaw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/iron/white, @@ -99256,10 +99330,10 @@ qFk eln kFx rhT -wIb +phs uJB aCn -scM +eaO wSw dNb rzL @@ -102409,10 +102483,10 @@ cXM smX jRK xmC -iyT -bQR -ghh -vRd +cph +nph +tFM +aOg uUA dEP dEP @@ -102666,11 +102740,11 @@ jWc gFH ctL bHz -gFy -jMN -lpa -uve -jcs +rBM +moe +gjn +qyP +atj uUA hob hnb @@ -102923,11 +102997,11 @@ dYv bHp clC xmC -pEW -crM +vHM +kPn +lrq crM -mSh -uve +wXs xds dOB jdW @@ -103180,11 +103254,11 @@ dYv bHp aIj xmC -pQV -juZ -jHo -cLF -wFq +uIM +xcK +qhc +mpo +hjf uUA oaT ouD @@ -103437,10 +103511,10 @@ cuH eAx pzV uUA -uUA -iem -hhq +vSA iem +mRh +meH uUA iEd iEd @@ -103693,12 +103767,12 @@ gfD mtq voJ aIj -uUA -miw -rrb -whS -yaq +nFF +pXm miw +cTu +iYN +iSX iEd tyx fwF @@ -103925,7 +103999,7 @@ ceW oiI ewX xYW -ssN +nmg jLb qOU fsy @@ -103950,12 +104024,12 @@ rXr vst tgF sng -uUA -wrB -jlb -kSG -jlb -sNx +nFF +dku +miw +fTL +miw +iRp iEd boR twg @@ -104183,7 +104257,7 @@ vKL jGK jap oKM -cwG +pKr sNq oiI faP @@ -104207,12 +104281,12 @@ kOH jWc bHp aIj -uUA -miw -saA -mFb -uRO -miw +nFF +vyv +ciJ +uUQ +veJ +roR iEd tyx tyx @@ -104438,9 +104512,9 @@ gZQ nIx oiI uxS -cQm +pKr giD -ssN +nmg qzd oiI cOA @@ -104954,7 +105028,7 @@ oiI fIf uwF sMy -gTU +arz gHl fsy nkK @@ -105469,7 +105543,7 @@ oiI oiI oiI gSS -arz +nmg fsy xIX pro @@ -110833,7 +110907,7 @@ jGx gsA hdp eKY -beb +xAZ xAZ bLz fia @@ -111347,7 +111421,7 @@ gsA gsA efr jdn -xPu +adn pZQ qbO szF @@ -112135,7 +112209,7 @@ ueX nXc eLi fdq -cnr +pxV cYr tiX dJr diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 8dc13698cda1e..5d03658bcce71 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -220,6 +220,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/gravity_generator) +"aL" = ( +/obj/machinery/camera/directional/south, +/turf/open/floor/iron, +/area/hallway/secondary/entry) "aN" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1 @@ -1098,29 +1102,6 @@ /obj/machinery/camera/directional/north, /turf/open/floor/iron, /area/construction) -"dX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/directional/west, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/iron, -/area/construction) -"dZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron, -/area/construction) -"ea" = ( -/obj/structure/table, -/obj/machinery/camera/directional/south, -/obj/item/gun/magic/wand/resurrection/debug, -/turf/open/floor/iron, -/area/storage/primary) "eb" = ( /obj/docking_port/stationary{ dir = 8; @@ -1558,13 +1539,6 @@ }, /turf/open/space/basic, /area/space) -"fq" = ( -/obj/machinery/camera/directional/west, -/obj/machinery/computer/bounty{ - dir = 4 - }, -/turf/open/floor/iron, -/area/quartermaster/storage) "fr" = ( /obj/machinery/light{ dir = 8 @@ -1895,23 +1869,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"gg" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_x = 32 - }, -/obj/structure/sign/directions/engineering{ - dir = 1; - pixel_x = 32; - pixel_y = 7 - }, -/obj/structure/sign/directions/evac{ - pixel_x = 32; - pixel_y = -7 - }, -/obj/machinery/camera/directional/east, -/turf/open/floor/plating, -/area/storage/primary) "gh" = ( /obj/machinery/computer/shuttle_flight/mining, /turf/open/floor/iron, @@ -2058,19 +2015,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron, /area/hallway/secondary/entry) -"gD" = ( -/obj/machinery/camera/directional/south, -/turf/open/floor/iron, -/area/quartermaster/miningoffice) "gE" = ( /obj/machinery/camera/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron, /area/hallway/secondary/entry) -"gF" = ( -/obj/machinery/camera/directional/south, -/turf/open/floor/iron, -/area/hallway/secondary/entry) "gG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -2121,6 +2070,12 @@ }, /turf/open/floor/iron, /area/medical/chemistry) +"hM" = ( +/obj/structure/table, +/obj/machinery/camera/directional/south, +/obj/item/gun/magic/wand/resurrection/debug, +/turf/open/floor/iron, +/area/storage/primary) "hP" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2301,6 +2256,23 @@ }, /turf/open/floor/iron, /area/medical/chemistry) +"pV" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_x = 32 + }, +/obj/structure/sign/directions/engineering{ + dir = 1; + pixel_x = 32; + pixel_y = 7 + }, +/obj/structure/sign/directions/evac{ + pixel_x = 32; + pixel_y = -7 + }, +/obj/machinery/camera/directional/east, +/turf/open/floor/plating, +/area/storage/primary) "qb" = ( /obj/machinery/door/airlock, /obj/effect/mapping_helpers/simple_pipes/supply_scrubber/hidden, @@ -2314,6 +2286,16 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/maintenance/department/bridge) +"rV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/directional/west, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/iron, +/area/construction) "sE" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, @@ -2724,6 +2706,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/bridge) +"QI" = ( +/obj/machinery/camera/directional/south, +/turf/open/floor/iron, +/area/quartermaster/miningoffice) "QO" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -2757,6 +2743,13 @@ }, /turf/open/floor/iron/white/corner, /area/medical/medbay) +"Tl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/directional/south, +/turf/open/floor/iron, +/area/construction) "Tt" = ( /obj/effect/mapping_helpers/simple_pipes/supply_scrubber/hidden, /turf/open/floor/plating, @@ -2774,6 +2767,13 @@ }, /turf/open/floor/iron, /area/storage/primary) +"UK" = ( +/obj/machinery/camera/directional/west, +/obj/machinery/computer/bounty{ + dir = 4 + }, +/turf/open/floor/iron, +/area/quartermaster/storage) "Vg" = ( /obj/machinery/light, /turf/open/floor/iron, @@ -4498,7 +4498,7 @@ aa em gh gl -gD +QI em ge ge @@ -5064,7 +5064,7 @@ aa aa en eh -gF +aL fj aa aa @@ -6258,7 +6258,7 @@ cW dm dy ii -dX +rV dy dy gG @@ -6817,7 +6817,7 @@ dn dn dn dn -dZ +Tl cN Tt Rb @@ -8013,7 +8013,7 @@ dJ dJ dJ dJ -ea +hM cS fS fO @@ -8558,7 +8558,7 @@ dB dx dl dl -gg +pV ez tX dl @@ -8745,7 +8745,7 @@ eP fY eZ fv -fq +UK fr eu eu diff --git a/_maps/shuttles/whiteship/whiteship_delta.dmm b/_maps/shuttles/whiteship/whiteship_delta.dmm index c5c8bbb01805d..1031bdfe86c87 100644 --- a/_maps/shuttles/whiteship/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship/whiteship_delta.dmm @@ -462,12 +462,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/shuttle/abandoned/crew) -"bN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/bot_white, -/obj/machinery/portable_thermomachine, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bar) "bO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -672,20 +666,6 @@ }, /turf/open/floor/iron, /area/shuttle/abandoned/crew) -"cs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/portable_thermomachine, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) "ct" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable/yellow{ @@ -1378,6 +1358,20 @@ }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) +"hy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/portable_thermomachine, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/shuttle/abandoned/engine) "hz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/firealarm{ @@ -1964,6 +1958,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) +"EB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/bot_white, +/obj/machinery/portable_thermomachine, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/bar) "FY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/box/white/corners{ @@ -2350,7 +2350,7 @@ bP bV cc ck -cs +hy cB ai az @@ -2744,7 +2744,7 @@ av ae Yz ae -bN +EB af aa aa diff --git a/beestation.dme b/beestation.dme index 679f57a38f157..0cdee7f019ff6 100644 --- a/beestation.dme +++ b/beestation.dme @@ -179,6 +179,7 @@ #include "code\__DEFINES\stat_tracking.dm" #include "code\__DEFINES\station.dm" #include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\sticker.dm" #include "code\__DEFINES\strippable.dm" #include "code\__DEFINES\subsystems.dm" #include "code\__DEFINES\supermatter.dm" @@ -200,7 +201,7 @@ #include "code\__DEFINES\weather.dm" #include "code\__DEFINES\wiremod.dm" #include "code\__DEFINES\wires.dm" -#include "code\__DEFINES\xenoartifact_materials.dm" +#include "code\__DEFINES\xenoarchaeology.dm" #include "code\__DEFINES\xenobiology.dm" #include "code\__DEFINES\zmimic.dm" #include "code\__DEFINES\dcs\flags.dm" @@ -331,9 +332,9 @@ #include "code\_globalvars\regexes.dm" #include "code\_globalvars\religion.dm" #include "code\_globalvars\soul_glimmer.dm" +#include "code\_globalvars\sticker.dm" #include "code\_globalvars\time_vars.dm" #include "code\_globalvars\turf.dm" -#include "code\_globalvars\xenoartifact.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\ambience.dm" @@ -502,6 +503,7 @@ #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\wardrobe.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\xenoarchaeology.dm" #include "code\controllers\subsystem\zclear.dm" #include "code\controllers\subsystem\zcopy.dm" #include "code\controllers\subsystem\movement\ai_movement.dm" @@ -1587,6 +1589,9 @@ #include "code\game\objects\items\stacks\tiles\tile_mineral.dm" #include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\sticker\series_1.dm" +#include "code\game\objects\items\sticker\sticker.dm" +#include "code\game\objects\items\sticker\sticky_note.dm" #include "code\game\objects\items\storage\backpack.dm" #include "code\game\objects\items\storage\bags.dm" #include "code\game\objects\items\storage\belt.dm" @@ -3452,6 +3457,7 @@ #include "code\modules\particles\byond_particles\particle_holder.dm" #include "code\modules\particles\byond_particles\particle_procs.dm" #include "code\modules\particles\byond_particles\particool.dm" +#include "code\modules\particles\byond_particles\emitter\artifact.dm" #include "code\modules\particles\byond_particles\emitter\burst.dm" #include "code\modules\particles\byond_particles\emitter\fire.dm" #include "code\modules\particles\byond_particles\emitter\misc.dm" @@ -4200,6 +4206,7 @@ #include "code\modules\vending\security.dm" #include "code\modules\vending\snack.dm" #include "code\modules\vending\sovietsoda.dm" +#include "code\modules\vending\sticker.dm" #include "code\modules\vending\sustenance.dm" #include "code\modules\vending\toys.dm" #include "code\modules\vending\wardrobes.dm" @@ -4298,14 +4305,82 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" -#include "code\modules\xenoarchaeology\xenoartifact.dm" -#include "code\modules\xenoarchaeology\xenoartifact_console.dm" -#include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_activators.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_majors.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_malfunctions.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_minors.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_traits.dm" +#include "code\modules\xenoarchaeology\component\materials.dm" +#include "code\modules\xenoarchaeology\component\xenoartifact.dm" +#include "code\modules\xenoarchaeology\misc\exports.dm" +#include "code\modules\xenoarchaeology\misc\items.dm" +#include "code\modules\xenoarchaeology\misc\pearl.dm" +#include "code\modules\xenoarchaeology\misc\tutorial.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_machines.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_tracker.dm" +#include "code\modules\xenoarchaeology\tools\console\xenoarchaeology_console.dm" +#include "code\modules\xenoarchaeology\tools\console\xenoarchaeology_seller.dm" +#include "code\modules\xenoarchaeology\traits\_misc.dm" +#include "code\modules\xenoarchaeology\traits\_xenoartifact_traits.dm" +#include "code\modules\xenoarchaeology\traits\activators\_activators.dm" +#include "code\modules\xenoarchaeology\traits\activators\edible.dm" +#include "code\modules\xenoarchaeology\traits\activators\flammable.dm" +#include "code\modules\xenoarchaeology\traits\activators\item_key.dm" +#include "code\modules\xenoarchaeology\traits\activators\observational.dm" +#include "code\modules\xenoarchaeology\traits\activators\pitched.dm" +#include "code\modules\xenoarchaeology\traits\activators\signal.dm" +#include "code\modules\xenoarchaeology\traits\activators\sturdy.dm" +#include "code\modules\xenoarchaeology\traits\activators\weighted.dm" +#include "code\modules\xenoarchaeology\traits\majors\_majors.dm" +#include "code\modules\xenoarchaeology\traits\majors\animalize.dm" +#include "code\modules\xenoarchaeology\traits\majors\barreled.dm" +#include "code\modules\xenoarchaeology\traits\majors\combusting.dm" +#include "code\modules\xenoarchaeology\traits\majors\displaced.dm" +#include "code\modules\xenoarchaeology\traits\majors\dissipating.dm" +#include "code\modules\xenoarchaeology\traits\majors\echoing.dm" +#include "code\modules\xenoarchaeology\traits\majors\electrified.dm" +#include "code\modules\xenoarchaeology\traits\majors\emp.dm" +#include "code\modules\xenoarchaeology\traits\majors\enthusing.dm" +#include "code\modules\xenoarchaeology\traits\majors\exchanging.dm" +#include "code\modules\xenoarchaeology\traits\majors\flash.dm" +#include "code\modules\xenoarchaeology\traits\majors\flourishing.dm" +#include "code\modules\xenoarchaeology\traits\majors\forcing.dm" +#include "code\modules\xenoarchaeology\traits\majors\freezing.dm" +#include "code\modules\xenoarchaeology\traits\majors\hollow.dm" +#include "code\modules\xenoarchaeology\traits\majors\hypodermic.dm" +#include "code\modules\xenoarchaeology\traits\majors\illuminating.dm" +#include "code\modules\xenoarchaeology\traits\majors\marking.dm" +#include "code\modules\xenoarchaeology\traits\majors\obstructing.dm" +#include "code\modules\xenoarchaeology\traits\majors\porous.dm" +#include "code\modules\xenoarchaeology\traits\majors\shadow_realm.dm" +#include "code\modules\xenoarchaeology\traits\majors\temporal.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\_malfunctions.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\animal.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\explosion.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\hallucination.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\heated.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\organ_stealer.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\radiation.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\strip.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\trauma.dm" +#include "code\modules\xenoarchaeology\traits\malfunction\vomit.dm" +#include "code\modules\xenoarchaeology\traits\minors\_minors.dm" +#include "code\modules\xenoarchaeology\traits\minors\aerodynamic.dm" +#include "code\modules\xenoarchaeology\traits\minors\anchor.dm" +#include "code\modules\xenoarchaeology\traits\minors\aura.dm" +#include "code\modules\xenoarchaeology\traits\minors\bleeding.dm" +#include "code\modules\xenoarchaeology\traits\minors\capacitive.dm" +#include "code\modules\xenoarchaeology\traits\minors\charged.dm" +#include "code\modules\xenoarchaeology\traits\minors\cooling.dm" +#include "code\modules\xenoarchaeology\traits\minors\delicate.dm" +#include "code\modules\xenoarchaeology\traits\minors\dense.dm" +#include "code\modules\xenoarchaeology\traits\minors\haunted.dm" +#include "code\modules\xenoarchaeology\traits\minors\impulsing.dm" +#include "code\modules\xenoarchaeology\traits\minors\magnetic.dm" +#include "code\modules\xenoarchaeology\traits\minors\ringed.dm" +#include "code\modules\xenoarchaeology\traits\minors\scoped.dm" +#include "code\modules\xenoarchaeology\traits\minors\sentient.dm" +#include "code\modules\xenoarchaeology\traits\minors\sharp.dm" +#include "code\modules\xenoarchaeology\traits\minors\shielded.dm" +#include "code\modules\xenoarchaeology\traits\minors\signaller.dm" +#include "code\modules\xenoarchaeology\traits\minors\slippery.dm" +#include "code\modules\xenoarchaeology\traits\minors\sticky.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\~overrides\quickstart.dm" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 2ef50d8f420b4..baf65ae2f01b8 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -41,3 +41,5 @@ #define COMSIG_GLOB_STARLIGHT_COLOUR_CHANGE "!starlight_colour_change" /// Called whenever the crew manifest is updated #define COMSIG_GLOB_CREW_MANIFEST_UPDATE "!crew_manifest_update" +/// Called whenever something is sold through exports +#define COMSIG_GLOB_ATOM_SOLD "!atom_sold" diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm index 671a8269bf557..a658446982a21 100644 --- a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm +++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm @@ -57,7 +57,9 @@ // Used to stop food from being composted. #define COMPONENT_EDIBLE_BLOCK_COMPOST 1 -//Drink +///Called when we try to feed food to an object +#define COMSIG_FOOD_FEED_ITEM "feed_item" +//Drink ///from base of obj/item/reagent_containers/cup/attack(): (mob/M, mob/user) #define COMSIG_GLASS_DRANK "glass_drank" diff --git a/code/__DEFINES/sticker.dm b/code/__DEFINES/sticker.dm new file mode 100644 index 0000000000000..bf548f8c3cbf7 --- /dev/null +++ b/code/__DEFINES/sticker.dm @@ -0,0 +1,20 @@ +//State defines for stickers +#define STICKER_STATE_STUCK "STICKER_STATE_STUCK" +#define STICKER_STATE_ITEM "STICKER_STATE_ITEM" + +//Sticker rarity +#define STICKER_RARITY_COMMON (1<<0) +#define STICKER_RARITY_UNCOMMON (1<<1) +#define STICKER_RARITY_RARE (1<<2) +#define STICKER_RARITY_EXOTIC (1<<3) +#define STICKER_RARITY_MYTHIC (1<<4) + +//Sticker series +#define STICKER_SERIES_1 (1<<10) //Bump these along if you somehow need more rarities > 10 + +//Drop weight +#define STICKER_WEIGHT_COMMON 100 +#define STICKER_WEIGHT_UNCOMMON 50 +#define STICKER_WEIGHT_RARE 25 +#define STICKER_WEIGHT_EXOTIC 12 +#define STICKER_WEIGHT_MYTHIC 1 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 397cfeddd3148..1f3de3fc166fb 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -138,6 +138,7 @@ #define INIT_ORDER_VIS 80 #define INIT_ORDER_SECURITY_LEVEL 79 // We need to load before events so that it has a security level to choose from. #define INIT_ORDER_ACHIEVEMENTS 77 +#define INIT_ORDER_XENOARCHAEOLOGY 76 #define INIT_ORDER_RESEARCH 75 #define INIT_ORDER_ORBITS 74 //Other things use the orbital map, so it needs to be made early on. #define INIT_ORDER_STATION 73 //This is high priority because it manipulates a lot of the subsystems that will initialize after it. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index dd6121db10c3d..dbe0864dee3a0 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -229,8 +229,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_SAFE_STORAGE "fish_case" //Fish in this won't die #define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" //Stuff that can go inside fish cases #define TRAIT_NEEDS_TWO_HANDS "needstwohands" // The items needs two hands to be carried - #define TRAIT_AI_BAGATTACK "bagattack" // This atom can ignore the "is on a turf" check for simple AI datum attacks, allowing them to attack from bags or lockers as long as any other conditions are met +#define TRAIT_ARTIFACT_IGNORE "artifact_ignore" //This item is compltely ignored by artifacts, this is different to anti-artifact +#define TRAIT_IGNORE_EXPORT_SCAN "ignore_export_scan" //The export scanner can't scan this item /// Allows heretics to cast their spells. #define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm new file mode 100644 index 0000000000000..4f587bc32bf9a --- /dev/null +++ b/code/__DEFINES/xenoarchaeology.dm @@ -0,0 +1,85 @@ +//Material defines +///Safe +#define XENOA_BLUESPACE /datum/xenoartifact_material/bluespace +///Mild +#define XENOA_PLASMA /datum/xenoartifact_material/plasma +///Dangerous +#define XENOA_URANIUM /datum/xenoartifact_material/uranium +///Wildcard +#define XENOA_BANANIUM /datum/xenoartifact_material/bananium +///Artificial +#define XENOA_PEARL /datum/xenoartifact_material/pearl +///The gods are about to do something stupid +#define XENOA_DEBUGIUM /datum/xenoartifact_material + +//Trait priorities +#define TRAIT_PRIORITY_ACTIVATOR "activator" +#define TRAIT_PRIORITY_MINOR "minor" +#define TRAIT_PRIORITY_MAJOR "major" +#define TRAIT_PRIORITY_MALFUNCTION "malfunction" + +//Trait incompatabilities +#define TRAIT_INCOMPATIBLE_ITEM (1<<0) +#define TRAIT_INCOMPATIBLE_MOB (1<<1) +#define TRAIT_INCOMPATIBLE_STRUCTURE (1<<2) + +///Signal for artifact trigger +#define COMSIG_XENOA_TRIGGER "COMSIG_XENOA_TRIGGER" +///Signal for artifact calcified +#define COMSIG_XENOA_CALCIFIED "COMSIG_XENOA_CALCIFIED" + +///Signal for SS needing new mainc onsole +#define COMSIG_XENOA_REQUEST_NEW_CONSOLE "COMSIG_XENOA_REQUEST_NEW_CONSOLE" + +///generic starting cooldown timer for triggers +#define XENOA_GENERIC_COOLDOWN 5 SECONDS + +//Artifact trait strengths +#define XENOA_TRAIT_STRENGTH_NORMAL 50 +#define XENOA_TRAIT_STRENGTH_MILD 75 +#define XENOA_TRAIT_STRENGTH_STRONG 100 + +///trait flags +#define XENOA_BLUESPACE_TRAIT (1<<0) //Github's webview fucks these up, but they look fine in the editor +#define XENOA_PLASMA_TRAIT (1<<1) +#define XENOA_URANIUM_TRAIT (1<<2) +#define XENOA_BANANIUM_TRAIT (1<<3) +#define XENOA_PEARL_TRAIT (1<<4) +#define XENOA_MISC_TRAIT (1<<5) +#define XENOA_HIDE_TRAIT (1<<6) + +///trait cooldowns +#define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS +#define XENOA_TRAIT_COOLDOWN_SAFE 3 SECONDS +#define XENOA_TRAIT_COOLDOWN_DANGEROUS 5 SECONDS +#define XENOA_TRAIT_COOLDOWN_GAMER 8 SECONDS + +///trait weights, for rarities +#define XENOA_TRAIT_WEIGHT_COMMON 100 +#define XENOA_TRAIT_WEIGHT_UNCOMMON 80 +#define XENOA_TRAIT_WEIGHT_RARE 50 +#define XENOA_TRAIT_WEIGHT_EPIC 10 +#define XENOA_TRAIT_WEIGHT_MYTHIC 1 + +///Label reward and punishment values +#define XENOA_LABEL_REWARD 1.8 //Increases custom price by %80 +#define XENOA_LABEL_PUNISHMENT 0.5 //Decreases price by 50% + +///Types of artifact activation +#define XENOA_ACTIVATION_TOUCH "XENOA_ACTIVATION_TOUCH" +#define XENOA_ACTIVATION_CONTACT "XENOA_ACTIVATION_CONTACT" +#define XENOA_ACTIVATION_SPECIAL "XENOA_ACTIVATION_SPECIAL" + +///Distance for trait name balloon hint +#define XENOA_TRAIT_BALLOON_HINT_DIST 3 + +///Common defines for trait hints +#define XENOA_TRAIT_HINT_MATERIAL list("icon" = "eye", "desc" = "This trait can appear in the artifact's material description.") +#define XENOA_TRAIT_HINT_INHAND list("icon" = "hand-sparkles", "desc" = "This trait can be detected by 'feeling' the artifact.") +#define XENOA_TRAIT_HINT_TRIGGER(X) list("icon" = "wrench", "desc" = "This trait can be triggered with a [X].") +#define XENOA_TRAIT_HINT_DETECT(X) list("icon" = "search", "desc" = "This trait can be detected with a [X].") +#define XENOA_TRAIT_HINT_TWIN list("icon" = "clone", "desc" = "This trait has sister traits which perform a similar, but unqiue, action.") +#define XENOA_TRAIT_HINT_TWIN_VARIANT(X) list("icon" = "fingerprint", "desc" = "This variant will [X].") +#define XENOA_TRAIT_HINT_RANDOMISED list("icon" = "dice", "desc" = "This trait's effects may differ between instances.") +#define XENOA_TRAIT_HINT_APPEARANCE(X) list("icon" = "snowflake", "desc" = "This trait's changes the artifact's appearance. [X]") +#define XENOA_TRAIT_HINT_SOUND(X) list("icon" = "volume-up", "desc" = "This trait will passively make noise. listen for [X].") diff --git a/code/__DEFINES/xenoartifact_materials.dm b/code/__DEFINES/xenoartifact_materials.dm deleted file mode 100644 index fa6025d693225..0000000000000 --- a/code/__DEFINES/xenoartifact_materials.dm +++ /dev/null @@ -1,50 +0,0 @@ -//Xenoartifact defines -//Material defines. Used for characteristic generation -///Silly toys -#define XENOA_BLUESPACE "#1e7cff" -///Associated weapons -#define XENOA_PLASMA "#ff00c8" -///Broken Enigmas -#define XENOA_URANIUM "#00ff0d" -///Wildcard, may god have mercy -#define XENOA_BANANIUM "#ffd900" -///The gods are about to do something stupid -#define XENOA_DEBUGIUM "#ff4800" - -///trait flags -#define BLUESPACE_TRAIT (1<<0) -#define PLASMA_TRAIT (1<<1) -#define URANIUM_TRAIT (1<<2) - -//Also not materials but also related -///Process type on burn -#define PROCESS_TYPE_LIT "is_lit" -///Process type on ticking -#define PROCESS_TYPE_TICK "is_tick" - -///Discovery point reward -#define XENOA_DP 350 -#define XENOA_SOLD_DP 350 -///Reserach point reward (modifer) -#define XENOA_RP 2.5 - -///Max vendors / buyers in each catergory -#define XENOA_MAX_VENDORS 8 - -//Specific trait defines -///Bear limit at once -#define XENOA_MAX_BEARS 3 -///Max targets on expansive -#define XENOA_MAX_TARGETS 6 -///Tick chance to untick -#define XENOA_TICK_CANCEL_PROB 13 -///Max amount of evil clones at once -#define XENOA_MAX_CLONES 5 - -///Chance to avoid target if wearing bomb suit -#define XENOA_DEFLECT_CHANCE 45 - -//Xenoartifact signals. -#define XENOA_DEFAULT_SIGNAL "xenoa_default_signal" -#define XENOA_SIGNAL "xenoa_signal" -#define XENOA_CHANGE_PRICE "xenoa_change_price" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 8d75b40d3dd9d..3ea476b0ca70c 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -194,6 +194,9 @@ DEFINE_BITFIELD(flags_1, list( "TESLA_IGNORE_1" = TESLA_IGNORE_1, "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1, "UNPAINTABLE_1" = UNPAINTABLE_1, + "IS_ONTOP_1" = IS_ONTOP_1, + "HTML_USE_INITAL_ICON_1" = HTML_USE_INITAL_ICON_1, + "NO_DIRECT_ACCESS_FROM_CONTENTS_1" = NO_DIRECT_ACCESS_FROM_CONTENTS_1, )) DEFINE_BITFIELD(flags_ricochet, list( diff --git a/code/_globalvars/sticker.dm b/code/_globalvars/sticker.dm new file mode 100644 index 0000000000000..72fcdd2524daf --- /dev/null +++ b/code/_globalvars/sticker.dm @@ -0,0 +1,22 @@ +///Global list of stickers by series +GLOBAL_LIST(stickers_by_series) + +///Fill globals +/proc/fill_sticker_globals() + if(length(GLOB.stickers_by_series)) + return + /* + Build sticker GLOB.stickers_by_series + just index each series flag with a list of associated sticker objects + */ + var/list/temp = list() + var/series = STICKER_SERIES_1 //Make sure you update this if you add more series + for(var/obj/item/sticker/sticker as anything in subtypesof(/obj/item/sticker)) + var/index = (series & initial(sticker.sticker_flags)) + if(!index || (ABSTRACT & initial(sticker.item_flags))) + continue + var/string_index = "[index]" + if(!temp[string_index]) + temp[string_index] = list() + temp[string_index] += sticker + GLOB.stickers_by_series = temp diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index aab4c39b3d4b4..0c6d98592c53a 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -211,6 +211,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DRIED" = TRAIT_DRIED, "TRAIT_CUSTOMIZABLE_REAGENT_HOLDER" = TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, + "TRAIT_IGNORE_EXPORT_SCAN" = TRAIT_IGNORE_EXPORT_SCAN, "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, ), /obj = list( @@ -230,6 +231,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( /atom = list( "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_NO_IMMOBILIZE" = TRAIT_NO_IMMOBILIZE, + "TRAIT_ARTIFACT_IGNORE" = TRAIT_ARTIFACT_IGNORE ), /turf = list( "TRAIT_FIREDOOR_STOP" = TRAIT_FIREDOOR_STOP, diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm deleted file mode 100644 index f9cb28a73330e..0000000000000 --- a/code/_globalvars/xenoartifact.dm +++ /dev/null @@ -1,38 +0,0 @@ -///Global names for science sellers -GLOBAL_LIST_INIT(xenoa_seller_names, world.file2list("strings/names/science_seller.txt")) -GLOBAL_LIST_INIT(xenoa_seller_dialogue, world.file2list("strings/science_dialogue.txt")) -GLOBAL_LIST_INIT(xenoa_artifact_names, world.file2list("strings/names/artifact_sentience.txt")) - -///traits types, referenced for generation -GLOBAL_LIST(xenoa_activators) -GLOBAL_LIST(xenoa_minors) -GLOBAL_LIST(xenoa_majors) -GLOBAL_LIST(xenoa_malfs) -GLOBAL_LIST(xenoa_all_traits) - -///Blacklist for traits -GLOBAL_LIST(xenoa_bluespace_blacklist) -GLOBAL_LIST(xenoa_plasma_blacklist) -GLOBAL_LIST(xenoa_uranium_blacklist) - -///List of emotes for emote-trait -GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, - /datum/emote/living/scream, /datum/emote/living/tremble, /datum/emote/living/whimper, - /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, - /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush)) - -///Fill globals -/proc/generate_xenoa_statics() - GLOB.xenoa_seller_names -= "" - GLOB.xenoa_seller_dialogue -= "" - GLOB.xenoa_artifact_names -= "" - - GLOB.xenoa_activators = compile_artifact_weights(/datum/xenoartifact_trait/activator) - GLOB.xenoa_minors = compile_artifact_weights(/datum/xenoartifact_trait/minor) - GLOB.xenoa_majors = compile_artifact_weights(/datum/xenoartifact_trait/major) - GLOB.xenoa_malfs = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) - GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) - - GLOB.xenoa_bluespace_blacklist = compile_artifact_blacklist(BLUESPACE_TRAIT) - GLOB.xenoa_plasma_blacklist = compile_artifact_blacklist(PLASMA_TRAIT) - GLOB.xenoa_uranium_blacklist = compile_artifact_blacklist(URANIUM_TRAIT) diff --git a/code/controllers/subsystem/xenoarchaeology.dm b/code/controllers/subsystem/xenoarchaeology.dm new file mode 100644 index 0000000000000..51a52f6ed2e53 --- /dev/null +++ b/code/controllers/subsystem/xenoarchaeology.dm @@ -0,0 +1,216 @@ +SUBSYSTEM_DEF(xenoarchaeology) + name = "Xenoarchaeology" + flags = SS_NO_FIRE + init_order = INIT_ORDER_XENOARCHAEOLOGY + + ///Which console is the main character + var/obj/machinery/computer/xenoarchaeology_console/main_console + + //All the traits - before we sort them, semi needed for generation + var/list/xenoa_all_traits = list() + ///All traits indexed by name, used for labelling stuff + var/list/xenoa_all_traits_keyed = list() + + ///Names for science sellers & artifacts + var/list/xenoa_seller_names = list() + var/list/xenoa_seller_dialogue = list() + var/list/xenoa_artifact_names = list() + + ///Whitelist for traits by material type + var/list/material_info_list = list() + + ///Incompatability lists - Partial future proofing some stuff + var/list/xenoa_item_incompatible = list() + var/list/xenoa_mob_incompatible = list() + var/list/xenoa_structure_incompatible = list() + + ///Labeler trait lists, basically just names + var/datum/xenoa_material_info_holder/stats/labeler_traits + ///Other labeler shit + var/list/labeler_tooltip_stats = list() + var/list/labeler_traits_filter = list() + + ///Material weights, basically rarity - Also used to populate some other lists + var/list/xenoartifact_material_weights = list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 8, XENOA_URANIUM = 5, XENOA_BANANIUM = 1) + + ///Trait priority list - The order is important and it represents priotity + var/list/xenoartifact_trait_category_priorities = list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MALFUNCTION, TRAIT_PRIORITY_MAJOR) + + ///List of 'discovered' traits + var/list/discovered_traits = list() + +/datum/controller/subsystem/xenoarchaeology/Initialize(timeofday) + . = ..() +//Poplate seller & artifact personalities + xenoa_seller_names = world.file2list("strings/names/science_seller.txt") + xenoa_seller_dialogue = world.file2list("strings/science_dialogue.txt") + xenoa_artifact_names = world.file2list("strings/names/artifact_sentience.txt") + //in a rare case where that the game failed to get these texts + if(!length(xenoa_seller_names)) + xenoa_seller_names = list("Brock Enn") + if(!length(xenoa_seller_dialogue)) + xenoa_seller_dialogue = list("Something isn't right!") + if(!length(xenoa_artifact_names)) + xenoa_artifact_names = list("Brock Enn") + +//Dirty unwashed masses + var/list/standard_traits = typesof(/datum/xenoartifact_trait) - list(/datum/xenoartifact_trait, /datum/xenoartifact_trait/activator, /datum/xenoartifact_trait/minor, /datum/xenoartifact_trait/major, /datum/xenoartifact_trait/malfunction) + xenoa_all_traits = list() + xenoa_all_traits_keyed = list() + for(var/datum/xenoartifact_trait/trait as anything in standard_traits) + if(initial(trait.flags) & XENOA_HIDE_TRAIT) + continue + xenoa_all_traits_keyed[initial(trait.label_name)] = trait + xenoa_all_traits[trait] = initial(trait.rarity) + +//Compatabilities & labeler + labeler_traits = new() + labeler_traits.compile_artifact_whitelist(/datum/xenoartifact_material) + labeler_traits_filter = list() + for(var/datum/xenoartifact_trait/trait as anything in xenoa_all_traits) + //Compat + var/flags = initial(trait.incompatabilities) + if(flags & TRAIT_INCOMPATIBLE_ITEM) + xenoa_item_incompatible += trait + if(flags & TRAIT_INCOMPATIBLE_MOB) + xenoa_mob_incompatible += trait + if(flags & TRAIT_INCOMPATIBLE_STRUCTURE) + xenoa_structure_incompatible += trait + //Label + trait = new trait() //Instantiate so we can access a PROC + var/list/hints = trait.get_dictionary_hint() + for(var/each_hint in hints) + if(!labeler_traits_filter[each_hint["icon"]]) + labeler_traits_filter[each_hint["icon"]] = list() + labeler_traits_filter[each_hint["icon"]] += list("[initial(trait.label_name)]") + QDEL_NULL(trait) + +//Populate traits by material + material_info_list = list() + for(var/datum/xenoartifact_material/material_index as anything in typesof(/datum/xenoartifact_material)) + if(SSxenoarchaeology.material_info_list[initial(material_index.material_parent)]) + continue + var/datum/xenoa_material_info_holder/material = new() + material_info_list[material_index] = material + //Populate datum fields + material.compile_artifact_whitelist(material_index) + +/datum/controller/subsystem/xenoarchaeology/Shutdown() + . = ..() + +/datum/controller/subsystem/xenoarchaeology/Recover() + . = ..() + xenoa_seller_names = SSxenoarchaeology.xenoa_seller_names + xenoa_seller_dialogue = SSxenoarchaeology.xenoa_seller_dialogue + xenoa_artifact_names = SSxenoarchaeology.xenoa_artifact_names + + xenoa_all_traits = SSxenoarchaeology.xenoa_all_traits + xenoa_all_traits_keyed = SSxenoarchaeology.xenoa_all_traits_keyed + + material_info_list = SSxenoarchaeology.material_info_list + + xenoa_item_incompatible = SSxenoarchaeology.xenoa_item_incompatible + xenoa_mob_incompatible = SSxenoarchaeology.xenoa_mob_incompatible + xenoa_structure_incompatible = SSxenoarchaeology.xenoa_structure_incompatible + + labeler_tooltip_stats = SSxenoarchaeology.labeler_tooltip_stats + labeler_traits_filter = SSxenoarchaeology.labeler_traits_filter + +/datum/controller/subsystem/xenoarchaeology/proc/register_console(obj/machinery/computer/xenoarchaeology_console/new_console) + if(main_console) + main_console.is_main_console = FALSE + UnregisterSignal(main_console, COMSIG_PARENT_QDELETING) + main_console = new_console + main_console.is_main_console = TRUE + RegisterSignal(main_console, COMSIG_PARENT_QDELETING, PROC_REF(catch_console)) + +/datum/controller/subsystem/xenoarchaeology/proc/catch_console(datum/source) + SIGNAL_HANDLER + + main_console = null + SEND_SIGNAL(src, COMSIG_XENOA_REQUEST_NEW_CONSOLE) + +///Get a trait incompatability list based on the passed type +/datum/controller/subsystem/xenoarchaeology/proc/get_trait_incompatibilities(atom/type) + //Items + if(isitem(type)) + return xenoa_item_incompatible + //Mob + if(ismob(type)) + return xenoa_mob_incompatible + //Structure + if(isstructure(type)) + return xenoa_structure_incompatible + + return list() + +/* + Datum for holding a bunch of listed traits for a certain material + Thanks, EvilDragon +*/ + +/datum/xenoa_material_info_holder + ///List of traits per category + var/list/activators = list() + var/list/minors = list() + var/list/majors = list() + var/list/malfunctions = list() + ///Has this datum been compiled / populated? + var/compiled = FALSE + +///Populate our trait lists from a given material path +/datum/xenoa_material_info_holder/proc/compile_artifact_whitelist(datum/xenoartifact_material/material) + for(var/datum/xenoartifact_trait/trait as anything in SSxenoarchaeology.xenoa_all_traits) + if(initial(trait.flags) & XENOA_HIDE_TRAIT) + continue + if(!(initial(trait.flags) & initial(material.trait_flags))) + continue + //Sort trait into list + if(ispath(trait, /datum/xenoartifact_trait/activator)) + activators[trait] = initial(trait.rarity) + continue + if(ispath(trait, /datum/xenoartifact_trait/minor)) + minors[trait] = initial(trait.rarity) + continue + if(ispath(trait, /datum/xenoartifact_trait/major)) + majors[trait] = initial(trait.rarity) + continue + if(ispath(trait, /datum/xenoartifact_trait/malfunction)) + malfunctions[trait] = initial(trait.rarity) + continue + compiled = TRUE + +//Variant for stats, labeler baking +/datum/xenoa_material_info_holder/stats + +/datum/xenoa_material_info_holder/stats/compile_artifact_whitelist(datum/xenoartifact_material/material) + for(var/datum/xenoartifact_trait/trait as anything in SSxenoarchaeology.xenoa_all_traits) + if(initial(trait.flags) & XENOA_HIDE_TRAIT) + continue + if(!(initial(trait.flags) & initial(material.trait_flags))) + continue + //We're gonna be nice an populate labeler_tooltip_stats while we're at it, because we're nice + //generate tool tips + var/datum/xenoartifact_trait/hint_holder = new trait() //Instantiate so we can access a PROC + var/name = initial(trait.label_name) + SSxenoarchaeology.labeler_tooltip_stats["[name]"] = list("weight" = initial(trait.weight), "conductivity" = initial(trait.conductivity), "alt_name" = initial(trait.alt_label_name), "desc" = initial(trait.label_desc), "hints" = hint_holder.get_dictionary_hint()) + qdel(hint_holder) + //Generate material availability + var/list/materials = list(XENOA_BLUESPACE, XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM, XENOA_PEARL) + SSxenoarchaeology.labeler_tooltip_stats["[name]"]["availability"] = list() + for(var/datum/xenoartifact_material/M as anything in materials) + if(initial(M.trait_flags) & initial(trait.flags)) + SSxenoarchaeology.labeler_tooltip_stats["[name]"]["availability"] += list(list("color" = initial(M.material_color), "icon" = initial(M.label_icon))) + //Sort trait into list + if(ispath(trait, /datum/xenoartifact_trait/activator) && (trait != /datum/xenoartifact_trait/activator)) + activators += name + continue + if(ispath(trait, /datum/xenoartifact_trait/minor) && (trait != /datum/xenoartifact_trait/minor)) + minors += name + continue + if(ispath(trait, /datum/xenoartifact_trait/major) && (trait != /datum/xenoartifact_trait/major)) + majors += name + continue + if(ispath(trait, /datum/xenoartifact_trait/malfunction) && (trait != /datum/xenoartifact_trait/malfunction)) + malfunctions += name + continue diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index d91e936c26c61..9ed6ad407142e 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -455,14 +455,14 @@ if(5) return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]" -/atom/proc/balloon_alert(mob/viewer, text, color = null, show_in_chat = TRUE) +/atom/proc/balloon_alert(mob/viewer, text, color = null, show_in_chat = TRUE, offset_x, offset_y) if(!viewer?.client) return switch(viewer.client.prefs.read_player_preference(/datum/preference/choiced/show_balloon_alerts)) if(BALLOON_ALERT_ALWAYS) - new /datum/chatmessage/balloon_alert(text, src, viewer, color) + new /datum/chatmessage/balloon_alert(text, src, viewer, color, offset_x, offset_y) if(BALLOON_ALERT_WITH_CHAT) - new /datum/chatmessage/balloon_alert(text, src, viewer, color) + new /datum/chatmessage/balloon_alert(text, src, viewer, color, offset_x, offset_y) if(show_in_chat) to_chat(viewer, "[text].") if(BALLOON_ALERT_NEVER) @@ -482,7 +482,7 @@ /datum/chatmessage/balloon_alert tgt_color = "#ffffff" //default color -/datum/chatmessage/balloon_alert/New(text, atom/target, mob/owner, color) +/datum/chatmessage/balloon_alert/New(text, atom/target, mob/owner, color, offset_x, offset_y) if (!istype(target)) CRASH("Invalid target given for chatmessage") if(QDELETED(owner) || !istype(owner) || !owner.client) @@ -492,7 +492,7 @@ //handle color if(color) tgt_color = color - INVOKE_ASYNC(src, PROC_REF(generate_image), text, target, owner) + INVOKE_ASYNC(src, PROC_REF(generate_image), text, target, owner, offset_x, offset_y) /datum/chatmessage/balloon_alert/Destroy() if(!QDELETED(message_loc)) @@ -504,7 +504,7 @@ animate(message, alpha = 0, pixel_y = message.pixel_y + MESSAGE_FADE_PIXEL_Y, time = fadetime, flags = ANIMATION_PARALLEL) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME, SSrunechat) -/datum/chatmessage/balloon_alert/generate_image(text, atom/target, mob/owner) +/datum/chatmessage/balloon_alert/generate_image(text, atom/target, mob/owner, offset_x, offset_y) // Register client who owns this message var/client/owned_by = owner.client RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, PROC_REF(on_parent_qdel)) @@ -536,6 +536,8 @@ message.maptext_height = WXH_TO_HEIGHT(owned_by?.MeasureText(text, null, BALLOON_TEXT_WIDTH)) message.maptext_x = (BALLOON_TEXT_WIDTH - bound_width) * -0.5 message.maptext = MAPTEXT("[text]") + message.pixel_x = offset_x + message.pixel_y = offset_y // View the message owned_by.images += message @@ -547,7 +549,7 @@ duration_mult += duration_length * BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT // Animate the message - animate(message, alpha = 255, pixel_y = world.icon_size * 1.1, time = BALLOON_TEXT_SPAWN_TIME) + animate(message, alpha = 255, pixel_y = (message.pixel_y + world.icon_size) * 1.1, time = BALLOON_TEXT_SPAWN_TIME) LAZYADD(message_loc.balloon_alerts, src) diff --git a/code/datums/components/anti_artifact.dm b/code/datums/components/anti_artifact.dm index e40b3860d5baa..90ca6c785243f 100644 --- a/code/datums/components/anti_artifact.dm +++ b/code/datums/components/anti_artifact.dm @@ -7,6 +7,8 @@ var/allowed_slots = ~ITEM_SLOT_BACKPACK ///Chance to block var/chance = 100 + ///Override, turning this on will disable this component + var/override = FALSE var/datum/callback/reaction var/datum/callback/expire @@ -40,9 +42,13 @@ UnregisterSignal(user, COMSIG_MOB_RECEIVE_ARTIFACT) -/datum/component/anti_artifact/proc/protect(datum/source, mob/user, self, list/protection_sources) +/datum/component/anti_artifact/proc/protect(datum/source, mob/user, self, list/protection_sources, slot) SIGNAL_HANDLER + //Slot logic + if(slot && !(slot & allowed_slots) || override) + return + //Generic protection logic if((!self || blocks_self) && prob(chance)) protection_sources += parent reaction?.Invoke(user) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index fe6c4dd6f8b79..033312210760a 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -79,6 +79,7 @@ Behavior that's still missing from this component that original food items had t RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked)) RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) RegisterSignal(parent, COMSIG_EDIBLE_ON_COMPOST, PROC_REF(compost)) + RegisterSignal(parent, COMSIG_FOOD_FEED_ITEM, PROC_REF(feed_to_item)) if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand)) @@ -558,6 +559,19 @@ Behavior that's still missing from this component that original food items had t L.manual_emote(satisfaction_text) qdel(parent) +///Ability to feed food to items? +/datum/component/edible/proc/feed_to_item(datum/source, atom/movable/eater) + SIGNAL_HANDLER + + if(bitecount == 0 || prob(50)) + eater.visible_message("[eater] nibbles away at \the [parent].", allow_inside_usr = TRUE) + bitecount++ + . = COMPONENT_CANCEL_ATTACK_CHAIN + if(bitecount >= 5) + var/satisfaction_text = pick("burps from enjoyment.", "looks at the area where \the [parent] was.") + eater.visible_message("[eater] [satisfaction_text]", allow_inside_usr = TRUE) + qdel(parent) + ///Response to being used to customize something /datum/component/edible/proc/used_to_customize(datum/source, atom/customized) SIGNAL_HANDLER diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index 2bc228bff58b8..a90288b758f68 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -4,7 +4,7 @@ blacklisted_turf_types = list(/turf/open/lava) // Don't override lava rivers - weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/item/xenoartifact = 1) + weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/item/xenoartifact = 2) weighted_mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 4f75ae2673003..152c3e5d622a1 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -673,4 +673,21 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/poster) desc = "A poster begging you to max your suit sensors. Otherwise, you may be harder to locate if you sustain damage." icon_state = "poster50" +/obj/structure/sign/poster/official/xenoarchaeology + name = "Xenoarchaeology" + desc = "A poster with featuring several diagrams of artifacts.\ + \n\ + Artifacts can be labeled and sold through cargo to obtain research & discovery points.\n\ + Poorly labeled artifacts will yield fewer rewards than accurately labeled ones." + icon_state = "poster51" + +/obj/structure/sign/poster/official/xenoarchaeology_pearl + name = "???" + desc = "A poster featuring an artifact you don't recognize.\ + \n\ + Legends say, artifacts can be made by striking objects with nuclear particles while submerged in tritium. They also \ + say once stabilized, artifacts behave strangely when aligned to certain grids, related to \ + the characteristics of their traits." + icon_state = "poster52" + #undef PLACE_SPEED diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index a5c65f954adf5..5805e2362caae 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -436,8 +436,10 @@ /obj/item/circuitboard/machine/nanite_chamber, /obj/item/circuitboard/machine/nanite_programmer, /obj/item/circuitboard/machine/nanite_program_hub, - /obj/item/circuitboard/machine/xenoartifact_inbox, - /obj/item/circuitboard/computer/xenoartifact_console + /obj/item/circuitboard/computer/xenoarchaeology_console, + /obj/item/circuitboard/machine/xenoarchaeology_machine/scale, + /obj/item/circuitboard/machine/xenoarchaeology_machine/conductor, + /obj/item/circuitboard/machine/xenoarchaeology_machine/calibrator ) /obj/effect/spawner/lootdrop/techstorage/security diff --git a/code/game/objects/items/sticker/series_1.dm b/code/game/objects/items/sticker/series_1.dm new file mode 100644 index 0000000000000..05b811a40ff49 --- /dev/null +++ b/code/game/objects/items/sticker/series_1.dm @@ -0,0 +1,126 @@ +/* + Series 1 +*/ + +/obj/item/sticker/series_1/get_stats() + . = "Series 1\n" + . += ..() + +/obj/item/sticker/series_1/generate_unusual() + var/obj/emitter/emitter = pick(list(/obj/emitter/electrified, /obj/emitter/snow, /obj/emitter/fire)) + if(prob(1)) + playsound(src, 'sound/effects/audience-gasp.ogg', 50) + add_emitter(emitter, "unusual", 10) + is_unusual = TRUE + +/obj/item/sticker/series_1/smile + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_COMMON + +/obj/item/sticker/series_1/skub + icon_state = "skub" + sticker_icon_state = "skub_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_MYTHIC + //Don't chance the drop weight for this, the joke is it's common + +/obj/item/sticker/series_1/c4 + icon_state = "c4" + sticker_icon_state = "c4_sticker" + do_outline = FALSE + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_EXOTIC + drop_rate = STICKER_WEIGHT_EXOTIC + +/obj/item/sticker/series_1/emagged + icon_state = "apcemag" + sticker_icon_state = "apcemag_sticker" + do_outline = FALSE + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_EXOTIC + drop_rate = STICKER_WEIGHT_EXOTIC + +/obj/item/sticker/series_1/sad + icon_state = "sad" + sticker_icon_state = "sad_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_COMMON + +/obj/item/sticker/series_1/moth + icon_state = "moth" + sticker_icon_state = "moth_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/dog + icon_state = "dog" + sticker_icon_state = "dog_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/cat + icon_state = "cat" + sticker_icon_state = "cat_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/carp + icon_state = "carp" + sticker_icon_state = "carp_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/valid + icon_state = "valid" + sticker_icon_state = "valid_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/salad + icon_state = "salad" + sticker_icon_state = "salad_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/heart + icon_state = "heart" + sticker_icon_state = "heart_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_COMMON + +/obj/item/sticker/series_1/eggplant + icon_state = "eggplant" + sticker_icon_state = "eggplant_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + +/obj/item/sticker/series_1/nuke_disk + icon_state = "nucleardisk" + sticker_icon_state = "nucleardisk_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_RARE + drop_rate = STICKER_WEIGHT_RARE + + +/obj/item/sticker/series_1/generic + icon_state = "generic" + sticker_icon_state = "generic_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_COMMON + drop_rate = STICKER_WEIGHT_COMMON + ///What random color we rocking with? + var/random_color + ///Ref to our color overlay + var/mutable_appearance/color_overlay + +/obj/item/sticker/series_1/generic/Initialize(mapload) + random_color = "#[random_color()]" + . = ..() + update_appearance() + +/obj/item/sticker/series_1/generic/setup_appearance(_appearance) + . = ..() + var/mutable_appearance/base = . + color_overlay = new() + color_overlay.appearance = base.appearance + color_overlay.color = random_color + base.add_overlay(color_overlay) + +/obj/item/sticker/series_1/eye + icon_state = "eye" + sticker_icon_state = "eye_sticker" + sticker_flags = STICKER_SERIES_1 | STICKER_RARITY_UNCOMMON + drop_rate = STICKER_WEIGHT_UNCOMMON + do_outline = FALSE diff --git a/code/game/objects/items/sticker/sticker.dm b/code/game/objects/items/sticker/sticker.dm new file mode 100644 index 0000000000000..1cdc95876edad --- /dev/null +++ b/code/game/objects/items/sticker/sticker.dm @@ -0,0 +1,192 @@ +/obj/item/sticker + name = "sticker" //Don't bother changing the name or desc for subtypes + desc = "An adhesive graphic." + icon = 'icons/obj/sticker.dmi' + icon_state = "happy" + flags_1 = IS_ONTOP_1 + w_class = WEIGHT_CLASS_TINY + appearance_flags = TILE_BOUND | PIXEL_SCALE | KEEP_APART + ///Our current state for being stuck or unstuck + var/sticker_state = STICKER_STATE_ITEM + ///Built appearance for item state + var/mutable_appearance/item_appearance + ///Build appearance for stuck state + var/mutable_appearance/stuck_appearance + ///Sticker icon + var/sticker_icon + var/sticker_icon_state = "happy_sticker" + ///Do we add an outline? + var/do_outline = TRUE + ///What kind of tint we rocking? + var/tint = "#fff" + ///Sticker flags + var/sticker_flags + ///Drop rate weight, keep this seperate from rarity for joke + var/drop_rate = STICKER_WEIGHT_COMMON + ///Do we roll for unusual effects + var/roll_unusual = TRUE + var/is_unusual = FALSE + +/obj/item/sticker/Initialize(mapload) + . = ..() + item_appearance = build_item_appearance() + stuck_appearance = build_stuck_appearance() + color = tint + //Sticker outline + if(do_outline) + add_filter("sticker_outline", 1, outline_filter(1.3, "#fff", flags = OUTLINE_SHARP)) + //Unusual stuff + if(roll_unusual) + generate_unusual() + +/obj/item/sticker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_stick(target) || !proximity_flag) + return + //Move to our target + forceMove(target) + layer = target.layer+0.001 + target.vis_contents += src + //Update state + sticker_state = STICKER_STATE_STUCK + update_appearance() + //Build click offset + var/list/modifiers = params2list(click_parameters) + if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) + return + pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + +/obj/item/sticker/attack_hand(mob/user) + if(user.a_intent != INTENT_HELP && sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.attack_hand(user) + if(prob(33)) //We have a 1/3 chance of falling off + unstick() + forceMove(get_turf(user)) + return + unstick() + return ..() + +/obj/item/sticker/attack_alien(mob/user) + if(user.a_intent != INTENT_HELP && sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.attack_alien(user) + return attack_hand(user) //can be picked up by aliens + +/obj/item/sticker/attack_animal(mob/living/simple_animal/M) + if(M.a_intent != INTENT_HELP && sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.attack_animal(M) + return attack_hand(M) + +/obj/item/sticker/CtrlClick(mob/user) + . = ..() + if(user.a_intent != INTENT_HELP && sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.CtrlClick(user) + return + return ..() + +/obj/item/sticker/attackby(obj/item/I, mob/living/user, params) + //If we're stuck to something, pass the attack to our loc + if(sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.attackby(I, user, params) + if(prob(33)) //We have a 1/3 chance of falling off + unstick() + forceMove(get_turf(user)) + return + return ..() + +/obj/item/sticker/Moved(atom/OldLoc, Dir) + if(sticker_state == STICKER_STATE_STUCK) + unstick(OldLoc) + return ..() + +/obj/item/sticker/examine(mob/user) + . = ..() + //Throw sticker stats here, like series, rarity, etc. + . += get_stats() + +/obj/item/sticker/update_appearance(updates) + . = ..() + switch(sticker_state) + if(STICKER_STATE_ITEM) + appearance = item_appearance + vis_flags = null + if(STICKER_STATE_STUCK) + appearance = stuck_appearance + vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_DIR + else + return + +/obj/item/sticker/proc/build_item_appearance() + return setup_appearance(mutable_appearance(src.icon, src.icon_state, plane = src.plane, color = tint)) + +/obj/item/sticker/proc/build_stuck_appearance() + return setup_appearance(mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state, color = tint)) + +//used to set appearance stuff that gets reset by appearance assigns +/obj/item/sticker/proc/setup_appearance(_appearance) + var/mutable_appearance/MA = _appearance + MA.name = name + MA.appearance_flags = appearance_flags + MA.desc = desc + return MA + +/obj/item/sticker/proc/can_stick(atom/target) + if(istype(target, /obj/item/sticker)) + return FALSE + if(istype(target, /atom/movable/screen)) + return FALSE + //If you want to add MORE stuff to the denial list, swap it to a type list + if(ismovable(target)) + return TRUE + if(iswallturf(target)) + return TRUE + return FALSE + +/obj/item/sticker/proc/unstick(atom/override) + if(sticker_state != STICKER_STATE_STUCK) + return + var/atom/movable/AM = override || loc + AM.vis_contents -= src + layer = initial(layer) + //Set this here so ``update_appearance`` works correctly + sticker_state = STICKER_STATE_ITEM + update_appearance() + //Reset click offset + pixel_x = 0 + pixel_y = 0 + +///Add an unusual effect to the sticker, potentially +/obj/item/sticker/proc/generate_unusual() + //You'll want to go through and add a list of particle effects / logic for your series, this is just a generic placeholder + if(prob(1)) + add_emitter(/obj/emitter/electrified, "unusual", 10) + +/obj/item/sticker/proc/get_stats() + . = "" + //Append rarity + var/rarities = STICKER_RARITY_COMMON | STICKER_RARITY_UNCOMMON | STICKER_RARITY_RARE | STICKER_RARITY_EXOTIC | STICKER_RARITY_MYTHIC + var/rarity = rarities & sticker_flags + if(!rarity) + return + //use this switch to give the rarity name, color, and any other effects you want to add + switch(rarity) + if(STICKER_RARITY_COMMON) + . += "Common\n" + if(STICKER_RARITY_UNCOMMON) + . += "Uncommon\n" + if(STICKER_RARITY_RARE) + . += "Rare\n" + if(STICKER_RARITY_EXOTIC) + . += "Exotic\n" + if(STICKER_RARITY_MYTHIC) + . += "Mythic\n" + else + . += "GARBAGE\n" + //Append unusual status + if(is_unusual) + . += "Unusual\n" diff --git a/code/game/objects/items/sticker/sticky_note.dm b/code/game/objects/items/sticker/sticky_note.dm new file mode 100644 index 0000000000000..bdabd9b3fdbe7 --- /dev/null +++ b/code/game/objects/items/sticker/sticky_note.dm @@ -0,0 +1,111 @@ +/obj/item/sticker/sticky_note + name = "office note" + desc = "An adhesive office note." + icon_state = "sticky_note" + sticker_icon_state = "sticky_note_sticker" + do_outline = FALSE + ///Internal paper we use for display + var/obj/item/paper/my_paper + ///Custom text to throw into the paper at init + var/custom_text + +/obj/item/sticker/sticky_note/Initialize(mapload) + my_paper = new(src) + if(custom_text) + my_paper.add_raw_text(custom_text) + sticker_icon_state = "sticky_note_sticker_written" + RegisterSignal(my_paper, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_paper)) + return ..() + +/obj/item/sticker/sticky_note/Destroy() + . = ..() + UnregisterSignal(my_paper, COMSIG_ATOM_UPDATE_OVERLAYS) + QDEL_NULL(my_paper) + +/obj/item/sticker/sticky_note/examine(mob/user) + . = ..() + . += my_paper.examine(user) + +/obj/item/sticker/sticky_note/attackby(obj/item/I, mob/living/user, params) + . = ..() + my_paper.attackby(I, user, params) + +/obj/item/sticker/sticky_note/interact(mob/user) + . = ..() + my_paper.interact(user) + +/obj/item/sticker/sticky_note/proc/handle_paper() + SIGNAL_HANDLER + + sticker_icon_state = "sticky_note_sticker_written" + stuck_appearance = build_stuck_appearance() + if(sticker_state == STICKER_STATE_STUCK) + var/old_x = pixel_x + var/old_y = pixel_y + update_appearance() + pixel_x = old_x + pixel_y = old_y + UnregisterSignal(my_paper, COMSIG_ATOM_UPDATE_OVERLAYS) + +/* + Dispenser for sticky notes +*/ +/obj/item/sticky_note_pile + name = "office note pad" + desc = "A stack of adhesive office notes." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "sticky_note_pile" + throwforce = 0 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 3 + throw_range = 7 + pressure_resistance = 8 + resistance_flags = FLAMMABLE + ///How many sticky notes do we contain + var/current_notes = 30 + +/obj/item/sticky_note_pile/Initialize(mapload) + . = ..() + interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + +/obj/item/sticky_note_pile/MouseDrop(atom/over_object) + . = ..() + var/mob/living/L = usr + if(!istype(L) || L.incapacitated() || !Adjacent(L)) + return + + if(over_object == L) + L.put_in_hands(src) + + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object + L.putItemFromInventoryInHandIfPossible(src, H.held_index) + + add_fingerprint(L) + +/obj/item/sticky_note_pile/attack_hand(mob/user) + . = ..() + //Prechecks + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return + if(current_notes <= 0) + to_chat(user, "[src] is empty!") + return + //Give the note + user.changeNext_move(CLICK_CD_MELEE) + var/obj/item/sticker/sticky_note/N = new() + N.add_fingerprint(user) + N.forceMove(user.loc) + user.put_in_hands(N) + to_chat(user, "You take [N] out of \the [src].") + //Deitterate notes + current_notes -= 1 + +/obj/item/sticky_note_pile/examine(mob/user) + . = ..() + if(current_notes) + . += "It contains [current_notes] [current_notes > 1 ? "notes" : "note"]." + else + . += "It doesn't contain anything." diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index cf05b79bfbcaf..eabc18b710f92 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -174,6 +174,9 @@ Striking a noncultist, however, will tear their flesh."} heat_protection = CHEST|GROIN|LEGS|ARMS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT +/obj/item/clothing/suit/hooded/cultrobes/ComponentInitialize() + . = ..() + AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100) /datum/armor/hooded_cultrobes diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 710cdf672cd60..d546dc7548983 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -170,7 +170,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/rend) if(ismob(A)) to_chat(A, "There is no way out of this place...") return - var/atom/return_thing = pick(GLOB.destabliization_exits) + var/atom/return_thing = pick(GLOB.destabliization_exits) || pick(get_safe_random_station_turfs()) var/turf/T = get_turf(return_thing) if(!T) return diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index cfba7f3acafa5..78e84216f9533 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -18,7 +18,9 @@ /obj/item/export_scanner/afterattack(obj/O, mob/user, proximity) . = ..() - if(!istype(O) || !proximity) + if(!istype(O) || !proximity || HAS_TRAIT(O, TRAIT_IGNORE_EXPORT_SCAN)) + if(HAS_TRAIT(O, TRAIT_IGNORE_EXPORT_SCAN)) + to_chat(user, "[O] cannot be scanned!") return if(istype(O, /obj/machinery/computer/cargo)) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index fc7263baa8612..151d83fd5aae8 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -49,6 +49,9 @@ then the player gets the profit from selling his own wasted time. sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) + if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) @@ -77,6 +80,9 @@ then the player gets the profit from selling his own wasted time. sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) + if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index be7bf34de53a6..30344f758a05f 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -19,6 +19,7 @@ var/DropPodOnly = FALSE//only usable by the Bluespace Drop Pod via the express cargo console var/admin_spawned = FALSE var/small_item = FALSE //Small items can be grouped into a single crate. + var/can_secure = TRUE //Can this order be secured /datum/supply_pack/New() . = ..() @@ -27,7 +28,7 @@ /datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) var/obj/structure/closet/crate/C - if(paying_account) + if(paying_account && can_secure) C = new /obj/structure/closet/crate/secure/owned(A, paying_account) C.name = "[crate_name] - Purchased by [paying_account.account_holder]" else @@ -55,7 +56,11 @@ A.flags_1 |= ADMIN_SPAWNED_1 else for(var/item in contains) - new item(C) + if(ispath(item)) + new item(C) + else if(ismovable(item)) + var/atom/movable/MA = item + MA.forceMove(C) // If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal @@ -3358,7 +3363,8 @@ /obj/item/canvas/twentythree_twentythree, /obj/item/canvas/twentythree_twentythree, /obj/item/toy/crayon/rainbow, - /obj/item/toy/crayon/rainbow) + /obj/item/toy/crayon/rainbow, + /obj/item/vending_refill/sticker) crate_name = "art supply crate" crate_type = /obj/structure/closet/crate/wooden @@ -3456,7 +3462,8 @@ /obj/item/clipboard, /obj/item/stamp, /obj/item/stamp/denied, - /obj/item/laser_pointer/purple) + /obj/item/laser_pointer/purple, + /obj/item/sticky_note_pile) crate_name = "bureaucracy crate" /datum/supply_pack/misc/bulk_paper diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 8b4cb3ca851ec..f2052689d442b 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -160,6 +160,11 @@ actions_types = list(/datum/action/item_action/artifact_pincher_mode) var/safety = FALSE +/obj/item/clothing/gloves/artifact_pinchers/ComponentInitialize() + . = ..() + var/datum/component/anti_artifact/A = AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100, ITEM_SLOT_GLOVES) + A?.override = !safety + /datum/action/item_action/artifact_pincher_mode name = "Toggle Safety" @@ -167,4 +172,12 @@ var/obj/item/clothing/gloves/artifact_pinchers/pinchy = target if(istype(pinchy)) pinchy.safety = !pinchy.safety - button.icon_state = (pinchy.safety ? "template_active" : "template") + var/datum/component/anti_artifact/A = pinchy.GetComponent(/datum/component/anti_artifact) + A?.override = !pinchy.safety + UpdateButtonIcon() + +/datum/action/item_action/artifact_pincher_mode/UpdateButtonIcon(status_only = FALSE, force) + if(..()) //button available + var/obj/item/clothing/gloves/artifact_pinchers/pinchy = target + if(istype(pinchy)) + button.icon_state = (pinchy.safety ? "template_active" : "template") diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index c215d0e44b4a2..134139c16c8ac 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -18,7 +18,7 @@ /obj/item/storage/part_replacer/bluespace/tier4=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1,\ - /obj/item/xenoartifact_labeler/debug=1,\ + /obj/item/xenoarchaeology_labeler/debug=1,\ /obj/item/map_template_diver=1,\ /obj/item/debug/orb_of_power=1 ) diff --git a/code/modules/exploration_crew/discovery_research/discoverable_component.dm b/code/modules/exploration_crew/discovery_research/discoverable_component.dm index 1b9685404b15b..c2ec104c18cf7 100644 --- a/code/modules/exploration_crew/discovery_research/discoverable_component.dm +++ b/code/modules/exploration_crew/discovery_research/discoverable_component.dm @@ -53,3 +53,44 @@ playsound(user, 'sound/machines/terminal_success.ogg', 60) to_chat(user, "New datapoint scanned, [point_reward] discovery points gained.") pulse_effect(get_turf(A), 4) + +/* + Equivilent for artifacts + essentially looks at the artifact's traits +*/ + +/datum/component/discoverable/artifact + +/datum/component/discoverable/artifact/discovery_scan(datum/techweb/linked_techweb, mob/user) + //Already scanned our atom. + var/atom/atom_parent = parent + if(scanned) + to_chat(user, "[atom_parent] has already been analysed.") + return + //Is it *even* an artifact + var/datum/component/xenoartifact/artifact_datum = atom_parent.GetComponent(/datum/component/xenoartifact) + if(!artifact_datum) + return + //Loop through artfact traits + var/total_payout = 0 + var/discovered_trait_count = 0 + for(var/trait in artifact_datum.traits_catagories) + for(var/datum/xenoartifact_trait/trait_datum as anything in artifact_datum.traits_catagories[trait]) + //Already scanned another of this type. + var/discover_id = get_discover_id?.Invoke() || trait_datum.type + if(!unique && linked_techweb.scanned_atoms[discover_id]) + continue + if(atom_parent.flags_1 & HOLOGRAM_1) + continue + total_payout += trait_datum.discovery_reward + discovered_trait_count++ + linked_techweb.scanned_atoms[discover_id] = TRUE + scanned = TRUE + if(total_payout) + linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, total_payout) + playsound(user, 'sound/machines/terminal_success.ogg', 60) + to_chat(user, "New datapoint scanned, [total_payout] discovery points gained.\n[discovered_trait_count] new traits discovered!") + pulse_effect(get_turf(atom_parent), 4) + else + playsound(user, 'sound/machines/uplinkerror.ogg', 60) + to_chat(user, "No new traits detected in [atom_parent].") diff --git a/code/modules/exploration_crew/discovery_research/discovery_scanner.dm b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm index 109f7b4aa3875..b1c2dd0faca05 100644 --- a/code/modules/exploration_crew/discovery_research/discovery_scanner.dm +++ b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm @@ -13,6 +13,7 @@ . = ..() if(!linked_techweb) linked_techweb = SSresearch.science_tech + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) /obj/item/discovery_scanner/Destroy() linked_techweb = null //Note: Shouldn't hard del anyway since techwebs don't get deleted, however if they do then troubles will arise and this will need to be changed. diff --git a/code/modules/hallucination/hazard.dm b/code/modules/hallucination/hazard.dm index 3dde2d764ea57..085c5a0c62d66 100644 --- a/code/modules/hallucination/hazard.dm +++ b/code/modules/hallucination/hazard.dm @@ -284,7 +284,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/hallucination/simple/clown) charged = TRUE target.Paralyze(80) target.adjustStaminaLoss(40) - step_away(target, bubblegum) + if(isturf(target.loc)) + step_away(target, bubblegum) shake_camera(target, 4, 3) target.visible_message("[target] jumps backwards, falling on the ground!","[bubblegum] slams into you!") next_action = 0.2 diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 47e000da38d15..7e1ffe94f0526 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -28,12 +28,19 @@ ai_controller = /datum/ai_controller/basic_controller/cockroach + ///Are we squashable + var/is_squashable = TRUE + +/mob/living/basic/cockroach/strong + is_squashable = FALSE + /mob/living/basic/cockroach/Initialize(mapload) . = ..() AddElement(/datum/element/death_drops, list(/obj/effect/decal/cleanable/insectguts)) // AddElement(/datum/element/swabable, CELL_LINE_TABLE_COCKROACH, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7) //Bee edit: No swabable elements AddElement(/datum/element/basic_body_temp_sensetive, 270, INFINITY) - AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) + if(is_squashable) + AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) /mob/living/basic/cockroach/death(gibbed) if(SSticker.mode?.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index f2b9417323fca..cf0668302603b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -386,7 +386,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, separation = " ") +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, allow_inside_usr = FALSE, separation = " ") if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4ba48a2af5a5e..33e5acb84812f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -236,7 +236,7 @@ if(length(show_to)) create_chat_message(src, null, show_to, raw_msg, null, visible_message_flags) -/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, separation = " ") +/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, allow_inside_usr = FALSE, separation = " ") . = ..() if(!self_message) return @@ -930,14 +930,17 @@ S.action.Grant(src) ///Remove a spell from the mobs spell list -/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) +/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell, delete_spell = TRUE) if(!spell) return for(var/X in mob_spell_list) - var/obj/effect/proc_holder/spell/S = X - if(istype(S, spell)) - mob_spell_list -= S - qdel(S) + var/obj/effect/proc_holder/spell/spell_holder = X + if(istype(spell_holder, spell)) + mob_spell_list -= spell_holder + if(delete_spell) + qdel(spell_holder) + else + spell_holder.action.Remove(src) ///Return any anti magic atom on this mob that matches the magic type /mob/proc/anti_magic_check(magic = TRUE, holy = FALSE, major = TRUE, self = FALSE) @@ -951,9 +954,9 @@ return src ///Return any anti artifact atom on this mob -/mob/proc/anti_artifact_check(self = FALSE) +/mob/proc/anti_artifact_check(self = FALSE, slot) var/list/protection_sources = list() - if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_ARTIFACT, src, self, protection_sources) & COMPONENT_BLOCK_ARTIFACT) + if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_ARTIFACT, src, self, protection_sources, slot) & COMPONENT_BLOCK_ARTIFACT) if(protection_sources.len) return pick(protection_sources) else diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index c77f5660f2620..b1063cb512891 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -233,6 +233,8 @@ * This list expands if you snip a particular wire. */ /obj/machinery/fax/proc/is_allowed_type(obj/item/item) + if(item?.GetComponent(/datum/component/xenoartifact)) + return FALSE if(is_type_in_list(item, allowed_types)) return TRUE if(!allow_exotic_faxes) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 76e2029ae7bbf..6b6a99c033bd9 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -326,7 +326,7 @@ return UI_CLOSE if(camera_holder && can_show_to_mob_through_camera(user) || request_state) return UI_UPDATE - if(!in_range(user,src)) + if(!in_range(user, src)) return UI_CLOSE if(user.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB) || (isobserver(user) && !IsAdminGhost(user))) return UI_UPDATE @@ -334,7 +334,7 @@ // .. or if you cannot read if(!user.can_read(src)) return UI_CLOSE - if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard)) + if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard) || in_contents_of(/obj/item/sticker/sticky_note)) return UI_INTERACTIVE return ..() diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm new file mode 100644 index 0000000000000..4c7e87d71c21c --- /dev/null +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -0,0 +1,115 @@ +/* + Particles for artifacts +*/ + +///Sonar +/obj/emitter/sonar + particles = new/particles/sonar + plane = ABOVE_LIGHTING_PLANE + +/obj/emitter/sonar/out + particles = new/particles/sonar/out + +/particles/sonar + width = 100 + height = 100 + count = 3 + spawning = 0.15 + lifespan = 15 + fade = 3 + #ifndef SPACEMAN_DMM // Waiting on next release of DreamChecker + fadein = 3 + #endif + friction = 0.25 + color = "#0081ff" + scale = list(2, 2) + grow = list(-0.1, -0.1) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("circle_1") + +/particles/sonar/out + color = "#55ff00" + scale = list(0.5, 0.5) + grow = list(0.1, 0.1) + +///Snow smoke, idk +/obj/emitter/snow + alpha = 200 + particles = new/particles/snow + +/particles/snow + icon = 'icons/effects/particles/weather.dmi' + icon_state = list("snow_1" = 1, "snow_2" = 1, "snow_3" = 2) + color = "#b8fffd" + count = 10 + spawning = 1 + lifespan = 10 + fade = 4 + #ifndef SPACEMAN_DMM + fadein = 4 + #endif + position = generator("box", list(-15, 10, -15), list(15, 12, 15), UNIFORM_RAND) + velocity = list(0, -2, 0) + gravity = list(0, 0.1, 0) + drift = generator("box", list(-0.2, 0, -0.2), list(0.2, 0, 0.2), UNIFORM_RAND) + +///Electrified +/obj/emitter/electrified + particles = new/particles/electrified + plane = ABOVE_LIGHTING_PLANE + blend_mode = BLEND_ADD + +/obj/emitter/electrified/Initialize(mapload) + . = ..() + add_filter("bloom" , 1 , list(type="bloom", size=1, offset = 0.1, alpha = 255)) + +/particles/electrified + count = 10 + spawning = 1 + lifespan = 10 + fade = 2 + #ifndef SPACEMAN_DMM + fadein = 1 + #endif + position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) + velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) + rotation = generator("num", 0, 360, UNIFORM_RAND) + friction = 0.21 + color = "#94f3ff" + scale = list(0.14, 0.14) + grow = list(0.08, 0.08) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("static_1", "static_2") + +///Calibartion spiral thing +/obj/emitter/spiral + plane = ABOVE_LIGHTING_PLANE + blend_mode = BLEND_ADD + +/obj/emitter/spiral/New(loc, ...) + . = ..() + add_filter("blur", 1, gauss_blur_filter(0.7)) + +/obj/emitter/spiral/proc/setup(_color) + particles = new/particles/spiral(_color) + +/particles/spiral + count = 90 + spawning = 30 + lifespan = 3 + fade = 1 + #ifndef SPACEMAN_DMM + fadein = 1 + #endif + rotation = generator("num", 0, 360, UNIFORM_RAND) + spin = generator("num", 8, 10, UNIFORM_RAND) + friction = 0.21 + color = "#94f3ff" + scale = generator("box", list(1.5, 1.5, 1.5), list(2, 2, 2), UNIFORM_RAND) + grow = list(-0.5, -0.5) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("line_1", "line_2", "line_3") + +/particles/spiral/New(_color) + . = ..() + color = _color || color diff --git a/code/modules/particles/byond_particles/emitter/misc.dm b/code/modules/particles/byond_particles/emitter/misc.dm index c3e59de03f265..b8361839ff1d0 100644 --- a/code/modules/particles/byond_particles/emitter/misc.dm +++ b/code/modules/particles/byond_particles/emitter/misc.dm @@ -1,2 +1,27 @@ /obj/emitter/stink_lines particles = new/particles/stink_lines + +//Confetti +/obj/emitter/confetti + particles = new/particles/confetti + +/particles/confetti + width = 100 + height = 100 + count = 15 + spawning = 15 + lifespan = 20 + fade = 1 + #ifndef SPACEMAN_DMM + fadein = 3 + #endif + friction = 0.15 + gravity = list(0, -1, 0) + color = generator("color", "#ff0000", "#0000ff", UNIFORM_RAND) + scale = list(0.7, 1) + velocity = generator("box", list(-4, 15, -4), list(4, 10, 4), NORMAL_RAND) + rotation = generator("num", 0, 360, UNIFORM_RAND) + spin = generator("num", 5, 15, UNIFORM_RAND) + icon = 'icons/effects/particles/misc.dmi' + drift = generator("box", list(0.3, 0, 0.3), list(-0.3, 0, -0.3), NORMAL_RAND) + icon_state = list("line_4") diff --git a/code/modules/particles/byond_particles/emitter/spark.dm b/code/modules/particles/byond_particles/emitter/spark.dm index f61a708fd6e74..992ce56e89e8c 100644 --- a/code/modules/particles/byond_particles/emitter/spark.dm +++ b/code/modules/particles/byond_particles/emitter/spark.dm @@ -12,4 +12,3 @@ /obj/emitter/sparks/flare/Initialize(mapload) . = ..() add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) - diff --git a/code/modules/particles/byond_particles/particle_procs.dm b/code/modules/particles/byond_particles/particle_procs.dm index f596be1817d5f..3bc4109816db3 100644 --- a/code/modules/particles/byond_particles/particle_procs.dm +++ b/code/modules/particles/byond_particles/particle_procs.dm @@ -34,6 +34,8 @@ particles like bonfires. else addtimer(CALLBACK(src, PROC_REF(remove_emitter), particle_key), lifespan) + return new_emitter + /atom/proc/remove_emitter(particle_key, burst_mode = FALSE) if(!particle_key) CRASH("remove_emitter called without a key ref.") diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 98eb16acb14b7..413cc9db2e97c 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -52,6 +52,30 @@ name = "impossibly strong nuclear particle" damage = 30 +/obj/projectile/energy/nuclear_particle/scan_moved_turf() + . = ..() + //Do a gas check first + var/turf/turf = get_turf(src) + var/datum/gas_mixture/air = turf?.return_air() + if((air?.get_moles(GAS_TRITIUM) < MOLES_GAS_VISIBLE)) + return + for(var/obj/item/item in loc) + if(!prob(33)) + continue + //Proceed with artifact logic + if(item.GetComponent(/datum/component/xenoartifact)) + continue + //Check for any pearls attached to the item first + var/list/trait_list + for(var/obj/item/sticker/trait_pearl/pearl in item.contents) + LAZYADD(trait_list, pearl.stored_trait) + qdel(pearl) + //Make the item an artifact + item.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, trait_list, TRUE, FALSE) + playsound(item, 'sound/magic/staff_change.ogg', 50, TRUE) + qdel(src) + break + /atom/proc/fire_nuclear_particle(angle = rand(0,360), customize = FALSE, custompower = 1e12) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. var/obj/projectile/energy/nuclear_particle/P = new /obj/projectile/energy/nuclear_particle(src) if(customize) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 6c0e232ad9890..a0d60548f64ef 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -676,19 +676,11 @@ category = list("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/xeno_listing_console +/datum/design/board/xenoa_listing_console name = "Computer Design (Research and Development Listing Console)" desc = "The circuit board for a research listing console." id = "xenoa_list_console" - build_path = /obj/item/circuitboard/computer/xenoartifact_console - category = list ("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/board/xenia_listing_inbox - name = "Machine Design (Bluespace Straythread Pad)" - desc = "The circuit board for a bluespace straythread pad." - id = "xenoa_list_pad" - build_path = /obj/item/circuitboard/machine/xenoartifact_inbox + build_path = /obj/item/circuitboard/computer/xenoarchaeology_console category = list ("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE @@ -732,6 +724,30 @@ departmental_flags = DEPARTMENTAL_FLAG_SECURITY category = list("Misc. Machinery") +/datum/design/board/xenoa_scale + name = "Machine Design (Industrial Scale)" + desc = "The circuit board for an industrial scale." + id = "xenoa_scale" + build_path = /obj/item/circuitboard/machine/xenoarchaeology_machine/scale + category = list ("Research Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/xenoa_conductor + name = "Machine Design (Conducting Plate)" + desc = "The circuit board for a conducting plate." + id = "xenoa_conductor" + build_path = /obj/item/circuitboard/machine/xenoarchaeology_machine/conductor + category = list ("Research Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/xenoa_calibrator + name = "Machine Design (Anomalous Material Calibrator)" + desc = "The circuit board for an anomalous material calibrator." + id = "xenoa_calibrator" + build_path = /obj/item/circuitboard/machine/xenoarchaeology_machine/calibrator + category = list ("Research Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/board/sheetifier name = "Sheetifier" desc = "This machine turns weird things into sheets." diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 88bcb51d7bec3..3931ab72b9bc1 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -266,13 +266,13 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE -/datum/design/xenoartifact_labeler +/datum/design/xenoartifact_labeller name = "Artifact Labeler" desc = "A scientific labeler used to warn others of the dangers of an alien artifact." id = "xenoa_labeler" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000, /datum/material/gold = 3000) - build_path = /obj/item/xenoartifact_labeler + build_path = /obj/item/xenoarchaeology_labeler category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE @@ -286,6 +286,16 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/xenoartifact_tracker + name = "Artifact Tracker" + desc = "A tracker for researching artifacts." + id = "xenoa_tracker" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500, /datum/material/gold = 500) + build_path = /obj/item/sticker/artifact_tracker + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/bluespace_capsule name = "Bluespace Capsule" id = "bluespace_capsule" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 7ce97d30f8532..ae77f992f3088 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -475,7 +475,10 @@ "reactive_armour", "xenoa_gloves", "xenoa_list_console", - "xenoa_list_pad", + "xenoa_scale", + "xenoa_conductor", + "xenoa_calibrator", + "xenoa_tracker", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 5000 diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm index 5c459acc4ac3a..be5405392521f 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm @@ -185,7 +185,7 @@ loot = list( "" = 4, /obj/item/disk/tech_disk/research/random = 24, - /obj/item/xenoartifact = 6, + /obj/item/xenoartifact/pre_labeled = 6, /obj/item/gun/energy/vortex = 3, /obj/item/gun/energy/alien = 1 ) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index fa945412170d3..55e9509d1a2a3 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -30,6 +30,12 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/effect/warped_rune // no teleporting to cc for you ))) +GLOBAL_LIST_INIT(whitelisted_cargo_types, typecacheof(list( + /obj/effect/mob_spawn/sentient_artifact, + /mob/living/simple_animal/shade/sentience + ))) + + /obj/docking_port/mobile/supply name = "supply shuttle" id = "supply" @@ -62,7 +68,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( for(var/trf in shuttle_area) var/turf/T = trf for(var/a in T.GetAllContents()) - if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types) && !istype(a, /obj/docking_port)) + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types) && !istype(a, /obj/docking_port) && !is_type_in_typecache(a, GLOB.whitelisted_cargo_types)) return FALSE return TRUE diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 70fea8d8c39a4..8f627a69b36da 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -175,6 +175,14 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/shapeshift_holder) qdel(shape) qdel(src) +//Special subtype for artifacts that use it in a wonky-ish way, don't worry :) +/obj/shapeshift_holder/no_damage + +/obj/shapeshift_holder/no_damage/restore(death=FALSE, convert_damage = FALSE) + convert_damage = FALSE //Bruh + death = FALSE + . = ..() + /datum/soullink/shapeshift var/obj/shapeshift_holder/source diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 1e00b6aef4be7..9c3ef45f13325 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -28,8 +28,6 @@ ///Color of the heart, is set by the species on gain //var/ethereal_color = "#9c3030" - - /obj/item/organ/heart/update_icon() if(beating) icon_state = "[icon_base]-on" diff --git a/code/modules/vending/sticker.dm b/code/modules/vending/sticker.dm new file mode 100644 index 0000000000000..f7c923512cb86 --- /dev/null +++ b/code/modules/vending/sticker.dm @@ -0,0 +1,54 @@ +/obj/machinery/vending/sticker + name = "\improper Sticker Vendor" + desc = "Surprise mechanics!" + product_ads = "Stick with me!;Be sure to stick around.;Stick to it." + icon_state = "gacha" + light_color = LIGHT_COLOR_CYAN + products = list(/obj/item/sticker_gacha/series_1 = 15) + refill_canister = /obj/item/vending_refill/sticker + default_price = 35 + extra_price = 50 + dept_req_for_free = ACCOUNT_VIP_BITFLAG + +/obj/machinery/vending/sticker/Initialize(mapload) + . = ..() + fill_sticker_globals() + +/obj/item/vending_refill/sticker + machine_name = "Sticker Vendor" + icon_state = "refill_smoke" + +//You can make this generic if you want to use it elsehwere +/obj/item/sticker_gacha + name = "sticker gacha ball - series 1" + desc = "A prize ball. What could be inside!" + icon = 'icons/obj/sticker.dmi' + icon_state = "gacha_red" + w_class = WEIGHT_CLASS_SMALL + ///What series does this gacha pull from + var/series = STICKER_SERIES_1 + +/obj/item/sticker_gacha/Initialize(mapload) + . = ..() + icon_state = "gacha_[pick("red", "green", "blue")]" + +/obj/item/sticker_gacha/interact(mob/user) + . = ..() + to_chat(user, "You begin to pry open [src].") + if(do_after(user, 2.5 SECONDS, src)) + playsound(user, 'sound/effects/cartoon_pop.ogg', 35, TRUE) + //Build prize + user.dropItemToGround(src) + var/obj/item/sticker/S = pick(GLOB.stickers_by_series["[series]"]) + S = new S(get_turf(src)) + user.put_in_active_hand(S) + //Dopamine + playsound(user, 'sound/items/party_horn.ogg', 35, TRUE) + user.add_emitter(/obj/emitter/confetti, "confetti", 10, lifespan = 15) + //Kill ourselves + qdel(src) + else + to_chat(user, "You fail to pry [src] open.") + +/obj/item/sticker_gacha/series_1 + series = STICKER_SERIES_1 diff --git a/code/modules/xenoarchaeology/component/materials.dm b/code/modules/xenoarchaeology/component/materials.dm new file mode 100644 index 0000000000000..cf3e196ed2b30 --- /dev/null +++ b/code/modules/xenoarchaeology/component/materials.dm @@ -0,0 +1,136 @@ +/* + material datums +*/ + +/datum/xenoartifact_material + var/name = "debugium" + ///What color we associate with this material + var/material_color = "#ff4800" + + ///Trait info, how many of each trait are we allowed / start with + var/trait_activators = 1 + var/trait_minors = 3 + var/trait_majors = 1 + var/trait_malfunctions = 0 //How many malfunctions we start with + + ///How many malfunctions can we gain, maximum + var/max_trait_malfunctions = 1 + + ///How much we increase artifact instability by for every use + var/instability_step = 0 + + ///Custom price we use if the item doesn't have its own + var/custom_price = 100 + + ///Artifact textures + var/texture_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/texture_icon_states = list("texture-debug1", "texture-debug2", "texture-debug3") + ///Artifact masks + var/mask_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/mask_icon_states = list("map_editor") + + ///What rate do we convert custom price to discovery points to? + var/dp_rate = 0.1 + ///What rate do we convert custom price to research points to? + var/rnd_rate = 0.5 + + ///What traits flags are we associated with + var/trait_flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + + ///What icon we use in the labeler + var/label_icon = "circle" + + ///Parent path - Use this if you're making a material subtype and don't change the traits + var/material_parent + +/datum/xenoartifact_material/proc/get_activators() + var/datum/xenoa_material_info_holder/traits = SSxenoarchaeology.material_info_list[material_parent || type] + if(!traits) + CRASH("Unable to find activator traits, for [material_parent || type]. Cosmic rays have fucked your device!") + return traits.activators + +/datum/xenoartifact_material/proc/get_minors() + var/datum/xenoa_material_info_holder/traits = SSxenoarchaeology.material_info_list[material_parent || type] + if(!traits) + CRASH("Unable to find minor traits, for [material_parent || type]. Cosmic rays have fucked your device!") + return traits.minors + +/datum/xenoartifact_material/proc/get_majors() + var/datum/xenoa_material_info_holder/traits = SSxenoarchaeology.material_info_list[material_parent || type] + if(!traits) + CRASH("Unable to find major traits, for [material_parent || type]. Cosmic rays have fucked your device!") + return traits.majors + +/datum/xenoartifact_material/proc/get_malfunctions() + var/datum/xenoa_material_info_holder/traits = SSxenoarchaeology.material_info_list[material_parent || type] + if(!traits) + CRASH("Unable to find malfunction traits, for [material_parent || type]. Cosmic rays have fucked your device!") + return traits.malfunctions + +/datum/xenoartifact_material/proc/get_texture() + return icon(texture_icon, pick(texture_icon_states)) + +/datum/xenoartifact_material/proc/get_mask() + return mutable_appearance(mask_icon, pick(mask_icon_states)) + +/datum/xenoartifact_material/bananium + name = "bananium" + material_color = "#f2ff00" + instability_step = 0.5 + texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") + mask_icon_states = list("mask-bananium1", "mask-bananium2", "mask-bananium3") + custom_price = 600 + trait_flags = XENOA_BANANIUM_TRAIT + label_icon = "circle" + +/datum/xenoartifact_material/uranium + name = "uranium" + material_color = "#88ff00" + instability_step = 25 + texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") + mask_icon_states = list("mask-uranium1", "mask-uranium2", "mask-uranium2") + custom_price = 450 + trait_malfunctions = 1 + max_trait_malfunctions = 2 + trait_flags = XENOA_URANIUM_TRAIT + label_icon = "certificate" + +/datum/xenoartifact_material/plasma + name = "plasma" + material_color = "#f200ff" + instability_step = 5 + texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") + mask_icon_states = list("mask-plasma1", "mask-plasma2", "mask-plasma3") + custom_price = 250 + trait_flags = XENOA_PLASMA_TRAIT + label_icon = "play" + +/datum/xenoartifact_material/bluespace + name = "bluespace" + material_color = "#006aff" + instability_step = 1 + texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") + mask_icon_states = list("mask-bluespace1", "mask-bluespace2", "mask-bluespace3") + trait_flags = XENOA_BLUESPACE_TRAIT + label_icon = "star" + +//Artificial +/datum/xenoartifact_material/pearl + name = "pearl" + material_color = "#f1ffca" + instability_step = 50 + texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") + custom_price = 800 + trait_flags = XENOA_PEARL_TRAIT + label_icon = "question" + +/datum/xenoartifact_material/pearl/get_texture() + var/icon/I = icon(texture_icon, pick(texture_icon_states)) + I.AddAlphaMask(icon('icons/obj/xenoarchaeology/xenoartifact.dmi', "feather")) + return I + +//Calcified +/datum/xenoartifact_material/calcified + name = "calcified" + material_color = "#726387" + texture_icon_states = list("texture-calcified1", "texture-calcified2", "texture-calcified3") diff --git a/code/modules/xenoarchaeology/component/xenoartifact.dm b/code/modules/xenoarchaeology/component/xenoartifact.dm new file mode 100644 index 0000000000000..a330bee3ecb8a --- /dev/null +++ b/code/modules/xenoarchaeology/component/xenoartifact.dm @@ -0,0 +1,411 @@ +/* + Artifact component +*/ + +/datum/component/xenoartifact + ///List of artifact-traits we have : list(PRIORITY = list(trait)) + var/list/traits_catagories = list() + ///Blacklist of components this artifact is currently incompatible with + var/list/blacklisted_traits = list() + + ///What strenght are our traits operating at? + var/trait_strength = XENOA_TRAIT_STRENGTH_STRONG + + ///Level of instability, associated with gaining malfunctions + var/instability = 0 + + ///What type of artifact are we? + var/datum/xenoartifact_material/artifact_material + + ///Cooldown logic for uses + var/use_cooldown = XENOA_GENERIC_COOLDOWN + var/use_cooldown_timer + ///Extra cooldown from traits - update this with get_extra_cooldowns() when you add traits + var/trait_cooldown = 0 SECONDS + ///Cooldown override. If this is true, we're on cooldown + var/cooldown_override = FALSE + ///Is cooldown disabled + var/cooldown_disabled = FALSE + + ///List of targets we can pass to our traits + var/list/targets = list() + ///Maximum range we can register targets from + var/target_range = 1 + + ///Description for the material, based on the traits - Update this with get_material_desc() when you add traits + var/material_description = "" + + ///What the old appearance of the parent was, for resetting their appearance + var/mutable_appearance/old_appearance + var/old_name + ///Do we edit the parent's texture? + var/do_texture = TRUE + ///Do we edit the parent's silhouette? + var/do_mask = TRUE + + ///Do we play a sound? - This is mostly here for admins to disable when they're doing gimmicks + var/play_hint_sound = TRUE + + ///States + var/calcified = FALSE + var/calibrated = FALSE + var/atom/movable/artifact_particle_holder/calibrated_holder + +/datum/component/xenoartifact/Initialize(material_type, list/traits, _do_appearance = TRUE, _do_mask = TRUE, patch_traits = TRUE) + . = ..() + var/atom/atom_parent = parent + + //Add discovery component + atom_parent.AddComponent(/datum/component/discoverable/artifact) + + //Setup our typing + artifact_material = material_type || pick_weight(SSxenoarchaeology.xenoartifact_material_weights) + artifact_material = new artifact_material() + atom_parent.custom_price = atom_parent.custom_price || artifact_material.custom_price + + //Build appearance from material + old_appearance = atom_parent.appearance + old_name = atom_parent.name + do_texture = _do_appearance + do_mask = _do_mask + build_material_appearance() + + //Populate priotity list + for(var/each_category in SSxenoarchaeology.xenoartifact_trait_category_priorities) + traits_catagories[each_category ] = list() + + //If we're force-generating traits + if(traits) + for(var/datum/xenoartifact_trait/T as() in traits) + add_individual_trait(T) + + //Otherwise, randomly generate our own traits - Additional option to patch traits missing from trait list + if(!length(traits) || patch_traits) + var/list/focus_traits + if(length(traits_catagories[TRAIT_PRIORITY_ACTIVATOR]) < artifact_material.trait_activators) + //Generate activators + focus_traits = artifact_material.get_activators() + build_traits(focus_traits, artifact_material.trait_activators - length(traits_catagories[TRAIT_PRIORITY_ACTIVATOR])) + if(length(traits_catagories[TRAIT_PRIORITY_MINOR]) < artifact_material.trait_minors) + //Generate minors + focus_traits = artifact_material.get_minors() + build_traits(focus_traits, artifact_material.trait_minors - length(traits_catagories[TRAIT_PRIORITY_MINOR])) + if(length(traits_catagories[TRAIT_PRIORITY_MAJOR]) < artifact_material.trait_majors) + //Generate majors + focus_traits = artifact_material.get_majors() + build_traits(focus_traits, artifact_material.trait_majors - length(traits_catagories[TRAIT_PRIORITY_MAJOR])) + if(length(traits_catagories[TRAIT_PRIORITY_MALFUNCTION]) < artifact_material.trait_malfunctions) + //Generate malfunctions + focus_traits = artifact_material.get_malfunctions() + build_traits(focus_traits, artifact_material.trait_malfunctions - length(traits_catagories[TRAIT_PRIORITY_MALFUNCTION])) + //Cooldown + trait_cooldown = get_extra_cooldowns() + //Description + material_description = get_material_desc() + //Setup description stuff + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + +/datum/component/xenoartifact/Destroy(force, silent) + if(!QDELETED(parent)) + var/atom/atom_parent = parent + //Remove discovery component + var/datum/component/discoverable/artifact/X = atom_parent.GetComponent(/datum/component/discoverable/artifact) + X.RemoveComponent() + //Reset parent's visuals + atom_parent.remove_filter("texture_overlay") + atom_parent.remove_filter("outline_1") + atom_parent.remove_filter("outline_2") + atom_parent.appearance = old_appearance + atom_parent.name = old_name + old_appearance = null + //Delete our traits + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + traits_catagories[i] -= T + if(!QDELETED(T)) + qdel(T) + return ..() + +///Used to trigger all our traits in order +/datum/component/xenoartifact/proc/trigger(force) + //Timer logic + if((use_cooldown_timer || cooldown_override) && !force) + return + else if(use_cooldown_timer) + reset_timer(use_cooldown_timer) + //Sound hint + if(play_hint_sound) + playsound(get_turf(parent), 'sound/magic/blink.ogg', 50, TRUE) + //Trait triggers + for(var/i in SSxenoarchaeology.xenoartifact_trait_category_priorities) + SEND_SIGNAL(src, COMSIG_XENOA_TRIGGER, i) + //Malfunctions + if(!calibrated) + handle_malfunctions() + //Cleanup targets + for(var/atom/target in targets) + unregister_target(target) + //Timer setup + if(!cooldown_disabled) + use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), max(0, use_cooldown + trait_cooldown), TIMER_STOPPABLE) + +/datum/component/xenoartifact/proc/build_traits(list/trait_list, amount, incompatabilities = TRUE) + var/list/options = trait_list.Copy() + //Remove any blacklisted traits + options -= blacklisted_traits + //Remove any incompatible traits + if(incompatabilities) + options -= SSxenoarchaeology.get_trait_incompatibilities(parent) + for(var/i in 1 to amount) + //Pick a random trait + var/datum/xenoartifact_trait/T = pick_weight(options) + add_individual_trait(T) + options -= blacklisted_traits + +//Cooldown finish logic goes here +/datum/component/xenoartifact/proc/reset_timer() + if(use_cooldown_timer) + deltimer(use_cooldown_timer) + use_cooldown_timer = null //Just incase + +/datum/component/xenoartifact/proc/get_extra_cooldowns() + var/time = 0 SECONDS + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + time += T.cooldown + return time + +/datum/component/xenoartifact/proc/handle_malfunctions(itterate = TRUE) + //Instability rolls + if(!prob(instability)) + if(itterate) + instability += artifact_material.instability_step + return + //Max malfunction checks, against our material + if(length(traits_catagories[TRAIT_PRIORITY_MALFUNCTION]) >= artifact_material.max_trait_malfunctions) + return + //Hint sound + var/atom/atom_parent = parent + playsound(atom_parent, 'sound/effects/light_flicker.ogg', 60) + atom_parent.visible_message("[atom_parent] makes a concerning sound, as if something has gone terribly wrong...") + //Build malfunctions + var/list/focus_traits + focus_traits = artifact_material.get_malfunctions() + build_traits(focus_traits, 1) + //Reset instability + instability = 0 + +/datum/component/xenoartifact/proc/register_target(atom/target, force, type = XENOA_ACTIVATION_CONTACT) + //Don't register new targets unless the cooldown is finished + if((use_cooldown_timer || cooldown_override) && !force) + return + //Range check + if(get_dist(get_turf(parent), get_turf(target))> target_range && !force) + return + //Anti-artifact check + if(anti_check(target, type) && !force) + return + //Prexisting check + if((target in targets) && !force) + return + //Mob check, so we don't tag ghosts or camera + if((iscameramob(target) || isobserver(target)) && !force) + return + //Regular target follow through + create_beam(target) + targets += target + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) + +/datum/component/xenoartifact/proc/unregister_target(datum/source) + SIGNAL_HANDLER + + targets -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + +/datum/component/xenoartifact/proc/on_examined(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + var/mob/living/carbon/M = user + if(iscarbon(user) && M.can_see_reagents() || isobserver(user)) + examine_text += "[parent] seems to be made from a [material_description]material." + //Special case for observers that shows all the traits + if(isobserver(user)) + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + if(T.label_name) + examine_text += "- [T.label_name]" + +//Build the description for the scientific examination +/datum/component/xenoartifact/proc/get_material_desc() + var/temp = "" + var/list/description_category = list() + //Get descriptions from each category + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + if(!description_category[i]) + description_category[i] = list() + if(T.material_desc) //Avoid adding null, so later logic works + description_category[i] += initial(T.material_desc) + //Pick one from each category to build an entire description + var/unknown_used = FALSE + for(var/i in description_category) + //Descriptor + if(length(description_category[i])) + temp = "[temp][pick(description_category[i])] " + else if(!unknown_used) + temp = "unknown [temp]" + unknown_used = TRUE + return temp + +/datum/component/xenoartifact/proc/get_material_weight() + var/total_weight = 0 + //Get descriptions from each category + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + total_weight += T.weight + return total_weight + +/datum/component/xenoartifact/proc/get_material_conductivity() + var/total_conductivity = 0 + //Get descriptions from each category + for(var/i in traits_catagories) + for(var/datum/xenoartifact_trait/T as() in traits_catagories[i]) + total_conductivity += T.conductivity + return total_conductivity + +/datum/component/xenoartifact/proc/add_individual_trait(datum/xenoartifact_trait/trait, force = TRUE) + //Is this trait in the blacklist? + if((locate(trait) in blacklisted_traits) && !force) + return FALSE + //Double check our material restrictions + var/list/trait_type = list(/datum/xenoartifact_trait/activator, /datum/xenoartifact_trait/minor, /datum/xenoartifact_trait/major, /datum/xenoartifact_trait/malfunction) + for(var/datum/xenoartifact_trait/i in trait_type) + if(istype(trait, i) && length(traits_catagories[initial(i.priority)]) >= artifact_material) + return FALSE + //We can either pass paths, or initialized traits + if(ispath(trait)) + trait = new trait(src) + else + trait.remove_parent() + trait.register_parent(src) + //List building, handle custom priorities, just appened to the end + if(!traits_catagories[trait.priority]) + traits_catagories[trait.priority] = list() + //handle adding trait + traits_catagories[trait.priority] += trait + blacklisted_traits += trait.blacklist_traits + blacklisted_traits += trait.type + //Ant-hardel stuff + RegisterSignal(trait, COMSIG_PARENT_QDELETING, PROC_REF(handle_trait)) + + return TRUE + +//Calcifies, aka breaks, the artifact +/datum/component/xenoartifact/proc/calcify(override_cooldown = TRUE) + var/atom/movable/atom_parent = parent + //Appearnce + artifact_material = new /datum/xenoartifact_material/calcified() + var/old_mask = do_mask + do_mask = FALSE + if(do_texture) + build_material_appearance() + do_mask = old_mask + //States + calcified = TRUE + atom_parent.custom_price /= 2 + //Disable artifact + cooldown_override = TRUE + + SEND_SIGNAL(src, COMSIG_XENOA_CALCIFIED) + +//Calibrates. Does the opposite of calcify +/datum/component/xenoartifact/proc/calibrate() + var/atom/movable/atom_parent = parent + //Stats + calibrated = TRUE + atom_parent.custom_price *= 2 + //Effect + calibrated_holder = new(atom_parent) + var/obj/emitter/spiral/S = calibrated_holder.add_emitter(/obj/emitter/spiral, "calibration", 11) + S.setup(artifact_material.material_color) + atom_parent.vis_contents += calibrated_holder + +//Build the artifact's appearance +/datum/component/xenoartifact/proc/build_material_appearance() + var/atom/atom_parent = parent + //Remove old filters, if they exist + atom_parent.remove_filter("texture_overlay") + atom_parent.remove_filter("outline_fix") + atom_parent.remove_filter("outline_1") + atom_parent.remove_filter("outline_2") + //Apply new stuff + if(do_mask) + var/old_desc = atom_parent.desc + //Build the silhouette of the artifact + var/mutable_appearance/MA = artifact_material.get_mask() + MA.plane = atom_parent.plane //This is important lol + MA.layer = atom_parent.layer + atom_parent.appearance = MA + //Rset name & desc + atom_parent.name = "[artifact_material.name] [old_name]" + atom_parent.desc = old_desc //Appearance resets this shit + if(do_texture) + //Overlay the material texture + var/icon/I = artifact_material.get_texture() + atom_parent.add_filter("texture_overlay", 1, layering_filter(icon = I, blend_mode = BLEND_INSET_OVERLAY)) + //Throw on some outlines + //TODO: Check if this fix is still needed in 515 - Racc from 514 : PLAYTEST + atom_parent.add_filter("outline_fix", 2, outline_filter(0)) //This fixes a weird byond thing. BLEND_INSET_OVERLAY will encrouch on outline 1 if we dont do this + atom_parent.add_filter("outline_1", 3, outline_filter(1, "#000", flags = OUTLINE_SHARP)) + atom_parent.add_filter("outline_2", 4, outline_filter(1, artifact_material.material_color, flags = OUTLINE_SHARP)) + +///Create a hint beam from the artifact to the target +/datum/component/xenoartifact/proc/create_beam(atom/movable/target) + if(!get_turf(target) || locate(parent) in target.contents) + return + var/atom/atom_parent = parent + var/datum/beam/xenoa_beam/B = new((!isturf(atom_parent.loc) ? atom_parent.loc : atom_parent), (!isturf(target.loc) ? target.loc : target), time=1.5 SECONDS, beam_color = artifact_material.material_color, icon='icons/obj/xenoarchaeology/xenoartifact.dmi', icon_state="xenoa_beam", beam_type=/obj/effect/ebeam/xenoa_ebeam) + INVOKE_ASYNC(B, TYPE_PROC_REF(/datum/beam, Start)) + +/datum/component/xenoartifact/proc/anti_check(atom/target, activation_type = XENOA_ACTIVATION_CONTACT) + var/mob/M = target + var/slot = ~ITEM_SLOT_GLOVES + //Throw you custom clothing block logic here + switch(activation_type) + if(XENOA_ACTIVATION_TOUCH) + slot = ITEM_SLOT_GLOVES + if(isliving(M) && M.anti_artifact_check(FALSE, slot)) + return TRUE + //Just check if the thing itself has the anti-component + var/datum/component/anti_artifact/anti_component = target.GetComponent(/datum/component/anti_artifact) + if(anti_component?.charges && prob(anti_component.chance)) + anti_component.charges -= 1 + return TRUE + return FALSE + +/datum/component/xenoartifact/proc/handle_trait(datum/source) + SIGNAL_HANDLER + + var/datum/xenoartifact_trait/T = source + traits_catagories[T.priority] -= T + +/datum/component/xenoartifact/proc/remove_individual_trait(datum/xenoartifact_trait/trait, destroy = FALSE) + traits_catagories[trait.priority] -= trait + UnregisterSignal(trait, COMSIG_PARENT_QDELETING) + if(destroy) + qdel(trait) + +/* + Artifact beam subtype +*/ + +/obj/effect/ebeam/xenoa_ebeam + name = "artifact beam" + +/datum/beam/xenoa_beam/redrawing(atom/movable/mover, atom/oldloc, direction) + //Add a custom check to stop the beam shooting off into infinity, artifact traits fuck with default beam stuff + if(!isturf(target?.loc) || oldloc?.z != target?.z) + target = get_turf(oldloc) + if(!target) + qdel(src) + return ..() diff --git a/code/modules/xenoarchaeology/misc/exports.dm b/code/modules/xenoarchaeology/misc/exports.dm new file mode 100644 index 0000000000000..d3d4e2c91255b --- /dev/null +++ b/code/modules/xenoarchaeology/misc/exports.dm @@ -0,0 +1,15 @@ +/* + Export datum, so we can sell artifacts for dosh +*/ + +/datum/export/artifact + unit_name = "xenoartifact" + export_types = list(/obj/item/xenoartifact) + +/datum/export/artifact/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + cost = O.custom_price + return ..() + +/datum/export/artifact/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + . = ..() + return O.GetComponent(/datum/component/xenoartifact) ? TRUE : . diff --git a/code/modules/xenoarchaeology/misc/items.dm b/code/modules/xenoarchaeology/misc/items.dm new file mode 100644 index 0000000000000..ea1df42b3417e --- /dev/null +++ b/code/modules/xenoarchaeology/misc/items.dm @@ -0,0 +1,87 @@ +/* + generic artifact +*/ +/obj/item/xenoartifact + name = "artifact" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "map_editor" + w_class = WEIGHT_CLASS_SMALL //This stops certain traits being broken by our shitty movement code when thrown + desc = "A strange alien artifact. What could it possibly do?" + throw_range = 3 + ///What type of artifact + var/datum/xenoartifact_material/artifact_material + ///Cover some special interactions we fuck up + var/transfer_prints = TRUE + +/obj/item/xenoartifact/Initialize(mapload, _artifact_type) + . = ..() + artifact_material = _artifact_type || artifact_material + ADD_TRAIT(src, TRAIT_IGNORE_EXPORT_SCAN, GENERIC_ITEM_TRAIT) + +/obj/item/xenoartifact/ComponentInitialize() + . = ..() + add_artifact_component() + +///Proc to add your artifact stuff, here so we can override it +/obj/item/xenoartifact/proc/add_artifact_component() + AddComponent(/datum/component/xenoartifact, artifact_material) + +/* + Maint variant + has a 90% chance of being bluespace, 10% of being anything else, like a regular artifact. + Lets crew discover / play with artifacts without blowing shit up +*/ +/obj/item/xenoartifact/maint/ComponentInitialize() + artifact_material = prob(90) ? /datum/xenoartifact_material/bluespace : null + return ..() + +/* + objective variant + spawns with objective trait, shouldn't effect labelling. +*/ +/obj/item/xenoartifact/objective/ComponentInitialize() + . = ..() + AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) + var/datum/component/xenoartifact/artifact_component = GetComponent(/datum/component/xenoartifact) + artifact_component?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) + +/* + No trait variant + Spawns with no traits, helps with debug and other stuff +*/ +/obj/item/xenoartifact/no_traits + +/obj/item/xenoartifact/no_traits/add_artifact_component() + return + +/* + tutorial variant + Has set traits, is accompanied by a piece of paper in the map that uses it to explain how-to-artifact-science. +*/ +/obj/item/xenoartifact/tutorial + +/obj/item/xenoartifact/tutorial/Initialize(mapload, _artifact_type) + . = ..() + var/obj/item/sticker/sticky_note/artifact_tutorial/sticker = new(loc) + sticker.afterattack(src, src, TRUE) + sticker.pixel_y = rand(-5, 5) + sticker.pixel_x = rand(-5, 5) + +/obj/item/xenoartifact/tutorial/add_artifact_component() + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/bluespace, list(/datum/xenoartifact_trait/activator/sturdy, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/major/animalize)) + +/* + Pre-labeled variant + for loots +*/ +/obj/item/xenoartifact/pre_labeled + +/obj/item/xenoartifact/pre_labeled/ComponentInitialize() + . = ..() + var/datum/component/xenoartifact/artifact_component = GetComponent(/datum/component/xenoartifact) + var/trait_list = list() + for(var/i in artifact_component.traits_catagories) + for(var/datum/xenoartifact_trait/trait_datum in artifact_component.traits_catagories[i]) + trait_list += trait_datum.type + var/obj/item/sticker/xenoartifact_label/old/label = new(get_turf(src), trait_list) + label.afterattack(src, src, TRUE) diff --git a/code/modules/xenoarchaeology/misc/pearl.dm b/code/modules/xenoarchaeology/misc/pearl.dm new file mode 100644 index 0000000000000..330d4a15244b2 --- /dev/null +++ b/code/modules/xenoarchaeology/misc/pearl.dm @@ -0,0 +1,70 @@ +/obj/item/sticker/trait_pearl + name = "xenopearl" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "trait_pearl" + w_class = WEIGHT_CLASS_TINY + desc = "A smooth alien pearl." + sticker_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + sticker_icon_state = "trait_pearl_sticker" + do_outline = FALSE + ///What trait do we have stored + var/datum/xenoartifact_trait/stored_trait + +/obj/item/sticker/trait_pearl/Initialize(mapload, trait) + . = ..() + stored_trait = trait + +/obj/item/sticker/trait_pearl/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + //Prechecks + if(!can_stick(target) || !proximity_flag) + return + if(isliving(target) || isstructure(target) || target.GetComponent(/datum/component/xenoartifact) || target.GetComponent(/datum/component/storage) || istype(target, /obj/item/sticker/trait_pearl)) + to_chat(user, "You are unable to affix [src] to [target].") + return + //Stop people adding too many traits, and check the trait limits + var/list/pearl_index = list(TRAIT_PRIORITY_ACTIVATOR = 0, TRAIT_PRIORITY_MINOR = 0, TRAIT_PRIORITY_MAJOR = 0, TRAIT_PRIORITY_MALFUNCTION = 0) + var/datum/xenoartifact_material/pearl/material = /datum/xenoartifact_material/pearl + var/list/trait_blacklist = list() + for(var/obj/item/sticker/trait_pearl/pearl in target.contents) + trait_blacklist += pearl.stored_trait.blacklist_traits + trait_blacklist += pearl.stored_trait.type + //Just check against generic pearl limits + if(istype(pearl.stored_trait, /datum/xenoartifact_trait/activator) && pearl_index[TRAIT_PRIORITY_ACTIVATOR] < initial(material.trait_activators)) + pearl_index[TRAIT_PRIORITY_ACTIVATOR] += 1 + else if(istype(pearl.stored_trait, /datum/xenoartifact_trait/minor) && pearl_index[TRAIT_PRIORITY_MINOR] < initial(material.trait_minors)) + pearl_index[TRAIT_PRIORITY_MINOR] += 1 + else if(istype(pearl.stored_trait, /datum/xenoartifact_trait/major) && pearl_index[TRAIT_PRIORITY_MAJOR] < initial(material.trait_majors)) + pearl_index[TRAIT_PRIORITY_MAJOR] += 1 + else if(istype(pearl.stored_trait, /datum/xenoartifact_trait/malfunction) && pearl_index[TRAIT_PRIORITY_MALFUNCTION] < initial(material.trait_malfunctions)) + pearl_index[TRAIT_PRIORITY_MALFUNCTION] += 1 + else + to_chat(user, "You are unable to affix [src] to [target].") + return + //Go through blacklist manually becuase ``in`` is a bitch and doesn't work right, even with ``.type`` + for(var/trait in trait_blacklist) + if(istype(stored_trait, trait)) + to_chat(user, "You are unable to affix [src] to [target].") + return + //Affix if we're chilling + to_chat(user, "You affix [src] to [target].") + return ..() + +/obj/item/sticker/trait_pearl/examine(mob/user) + . = ..() + if(user.can_see_reagents()) + . += "[src] holds '[initial(stored_trait.label_name) || "nothing"]'.\nYou can affix it to an item." + +/obj/item/sticker/trait_pearl/build_stuck_appearance() + var/mutable_appearance/MA = setup_appearance(mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state)) + MA.blend_mode = BLEND_INSET_OVERLAY + return MA + +/obj/item/sticker/trait_pearl/debug + +/obj/item/sticker/trait_pearl/debug/AltClick(mob/user) + . = ..() + var/list/options = SSxenoarchaeology.xenoa_all_traits + var/datum/xenoartifact_trait/decision = tgui_input_list(user, "Choose a trait", "Traits", options) + if(decision) + QDEL_NULL(stored_trait) + stored_trait = new decision() diff --git a/code/modules/xenoarchaeology/misc/tutorial.dm b/code/modules/xenoarchaeology/misc/tutorial.dm new file mode 100644 index 0000000000000..fd94db8724ba1 --- /dev/null +++ b/code/modules/xenoarchaeology/misc/tutorial.dm @@ -0,0 +1,39 @@ +/* + Intro to labelling artifacts +*/ + +/obj/item/sticker/sticky_note/artifact_tutorial + custom_text = "Went out for coffee, mind doing this one for me?\n\ + \n\ + It's pretty simple, just remember to wear your PPE. In-case you \ + forgot, that's your anti-tactile pinchers & science goggles, and \ + you'll probably want a labeler too.\n\ + \n\ + If you're going to label this for me, remember that you need to \ + label exactly 1 activator, 3 minors, and 1 major. I think some \ + of these things can develop malfunctions, I heard the green ones \ + even start with one too, so keep an eye out for that.\n\ + \n\ + After you've labeled it, correctly, you can hand it over to cargo, \ + to sell. The console will handle the rest.\n\ + \n\ + XOXO - Howard" + +/* + How to use the calibrator +*/ +/obj/item/sticker/sticky_note/calibrator_tutorial + custom_text = "Anomalous Material Calibrator Mk.42\n\ + \n\ + The AMC Mk.42 can be used to stabilize anomalous materials \ + through careful and percise operation. Stabilized materials will \ + not degrade any further, preventing potentially hazardous \ + malfunctions.\n\ + Successfully stabilizing materials will also yield valuable \ + research data.\n\ + \n\ + Operation is very simple, compared to the Mk.41. First, a labeled \ + material must be inserted into the reinforced chasis receptacle. \ + Then the AMC can be activated, to begin calibration. Properly \ + labeled samples will be stabilized, improperly labeled samples \ + will result in-." diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm new file mode 100644 index 0000000000000..3755fe332b715 --- /dev/null +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -0,0 +1,263 @@ +///Stability lost on purchase +#define STABILITY_COST 30 +///Stability gained on-tick +#define STABILITY_GAIN 5 + +/obj/machinery/computer/xenoarchaeology_console + name = "research and development listing console" + desc = "A science console used to source sellers, and buyers, for various blacklisted research objects." + icon_screen = "xenoartifact_console" + icon_keyboard = "rd_key" + circuit = /obj/item/circuitboard/computer/xenoarchaeology_console + + ///Which science server receives points + var/datum/techweb/linked_techweb + ///Which department's budget receives profit + var/datum/bank_account/budget + + ///List of current listing sellers + var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/uranium_bananium, + /datum/rnd_lister/artifact_seller/bluespace, /datum/rnd_lister/artifact_seller/plasma_bluespace) + + ///radio used by the console to send messages on science channel + var/obj/item/radio/headset/radio + ///Do we do purchase notices on the radio? + var/radio_purchase_notice = TRUE + ///Do we do solved notices on the radio? + var/radio_solved_notice = TRUE + + ///List of active orders + var/list/console_orders = list() + ///Max contents per order - leave this as a variable, trust + var/max_pack_contents = 5 + + ///History of purchases and sales + var/list/history = list() + + ///Is this console the main character? + var/is_main_console = FALSE + +/obj/machinery/computer/xenoarchaeology_console/Initialize(mapload) + . = ..() + //Link up with SS to see if we're the choosen one + if(!SSxenoarchaeology.main_console) + SSxenoarchaeology.register_console(src) + RegisterSignal(SSxenoarchaeology, COMSIG_XENOA_REQUEST_NEW_CONSOLE, PROC_REF(be_the_guy)) + //Link relevant stuff + linked_techweb = SSresearch.science_tech + budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) + var/list/new_sellers = sellers.Copy() + sellers = list() + for(var/datum/rnd_lister/seller as anything in new_sellers) + sellers += new seller() + //Radio setup + radio = new /obj/item/radio/headset/headset_sci(src) + //Look for sold artifacts + RegisterSignal(SSdcs, COMSIG_GLOB_ATOM_SOLD, PROC_REF(check_sold)) + +/obj/machinery/computer/xenoarchaeology_console/Destroy() + . = ..() + QDEL_LIST(sellers) + STOP_PROCESSING(SSobj, src) + QDEL_NULL(radio) + +/obj/machinery/computer/xenoarchaeology_console/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenoartifactConsole") + ui.open() + +/obj/machinery/computer/xenoarchaeology_console/ui_data(mob/user) + var/list/data = list() + + //Seller data + data["sellers"] = list() + for(var/datum/rnd_lister/seller as anything in sellers) + var/list/stock = list() + for(var/atom/listing as anything in seller.current_stock) + stock += list(list("name" = listing?.name, "description" = listing?.desc, "id" = FAST_REF(listing), "cost" = seller.get_price(listing) || 0)) + data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock, "id" = FAST_REF(seller))) + //Cash available + data["money"] = budget.account_balance + //Audio + data["purchase_radio"] = radio_purchase_notice + data["solved_radio"] = radio_solved_notice + //History + data["history"] = history + //Current requests + data["active_request"] = list() + if(length(console_orders)) + for(var/datum/supply_order/console_order in console_orders) + if(!(console_order in SSsupply.shoppinglist)) + console_orders -= console_order + qdel(console_order) + continue + data["active_request"] += list(list( + "object" = console_order.pack.name, + "cost" = console_order.pack.get_cost(), + "supply" = console_order.pack.current_supply, + "orderer" = console_order.orderer, + "reason" = console_order.reason, + "id" = console_order.id + )) + + return data + +/obj/machinery/computer/xenoarchaeology_console/ui_act(action, params) + if(..()) + return + + switch(action) + //Purchase items + if("stock_purchase") + //Locate seller and purchase our item from them + var/datum/rnd_lister/seller = locate(params["seller_id"]) + var/obj/item/item = locate(params["item_id"]) + //Check if this is even possible + if(!(item in seller.current_stock)) + return + //If we got no cash + if(seller.get_price(item) > budget.account_balance) + say("Insufficient funds!") + return + //Annouce it + if(radio_purchase_notice && radio) + radio.talk_into(src, "[item] was requested for purchase, for [seller.get_price(item)] credits, at [station_time_timestamp()].", RADIO_CHANNEL_SCIENCE) + history += "[item] was requested for purchase, for [seller.get_price(item)] credits, at [station_time_timestamp()]." + //handle ID and such + var/name = "*None Provided*" + var/rank = "*None Provided*" + var/ckey = usr.ckey + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + name = H.get_authentification_name() + rank = H.get_assignment(hand_first = TRUE) + else if(issilicon(usr)) + name = usr.real_name + rank = "Silicon" + //Check if we can add the artifact to a pending order + var/datum/supply_order/current_order + var/datum/supply_pack/current_pack + if(length(console_orders)) + current_order = console_orders[length(console_orders)] + current_pack = console_orders[current_order] + if(length(current_pack.contains) < max_pack_contents && (current_order in SSsupply.shoppinglist)) + //Update pack content and cost + current_pack.cost += seller?.get_price(item) + current_pack.contains += seller?.buy_stock(item) + //Generate a new order + SSsupply.shoppinglist -= current_order + console_orders -= current_order + qdel(current_order) + current_order = new /datum/supply_order(current_pack, name, rank, ckey, "Research Material Requisition", budget) + SSsupply.shoppinglist += current_order + console_orders[current_order] = current_pack + ui_update() + return + else if(!(current_order in SSsupply.shoppinglist)) + console_orders -= current_order + qdel(current_order) + //If we can't, make a new order + current_pack = new /datum/supply_pack/science_listing() + current_pack.contains = list() + //Kinda weird, but essentially what happens is the stock is set to 0, and when we make a new one it's 0 instead of 1. Cargo code is weird and this is weirder. + current_pack?.current_supply = max(1, current_pack.current_supply) + current_pack.cost += seller?.get_price(item) + current_pack.contains += seller?.buy_stock(item) + current_order = new /datum/supply_order(current_pack, name, rank, ckey, "Research Material Requisition", budget) + current_order.generateRequisition(get_turf(src)) + SSsupply.shoppinglist += current_order + console_orders[current_order] = current_pack + //Radio shit + if("toggle_purchase_audio") + radio_purchase_notice = !radio_purchase_notice + if("toggle_solved_audio") + radio_solved_notice = !radio_solved_notice + + ui_update() + +/obj/machinery/computer/xenoarchaeology_console/proc/check_sold(datum/source, atom/movable/_label, sold) + SIGNAL_HANDLER + + var/obj/item/sticker/xenoartifact_label/label = _label + if(!istype(label)) + return + var/atom/artifact = label.loc + var/datum/component/xenoartifact/artifact_component = artifact?.GetComponent(/datum/component/xenoartifact) + if(!artifact_component || !artifact) + return + //Grab values to calculate success + var/score = 0 + var/max_score = 0 + var/bonus = 0 + var/max_bonus = 0 + var/attempted_bonus = FALSE + var/list/traits_by_type = list() + for(var/trait in artifact_component.traits_catagories) //By priority + for(var/datum/xenoartifact_trait/trait_datum in artifact_component.traits_catagories[trait]) //By trait in priorty + traits_by_type += trait_datum.type + if(trait_datum.contribute_calibration) + max_score += 1 + else + max_bonus += 1 + for(var/datum/xenoartifact_trait/trait_datum as anything in label.traits) + if(trait_datum in traits_by_type) + if(initial(trait_datum.contribute_calibration)) + score += 1 + else + bonus += 1 + attempted_bonus = TRUE + else + if(initial(trait_datum.contribute_calibration)) + score -= 1 + else + bonus -= 1 + attempted_bonus = TRUE + //Calculate success rate + var/success_rate = score / (max(max_score, 1)) + var/bonus_rate = max(1, 2*(bonus/max(max_score, 1))) + //Rewards + //Research Points + var/rnd_reward = round(max(0, (artifact.custom_price*artifact_component.artifact_material.rnd_rate)*success_rate) * bonus_rate, 1) + //Discovery Points + var/dp_reward = round(max(0, (artifact.custom_price*artifact_component.artifact_material.dp_rate)*success_rate) * bonus_rate, 1) + //Money + var/monetary_reward = round(FLOOR(((artifact.custom_price * success_rate * 1.5)^1.1) * (success_rate >= 0.5 ? 1 : 0) * bonus_rate, 1), 1) + //Alloctae + if(is_main_console) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_GENERIC, rnd_reward) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) + budget.adjust_money(monetary_reward) + //Announce victory or fuck up + var/success_type + switch(success_rate) + if(0.3 to 0.69) + success_type = "sufficient research" + if(0.7 to 0.89) + success_type = "admirable research" + if(0.9 to INFINITY) + success_type = "incredible discovery" + else + success_type = prob(99) ? "scientific failure." : "who let the clown in?" + if(radio_solved_notice) + radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ + [attempted_bonus ? "with a bonus achieved of [100 * (bonus / (max_bonus||1))]%, " : ""]\ + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of [monetary_reward] credits.",\ + RADIO_CHANNEL_SCIENCE) + history += "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of [monetary_reward] credits." + +/obj/machinery/computer/xenoarchaeology_console/proc/be_the_guy(datum/source) + SIGNAL_HANDLER + + if(!SSxenoarchaeology.main_console && !is_main_console) + SSxenoarchaeology.register_console(src) + +//Circuitboard for this console +/obj/item/circuitboard/computer/xenoarchaeology_console + name = "research and development listing console (Computer Board)" + icon_state = "science" + build_path = /obj/machinery/computer/xenoarchaeology_console + +#undef STABILITY_COST +#undef STABILITY_GAIN diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm new file mode 100644 index 0000000000000..a0ef9c876eb7e --- /dev/null +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -0,0 +1,128 @@ +/* + Seller personality for the RND listing console +*/ + +#define SELLER_PERSONALITY_GENEROUS "SELLER_PERSONALITY_GENEROUS" +#define SELLER_PERSONALITY_NORMAL "SELLER_PERSONALITY_NORMAL" +#define SELLER_PERSONALITY_STINGY "SELLER_PERSONALITY_STINGY" + +//Move this to its own datum file if you implement it for other sub departments of science +/datum/rnd_lister + ///What is this slimeball's name + var/name = "Petrikov" + ///What nonsense flavor dialogue do they spout + var/dialogue = "" + ///What kind of selling personality do they have + var/personality = SELLER_PERSONALITY_GENEROUS + ///How often do they restock their... stock + var/restock_time = 1 MINUTES + ///What science thingy are they selling + var/atom/stock_type + var/list/current_stock = list() + var/max_stock = 1 + +/datum/rnd_lister/New() + . = ..() + //Generate initial stock + replenish_stock(max_stock) + +//Generic random seller +/datum/rnd_lister/random/New() + . = ..() + ///Randomized stats + name = pick(SSxenoarchaeology.xenoa_seller_names) + dialogue = pick(SSxenoarchaeology.xenoa_seller_dialogue) + personality = pick(list(SELLER_PERSONALITY_GENEROUS, SELLER_PERSONALITY_NORMAL, SELLER_PERSONALITY_STINGY)) + +/datum/rnd_lister/proc/get_new_stock() + return new stock_type() + +///Get the price of an atom, persumably our stock, based on our selling personality +/datum/rnd_lister/proc/get_price(atom/listing) + switch(personality) + if(SELLER_PERSONALITY_GENEROUS) + return round(listing.custom_price * 0.8, 1) + if(SELLER_PERSONALITY_NORMAL) + return listing.custom_price + if(SELLER_PERSONALITY_STINGY) + return round(listing.custom_price * 1.5, 1) + else + return 0 //FOR FREE! + +/datum/rnd_lister/proc/buy_stock(atom/listing) + //Remove stock and prepare to replace it + current_stock -= listing + addtimer(CALLBACK(src, PROC_REF(replenish_stock)), restock_time) + return listing + +/datum/rnd_lister/proc/replenish_stock(amount = 1) + for(var/listing_index in 1 to amount) + var/atom/listing = get_new_stock() + current_stock += listing + +/* + Artifact sellers +*/ + +/datum/rnd_lister/artifact_seller + ///What kind of artifacts do we sell - Weighted list + var/list/artifact_types = list(XENOA_BLUESPACE = 1, XENOA_PLASMA = 1, XENOA_URANIUM = 1, XENOA_BANANIUM = 1) + +/datum/rnd_lister/artifact_seller/get_new_stock() + var/datum/xenoartifact_material/material = pick_weight(artifact_types) + var/obj/item/xenoartifact/artifact = new(null, material) + return artifact + +/* + Actual types of artifact sellers +*/ + +//Will sell random artifacts equally +/datum/rnd_lister/artifact_seller/bastard + name = "Sidorovich" + dialogue = "What are you standing there for? come closer." + personality = SELLER_PERSONALITY_NORMAL + max_stock = 2 + +//Sells uranium, and rarely, banaium artifacts +/datum/rnd_lister/artifact_seller/uranium_bananium + name = "Deepthroat" + dialogue = "..." + personality = SELLER_PERSONALITY_STINGY + artifact_types = list(XENOA_URANIUM = 3, XENOA_BANANIUM = 1) + +//Sells bluespace +/datum/rnd_lister/artifact_seller/bluespace + name = "Raichovich" + dialogue = "These things make my head hurt, take the from me!" + personality = SELLER_PERSONALITY_NORMAL + artifact_types = list(XENOA_BLUESPACE = 1) + max_stock = 3 + +//Sells plasma & bluespace +/datum/rnd_lister/artifact_seller/plasma_bluespace + name = "Shalashaska" + dialogue = "Maybe I'm colorblind, but some of these don't look blue..." + personality = SELLER_PERSONALITY_STINGY + artifact_types = list(XENOA_BLUESPACE = 1, XENOA_PLASMA = 1) + max_stock = 2 + +/* + Supply pack for this system + Whenever a listing is purchased, a supply pack with the purchased items is returned +*/ +/datum/supply_pack/science_listing + name = "Research Material Listing" + desc = "Contains potentially hazardous materials, or ridiculous ties." + hidden = TRUE + crate_name = "research material container" + crate_type = /obj/structure/closet/crate/science + access_any = TRUE + max_supply = 1 + current_supply = 1 + cost = 0 + can_secure = FALSE + +#undef SELLER_PERSONALITY_GENEROUS +#undef SELLER_PERSONALITY_NORMAL +#undef SELLER_PERSONALITY_STINGY diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm new file mode 100644 index 0000000000000..0f3a852e3967a --- /dev/null +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -0,0 +1,263 @@ +/obj/item/xenoarchaeology_labeler + name = "artifact labeler" + icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' + icon_state = "labeler" + desc = "A tool scientists use to label their alien bombs." + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_TINY + ///Checked traits + var/list/selected_traits = list() + ///List of deselected traits + var/list/deselected_traits = list() + ///List of selected traits we'll put on the label + var/list/label_traits = list() + ///List of possible trait filters + var/list/trait_filters = list( + list("icon" = "eye", "desc" = "Traits that can appear in the material description."), + list("icon" = "hand-sparkles", "desc" = "Traits that can be detected by 'feeling' the artifact."), + list("icon" = "wrench", "desc" = "Traits that can be triggered with specific items."), + list("icon" = "search", "desc" = "Traits that can be detected with specific items."), + list("icon" = "clone", "desc" = "Traits that have 'clones' or 'twins'."), + list("icon" = "dice", "desc" = "Traits with randomized effects."), + list("icon" = "snowflake", "desc" = "Traits that spawn particles, or change the artifact's appearance."), + list("icon" = "volume-up", "desc" = "Traits that passively make noise")) + ///List of currently enabled trait filters + var/list/enabled_trait_filters = list() + ///List of filtered traits + var/list/filtered_traits = list() + ///Cooldown for stickers + var/sticker_cooldown = 5 SECONDS + COOLDOWN_DECLARE(sticker_cooldown_timer) + +/obj/item/xenoarchaeology_labeler/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) + //Fill enabled filters with all filters + for(var/filter in trait_filters) + enabled_trait_filters += filter["icon"] + +/obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenoartifactLabeler") + ui.open() + +/obj/item/xenoarchaeology_labeler/ui_data(mob/user) + var/list/data = list() + data["selected_traits"] = selected_traits + data["deselected_traits"] = deselected_traits + data["enabled_trait_filters"] = enabled_trait_filters + data["filtered_traits"] = filtered_traits + + return data + +/obj/item/xenoarchaeology_labeler/ui_static_data(mob/user) + var/list/data = list() + data["malfunction_list"] = SSxenoarchaeology.labeler_traits.malfunctions + data["major_traits"] = SSxenoarchaeology.labeler_traits.majors + data["minor_traits"] = SSxenoarchaeology.labeler_traits.minors + data["activator_traits"] = SSxenoarchaeology.labeler_traits.activators + data["tooltip_stats"] = SSxenoarchaeology.labeler_tooltip_stats + + data["trait_filters"] = trait_filters + + return data + +/obj/item/xenoarchaeology_labeler/ui_act(action, params) + if(..()) + return + + switch(action) + if("print_traits") + if(COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + COOLDOWN_START(src, sticker_cooldown_timer, sticker_cooldown) + create_label() + else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer) && isliving(loc)) + to_chat(loc, "The labeler is still printing.") + return + if("clear_traits") + clear_selection() + return + if("toggle_trait") + var/trait_key = params["trait_name"] + var/list/focus = list(SSxenoarchaeology.labeler_traits.activators, SSxenoarchaeology.labeler_traits.minors, SSxenoarchaeology.labeler_traits.majors, SSxenoarchaeology.labeler_traits.malfunctions) + for(var/list/foci as anything in focus) + if(!(trait_key in foci)) + continue + //Selected traits + if(trait_key in selected_traits) + selected_traits -= trait_key + label_traits -= SSxenoarchaeology.xenoa_all_traits_keyed[trait_key] + if(!params["select"]) + deselected_traits += trait_key + continue + else if(!(trait_key in deselected_traits)) + if(params["select"]) + selected_traits.Insert(1, trait_key) + label_traits.Insert(1, SSxenoarchaeology.xenoa_all_traits_keyed[trait_key]) + else + deselected_traits += trait_key + continue + //Deselected traits + if(trait_key in deselected_traits) + deselected_traits -= trait_key + if("toggle_filter") + var/specific_filter = params["filter"] + if(specific_filter in enabled_trait_filters) + enabled_trait_filters -= specific_filter + filtered_traits += SSxenoarchaeology.labeler_traits_filter[params["filter"]] + else + enabled_trait_filters += specific_filter + filtered_traits -= SSxenoarchaeology.labeler_traits_filter[params["filter"]] + return TRUE + +/obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) + . = ..() + if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + COOLDOWN_START(src, sticker_cooldown_timer, 5 SECONDS) + create_label(target, user) + else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + to_chat(user, "The labeler is still printing.") + +///reset all the options +/obj/item/xenoarchaeology_labeler/proc/clear_selection() + label_traits.Cut() + label_traits = list() + selected_traits.Cut() + selected_traits = list() + deselected_traits.Cut() + deselected_traits = list() + ui_update() + +/obj/item/xenoarchaeology_labeler/proc/create_label(mob/target, mob/user) + var/obj/item/sticker/xenoartifact_label/P = new(get_turf(src), label_traits) + if(target && user) + P.afterattack(target, user, TRUE) +/* + Debug variant, spawns artifacts +*/ +/obj/item/xenoarchaeology_labeler/debug + name = "xenoartifact debug labeler" + desc = "Use to create specific Xenoartifacts" + icon_state = "labeler_debug" + sticker_cooldown = 0 SECONDS + ///Flag for enabling or disabling trait patches + var/patch_traits = FALSE + ///What type of material we're applying + var/datum/xenoartifact_material/material = /datum/xenoartifact_material + ///Hack fix for double creation, who cares about a debug tool + var/skip_label = FALSE + +//Create an artifact with all the traits we have selected, but from the item we target +/obj/item/xenoarchaeology_labeler/debug/afterattack(atom/target, mob/user) + target.AddComponent(/datum/component/xenoartifact, material, length(label_traits) ? label_traits : null, TRUE, FALSE, patch_traits) + skip_label = TRUE + return ..() + +/obj/item/xenoarchaeology_labeler/debug/AltClick(mob/user) + . = ..() + var/choice = tgui_alert(user, "Select Action", "Select Action", list("Toggle Patch", "Change Material")) + switch(choice) + if("Toggle Patch") + patch_traits = !patch_traits + to_chat(user, "Toggled patch: [patch_traits ? "On" : "Off"].") + if("Change Material") + var/list/possible_materials = typesof(/datum/xenoartifact_material) + material = tgui_input_list(user, "Select artifact material.", "Select Material", possible_materials, /datum/xenoartifact_material) + +/obj/item/xenoarchaeology_labeler/debug/examine(mob/user) + . = ..() + . += "Alt+Click to toggle settings." + +/obj/item/xenoarchaeology_labeler/debug/create_label() + if(skip_label) + skip_label = FALSE + return + var/obj/item/xenoartifact/no_traits/artifact = new(get_turf(src)) + artifact.AddComponent(/datum/component/xenoartifact, material, length(label_traits) ? label_traits : null, TRUE, TRUE, patch_traits) + +/* + Sticker for labeler, so we can label artifact's with their traits +*/ + +/obj/item/sticker/xenoartifact_label + icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' + icon_state = "sticker_star" + name = "artifact label" + desc = "An adhesive label, for artifacts." + do_outline = FALSE + roll_unusual = FALSE + ///List of artifact traits we're labelling + var/list/traits = list() + ///A special examine description built from the traits we have + var/examine_override = "" + ///The original custom price of the item we're going to label + var/old_custom_price + +/obj/item/sticker/xenoartifact_label/old + name = "old artifact label" + color = "#bd812e" + +/obj/item/sticker/xenoartifact_label/old/build_stuck_appearance() + var/mutable_appearance/MA = mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state) + MA.color = color + return MA + + +/obj/item/sticker/xenoartifact_label/Initialize(mapload, list/_traits) + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) + //Setup traits & examine desc + traits = _traits.Copy() + if(length(traits)) + examine_override = "Traits:" + for(var/datum/xenoartifact_trait/trait_datum as anything in traits) + examine_override = "[examine_override]\n - [initial(trait_datum.label_name)]" + //Setup a random appearance + icon_state = "sticker_[pick(list("star", "box", "tri", "round"))]" + sticker_icon_state = "[icon_state]_small" + return ..() + +/obj/item/sticker/xenoartifact_label/examine(mob/user) + . = ..() + . += examine_override + +/obj/item/sticker/xenoartifact_label/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + //If you somehow make traits start working with mobs, remove this isliving() check + if(ismob(target) && !isliving(target) || (locate(/obj/item/sticker/xenoartifact_label) in target.contents)) + to_chat(user, "[target] already has a label!") + return + . = ..() + if(!can_stick(target) || !proximity_flag) + return + //Set custom price with the artifact component + var/datum/component/xenoartifact/artifact = target.GetComponent(/datum/component/xenoartifact) + if(artifact) + old_custom_price = target.custom_price + //Build list of artifact's traits + var/list/traits_catagories = list() + for(var/trait in artifact.traits_catagories) + for(var/datum/xenoartifact_trait/trait_datum as anything in artifact.traits_catagories[trait]) + traits_catagories += trait_datum + //Compare them to ours + for(var/datum/xenoartifact_trait/trait_datum as anything in traits) + if(locate(trait_datum) in traits_catagories) + target.custom_price *= XENOA_LABEL_REWARD + else + target.custom_price *= XENOA_LABEL_PUNISHMENT + RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(parent_examine)) + +/obj/item/sticker/xenoartifact_label/attack_hand(mob/user) + if(sticker_state == STICKER_STATE_STUCK) + UnregisterSignal(loc, COMSIG_PARENT_EXAMINE) + //Set custom price back + var/datum/component/xenoartifact/artifact = loc.GetComponent(/datum/component/xenoartifact) + if(artifact) + loc.custom_price = old_custom_price + . = ..() + +/obj/item/sticker/xenoartifact_label/proc/parent_examine(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + examine_text += "There is an artifact label attached." + examine_text += examine_override diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm new file mode 100644 index 0000000000000..ec72b231d9d4f --- /dev/null +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -0,0 +1,339 @@ +/* + Misc machines used to interact with artifact traits +*/ + +/obj/machinery/xenoarchaeology_machine + icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' + ///Do we move the artifact to our turf, or inside us? + var/move_inside = FALSE + ///List of things we need to spit out + var/list/held_contents = list() + var/max_contents = 1 + +/obj/machinery/xenoarchaeology_machine/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) + +/obj/machinery/xenoarchaeology_machine/attackby(obj/item/I, mob/living/user, params) + if(user.a_intent == INTENT_HARM || (I.item_flags & ABSTRACT)) + return ..() + if(move_inside && length(held_contents) >= max_contents) + return + var/list/modifiers = params2list(params) + var/atom/target = get_target() + ///Move the item to our target, so we can work with it, like we're a table + if(user.transferItemToLoc(I, target, silent = FALSE)) + //Center the icon where the user clicked. + if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) + return + //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) + I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + //Handle contents + if(move_inside) + register_contents(I) + +/obj/machinery/xenoarchaeology_machine/attack_hand(mob/living/user) + . = ..() + activate_machine() + +/// Does a machine thing when you 'click' the machine. Typically called by 'attack_hand'. +/obj/machinery/xenoarchaeology_machine/proc/activate_machine() + return + +/obj/machinery/xenoarchaeology_machine/AltClick(mob/user) + . = ..() + alt_activate_machine(user) + +/// Does a machine thing when you 'alt+click' the machine. +/obj/machinery/xenoarchaeology_machine/proc/alt_activate_machine(mob/user) + return + +/obj/machinery/xenoarchaeology_machine/proc/register_contents(atom/atom_target) + RegisterSignal(atom_target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_contents)) + RegisterSignal(atom_target, COMSIG_MOVABLE_MOVED, PROC_REF(unregister_contents)) + held_contents += atom_target + +/obj/machinery/xenoarchaeology_machine/proc/unregister_contents(datum/source) + SIGNAL_HANDLER + + held_contents -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/obj/machinery/xenoarchaeology_machine/proc/get_target() + return move_inside ? src : drop_location() + +/obj/machinery/xenoarchaeology_machine/proc/empty_contents(atom/movable/target, force) + if(target && (list(target) & held_contents || force)) + target.forceMove(get_turf(src)) + unregister_contents(target) + return + for(var/atom/movable/AM in held_contents) + AM.forceMove(get_turf(src)) + unregister_contents(AM) + +//Circuitboard +/obj/item/circuitboard/machine/xenoarchaeology_machine + name = "place holder (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/xenoarchaeology_machine + req_components = list( + /obj/item/stack/ore/bluespace_crystal = 5, + /obj/item/stock_parts/matter_bin = 1) + +// --------------------------------------------------------------------------------------------------------------------------------------------------------------------- +/* + Scale, measures artifact weight +*/ +/obj/machinery/xenoarchaeology_machine/scale + name = "industrial scale" + desc = "A piece of industrial equipment, designed to weigh thousands of kilograms." + icon_state = "scale" + circuit = /obj/item/circuitboard/machine/xenoarchaeology_machine/scale + +/obj/machinery/xenoarchaeology_machine/scale/examine(mob/user) + . = ..() + . += "Interact to measure artifact weight.\nLabeled artifacts will also show label weights, against the total." + +/obj/machinery/xenoarchaeology_machine/scale/activate_machine(mob/living/user) + empty_contents() + ///Get the combined weight of all artifacts in our target + var/atom/target = get_target() + var/total_weight = 0 + var/label_weight = 0 + for(var/atom/atom_target in target) + var/datum/component/xenoartifact/artifact_component = atom_target.GetComponent(/datum/component/xenoartifact) + if(artifact_component) + total_weight += artifact_component.get_material_weight() + //If there's a label and we're obliged to 'help' the player + var/obj/item/sticker/xenoartifact_label/label = locate(/obj/item/sticker/xenoartifact_label) in atom_target.contents + if(label) + for(var/datum/xenoartifact_trait/T as() in label.traits) + say("[initial(T.label_name)] - Weight: [initial(T.weight)]") + label_weight += initial(T.weight) + else if(isitem(atom_target) || isliving(atom_target)) + if(isliving(atom_target)) + if(prob(1)) + say("Unexpected Fatass Detected!") + say("Get the fuck off me, lardass!") + playsound(get_turf(src), 'sound/vehicles/clowncar_fart.ogg', 100) + else + say("Unexpected Item Detected!") + return + if(total_weight) + say("Total Mass: [total_weight] KG.\n[label_weight ? "Label Mass: [label_weight] KG." : ""]") + else + say("No Mass Detected!") + playsound(src, 'sound/machines/uplinkpurchase.ogg', 50, TRUE) + +//Circuitboard +/obj/item/circuitboard/machine/xenoarchaeology_machine/scale + name = "industrial scale (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/xenoarchaeology_machine/scale + +// --------------------------------------------------------------------------------------------------------------------------------------------------------------------- +/* + Conductor, measures artifact conductivty +*/ +/obj/machinery/xenoarchaeology_machine/conductor + name = "conducting plate" + desc = "A piece of industrial equipment for measuring material conductivity." + icon_state = "conductor" + circuit = /obj/item/circuitboard/machine/xenoarchaeology_machine/conductor + +/obj/machinery/xenoarchaeology_machine/conductor/examine(mob/user) + . = ..() + . += "Interact to measure artifact conductivity.\nLabeled artifacts will also show label conductivity, against the total." + +/obj/machinery/xenoarchaeology_machine/conductor/activate_machine(mob/living/user) + empty_contents() + + ///Get the combined conductivity of all artifacts in our target + var/atom/target = get_target() + var/total_conductivity = 0 + var/label_conductivity = 0 + for(var/atom/atom_target in target) + var/datum/component/xenoartifact/artifact_component = atom_target.GetComponent(/datum/component/xenoartifact) + if(artifact_component) + total_conductivity += artifact_component.get_material_conductivity() + //If there's a label and we're obliged to 'help' the player + var/obj/item/sticker/xenoartifact_label/label = locate(/obj/item/sticker/xenoartifact_label) in atom_target.contents + if(label) + for(var/datum/xenoartifact_trait/T as() in label.traits) + say("[initial(T.label_name)] - conductivity: [initial(T.conductivity)]") + label_conductivity += initial(T.conductivity) + else if(isitem(atom_target) || isliving(atom_target)) + if(isliving(atom_target)) + if(prob(1)) + say("Unexpected Fatass Detected!") + say("Get the fuck off me, lardass!") + playsound(get_turf(src), 'sound/vehicles/clowncar_fart.ogg', 100) + else + say("Unexpected Item Detected!") + return + if(total_conductivity) + say("Total Conductivity: [total_conductivity] MPC.\n[label_conductivity ? "Label Conductivity: [label_conductivity] MPC." : ""]") + else + say("No Conductivity Detected!") + playsound(src, 'sound/machines/uplinkpurchase.ogg', 50, TRUE) + +//Circuitboard +/obj/item/circuitboard/machine/xenoarchaeology_machine/conductor + name = "conducting plate (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/xenoarchaeology_machine/conductor + +// --------------------------------------------------------------------------------------------------------------------------------------------------------------------- +/* + Calibrator, calibrates artifacts +*/ +/obj/machinery/xenoarchaeology_machine/calibrator + name = "anomalous material calibrator" + desc = "An experimental piece of scientific equipment, designed to calibrate anomalous materials." + icon_state = "calibrator" + move_inside = TRUE + circuit = /obj/item/circuitboard/machine/xenoarchaeology_machine/calibrator + ///Which science server receives points + var/datum/techweb/linked_techweb + ///radio used by the console to send messages on science channel + var/obj/item/radio/headset/radio + ///Cooking logic + var/cooking_time = 4 SECONDS + var/cooking_timer + ///How effective are our parts, for making DP + var/reward_rate = 0.25 + +/obj/machinery/xenoarchaeology_machine/calibrator/Initialize(mapload, _artifact_type) + . = ..() + //Link relevant stuff + linked_techweb = SSresearch.science_tech + //Radio setup + radio = new /obj/item/radio/headset/headset_sci(src) + +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial/Initialize(mapload, _artifact_type) + . = ..() + var/obj/item/sticker/sticky_note/calibrator_tutorial/label = new(loc) + label.afterattack(src, src, TRUE) + unregister_contents(label) + label.pixel_y = rand(-8, 8) + label.pixel_x = rand(-8, 8) + +/obj/machinery/xenoarchaeology_machine/calibrator/Destroy() + . = ..() + QDEL_NULL(radio) + if(cooking_timer) + deltimer(cooking_timer) + +/obj/machinery/xenoarchaeology_machine/calibrator/RefreshParts() + //Should only be one, but I'm lazy and this seems safe + for(var/obj/item/stock_parts/manipulator/part in component_parts) + reward_rate = part.rating / 4 + +/obj/machinery/xenoarchaeology_machine/calibrator/examine(mob/user) + . = ..() + . += "Alt-Click to calibrate inserted artifacts.\nArtifacts can be calibrated by labeling them 100% correctly, excluding malfunctions." + +/obj/machinery/xenoarchaeology_machine/calibrator/activate_machine(mob/living/user) + if(length(held_contents)) + empty_contents() + return + + var/turf/turf = get_turf(src) + for(var/obj/item/item in turf.contents) + if(move_inside && length(held_contents) >= max_contents) + return + item.forceMove(src) + register_contents(item) + +/obj/machinery/xenoarchaeology_machine/calibrator/alt_activate_machine(mob/user) + if(!length(held_contents) || cooking_timer) + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + return + playsound(src, 'sound/machines/uplinkpurchase.ogg', 50, TRUE) + for(var/atom/atom_target as anything in contents-radio) + var/solid_as = TRUE + //Once we find an artifact- + var/datum/component/xenoartifact/artifact_component = atom_target.GetComponent(/datum/component/xenoartifact) + //We then want to find a sticker attached to it- + var/obj/item/sticker/xenoartifact_label/label = locate(/obj/item/sticker/xenoartifact_label) in atom_target.contents + //Early checks + if(!artifact_component || !label || artifact_component?.calibrated || artifact_component?.calcified) + var/decision = "No" + if(!label && artifact_component) + say("No label detected!") + if(!artifact_component.calcified) + decision = tgui_alert(user, "Do you want to continue, this will destroy [atom_target]?", "Calcify Artifact", list("Yes", "No")) + if(decision == "No") + //This stops us from spitting out stuff we shouldn't, mostly + if(atom_target in held_contents) + empty_contents(atom_target) + continue + else + solid_as = FALSE + //Loop through traits and see if we're fucked or not + var/score = 0 + var/max_score = 0 + if(solid_as) //This is kinda wacky but it's for a player option so idc + for(var/trait in artifact_component.traits_catagories) + for(var/datum/xenoartifact_trait/trait_datum in artifact_component.traits_catagories[trait]) + if(trait_datum.contribute_calibration) + if(!(locate(trait_datum) in label.traits)) + solid_as = FALSE + else + score += 1 + max_score = trait_datum.contribute_calibration ? max_score + 1 : max_score + //Check against label length, for extra labeled traits + var/label_length = 0 + for(var/datum/xenoartifact_trait/trait_datum as() in label?.traits) + if(initial(trait_datum.contribute_calibration)) + label_length += 1 + if(label_length != max_score) + solid_as = FALSE + //FX + INVOKE_ASYNC(src, PROC_REF(do_cooking_sounds), solid_as) + cooking_timer = addtimer(CALLBACK(src, PROC_REF(finish_cooking), atom_target, artifact_component, score, max_score, solid_as), cooking_time, TIMER_STOPPABLE) + +/obj/machinery/xenoarchaeology_machine/calibrator/proc/do_cooking_sounds(status) + playsound(src, 'sound/machines/capacitor_charge.ogg', 50, TRUE) + sleep(2 SECONDS) + playsound(src, 'sound/machines/capacitor_discharge.ogg', 50, TRUE) + sleep(2 SECONDS) + playsound(src, status ? 'sound/machines/microwave/microwave-end.ogg' : 'sound/machines/buzz-two.ogg', 50, TRUE) + +/obj/machinery/xenoarchaeology_machine/calibrator/proc/finish_cooking(atom/atom_target, datum/component/xenoartifact/artifact_component, score, max_score, solid_as) + //Timer + if(cooking_timer) + deltimer(cooking_timer) + cooking_timer = null + empty_contents(atom_target) + //If we're cooked + if(!solid_as) + artifact_component.calcify() + return + //Scoring & success + if(score) + var/success_rate = score / max_score + var/dp_reward = max(0, (atom_target.custom_price*artifact_component.artifact_material.dp_rate)*success_rate) * reward_rate + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) + //Announce this, for honor or shame + var/message = "[atom_target] has been calibrated, and generated [dp_reward] Discovery Points!" + say(message) + radio?.talk_into(src, message, RADIO_CHANNEL_SCIENCE) + //Calibrate the artifact + artifact_component.calibrate() + //Prompt user to delete or keep malfunctions + var/decision = tgui_alert(usr, "Do you want to calcify [atom_target]'s malfunctions?", "Remove Malfunctions", list("Yes", "No")) + if(decision == "Yes") + for(var/i in artifact_component.traits_catagories) + for(var/datum/xenoartifact_trait/trait_datum in artifact_component.traits_catagories[i]) + if(istype(trait_datum, /datum/xenoartifact_trait/malfunction)) + qdel(trait_datum) + +//Circuitboard +/obj/item/circuitboard/machine/xenoarchaeology_machine/calibrator + name = "anomalous material calibrator (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/xenoarchaeology_machine/calibrator + req_components = list(/obj/item/stock_parts/matter_bin = 3, /obj/item/stock_parts/manipulator = 1) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm new file mode 100644 index 0000000000000..41e7448ae9446 --- /dev/null +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm @@ -0,0 +1,89 @@ +/* + 'Tracker' for artifacts, can be attached to generate points + from successful artifact activations. + Currently just a prototype +*/ +/obj/item/sticker/artifact_tracker + name = "anomalous material tracker" + icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' + icon_state = "tracker" + sticker_icon_state = "tracker_small" + do_outline = FALSE + ///Reward stuff + var/list/rewards = list(TECHWEB_POINT_TYPE_DISCOVERY = 100, TECHWEB_POINT_TYPE_GENERIC = 300) + ///radio used to send messages on science channel + var/obj/item/radio/headset/radio + var/use_radio = TRUE + ///Which science server receives points + var/datum/techweb/linked_techweb + ///Artifact component we're tracking + var/datum/component/xenoartifact/artifact_component + +/obj/item/sticker/artifact_tracker/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) + //Radio setup + radio = new /obj/item/radio/headset/headset_sci(src) + //Link relevant stuff + linked_techweb = SSresearch.science_tech + +/obj/item/sticker/artifact_tracker/Destroy() + . = ..() + QDEL_NULL(radio) + +/obj/item/sticker/artifact_tracker/examine(mob/user) + . = ..() + . += "Alt-Click to disable the radio & reward notice." + +/obj/item/sticker/artifact_tracker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_stick(target) || !proximity_flag) + return + var/sound_in = 'sound/machines/buzz-sigh.ogg' + artifact_component = target.GetComponent(/datum/component/xenoartifact) + if(artifact_component) + if(artifact_component.calibrated) + sound_in = 'sound/machines/click.ogg' + RegisterSignal(artifact_component, COMSIG_XENOA_TRIGGER, PROC_REF(catch_activation)) + RegisterSignal(artifact_component, COMSIG_PARENT_QDELETING, PROC_REF(clean_up)) + else + say("Error: [target] needs to be calibrated.") + else + say("Error: [target] is not compatible with [src].") + playsound(src, sound_in, 50, TRUE) + +/obj/item/sticker/artifact_tracker/AltClick(mob/user) + . = ..() + use_radio = !use_radio + to_chat(user, "Internal radio [use_radio ? "enabled" : "disabled"].") + + +/obj/item/sticker/artifact_tracker/unstick(atom/override) + . = ..() + clean_up() + +/obj/item/sticker/artifact_tracker/proc/clean_up() + SIGNAL_HANDLER + + if(!artifact_component) + return + UnregisterSignal(artifact_component, COMSIG_XENOA_TRIGGER) + UnregisterSignal(artifact_component, COMSIG_PARENT_QDELETING) + artifact_component = null + +/obj/item/sticker/artifact_tracker/proc/catch_activation(datum/source, priority) + SIGNAL_HANDLER + + if(priority != TRAIT_PRIORITY_ACTIVATOR) + return + for(var/reward in rewards) + //Reward + var/reward_amount = rewards[reward] + linked_techweb?.add_point_type(reward, reward_amount) + //Message + if(!use_radio) + return + var/datum/component/xenoartifact/artifact_component = source + var/message = "[artifact_component.parent] has generated [reward_amount] points of [reward] at [get_area(get_turf(src))]." + say(message) + radio?.talk_into(src, message, RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/xenoarchaeology/traits/_misc.dm b/code/modules/xenoarchaeology/traits/_misc.dm new file mode 100644 index 0000000000000..e382cd9cb6770 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/_misc.dm @@ -0,0 +1,64 @@ +/datum/xenoartifact_trait/misc + flags = null + register_targets = FALSE + weight = 0 + conductivity = 0 + contribute_calibration = FALSE + can_pearl = FALSE + flags = XENOA_MISC_TRAIT | XENOA_HIDE_TRAIT + +/* + Objective trait for exploration artifacts +*/ + +/datum/xenoartifact_trait/misc/objective + blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) + +/datum/xenoartifact_trait/misc/objective/New(atom/_parent) + . = ..() + var/atom/A = component_parent.parent + A.AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) + +/datum/xenoartifact_trait/misc/objective/Destroy(force, ...) + var/atom/A = component_parent.parent + var/datum/component/gps/G = A.GetComponent(/datum/component/gps) + qdel(G) + return ..() + +/* + Special activator for closets +*/ + +/datum/xenoartifact_trait/activator/weighted/closet + material_desc = null + flags = XENOA_MISC_TRAIT | XENOA_HIDE_TRAIT + +/datum/xenoartifact_trait/activator/weighted/closet/New(atom/_parent) + . = ..() + if(!component_parent?.parent || !istype(component_parent.parent, /obj/structure/closet)) + return FALSE + +/datum/xenoartifact_trait/activator/weighted/closet/trigger_artifact(atom/target, type = XENOA_ACTIVATION_CONTACT, force) + var/obj/structure/closet/C = component_parent.parent + //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially + if(target && HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE + //Stop traits that don't register targets activating when we feel them + if(component_parent.anti_check(target, type)) + return FALSE + //Door check + if(!C.opened) + return FALSE + //Collect targets + var/turf/T = get_turf(C) + for(var/atom/movable/movable in T?.contents) + component_parent.register_target(movable, force, XENOA_ACTIVATION_CONTACT) + component_parent.trigger() + return TRUE + +/obj/structure/closet/artifact + name = "The Bishop" //Proper name + +/obj/structure/closet/artifact/ComponentInitialize() + . = ..() + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, list(/datum/xenoartifact_trait/activator/weighted/closet, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/minor/capacitive, /datum/xenoartifact_trait/major/animalize), FALSE, FALSE) diff --git a/code/modules/xenoarchaeology/traits/_xenoartifact_traits.dm b/code/modules/xenoarchaeology/traits/_xenoartifact_traits.dm new file mode 100644 index 0000000000000..19c55a72ac393 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/_xenoartifact_traits.dm @@ -0,0 +1,261 @@ +/* + For laternate versions of traits, that you want as seperate on the labeler, use the format- + 'trait_name Δ' 'trait_name Σ' 'trait_name Ω', for up to three alternates, add more symbols if you have a trait with 4 alts or more +*/ + +/datum/xenoartifact_trait + ///Reference to the artifact + var/datum/component/xenoartifact/component_parent + + ///Acts as a descriptor for when examining - 'reinforced' 'electrified' 'hollow' + var/material_desc + ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. + var/label_name + ///Alternate name displayed when hovering + var/alt_label_name + ///Something briefly explaining it in inagame terms. + var/label_desc + + ///Asscoiated flags for artifact typing and such + var/flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///Other traits this trait wont work with. + var/list/blacklist_traits = list() + ///How rare is this trait? 100 being common, and 1 being very rare + var/rarity = XENOA_TRAIT_WEIGHT_COMMON + + ///Does this trait reigster targets? + var/register_targets = TRUE + + ///How much time does this trait add to the artifact cooldownm + var/cooldown = 0 SECONDS + + ///What trait priority we use + var/priority = TRAIT_PRIORITY_ACTIVATOR + + ///List of things we've effected. used to automatically reigster & unregister targets. Don't confuse with component_parent targets, which is things we want to effect + var/list/targets = list() + ///A distinct list of targets, incorporating overrides + var/list/focus = list() + ///Extra target range we add to the artifact + var/extra_target_range = 0 + + ///How much extra value does this trait apply to the artifact - It's important this is applied before anyone can use stickers on the artifact + var/extra_value = 0 + ///How many discovery points does this trait give? + var/discovery_reward = 100 + + ///Does this trait contribute to calibration + var/contribute_calibration = TRUE + + ///Can this trait be made a pearl? - aka can this trait be used in circuits + var/can_pearl = TRUE + + ///Characteristics for deduction + var/weight = 1 //KG + var/conductivity = 1 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable + + ///What kind of incompatabilities does this trait have + var/incompatabilities + +/datum/xenoartifact_trait/New(atom/_parent) + . = ..() + if(_parent) + register_parent(_parent) + +/datum/xenoartifact_trait/Destroy(force, ...) + . = ..() + dump_targets() + remove_parent(component_parent, FALSE) + +//The reason this is a seperate proc is so we can init the trait and swap its artifact component component_parent around +/datum/xenoartifact_trait/proc/register_parent(datum/source) + component_parent = source + var/atom/movable/movable = component_parent.parent + RegisterSignal(component_parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_parent)) + //Setup trigger signals + RegisterSignal(component_parent, COMSIG_XENOA_TRIGGER, PROC_REF(trigger)) + //If we need to setup signals for pearl stuff + if(can_pearl) + RegisterSignal(movable, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(catch_pearl_tool)) + RegisterSignal(movable, COMSIG_MOVABLE_MOVED, PROC_REF(catch_move)) + //Appearance + if(component_parent.do_texture) + generate_trait_appearance(component_parent.parent) + //Stats + component_parent.target_range += extra_target_range + movable.custom_price += extra_value + +//Remeber to call this before setting a new component_parent +/datum/xenoartifact_trait/proc/remove_parent(datum/source, pensive = TRUE) + SIGNAL_HANDLER + + //Detach from current component_parent + if(component_parent) + remove_hints() + UnregisterSignal(component_parent, COMSIG_PARENT_QDELETING) + UnregisterSignal(component_parent, COMSIG_XENOA_TRIGGER) + var/atom/atom_parent = component_parent.parent + component_parent.target_range -= extra_target_range + atom_parent.custom_price -= extra_value + cut_trait_appearance(component_parent.parent) + if(can_pearl) + UnregisterSignal(atom_parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER)) + UnregisterSignal(atom_parent, COMSIG_MOVABLE_MOVED) + if(pensive) + qdel(src) + component_parent = null + dump_targets() + +//Cleanly register an effected target +/datum/xenoartifact_trait/proc/register_target(atom/target, do_trigger = FALSE) + if(do_trigger) + trigger(null, priority, target) + targets += target + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target_signal), TRUE) + +//Cleanly unregister an effected target +/datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = FALSE) + SIGNAL_HANDLER + + if(do_untrigger) //This will only happen in the event something is unregistered before we can untrigger, which is needed for QDELs + un_trigger(source, override = source) + targets -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + +/datum/xenoartifact_trait/proc/unregister_target_signal(datum/source) + SIGNAL_HANDLER + + unregister_target(source, TRUE) + +/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override) + SIGNAL_HANDLER + + . = TRUE + if(_priority != priority && _priority) + return FALSE + if(!register_targets) + return + //If we've been given an override + if(override) + register_target(override) + //Otherwise just use the artifact's target list + else if(length(component_parent.targets)) + for(var/atom/target in component_parent.targets) + register_target(target) + //Handle focus + focus = override ? list(override) : targets + return + +//Most traits will handle this on their own +/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE) + //Override + if(override) + unregister_target(override) + //Parent targets, we shouldn't need this casually, only for niche cases + if(length(component_parent.targets) && handle_parent) + for(var/atom/target in component_parent.targets) + unregister_target(target) + //Our targets + if(length(targets)) + for(var/atom/target in targets) + unregister_target(target) + //Handle Focus + clear_focus() + return + +/datum/xenoartifact_trait/proc/dump_targets() + for(var/target in targets) + unregister_target(target, TRUE) + +//Call this when you're finished with the focus in the trigger() proc, un_trigger() handles itself +/datum/xenoartifact_trait/proc/clear_focus() + focus.Cut() + focus = list() + +//If we want this trait to modify the artifact's appearance +/datum/xenoartifact_trait/proc/generate_trait_appearance(atom/target) + return + +/datum/xenoartifact_trait/proc/cut_trait_appearance(atom/target) + return + +/datum/xenoartifact_trait/proc/setup_generic_item_hint() + RegisterSignal(component_parent.parent, COMSIG_PARENT_ATTACKBY, PROC_REF(hint_translation_type_a)) + +/datum/xenoartifact_trait/proc/setup_generic_touch_hint() + RegisterSignal(component_parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(hint_translation_type_b)) + RegisterSignal(component_parent.parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hint_translation_type_b)) + +/datum/xenoartifact_trait/proc/remove_hints() + UnregisterSignal(component_parent.parent, COMSIG_ITEM_ATTACK_SELF) + UnregisterSignal(component_parent.parent, COMSIG_ATOM_ATTACK_HAND) + UnregisterSignal(component_parent.parent, COMSIG_PARENT_ATTACKBY) + +/datum/xenoartifact_trait/proc/hint_translation_type_a(datum/source, obj/item, mob/living, params) + SIGNAL_HANDLER + + do_hint(living, item) + +/datum/xenoartifact_trait/proc/hint_translation_type_b(datum/source, mob/living) + SIGNAL_HANDLER + + var/atom/atom_parent = component_parent?.parent + if(!atom_parent?.density && atom_parent?.loc != living) + return + do_hint(living, null) + +/datum/xenoartifact_trait/proc/do_hint(mob/user, atom/item) + //If they have science goggles, or equivilent, they are shown exatcly what trait this is + if(!user?.can_see_reagents()) + return + var/atom/atom_parent = component_parent.parent + if(!isturf(atom_parent.loc)) + atom_parent = atom_parent.loc + atom_parent.balloon_alert(user, label_name, component_parent.artifact_material.material_color) + //show_in_chat doesn't work + to_chat(user, "[component_parent.parent] : [label_name]") + +/datum/xenoartifact_trait/proc/get_dictionary_hint() + return list() + +//Check the artifact, item, moves to see if we open up for 'pearling' +/datum/xenoartifact_trait/proc/catch_move(datum/source, atom/target, dir) + SIGNAL_HANDLER + + if(!component_parent.calibrated) + return + //Check if we're at our heart location, which is based on our weight-x and conductivity-y + var/atom/atom_parent = component_parent.parent + if(!isturf(atom_parent?.loc)) + return + if(target.x % (weight || target.x || 1) == 0 && target.y % (conductivity || target.y || 1) == 0) + var/atom/target_loc = atom_parent.loc + target_loc.visible_message("[atom_parent] develops a slight opening!\nYou could probably use a screwdriver on [atom_parent]!", allow_inside_usr = TRUE) + //Do effects + playsound(atom_parent, 'sound/machines/clockcult/ark_damage.ogg', 50, TRUE) + +/datum/xenoartifact_trait/proc/catch_pearl_tool(datum/source, mob/living/user, obj/item/I, list/recipes) + SIGNAL_HANDLER + + if(!component_parent.calibrated) + return + var/atom/atom_parent = component_parent.parent + if(!isturf(atom_parent?.loc)) + return + if(atom_parent.x % (weight || atom_parent.x || 1) != 0 || atom_parent.y % (conductivity || atom_parent.y || 1) != 0) + return + INVOKE_ASYNC(src, PROC_REF(pry_action), user, I) + +/datum/xenoartifact_trait/proc/pry_action(mob/living/user, obj/item/I) + var/atom/movable/movable = component_parent.parent + to_chat(user, "You begin to pry [movable] open with [I].") + if(do_after(user, 8 SECONDS, movable) && component_parent) + new /obj/item/sticker/trait_pearl(get_turf(movable), src) + component_parent?.remove_individual_trait(src) //You never know... + remove_parent(pensive = FALSE) + else + to_chat(user, "You reconsider...") + +///Particle holder for trait appearances - Throw any extras you want in here +/atom/movable/artifact_particle_holder + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/modules/xenoarchaeology/traits/activators/_activators.dm b/code/modules/xenoarchaeology/traits/activators/_activators.dm new file mode 100644 index 0000000000000..6b4c65c26855f --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/_activators.dm @@ -0,0 +1,71 @@ +/* + Activators + These traits cause the xenoartifact to trigger, activate + + * weight - All activators MUST have a weight that is a multiple of 8 + * conductivity - If an activator should have conductivity, it will be a multiple of 8 too +*/ + +/datum/xenoartifact_trait/activator + register_targets = FALSE + weight = 8 + conductivity = 0 + ///Do we override the artifact's generic cooldown? + var/override_cooldown = FALSE + +//Translation procs that catch a signal and translate it into a trigger +//Throw custom cooldown logic in here +/datum/xenoartifact_trait/activator/proc/trigger_artifact(atom/target, type = XENOA_ACTIVATION_CONTACT, force) + SIGNAL_HANDLER + + //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially + if(target && HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE + //Stop traits that don't register targets activating when we feel them + if(component_parent?.anti_check(target, type)) + return FALSE + component_parent.register_target(target, force, type) + component_parent.trigger() + return TRUE + +///Translates a (atom/target) input +/datum/xenoartifact_trait/activator/proc/translation_type_a(datum/source, atom/target) + SIGNAL_HANDLER + + trigger_artifact(target) + +///Translates a (atom/item, atom/target) input +/datum/xenoartifact_trait/activator/proc/translation_type_b(datum/source, atom/item, atom/target) + SIGNAL_HANDLER + + if(check_item_safety(item)) + return + trigger_artifact(target) + +///Translates a (atom/target, atom/item) input +/datum/xenoartifact_trait/activator/proc/translation_type_c(datum/source, atom/target, atom/item) + SIGNAL_HANDLER + + if(check_item_safety(item)) + return + trigger_artifact(target) + +///Translates a (atom/target) input, different to A becuase we use this one to handle dense cases and other conditions +/datum/xenoartifact_trait/activator/proc/translation_type_d(datum/source, atom/target) + SIGNAL_HANDLER + + var/atom/atom_parent = component_parent?.parent + if(!atom_parent.density) + return + trigger_artifact(target) + +/datum/xenoartifact_trait/activator/proc/check_item_safety(atom/item) + //Anti artifact check + var/datum/component/anti_artifact/anti_component = item.GetComponent(/datum/component/anti_artifact) + if(anti_component?.charges) + anti_component.charges -= 1 + return TRUE + //Trait check + if(HAS_TRAIT(item, TRAIT_ARTIFACT_IGNORE)) + return TRUE + return FALSE diff --git a/code/modules/xenoarchaeology/traits/activators/edible.dm b/code/modules/xenoarchaeology/traits/activators/edible.dm new file mode 100644 index 0000000000000..f1c7077a377db --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/edible.dm @@ -0,0 +1,89 @@ +/* + Edible + This trait activates the artifact when it is eaten +*/ +/datum/xenoartifact_trait/activator/edible + material_desc = "edible" + label_name = "Edible" + label_desc = "Edible: The artifact seems to be made of an edible material. This material seems to be triggered by being consumed." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 16 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///What reagents does this artifact provide when eaten? + var/food_reagents = list(/datum/reagent/consumable/nutriment = INFINITY) + ///How long does it take us to bite thise? + var/bite_time = 4 SECONDS + ///How many reagents do we get per bite, maximum + var/max_bite_reagents = 2 + +/datum/xenoartifact_trait/activator/edible/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + component_parent.parent.AddComponent(/datum/component/edible,\ + initial_reagents = food_reagents,\ + foodtypes = RAW | MEAT | GORE,\ + volume = INFINITY,\ + pre_eat = CALLBACK(src, PROC_REF(pre_eat)),\ + after_eat = CALLBACK(src, PROC_REF(after_eat)),\ + eat_time = bite_time,\ + bite_consumption = (max_bite_reagents * (component_parent.trait_strength/100))) + RegisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + +/datum/xenoartifact_trait/activator/edible/remove_parent(datum/source, pensive = TRUE) + if(!component_parent?.parent) + return ..() + var/datum/component/edible/E = component_parent.parent.GetComponent(/datum/component/edible) + E.RemoveComponent() + return ..() + +/datum/xenoartifact_trait/activator/edible/translation_type_b(datum/source, atom/item, atom/target) + do_hint(target, item) + +/datum/xenoartifact_trait/activator/edible/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_DETECT("health analyzer"), XENOA_TRAIT_HINT_TWIN_VARIANT("start with nutrients")) + +/datum/xenoartifact_trait/activator/edible/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/healthanalyzer)) + var/message = "" + var/index = 0 + for(var/datum/reagent/r as() in food_reagents) + message = "[message][initial(r.name)][index+1 < length(food_reagents) ? ", " : ""]" + index += 1 + to_chat(user, "[item] detects [message].") + return ..() + +/datum/xenoartifact_trait/activator/edible/proc/pre_eat(eater, feeder) + return TRUE + +/datum/xenoartifact_trait/activator/edible/proc/after_eat(mob/living/eater, mob/feeder, bitecount, bitesize) + trigger_artifact(eater, XENOA_ACTIVATION_CONTACT) + +//CRAZY WACKY VARIANT! +/datum/xenoartifact_trait/activator/edible/random + label_name = "Edible Δ" + label_desc = "Edible Δ: The artifact seems to be made of an edible material. This material seems to be triggered by being consumed." + bite_time = 6 SECONDS + food_reagents = list() + conductivity = 8 + ///How many random reaagents we're rocking with + var/random_reagents + +/datum/xenoartifact_trait/activator/edible/random/register_parent(datum/source) + random_reagents = rand(1, 3) + for(var/i in 1 to random_reagents) + food_reagents += list(get_random_reagent_id(CHEMICAL_RNG_GENERAL) = 300/random_reagents) + max_bite_reagents = random_reagents * 2 + return ..() + +/datum/xenoartifact_trait/activator/edible/random/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_DETECT("health analyzer"), XENOA_TRAIT_HINT_TWIN_VARIANT("start with 1-3 random chemicals")) + +/datum/xenoartifact_trait/activator/edible/random/after_eat(mob/living/eater, mob/feeder, bitecount, bitesize) + . = ..() + var/atom/atom_parent = component_parent.parent + for(var/datum/reagent/R in atom_parent.reagents.reagent_list) + if(R.type in food_reagents) + R.volume = 300/random_reagents + atom_parent.reagents.update_total() diff --git a/code/modules/xenoarchaeology/traits/activators/flammable.dm b/code/modules/xenoarchaeology/traits/activators/flammable.dm new file mode 100644 index 0000000000000..9d107d31819cb --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/flammable.dm @@ -0,0 +1,81 @@ +/* + Flammable + This trait activates the artifact when it's lit +*/ +/datum/xenoartifact_trait/activator/flammable + material_desc = "flammable" + label_name = "Flammable" + label_desc = "Flammable: The artifact seems to be made of a flammable material. This material seems to be triggered by heat interaction." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///Are we 'lit' and looking for targets + var/lit = FALSE + ///Search cooldown logic + var/search_cooldown = 4 SECONDS + var/search_cooldown_timer + +/datum/xenoartifact_trait/activator/flammable/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + RegisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(component_parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + RegisterSignal(component_parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + +/datum/xenoartifact_trait/activator/flammable/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(component_parent?.parent, COMSIG_ATOM_ATTACK_HAND) + UnregisterSignal(component_parent?.parent, COMSIG_ITEM_ATTACK_SELF) + return ..() + +/datum/xenoartifact_trait/activator/flammable/translation_type_a(datum/source, atom/target) + lit = FALSE + //Indicator hint + indicator_hint() + +/datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) + var/obj/item/I = item + if(isitem(I) && I.is_hot() && !check_item_safety(item)) + if(HAS_TRAIT(item, TRAIT_ARTIFACT_IGNORE)) + return FALSE + if(component_parent.anti_check(target, XENOA_ACTIVATION_TOUCH)) + return FALSE + lit = TRUE + indicator_hint(1) + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) + START_PROCESSING(SSobj, src) + +/datum/xenoartifact_trait/activator/flammable/translation_type_d(datum/source, atom/target) + var/atom/atom_parent = component_parent?.parent + if(atom_parent?.density) + lit = FALSE + indicator_hint() + +/datum/xenoartifact_trait/activator/flammable/process(delta_time) + if(!lit) + return ..() + if(search_cooldown_timer) + return + for(var/atom/target in oview(component_parent.target_range, get_turf(component_parent?.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target) + lit = FALSE + indicator_hint() + break + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/activator/flammable/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_TRIGGER("'hot' tool"), list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target.")) + +/datum/xenoartifact_trait/activator/flammable/proc/reset_timer() + if(search_cooldown_timer) + deltimer(search_cooldown_timer) + search_cooldown_timer = null + +/datum/xenoartifact_trait/activator/flammable/proc/indicator_hint(engaging = FALSE) + var/atom/atom_parent = component_parent?.parent + atom_parent?.balloon_alert_to_viewers("[atom_parent] [engaging ? "flicks on" : "snuffs out."]!") diff --git a/code/modules/xenoarchaeology/traits/activators/item_key.dm b/code/modules/xenoarchaeology/traits/activators/item_key.dm new file mode 100644 index 0000000000000..1e84a23f8c656 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/item_key.dm @@ -0,0 +1,112 @@ +/* + ABSTRACT + Item key + This trait activates when an item key is used on it +*/ +/datum/xenoartifact_trait/activator/item_key + flags = XENOA_HIDE_TRAIT + ///What item type activates us? + var/obj/item/key_item + ///Is the key item a strict type? + var/is_strict = FALSE + +/datum/xenoartifact_trait/activator/item_key/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + RegisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + +/datum/xenoartifact_trait/activator/item_key/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY) + return ..() + +/datum/xenoartifact_trait/activator/item_key/translation_type_b(datum/source, atom/item, atom/target) + if(is_strict) + . = item?.type == key_item.type + else + . = istype(item, key_item) + return (. && !component_parent.use_cooldown_timer) + +/* + Cell + This trait activates the artifact when a battery is used +*/ +/datum/xenoartifact_trait/activator/item_key/cell + label_name = "Cell" + label_desc = "Cell: The artifact seems to be made of a capacitive material. This material seems to be triggered by eletric currents, such as cells." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 32 + key_item = /obj/item/stock_parts/cell + +/datum/xenoartifact_trait/activator/item_key/cell/translation_type_b(datum/source, atom/item, atom/target) + . = ..() + do_hint(target, item) + if(!.) + return + var/obj/item/stock_parts/cell/C = item + if(C.charge-(C.maxcharge*0.25) >= 0 && !check_item_safety(item)) + C.use(C.maxcharge*0.25) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/item_key/cell/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/multitool)) + to_chat(user, "[item] detects a capacitive draw of 25%!") + return ..() + +/datum/xenoartifact_trait/activator/item_key/cell/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("charged cell"), XENOA_TRAIT_HINT_DETECT("multitool")) + +/* + Greedy + This trait activates the artifact when a coin is used +*/ +/datum/xenoartifact_trait/activator/item_key/greedy + material_desc = "slotted" + label_name = "Greedy" + label_desc = "Greedy: The artifact seems to be made of a collective material. This material seems to be triggered by inserting coins." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 32 + key_item = /obj/item/coin + +/datum/xenoartifact_trait/activator/item_key/greedy/translation_type_b(datum/source, atom/item, atom/target) + . = ..() + if(!.) + return + handle_input(item, target) + +/datum/xenoartifact_trait/activator/item_key/greedy/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("coin"), XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("accept coins to activate")) + +/datum/xenoartifact_trait/activator/item_key/greedy/proc/handle_input(atom/item, atom/target) + var/atom/movable/movable = item + movable.forceMove(component_parent.parent) + playsound(component_parent.parent, 'sound/items/coinflip.ogg', 50, TRUE) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +//Credit variant +/datum/xenoartifact_trait/activator/item_key/greedy/credit + label_name = "Greedy Δ" + label_desc = "Greedy Δ: The artifact seems to be made of a collective material. This material seems to be triggered by inserting credit holochips." + key_item = /obj/item/holochip + conductivity = 8 + ///How many credits we need to activate + var/credit_requirement = 1 + +/datum/xenoartifact_trait/activator/item_key/greedy/credit/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("credit holochip"), XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("accept credit holochips to activate")) + +/datum/xenoartifact_trait/activator/item_key/greedy/credit/handle_input(atom/item, atom/target) + var/obj/item/holochip/C = item + if(C.credits < credit_requirement) + to_chat(target, "[component_parent.parent] demands more than your meager offering!") + playsound(component_parent.parent, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + C.forceMove(component_parent.parent) + playsound(component_parent.parent, 'sound/machines/terminal_insert_disc.ogg', 50, TRUE) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + credit_requirement += 1 diff --git a/code/modules/xenoarchaeology/traits/activators/observational.dm b/code/modules/xenoarchaeology/traits/activators/observational.dm new file mode 100644 index 0000000000000..5870d31f322f0 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/observational.dm @@ -0,0 +1,27 @@ +/* + Observational + This trait activates the artifact when it's examined +*/ +/datum/xenoartifact_trait/activator/examine + label_name = "Observational" + label_desc = "Observational: The artifact seems to be made of a light-sensitive material. This material seems to be triggered by observational interaction." + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 16 + +/datum/xenoartifact_trait/activator/examine/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + //Register all the relevant signals we trigger from + RegisterSignal(component_parent?.parent, COMSIG_PARENT_EXAMINE, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + +/datum/xenoartifact_trait/activator/examine/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_PARENT_EXAMINE) + return ..() + +/datum/xenoartifact_trait/activator/examine/translation_type_a(datum/source, atom/target) + if(isliving(target)) + trigger_artifact(target, XENOA_ACTIVATION_SPECIAL) + return diff --git a/code/modules/xenoarchaeology/traits/activators/pitched.dm b/code/modules/xenoarchaeology/traits/activators/pitched.dm new file mode 100644 index 0000000000000..f5b29312360ea --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/pitched.dm @@ -0,0 +1,23 @@ +/* + Pitched + This trait activates the artifact when it is thrown +*/ +/datum/xenoartifact_trait/activator/pitched + label_name = "Pitched" + label_desc = "Pitched: The artifact seems to be made of an aerodynamic material. This material seems to be triggered by motion, such as being thrown." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = -8 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + +/datum/xenoartifact_trait/activator/pitched/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + RegisterSignal(component_parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + +/datum/xenoartifact_trait/activator/pitched/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_MOVABLE_IMPACT) + return ..() diff --git a/code/modules/xenoarchaeology/traits/activators/signal.dm b/code/modules/xenoarchaeology/traits/activators/signal.dm new file mode 100644 index 0000000000000..5731a943440c5 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/signal.dm @@ -0,0 +1,99 @@ +/* + Signal + This trait activates the artifact when it's signalled +*/ +/datum/xenoartifact_trait/activator/signal + label_name = "Signal" + label_desc = "Signal: The artifact seems to be made of a radio sensitive material. This material seems to be triggered by radio pulses." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///Signal code + var/code + ///Signal frequency + var/datum/radio_frequency/radio_connection + //Signal + var/datum/signal/signal + ///Annoying soung + var/sound_timer + + ///Reference to our particle holder - we need to use holders & vis contents, otherwise shit gets fucky with filters + var/atom/movable/artifact_particle_holder/particle_holder + +/datum/xenoartifact_trait/activator/signal/New(atom/_parent) + . = ..() + //Code + code = rand(0, 100) + //Signal + signal = new(list("code" = code)) + //Frequency + radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + radio_connection.add_listener(src) + +/datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) + SSradio.remove_object(src, FREQ_SIGNALER) + QDEL_NULL(signal) + return ..() + +/datum/xenoartifact_trait/activator/signal/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + setup_generic_item_hint() + sound_timer = addtimer(CALLBACK(src, PROC_REF(do_sonar)), 5 SECONDS) + +/datum/xenoartifact_trait/activator/signal/remove_parent(datum/source, pensive) + if(sound_timer) + deltimer(sound_timer) + return ..() + +/datum/xenoartifact_trait/activator/signal/generate_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + //Build particle holder + particle_holder = new(component_parent?.parent) + particle_holder.add_emitter(/obj/emitter/sonar, "sonar", 9) + //Layer onto parent + target.vis_contents += particle_holder + +/datum/xenoartifact_trait/activator/signal/cut_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + target.vis_contents -= particle_holder + QDEL_NULL(particle_holder) + +/datum/xenoartifact_trait/activator/signal/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/analyzer)) + to_chat(user, "[item] detects an input frequency & code of [FREQ_SIGNALER]-[code]!") + return ..() + +/datum/xenoartifact_trait/activator/signal/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), + XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), + XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target."), + XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact."), + XENOA_TRAIT_HINT_SOUND("sonar pings")) + +/datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) + if(!signal) + return + if(signal.data["code"] != code) + return + for(var/atom/target in oview(component_parent.target_range, get_turf(component_parent?.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target, XENOA_ACTIVATION_CONTACT) + break + if(!length(component_parent.targets)) + component_parent.trigger() + +/datum/xenoartifact_trait/activator/signal/proc/do_sonar(repeat = TRUE) + if(QDELETED(src)) + return + var/atom/atom_parent = component_parent.parent + if(isturf(atom_parent.loc)) + playsound(get_turf(component_parent?.parent), 'sound/effects/ping.ogg', 60, TRUE) + var/rand_time = rand(5, 15) SECONDS + sound_timer = addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time / (isturf(atom_parent.loc) ? 2 : 1)) diff --git a/code/modules/xenoarchaeology/traits/activators/sturdy.dm b/code/modules/xenoarchaeology/traits/activators/sturdy.dm new file mode 100644 index 0000000000000..3f2e025802e87 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/sturdy.dm @@ -0,0 +1,184 @@ +/* + Sturdy + This trait activates the artifact when it's used, like a generic item +*/ +/datum/xenoartifact_trait/activator/sturdy + material_desc = "sturdy" + label_name = "Sturdy" + label_desc = "Sturdy: The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 16 + +/datum/xenoartifact_trait/activator/sturdy/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + //Register all the relevant signals we trigger from + RegisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(component_parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(component_parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(component_parent?.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) + RegisterSignal(component_parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + +/datum/xenoartifact_trait/activator/sturdy/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(component_parent?.parent, COMSIG_MOVABLE_IMPACT) + UnregisterSignal(component_parent?.parent, COMSIG_ITEM_ATTACK_SELF) + UnregisterSignal(component_parent?.parent, COMSIG_ITEM_AFTERATTACK) + UnregisterSignal(component_parent?.parent, COMSIG_ATOM_ATTACK_HAND) + return ..() + +/datum/xenoartifact_trait/activator/sturdy/translation_type_b(datum/source, atom/item, atom/target) + if(check_item_safety(item)) + return + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/sturdy/translation_type_d(datum/source, atom/item, atom/target) + var/atom/atom_parent = component_parent?.parent + if(!isliving(atom_parent?.loc) && !atom_parent?.density || check_item_safety(item)) + return + trigger_artifact(target || item, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/sturdy/translation_type_a(datum/source, atom/target) + var/atom/atom_parent = component_parent?.parent + if(isliving(atom_parent?.loc)) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + return + trigger_artifact(target) + +/datum/xenoartifact_trait/activator/sturdy/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_MATERIAL) + +/* + Timed + This trait activates the artifact on a timer, which can be toggled on & off +*/ +/datum/xenoartifact_trait/activator/sturdy/timed + label_name = "Timed" + label_desc = "Timed: The artifact seems to be made of a harmonizing material. This material seems to activate on a timer, which can be enabled or disabled." + material_desc = null + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 32 + ///Are we looking for targets + var/searching = FALSE + ///Search cooldown logic + var/search_cooldown = 4 SECONDS + var/search_cooldown_timer + +/datum/xenoartifact_trait/activator/sturdy/timed/New(atom/_parent) + . = ..() + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) + START_PROCESSING(SSobj, src) + +/datum/xenoartifact_trait/activator/sturdy/timed/trigger_artifact(atom/target, type, force, do_real_trigger) + if(do_real_trigger) + return ..() + else + if(HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE + if(component_parent.anti_check(target, type)) + return FALSE + searching = !searching + indicator_hint(searching) + +/datum/xenoartifact_trait/activator/sturdy/timed/process(delta_time) + if(!searching || search_cooldown_timer || !component_parent) + return + playsound(get_turf(component_parent?.parent), 'sound/effects/clock_tick.ogg', 60, TRUE) + for(var/atom/target in oview(component_parent.target_range, get_turf(component_parent?.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target, XENOA_ACTIVATION_CONTACT, FALSE, TRUE) + break + if(!length(component_parent.targets)) + component_parent.trigger() + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/activator/sturdy/timed/get_dictionary_hint() + . = ..() + return list(list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target, periodically.")) + +/datum/xenoartifact_trait/activator/sturdy/timed/proc/reset_timer() + if(search_cooldown_timer) + deltimer(search_cooldown_timer) + search_cooldown_timer = null + +/datum/xenoartifact_trait/activator/sturdy/timed/proc/indicator_hint(engaging = FALSE) + var/atom/atom_parent = component_parent?.parent + atom_parent?.balloon_alert_to_viewers("[atom_parent] [!engaging ? "stops ticking" : "starts ticking"]!") + +/* + Hungry + This trait activates the artifact when it's fed +*/ +/datum/xenoartifact_trait/activator/sturdy/hungry + material_desc = null + label_name = "Hungry" + label_desc = "Hungry: The artifact seems to be made of a semi-living, hungry, material. This material seems to be triggered by feeding interactions." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 32 + ///How much damage do we deal per bite? + var/eat_damage = 15 + ///Timer logic for biting people + var/bite_cooldown = 4 SECONDS + var/bite_timer + ///Will we tollerate the taste of humans? Used for subtypes + var/maneater = FALSE + +/datum/xenoartifact_trait/activator/sturdy/hungry/trigger_artifact(atom/target, type, force) + if(component_parent.anti_check(target, type) || component_parent.calcified || get_dist(target, component_parent?.parent) > component_parent?.target_range) + return FALSE + //Find a food item + var/mob/living/M = target + var/edible + if(isliving(M)) + var/list/sides = list("left", "right") + for(var/i in sides) + var/atom/atom_parent = M.get_held_items_for_side(i) + if(atom_parent) //Not pre-checking atom_parent can cause some runtimes + edible = SEND_SIGNAL(atom_parent, COMSIG_FOOD_FEED_ITEM, component_parent?.parent) + if(!edible && target) + edible = SEND_SIGNAL(target, COMSIG_FOOD_FEED_ITEM, component_parent?.parent) + //If food + var/atom/movable/movable = component_parent.parent + if(edible) + playsound(movable.loc, 'sound/items/eatfood.ogg', 60, 1, 1) + return ..() + //Otherwise, nibble the target, and spit them out, they're gross, ew + if(isliving(M) && !bite_timer) + playsound(movable.loc, 'sound/weapons/bite.ogg', 60, 1, 1) + movable.do_attack_animation(M) + var/affecting = M.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + var/armour_block = M.run_armor_check(null, MELEE, armour_penetration = 0) + M.apply_damage(15, BRUTE, affecting, armour_block) + bite_timer = addtimer(CALLBACK(src, PROC_REF(handle_timer)), bite_cooldown, TIMER_STOPPABLE) + if(!maneater) + M.visible_message("[movable] bites [M], it didn't quite like the taste!", "[movable] bites you!\n[movable] doesn't like that taste!") + return FALSE + else + M.visible_message("[movable] bites [M], it loves the taste!", "[movable] bites you!\n[movable] loves that taste!") + return ..() + return FALSE + +/datum/xenoartifact_trait/activator/sturdy/hungry/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("only eat food items")) + +/datum/xenoartifact_trait/activator/sturdy/hungry/proc/handle_timer() + if(bite_timer) + deltimer(bite_timer) + bite_timer = null + +//maneater variant +/datum/xenoartifact_trait/activator/sturdy/hungry/maneater + material_desc = null + label_name = "Hungry Δ" + label_desc = "Hungry Δ: The artifact seems to be made of a semi-living, hungry, material. This material seems to be triggered by feeding interactions." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + maneater = TRUE + conductivity = 8 + +/datum/xenoartifact_trait/activator/sturdy/hungry/maneater/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("eat food items, and mobs")) diff --git a/code/modules/xenoarchaeology/traits/activators/weighted.dm b/code/modules/xenoarchaeology/traits/activators/weighted.dm new file mode 100644 index 0000000000000..660593a115313 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators/weighted.dm @@ -0,0 +1,26 @@ +/* + Weighted + This trait activates the artifact when it is picked up +*/ +/datum/xenoartifact_trait/activator/weighted + label_name = "Weighted" + label_desc = "Weighted: The artifact seems to be made of a weighted material. This material seems to be triggered by motion, such as being picked up." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 32 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + +/datum/xenoartifact_trait/activator/weighted/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + RegisterSignal(component_parent?.parent, COMSIG_ITEM_EQUIPPED, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + +/datum/xenoartifact_trait/activator/weighted/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + UnregisterSignal(component_parent?.parent, COMSIG_ITEM_EQUIPPED) + return ..() + +/datum/xenoartifact_trait/activator/weighted/translation_type_d(datum/source, atom/target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) diff --git a/code/modules/xenoarchaeology/traits/majors/_majors.dm b/code/modules/xenoarchaeology/traits/majors/_majors.dm new file mode 100644 index 0000000000000..bfbba389cae0e --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/_majors.dm @@ -0,0 +1,18 @@ +/* + Major + These traits cause the xenoartifact to do a specific action + + * weight - All majors should have a weight that is a multiple of 3 + * conductivity - If a major should have conductivity, it will be a multiple of 3 too +*/ +/datum/xenoartifact_trait/major + priority = TRAIT_PRIORITY_MAJOR + weight = 3 + conductivity = 0 + +/datum/xenoartifact_trait/major/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in view(XENOA_TRAIT_BALLOON_HINT_DIST, get_turf(component_parent.parent))) + do_hint(M) diff --git a/code/modules/xenoarchaeology/traits/majors/animalize.dm b/code/modules/xenoarchaeology/traits/majors/animalize.dm new file mode 100644 index 0000000000000..d77b86f19af22 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/animalize.dm @@ -0,0 +1,88 @@ +/* + Bestialized + The artifact shoots the target with a random projectile +*/ +/datum/xenoartifact_trait/major/animalize + label_name = "Bestialized" + label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + weight = 15 + conductivity = 12 + ///List of potential animals we could turn people into + var/list/possible_animals = list(/mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/pet/dog/bullterrier, /mob/living/simple_animal/pet/dog/pug) + ///The animal we will turn people into + var/mob/choosen_animal + ///How long we keep them as animals + var/animal_time = 15 SECONDS + +/datum/xenoartifact_trait/major/animalize/New(atom/_parent) + . = ..() + choosen_animal = pick(possible_animals) + +/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/target in focus) + if(istype(target, choosen_animal) || IS_DEAD_OR_INCAP(target)) + continue + transform(target) + var/atom/log_atom = component_parent.parent + log_game("[component_parent] in [log_atom] transformed [key_name_admin(target)] into [choosen_animal] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + //Add timer to undo this + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), target), animal_time*(component_parent.trait_strength/100)) + clear_focus() + +/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE) + focus = override ? list(override) : targets + if(!length(focus)) + return ..() + //Restore every swap holder + for(var/mob/living/target in focus) + var/obj/shapeshift_holder/H = (locate(/obj/shapeshift_holder) in target) || istype(target.loc, /obj/shapeshift_holder) ? target.loc : null + if(!istype(H)) + continue + H?.restore(FALSE, FALSE) + target.Knockdown(2 SECONDS) + REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) + return ..() + +/datum/xenoartifact_trait/major/animalize/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a dog")) + +//Transform a valid target into our choosen animal +/datum/xenoartifact_trait/major/animalize/proc/transform(mob/living/target) + if(!istype(target)) + return + //Check for a mob swap holder, and deny the transform if we find one + var/obj/shapeshift_holder/no_damage/H = (locate(/obj/shapeshift_holder/no_damage) in target) || istype(target.loc, /obj/shapeshift_holder/no_damage) ? target.loc : null + if(H) + playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + ADD_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) + //Setup the animal + var/mob/new_animal = new choosen_animal(target.loc) + //Swap holder + H = new(new_animal, src, target, FALSE) + RegisterSignal(new_animal, COMSIG_MOB_DEATH, PROC_REF(un_trigger)) + return new_animal + +/datum/xenoartifact_trait/major/animalize/vermin + label_name = "Bestialized Δ" + possible_animals = list(/mob/living/basic/mothroach, /mob/living/simple_animal/mouse, /mob/living/basic/cockroach/strong) + conductivity = 6 + +/datum/xenoartifact_trait/major/animalize/vermin/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a vermin")) + +/datum/xenoartifact_trait/major/animalize/dangerous + label_name = "Bestialized Σ" + possible_animals = list(/mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/killertomato) + conductivity = 3 + +/datum/xenoartifact_trait/major/animalize/dangerous/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a hostile animal")) diff --git a/code/modules/xenoarchaeology/traits/majors/barreled.dm b/code/modules/xenoarchaeology/traits/majors/barreled.dm new file mode 100644 index 0000000000000..c682543e6326f --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/barreled.dm @@ -0,0 +1,56 @@ +/* + Barreled + The artifact shoots the target with a random projectile +*/ +/datum/xenoartifact_trait/major/projectile + material_desc = "barreled" + label_name = "Barreled" + label_desc = "Barreled: The artifact seems to contain projectile components. Triggering these components will produce a 'safe' projectile." + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + extra_target_range = 2 + weight = 21 + ///List of projectiles we *could* shoot + var/list/possible_projectiles = list(/obj/projectile/beam/disabler, /obj/projectile/tentacle, /obj/projectile/beam/lasertag, /obj/projectile/energy/electrode) + ///The projectile type we *will* shoot + var/obj/projectile/choosen_projectile + +/datum/xenoartifact_trait/major/projectile/New(atom/_parent) + . = ..() + choosen_projectile = pick(possible_projectiles) + +/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + var/turf/T = get_turf(target) + if(get_turf(component_parent.parent) == T) + T = get_edge_target_turf(component_parent.parent, pick(NORTH, EAST, SOUTH, WEST)) + var/obj/projectile/P = new choosen_projectile() + P.preparePixelProjectile(T, component_parent.parent) + P.fire() + playsound(get_turf(component_parent.parent), 'sound/mecha/mech_shield_deflect.ogg', 50, TRUE) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/projectile/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a 'safe' projectile")) + +/* + Barreled Δ + Barreled but scary +*/ +/datum/xenoartifact_trait/major/projectile/unsafe + material_desc = "barreled" + label_name = "Barreled Δ" + label_desc = "Barreled Δ: The artifact seems to contain projectile components. Triggering these components will produce an unsafe projectile." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + possible_projectiles = list(/obj/projectile/beam/laser, /obj/projectile/bullet/c38, /obj/projectile/energy/tesla) + conductivity = 3 + +/datum/xenoartifact_trait/major/projectile/unsafe/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce an unsafe projectile")) diff --git a/code/modules/xenoarchaeology/traits/majors/combusting.dm b/code/modules/xenoarchaeology/traits/majors/combusting.dm new file mode 100644 index 0000000000000..9d658149222b9 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/combusting.dm @@ -0,0 +1,26 @@ +/* + Combusting + Ignites the target +*/ +/datum/xenoartifact_trait/major/combusting + label_name = "Combusting" + label_desc = "Combusting: The artifact seems to contain combusting components. Triggering these components will ignite the target." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 24 + weight = 12 + ///max fire stacks + var/max_stacks = 6 + +/datum/xenoartifact_trait/major/combusting/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(iscarbon(target)) + var/mob/living/carbon/victim = target + victim.adjust_fire_stacks(max_stacks*(component_parent.trait_strength/100)) + victim.IgniteMob() + else + target.fire_act(1000, 500) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/majors/displaced.dm b/code/modules/xenoarchaeology/traits/majors/displaced.dm new file mode 100644 index 0000000000000..b554cea1eda38 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/displaced.dm @@ -0,0 +1,24 @@ +/* + Displaced + Teleports the target to a random nearby turf +*/ +/datum/xenoartifact_trait/major/displaced + label_name = "Displaced" + label_desc = "Displaced: The artifact seems to contain displacing components. Triggering these components will displace the target." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 15 + +/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in focus) + if(!target.anchored) + do_teleport(target, get_turf(target), (component_parent.trait_strength*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) + var/atom/log_atom = component_parent.parent + log_game("[component_parent] in [log_atom] teleported [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + unregister_target(target) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/majors/dissipating.dm b/code/modules/xenoarchaeology/traits/majors/dissipating.dm new file mode 100644 index 0000000000000..725a1ed8ee19e --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/dissipating.dm @@ -0,0 +1,92 @@ +/* + Dissipating + The artifact spawns a cloud of smoke +*/ +/datum/xenoartifact_trait/major/smoke + label_name = "Dissipating" + label_desc = "Dissipating: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 6 + ///The maximum size of our smoke stack in turfs, I think + var/max_size = 3 + +/datum/xenoartifact_trait/major/smoke/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a harmless cloud of smoke")) + +/datum/xenoartifact_trait/major/smoke/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + make_smoke() + +/datum/xenoartifact_trait/major/smoke/proc/make_smoke() + var/datum/effect_system/smoke_spread/E = new() + E.set_up(max_size*(component_parent.trait_strength/100), get_turf(component_parent.parent)) + E.start() + +//Foam variant +/datum/xenoartifact_trait/major/smoke/foam + label_name = "Dissipating Σ" + label_desc = "Dissipating: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a body of foam." + max_size = 5 + conductivity = 3 + +/datum/xenoartifact_trait/major/smoke/foam/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a harmless body of foam")) + +/datum/xenoartifact_trait/major/smoke/foam/make_smoke() + var/datum/effect_system/foam_spread/E = new() + E.set_up(max_size*(component_parent.trait_strength/100), get_turf(component_parent.parent)) + E.start() + +//Chem smoke variant +/datum/xenoartifact_trait/major/smoke/chem + label_name = "Dissipating Δ" + label_desc = "Dissipating Δ: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke containing a random chemical." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 12 + ///What chemical we're injecting + var/datum/reagent/formula + ///max amount we can inject people with + var/formula_amount + var/generic_amount = 11 + +/datum/xenoartifact_trait/major/smoke/chem/New(atom/_parent) + . = ..() + formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) + formula_amount = (initial(formula.overdose_threshold) || generic_amount) - 1 + +/datum/xenoartifact_trait/major/smoke/chem/make_smoke() + var/datum/effect_system/smoke_spread/chem/E = new() + var/datum/reagents/R = new(formula_amount) + R.add_reagent(formula, formula_amount) + E.set_up(R, max_size*(component_parent.trait_strength/100), get_turf(component_parent.parent)) + E.start() + +/datum/xenoartifact_trait/major/smoke/chem/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("create a cloud of smoke containing a random chemical"), XENOA_TRAIT_HINT_RANDOMISED) + + +//Chem foam variant +/datum/xenoartifact_trait/major/smoke/chem/foam + label_name = "Dissipating Ω" + label_desc = "Dissipating Ω: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a body of foam containing a random chemical." + max_size = 5 + conductivity = 21 + +/datum/xenoartifact_trait/major/smoke/chem/foam/make_smoke() + var/datum/effect_system/foam_spread/E = new() + var/datum/reagents/R = new(formula_amount) + R.add_reagent(formula, formula_amount) + E.set_up(max_size*(component_parent.trait_strength/100), get_turf(component_parent.parent), R) + E.start() + +/datum/xenoartifact_trait/major/smoke/chem/foam/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("create a body of foam containing a random chemical"), XENOA_TRAIT_HINT_RANDOMISED) diff --git a/code/modules/xenoarchaeology/traits/majors/echoing.dm b/code/modules/xenoarchaeology/traits/majors/echoing.dm new file mode 100644 index 0000000000000..86ca32042f8a8 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/echoing.dm @@ -0,0 +1,32 @@ +/* + Echoing + The artifact plays a random sound +*/ +/datum/xenoartifact_trait/major/noise + label_name = "Echoing" + label_desc = "Echoing: The artifact seems to contain echoing components. Triggering these components will cause the artifact to make a noise." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + ///List of possible noises + var/list/possible_noises = list('sound/effects/adminhelp.ogg', 'sound/effects/applause.ogg', 'sound/effects/bubbles.ogg', + 'sound/effects/empulse.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/explosion_distant.ogg', + 'sound/effects/laughtrack.ogg', 'sound/effects/magic.ogg', 'sound/effects/meteorimpact.ogg', + 'sound/effects/phasein.ogg', 'sound/effects/supermatter.ogg', 'sound/weapons/armbomb.ogg', + 'sound/weapons/blade1.ogg') + ///The noise we will make + var/noise + +/datum/xenoartifact_trait/major/noise/New(atom/_parent) + . = ..() + noise = pick(possible_noises) + +/datum/xenoartifact_trait/major/noise/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + playsound(get_turf(component_parent.parent), noise, 50, FALSE) + +/datum/xenoartifact_trait/major/noise/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) diff --git a/code/modules/xenoarchaeology/traits/majors/electrified.dm b/code/modules/xenoarchaeology/traits/majors/electrified.dm new file mode 100644 index 0000000000000..897dbdda2d620 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/electrified.dm @@ -0,0 +1,39 @@ +/* + Electrified + Electrocutes the mob target, or charges the cell target +*/ +/datum/xenoartifact_trait/major/shock + label_name = "Electrified" + label_desc = "Electrified: The artifact seems to contain electrifying components. Triggering these components will shock the target." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 27 + ///max damage + var/max_damage = 25 + ///Max cable charge + var/max_cable_charge = 50000 + +/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + playsound(get_turf(component_parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) + do_sparks(3, FALSE, component_parent.parent) + //electrocute targets + for(var/atom/target in focus) + if(iscarbon(target)) + var/mob/living/carbon/victim = target + victim.electrocute_act(max_damage*(component_parent.trait_strength/100), component_parent.parent, 1, 1) //Deal a max of 25 + else if(istype(target, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/C = target + C.give((component_parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool + var/atom/log_atom = component_parent.parent + log_game("[component_parent] in [log_atom] electrocuted [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + //If there's an exposed cable below us, charge it + var/obj/structure/cable/C = locate(/obj/structure/cable) in get_turf(component_parent.parent) + if(C?.invisibility <= UNDERFLOOR_HIDDEN) + C.powernet?.newavail += max_cable_charge*(component_parent.trait_strength/100) + //Get rid of anything else, since we can't interact with it + dump_targets() + //Tidy up focus too + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/majors/emp.dm b/code/modules/xenoarchaeology/traits/majors/emp.dm new file mode 100644 index 0000000000000..4d4df688d5dad --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/emp.dm @@ -0,0 +1,28 @@ +/* + EMP + Creates an EMP effect at the position of the artfiact +*/ +/datum/xenoartifact_trait/major/emp + label_name = "EMP" + label_desc = "EMP: The artifact seems to contain electromagnetic pulsing components. Triggering these components will create an EMP." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + rarity = XENOA_TRAIT_WEIGHT_MYTHIC //Fuck this trait + weight = 9 + conductivity = 36 + +/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() + +/datum/xenoartifact_trait/major/emp/proc/do_emp() + var/turf/T = get_turf(component_parent.parent) + if(!T) + return + playsound(T, 'sound/magic/disable_tech.ogg', 50, TRUE) + empulse(T, max(1, component_parent.trait_strength*0.03), max(1, component_parent.trait_strength*0.05, 1)) + var/atom/log_atom = component_parent.parent + log_game("[component_parent] in [log_atom] made an EMP at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") diff --git a/code/modules/xenoarchaeology/traits/majors/enthusing.dm b/code/modules/xenoarchaeology/traits/majors/enthusing.dm new file mode 100644 index 0000000000000..39ce4d405c4ef --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/enthusing.dm @@ -0,0 +1,41 @@ +/* + Enthusing + Makes the target emote, if they can +*/ +/datum/xenoartifact_trait/major/emote + label_name = "Enthusing" + label_desc = "Enthusing: The artifact seems to contain emoting components. Triggering these components will cause the target to emote." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///List of possible emotes + var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, + /datum/emote/living/shiver, /datum/emote/living/tremble, /datum/emote/living/whimper, + /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, + /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush) + ///Emote to preform + var/datum/emote/emote + +/datum/xenoartifact_trait/major/emote/New(atom/_parent) + . = ..() + emote = pick(possible_emotes) + emote = new emote() + +/datum/xenoartifact_trait/major/emote/Destroy(force, ...) + QDEL_NULL(emote) + return ..() + +/datum/xenoartifact_trait/major/emote/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/target in focus) + INVOKE_ASYNC(src, PROC_REF(run_emote), target) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/emote/proc/run_emote(mob/living/carbon/target) + emote.run_emote(target) + +/datum/xenoartifact_trait/major/emote/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) diff --git a/code/modules/xenoarchaeology/traits/majors/exchanging.dm b/code/modules/xenoarchaeology/traits/majors/exchanging.dm new file mode 100644 index 0000000000000..f9a59fef40b74 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/exchanging.dm @@ -0,0 +1,90 @@ +/* + Exchanging + Swaps the damage of the last two targets +*/ +/datum/xenoartifact_trait/major/exchange + label_name = "Exchanging" + label_desc = "Exchanging: The artifact seems to contain exchanging components. Triggering these components will exchange the damage of the last two targets." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 9 + weight = 12 + ///What damage type do we exchange + var/damage_type = BRUTE + ///How long until the window for exchange closes + var/exchange_window = 13 SECONDS //5 second window, in theory? + +/datum/xenoartifact_trait/major/exchange/trigger(datum/source, _priority, atom/override) + //Collect some targets + . = ..() + if(!.) + return + var/atom/atom_parent = component_parent.parent + var/final_time = exchange_window*(component_parent.trait_strength/100) + for(var/mob/living/target in focus) + //Build exchange hint + if(!atom_parent.render_target) + atom_parent.render_target = "[REF(atom_parent)]" + target.add_filter("exchange_overlay", 100, layering_filter(render_source = atom_parent.render_target)) + //Animate it + var/filter = target.get_filter("exchange_overlay") + if(filter) + animate(filter, color = "#00000000", time = final_time) + //Timer to undo + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), target), final_time) + clear_focus() + //Run targets + var/mob/living/victim_a + var/mob/living/victim_b + for(var/mob/living/target in targets) + if(target.stat > SOFT_CRIT) + playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) + continue + if(!victim_a) + victim_a = target + continue + if(!victim_b) + victim_b = target + //swap damage + + var/a_damage = victim_a.get_damage_amount(damage_type) + var/b_damage = victim_b.get_damage_amount(damage_type) + + victim_a.apply_damage_type(a_damage*-1, damage_type) //Heal + victim_b.apply_damage_type(b_damage*-1, damage_type) + + victim_a.apply_damage_type(b_damage, damage_type) //Apply + victim_b.apply_damage_type(a_damage, damage_type) + + victim_a.updatehealth() + victim_b.updatehealth() + + //Remove filters + victim_a.remove_filter("exchange_overlay") + victim_b.remove_filter("exchange_overlay") + //Reset holders + unregister_target(victim_a) + unregister_target(victim_b) + victim_a = null + victim_b = null + +/datum/xenoartifact_trait/major/exchange/un_trigger(atom/override, handle_parent = FALSE) + focus = override ? list(override) : targets + if(!length(focus)) + return ..() + for(var/mob/living/target in focus) + target.remove_filter("exchange_overlay") + return ..() + +/datum/xenoartifact_trait/major/exchange/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("exchange brute damage between two targets")) + +//Burn variant +/datum/xenoartifact_trait/major/exchange/burn + label_name = "Exchanging Δ" + label_desc = "Exchanging Δ: The artifact seems to contain exchanging components. Triggering these components will exchange the damage of the last two targets." + damage_type = BURN + conductivity = 3 + +/datum/xenoartifact_trait/major/exchange/burn/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("exchange burn damage between two targets")) diff --git a/code/modules/xenoarchaeology/traits/majors/flash.dm b/code/modules/xenoarchaeology/traits/majors/flash.dm new file mode 100644 index 0000000000000..bc8b12856a9b3 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/flash.dm @@ -0,0 +1,63 @@ +/* + Flashing + Creates a flash effect at the position of the artfiact +*/ +/datum/xenoartifact_trait/major/flash + label_name = "Flashing" + label_desc = "Flashing: The artifact seems to contain flashing components. Triggering these components will create a blinding flash." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 18 + conductivity = 18 + ///Maximum flash range + var/max_flash_range = 5 + +/datum/xenoartifact_trait/major/flash/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(component_parent.parent) + var/flash_range = max_flash_range * (component_parent.trait_strength/100) + playsound(T, 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) + new /obj/effect/dummy/lighting_obj (T, flash_range + 2, 4, COLOR_WHITE, 2) + for(var/mob/living/M in viewers(flash_range, T)) + flash(get_turf(M), M) + for(var/mob/living/M in hearers(flash_range, T)) + bang(get_turf(M), M) + +//IDK, I coped both of these from flashbang.dm +/datum/xenoartifact_trait/major/flash/proc/flash(turf/T, mob/living/M) + if(M.stat == DEAD) //They're dead! + return + var/distance = max(0,get_dist(get_turf(src),T)) + //When distance is 0, will be 1 + //When distance is 7, will be 0 + //Can be less than 0 due to hearers being a circular radius. + var/distance_proportion = max(1 - (distance / (max_flash_range * (component_parent.trait_strength/100))), 0) + + if(M.flash_act(intensity = 1, affect_silicon = 1)) + if(distance_proportion) + M.Paralyze(20 * distance_proportion) + M.Knockdown(200 * distance_proportion) + else + M.flash_act(intensity = 2) + +/datum/xenoartifact_trait/major/flash/proc/bang(turf/T, mob/living/M) + if(M.stat == DEAD) + return + var/distance = max(0,get_dist(get_turf(src),T)) + M.show_message("BANG", MSG_AUDIBLE) + var/atom/atom_parent = component_parent.parent + if(!distance || atom_parent.loc == M || atom_parent.loc == M.loc) //Stop allahu akbarring rooms with this. + M.Paralyze(20) + M.Knockdown(200) + M.soundbang_act(1, 200, 10, 15) + else + if(distance <= 1) + M.Paralyze(5) + M.Knockdown(30) + + var/distance_proportion = max(1 - (distance / (max_flash_range * (component_parent.trait_strength/100))), 0) + if(distance_proportion) + M.soundbang_act(1, 200 * distance_proportion, rand(0, 5)) diff --git a/code/modules/xenoarchaeology/traits/majors/flourishing.dm b/code/modules/xenoarchaeology/traits/majors/flourishing.dm new file mode 100644 index 0000000000000..03d76e44ae4b9 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/flourishing.dm @@ -0,0 +1,36 @@ +/* + Flourishing + Ages up plants +*/ +/datum/xenoartifact_trait/major/growing + label_name = "Flourishing" + label_desc = "Flourishing: The artifact seems to contain flourishing components. Triggering these components will age up plant targets." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 6 + weight = 6 + ///Max amount we increase age by + var/max_aging = 5 + +/datum/xenoartifact_trait/major/growing/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/obj/machinery/hydroponics/target in focus) + target.age += max_aging * (component_parent.trait_strength/100) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/growing/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("make plants age up")) + +//Makes plants younger +/datum/xenoartifact_trait/major/growing/youth + label_name = "Flourishing Δ" + label_desc = "Flourishing Δ: The artifact seems to contain flourishing components. Triggering these components will age down plant targets." + max_aging = -5 + conductivity = 3 + +/datum/xenoartifact_trait/major/growing/youth/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("make plants age down")) diff --git a/code/modules/xenoarchaeology/traits/majors/forcing.dm b/code/modules/xenoarchaeology/traits/majors/forcing.dm new file mode 100644 index 0000000000000..c9e1221aae8ba --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/forcing.dm @@ -0,0 +1,44 @@ +/* + Forcing + Inacts a pushing or pulling force on the target +*/ +/datum/xenoartifact_trait/major/force + label_name = "Forcing" + label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, push or pull, the target." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 21 + conductivity = 27 + ///Max force we can use, aka how far we throw things + var/max_force = 7 + ///Force direction, push or pull + var/force_dir = 1 + +/datum/xenoartifact_trait/major/force/pull + label_name = "Forcing Δ" + force_dir = 0 + conductivity = 3 + +/datum/xenoartifact_trait/major/force/pull/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pull the target")) + +/datum/xenoartifact_trait/major/force/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in focus) + if(target.anchored) + return + var/turf/parent_turf = get_turf(component_parent.parent) + var/turf/T + if(force_dir) + T = get_edge_target_turf(parent_turf, get_dir(parent_turf, get_turf(target)) || pick(NORTH, EAST, SOUTH, WEST)) + else + T = parent_turf + target.throw_at(T, max_force*(component_parent.trait_strength/100), 4) + unregister_target(target) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/force/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("push the target")) diff --git a/code/modules/xenoarchaeology/traits/majors/freezing.dm b/code/modules/xenoarchaeology/traits/majors/freezing.dm new file mode 100644 index 0000000000000..f0b1e22894c70 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/freezing.dm @@ -0,0 +1,24 @@ +/* + Freezing + Freezes the target +*/ +/datum/xenoartifact_trait/major/freezing + label_name = "Freezing" + label_desc = "Freezing: The artifact seems to contain freezing components. Triggering these components will freeze the target." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + conductivity = 12 + weight = 24 + +/datum/xenoartifact_trait/major/freezing/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/target in focus) + //Pretty much copied from the wizard traps + to_chat(target, "You're frozen solid!") + target.Paralyze(20) + target.adjust_bodytemperature(-300) + target.apply_status_effect(/datum/status_effect/freon) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/majors/hollow.dm b/code/modules/xenoarchaeology/traits/majors/hollow.dm new file mode 100644 index 0000000000000..6985c956ccbbd --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/hollow.dm @@ -0,0 +1,62 @@ +/* + Hollow + Captures the target for an amount of time +*/ +/datum/xenoartifact_trait/major/hollow + material_desc = "hollow" + label_name = "Hollow" + label_desc = "Hollow: The artifact seems to contain hollow components. Triggering these components will capture the target." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = -15 + ///Maximum time we hold people for + var/hold_time = 15 SECONDS + +/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(ismovable(target)) + var/atom/movable/M = target + if(M.anchored) + unregister_target(target) + continue + var/atom/movable/movable = component_parent.parent + //handle being held + if(!isturf(movable.loc) && locate(movable.loc) in focus) + if(isliving(movable.loc)) + var/mob/living/L = movable.loc + L.dropItemToGround(movable, TRUE) + else + movable.forceMove(get_turf(movable.loc)) + M.forceMove(movable) + //Buckle targets to artifact + movable.buckle_mob(M) + //Paralyze so they don't break shit, I know they would if they were able to move + if(isliving(M)) + var/mob/living/L = M + L.Paralyze(hold_time*(component_parent.trait_strength/100), ignore_canstun = TRUE) + //Add timer to undo this - becuase the hold time is longer than an actual artifact cooldown, we need to do this per-mob + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), M), hold_time*(component_parent.trait_strength/100)) + else + unregister_target(target) + clear_focus() + +/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE, did_cuff) + focus = override ? list(override) : targets + if(!length(focus)) + return ..() + var/atom/movable/movable = component_parent.parent + movable.unbuckle_all_mobs() + for(var/atom/movable/target in focus) + if(target.loc == movable) //If they somehow get out + target.forceMove(get_turf(movable)) + if(isliving(target)) + var/mob/living/L = target + L.Knockdown(2 SECONDS) + return ..() + +/datum/xenoartifact_trait/major/hollow/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/majors/hypodermic.dm b/code/modules/xenoarchaeology/traits/majors/hypodermic.dm new file mode 100644 index 0000000000000..2cc3c08c1920a --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/hypodermic.dm @@ -0,0 +1,53 @@ +/* + Hypodermic + Injects the target with a random, safe, chemical +*/ +/datum/xenoartifact_trait/major/chem + label_name = "Hypodermic" + label_desc = "Hypodermic: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 + ///What category of random chems are we pulling from? + var/chem_category = CHEMICAL_RNG_GENERAL + ///What chemical we're injecting + var/datum/reagent/formula + ///max amount we can inject people with + var/formula_amount + var/generic_amount = 11 + +/datum/xenoartifact_trait/major/chem/New(atom/_parent) + . = ..() + formula = get_random_reagent_id(chem_category) + formula_amount = (initial(formula.overdose_threshold) || generic_amount) - 1 + +/datum/xenoartifact_trait/major/chem/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(target.reagents) + playsound(get_turf(target), pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, TRUE) + var/datum/reagents/R = target.reagents + R.add_reagent(formula, formula_amount*(component_parent.trait_strength/100)) + var/atom/log_atom = component_parent.parent + log_game("[component_parent] in [log_atom] injected [key_name_admin(target)] with [formula_amount*(component_parent.trait_strength/100)]u of [formula] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + unregister_target(target) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/chem/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("inject the target with a random generic chemical")) + +//Evil jonkler version +/datum/xenoartifact_trait/major/chem/fun + label_name = "Hypodermic Δ" + label_desc = "Hypodermic Δ: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." + chem_category = CHEMICAL_RNG_FUN + rarity = XENOA_TRAIT_WEIGHT_RARE + conductivity = 3 + +/datum/xenoartifact_trait/major/chem/fun/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("inject the target with a random fun chemical")) diff --git a/code/modules/xenoarchaeology/traits/majors/illuminating.dm b/code/modules/xenoarchaeology/traits/majors/illuminating.dm new file mode 100644 index 0000000000000..c56db5ab14d15 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/illuminating.dm @@ -0,0 +1,56 @@ +/* + Illuminating + Toggles a light on the artifact +*/ +/datum/xenoartifact_trait/major/illuminating + label_name = "Illuminating" + label_desc = "Illuminating: The artifact seems to contain illuminating components. Triggering these components will cause the artifact to illuminate." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 18 + ///List of possible colors + var/list/possible_colors = list(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) + ///Our actual color + var/color + ///Are we currently lit? + var/lit = FALSE + +/datum/xenoartifact_trait/major/illuminating/New(atom/_parent) + . = ..() + color = pick(possible_colors) + +/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + do_light() + +/datum/xenoartifact_trait/major/illuminating/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a randomly colored light")) + +/datum/xenoartifact_trait/major/illuminating/proc/do_light() + lit = !lit + var/atom/light_source = component_parent.parent + if(lit) + light_source.set_light(component_parent.trait_strength*0.04, min(component_parent.trait_strength*0.1, 10), color) + else + light_source.set_light(0, 0) + +/datum/xenoartifact_trait/major/illuminating/shadow + label_name = "Illuminating Δ" + label_desc = "Illuminating Δ: The artifact seems to contain de-illuminating components. Triggering these components will cause the artifact to de-illuminate." + conductivity = 3 + +/datum/xenoartifact_trait/major/illuminating/shadow/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("create a localised shadow")) + +/datum/xenoartifact_trait/major/illuminating/shadow/do_light() + lit = !lit + var/atom/light_source = component_parent.parent + if(lit) + light_source.set_light(component_parent.trait_strength*0.04, min(component_parent.trait_strength*0.1, 10)*-1, color) + else + light_source.set_light(0, 0) diff --git a/code/modules/xenoarchaeology/traits/majors/marking.dm b/code/modules/xenoarchaeology/traits/majors/marking.dm new file mode 100644 index 0000000000000..133388a7aba3c --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/marking.dm @@ -0,0 +1,44 @@ +/* + Marking + Colors the target +*/ +/datum/xenoartifact_trait/major/color + label_name = "Marking" + label_desc = "Marking: The artifact seems to contain colorizing components. Triggering these components will color the target." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///Possible colors + var/list/possible_colors = list(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK) + ///Choosen color + var/color + +/datum/xenoartifact_trait/major/color/New(atom/_parent) + . = ..() + color = pick(possible_colors) + +/datum/xenoartifact_trait/major/color/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + target.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/color/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("apply a set color to the target")) + +//Random variant +/datum/xenoartifact_trait/major/color/random + label_name = "Marking Δ" + label_desc = "Marking Δ: The artifact seems to contain colorizing components. Triggering these components will color the target." + conductivity = 3 + +/datum/xenoartifact_trait/major/color/random/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("apply a random color to the target")) + +/datum/xenoartifact_trait/major/color/trigger(datum/source, _priority, atom/override) + color = pick(possible_colors) + return ..() diff --git a/code/modules/xenoarchaeology/traits/majors/obstructing.dm b/code/modules/xenoarchaeology/traits/majors/obstructing.dm new file mode 100644 index 0000000000000..af3f990073df0 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/obstructing.dm @@ -0,0 +1,48 @@ +/* + Obstructing + Builds forcefields around the artifact +*/ +/datum/xenoartifact_trait/major/forcefield + label_name = "Obstructing" + label_desc = "Obstructing: The artifact seems to contain obstructing components. Triggering these components will cause the artifact to build walls around itself." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 33 + ///What wall size are we making? + var/wall_size + ///Max time we keep walls around for + var/wall_time = 8 SECONDS + +/datum/xenoartifact_trait/major/forcefield/New(atom/_parent) + . = ..() + wall_size = pick(1, 2, 3) + +/datum/xenoartifact_trait/major/forcefield/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/time = wall_time*(component_parent.trait_strength/100) + //Don't use a switch case, we just pass through the ifs and add walls as we go + if(wall_size >= 1) + new /obj/effect/forcefield/xenoartifact_type(get_turf(component_parent.parent), time) + if(wall_size >= 2) + //If we're not making a symetrical design, pick a random orientation + var/outcome = pick(0, 1) + if(outcome || wall_size >= 3) + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, NORTH), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, SOUTH), time) + else + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, EAST), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, WEST), time) + if(wall_size >= 3) + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, WEST), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(component_parent.parent, EAST), time) + +/datum/xenoartifact_trait/major/forcefield/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + +//Special wall type for artifact. Throw any extra code or special logic in here +/obj/effect/forcefield/xenoartifact_type + desc = "An impenetrable artifact wall." diff --git a/code/modules/xenoarchaeology/traits/majors/porous.dm b/code/modules/xenoarchaeology/traits/majors/porous.dm new file mode 100644 index 0000000000000..c92781084c827 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/porous.dm @@ -0,0 +1,60 @@ +/* + Porous + The artifact replaces one random gas with another +*/ +/datum/xenoartifact_trait/major/gas + label_name = "Porous" + label_desc = "Porous: The artifact seems to contain porous components. Triggering these components will cause the artifact to exchange one gas with another." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 15 + ///Possible target gasses + var/list/target_gasses = list( + /datum/gas/oxygen = 6, + /datum/gas/nitrogen = 3, + /datum/gas/plasma = 1, + /datum/gas/carbon_dioxide = 1, + /datum/gas/water_vapor = 3 + ) + ///Possible exchange gasses + var/list/exchange_gasses = list( + /datum/gas/bz = 3, + /datum/gas/hypernoblium = 1, + /datum/gas/plasma = 3, + /datum/gas/tritium = 2, + /datum/gas/nitryl = 1 + ) + ///Choosen target gas + var/datum/gas/choosen_target + ///Choosen exchange gas + var/datum/gas/choosen_exchange + ///Max amount of moles we exchange at once + var/max_moles = 10 + +/datum/xenoartifact_trait/major/gas/New(atom/_parent) + . = ..() + choosen_target = pick_weight(target_gasses) + choosen_exchange = pick_weight(exchange_gasses) + +/datum/xenoartifact_trait/major/gas/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(component_parent.parent) + var/datum/gas_mixture/air = T.return_air() + var/input_id = initial(choosen_target.id) + var/output_id = initial(choosen_exchange.id) + var/moles = min(air.get_moles(input_id), max_moles) + air.adjust_moles(input_id, -moles) + air.adjust_moles(output_id, moles) + +/datum/xenoartifact_trait/major/gas/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + +/datum/xenoartifact_trait/major/gas/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/analyzer)) + to_chat(user, "[item] detects [initial(choosen_target.name)] exchanging into [initial(choosen_exchange.name)] \ + at a rate of [max_moles] moles!") + return ..() diff --git a/code/modules/xenoarchaeology/traits/majors/shadow_realm.dm b/code/modules/xenoarchaeology/traits/majors/shadow_realm.dm new file mode 100644 index 0000000000000..203bc7f8242cb --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/shadow_realm.dm @@ -0,0 +1,44 @@ +/* + Destabilizing + Send the target to the shadow realm +*/ +/datum/xenoartifact_trait/major/shadow_realm + label_name = "Destabilizing" + label_desc = "Destabilizing: The artifact seems to contain destabilizing components. Triggering these components will cause the artifact transport the target to another realm." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + rarity = XENOA_TRAIT_WEIGHT_EPIC + weight = 36 + conductivity = 36 + +/datum/xenoartifact_trait/major/shadow_realm/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + GLOB.destabliization_exits += component_parent?.parent + +/datum/xenoartifact_trait/major/shadow_realm/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + GLOB.destabliization_exits -= component_parent.parent + return ..() + +/datum/xenoartifact_trait/major/shadow_realm/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in focus) + if(target.anchored) + continue + //handle being held + var/atom/movable/movable = component_parent.parent + if(!isturf(movable.loc) && locate(movable.loc) in focus) + if(isliving(movable.loc)) + var/mob/living/L = movable.loc + L.dropItemToGround(movable, TRUE) + else + movable.forceMove(get_turf(movable.loc)) + //Banish target + target.forceMove(pick(GLOB.destabilization_spawns)) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/majors/temporal.dm b/code/modules/xenoarchaeology/traits/majors/temporal.dm new file mode 100644 index 0000000000000..c42c820242077 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors/temporal.dm @@ -0,0 +1,22 @@ +/* + Temporal + Creates a timestop object at the position of the artfiact +*/ +/datum/xenoartifact_trait/major/timestop + label_name = "Temporal" + label_desc = "Temporal: The artifact seems to contain temporal components. Triggering these components will create a temporal rift." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 24 + ///Maximum time we stop time for + var/max_time = 10 SECONDS + +/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(component_parent.parent) + if(!T) + return + new /obj/effect/timestop(T, 2, ((component_parent.trait_strength/100)*max_time), component_parent.parent) diff --git a/code/modules/xenoarchaeology/traits/malfunction/_malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunction/_malfunctions.dm new file mode 100644 index 0000000000000..367bb6d8404fe --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/_malfunctions.dm @@ -0,0 +1,33 @@ +/* + Malfunction + These traits cause the xenoartifact to malfunction, typically making the artifact wrose + + * weight - All malfunctions should have a weight that is a multiple of 7 + * conductivity - If a malfunction should have conductivity, it will be a multiple of 7 too +*/ +/datum/xenoartifact_trait/malfunction + priority = TRAIT_PRIORITY_MALFUNCTION + register_targets = FALSE + weight = 7 + conductivity = 0 + contribute_calibration = FALSE + can_pearl = FALSE + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + +/datum/xenoartifact_trait/malfunction/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in oview(XENOA_TRAIT_BALLOON_HINT_DIST, get_turf(component_parent.parent))) + do_hint(M) + +/datum/xenoartifact_trait/malfunction/do_hint(mob/user, atom/item) + //If they have science goggles, or equivilent, they are shown exatcly what trait this is + if(!user?.can_see_reagents()) + return + var/atom/atom_parent = component_parent.parent + if(!isturf(atom_parent.loc)) + atom_parent = atom_parent.loc + atom_parent.balloon_alert(user, label_name, component_parent.artifact_material.material_color, offset_y = 8) + //show_in_chat doesn't work + to_chat(user, "[component_parent.parent] : [label_name]") diff --git a/code/modules/xenoarchaeology/traits/malfunction/animal.dm b/code/modules/xenoarchaeology/traits/malfunction/animal.dm new file mode 100644 index 0000000000000..d135597e7b211 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/animal.dm @@ -0,0 +1,102 @@ +/* + Parallel Entity Retrieval + Summons entitiess +*/ +/datum/xenoartifact_trait/malfunction/animal + label_name = "P.E.R." + alt_label_name = "Parallel Entity Retrieval" + label_desc = "Parallel Entity Retrieval: A strange malfunction causes the Artifact to open a gateway to another plane that summons a random entity." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///List of our current summons + var/list/summons = list() + ///Max summons? + var/max_summons = 4 + ///What kinda of *thing* are we summoning + var/mob/summon_type = /mob/living/simple_animal/hostile/bear/malnourished + +/datum/xenoartifact_trait/malfunction/animal/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + if(length(summons) >= max_summons) + return + build_summon() + +/datum/xenoartifact_trait/malfunction/animal/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("summon bears")) + +//Keep this here so inheritance & poly is easier +/datum/xenoartifact_trait/malfunction/animal/proc/build_summon() + var/turf/T = get_turf(component_parent.parent) + var/mob/living/M = new summon_type(T) + summons += M + RegisterSignal(M, COMSIG_MOB_DEATH, PROC_REF(handle_death)) + +/datum/xenoartifact_trait/malfunction/animal/proc/handle_death(datum/source) + SIGNAL_HANDLER + + summons -= source + UnregisterSignal(source, COMSIG_MOB_DEATH) + +//carp variant +/datum/xenoartifact_trait/malfunction/animal/carp + label_name = "P.E.R. Δ" + alt_label_name = "Parallel Entity Retrieval Δ" + label_desc = "Parallel Entity Retrieval Δ: A strange malfunction causes the Artifact to open a gateway to another plane that summons a random entity." + max_summons = 6 + summon_type = /mob/living/simple_animal/hostile/carp + conductivity = 7 + +/datum/xenoartifact_trait/malfunction/animal/carp/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("summon space carps")) + +/* Mirrored Bluespace Collapse + Makes evil clones! +*/ +/datum/xenoartifact_trait/malfunction/animal/twin + label_name = "M.B.C." + alt_label_name = "Mirrored Bluespace Collapse" + label_desc = "Mirrored Bluespace Collapse: The Artifact produces an arguably maleviolent clone of target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/animal/twin/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(!isitem(target) && !isliving(target)) + continue + build_summon(target) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/malfunction/animal/twin/build_summon(atom/target) + if(!target || !isitem(target) && !ismob(target) || length(summons) >= max_summons) + return + var/mob/living/simple_animal/hostile/twin/T = new(get_turf(component_parent.parent)) + //Setup appearance for evil twin + T.appearance = target.appearance + T.color = component_parent.artifact_material.material_color + //Handle limit and hardel + summons += T + RegisterSignal(T, COMSIG_PARENT_QDELETING, PROC_REF(handle_death)) + +/mob/living/simple_animal/hostile/twin + name = "evil twin" + desc = "It looks so familiar." + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + speak_chance = 0 + turns_per_move = 5 + speed = 0 + maxHealth = 10 + health = 10 + melee_damage = 5 + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = INTENT_HARM + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("evil_clone") + status_flags = CANPUSH + del_on_death = TRUE + mobchatspan = "syndmob" diff --git a/code/modules/xenoarchaeology/traits/malfunction/explosion.dm b/code/modules/xenoarchaeology/traits/malfunction/explosion.dm new file mode 100644 index 0000000000000..b5debd6f8c0f9 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/explosion.dm @@ -0,0 +1,72 @@ +/* + Expansive Explosive Emmission + I'm about to blow up, and act like I don't know nobody! AH AH AH AH AH! +*/ +/datum/xenoartifact_trait/malfunction/explosion + label_name = "E.E.E." + alt_label_name = "Expansive Explosive Emmission" + label_desc = "Expansive Explosive Emmission: A strange malfunction that causes the Artifact to explode." + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + rarity = XENOA_TRAIT_WEIGHT_RARE + can_pearl = FALSE + ///Max explosion stat + var/max_explosion = 4 + ///Are we exploding? + var/exploding + ///Ref to the exploding effect + var/atom/movable/exploding_indicator //We can't use an overlay, becuase it breaks filters, and the overlay filter doesn't animate + +/datum/xenoartifact_trait/malfunction/explosion/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/obj/obj_parent = component_parent.parent + //Make the artifact robust so it doesn't destroy itself + obj_parent.set_armor_rating(BOMB, 500) + //Build indicator appearance + exploding_indicator = new() + exploding_indicator.appearance = mutable_appearance('icons/obj/xenoarchaeology/xenoartifact.dmi', "explosion_warning", plane = LOWEST_EVER_PLANE) + exploding_indicator.render_target = "[REF(exploding_indicator)]" + exploding_indicator.vis_flags = VIS_UNDERLAY + exploding_indicator.appearance_flags = KEEP_APART + //Get it nearby so we can render it later + obj_parent.vis_contents += exploding_indicator + //Register a signal to cancel the process + RegisterSignal(component_parent, COMSIG_XENOA_CALCIFIED, PROC_REF(cancel_explosion)) + +/datum/xenoartifact_trait/malfunction/explosion/Destroy(force, ...) + . = ..() + QDEL_NULL(exploding_indicator) + +/datum/xenoartifact_trait/malfunction/explosion/trigger(datum/source, _priority, atom/override) + . = ..() + if(!. || exploding) + return + var/atom/atom_parent = component_parent.parent + atom_parent.visible_message("The [atom_parent] begins to heat up, it's delaminating!", allow_inside_usr = TRUE) + exploding = addtimer(CALLBACK(src, PROC_REF(explode)), 30*(component_parent.trait_strength/100) SECONDS, TIMER_STOPPABLE) + //Fancy effect to alert players + atom_parent.add_filter("explosion_indicator", 1.1, layering_filter(render_source = exploding_indicator.render_target, blend_mode = BLEND_INSET_OVERLAY)) + atom_parent.add_filter("wave_effect", 5, wave_filter(x = 1, size = 0.6)) + var/filter = atom_parent.get_filter("wave_effect") + animate(filter, offset = 5, time = 5 SECONDS, loop = -1) + animate(offset = 0, time = 5 SECONDS) + +/datum/xenoartifact_trait/malfunction/explosion/proc/explode() + var/atom/atom_parent = component_parent.parent + atom_parent.remove_filter("explosion_indicator") + atom_parent.remove_filter("wave_effect") + if(component_parent.calcified) //Just in-case this somehow happens + return + explosion(get_turf(component_parent.parent), max_explosion/3*(component_parent.trait_strength/100), max_explosion/2*(component_parent.trait_strength/100), max_explosion*(component_parent.trait_strength/100), max_explosion*(component_parent.trait_strength/100)) + component_parent.calcify() + +//Tidy stuff up when we're calcified +/datum/xenoartifact_trait/malfunction/explosion/proc/cancel_explosion() + SIGNAL_HANDLER + + var/atom/atom_parent = component_parent.parent + atom_parent.remove_filter("explosion_indicator") + atom_parent.remove_filter("wave_effect") + deltimer(exploding) + UnregisterSignal(component_parent, COMSIG_XENOA_CALCIFIED) diff --git a/code/modules/xenoarchaeology/traits/malfunction/hallucination.dm b/code/modules/xenoarchaeology/traits/malfunction/hallucination.dm new file mode 100644 index 0000000000000..ce60896fc3c27 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/hallucination.dm @@ -0,0 +1,20 @@ +/* + Mass Hallucinatory Injection + Makes the target/s hallucinate +*/ +/datum/xenoartifact_trait/malfunction/hallucination + label_name = "M.H.I." + alt_label_name = "Mass Hallucinatory Injection" + label_desc = "Mass Hallucinatory Injection: The Artifact causes the target to hallucinate." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/hallucination/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/target in focus) + var/datum/hallucination/H = pick(GLOB.hallucination_list) + H = new H(target) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/malfunction/heated.dm b/code/modules/xenoarchaeology/traits/malfunction/heated.dm new file mode 100644 index 0000000000000..0e6e7aeb8f1fd --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/heated.dm @@ -0,0 +1,42 @@ +/* + Mass Area Combustion + Makes a bunch of hotspots near the artifact +*/ +/datum/xenoartifact_trait/malfunction/heated + label_name = "M.A.C." + alt_label_name = "Mass Area Combustion" + label_desc = "Mass Area Combustion: A strange malfunction that causes the Artifact to violently combust." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + +/datum/xenoartifact_trait/malfunction/heated/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(component_parent.parent) + playsound(T, 'sound/effects/bamf.ogg', 50, TRUE) + for(var/turf/open/turf in RANGE_TURFS(max(1, 4*(component_parent.trait_strength/100)), T)) + if(!locate(/obj/effect/safe_fire) in turf) + new /obj/effect/safe_fire(turf) + +//Lights on fire, does nothing else damage / atmos wise +/obj/effect/safe_fire + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/effects/fire.dmi' + icon_state = "1" + layer = GASFIRE_LAYER + blend_mode = BLEND_ADD + light_system = MOVABLE_LIGHT + light_range = LIGHT_RANGE_FIRE + light_power = 1 + light_color = LIGHT_COLOR_FIRE + +/obj/effect/safe_fire/Initialize(mapload) + . = ..() + for(var/atom/AT in loc) + if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose + AT.fire_act(400, 50) //should be average enough to not do too much damage + addtimer(CALLBACK(src, PROC_REF(after_burn)), 0.3 SECONDS) + +/obj/effect/safe_fire/proc/after_burn() + qdel(src) diff --git a/code/modules/xenoarchaeology/traits/malfunction/organ_stealer.dm b/code/modules/xenoarchaeology/traits/malfunction/organ_stealer.dm new file mode 100644 index 0000000000000..8dbed1e45f140 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/organ_stealer.dm @@ -0,0 +1,39 @@ +/* + Immediate Organ Extraction + steals the target's appendix +*/ +/datum/xenoartifact_trait/malfunction/organ_stealer + label_name = "I.O.E" + alt_label_name = "Immediate Organ Extraction" + label_desc = "Immediate Organ Extraction: A strange malfunction causes the Artifact to extract the target's appendix." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + ///What organ slot do we yank from + var/target_organ_slot = ORGAN_SLOT_APPENDIX + +/datum/xenoartifact_trait/malfunction/organ_stealer/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/M in focus) + var/obj/item/organ/O = M.getorganslot(target_organ_slot) + O?.Remove(M) + O?.forceMove(get_turf(component_parent.parent)) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/malfunction/organ_stealer/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("steal the target's appendix")) + +//This variant will steal the target's tongue +/datum/xenoartifact_trait/malfunction/organ_stealer/tongue + label_name = "I.O.E Δ" + alt_label_name = "Immediate Organ Extraction Δ" + label_desc = "Immediate Organ Extraction Δ: A strange malfunction causes the Artifact to extract the target's tongue." + target_organ_slot = ORGAN_SLOT_TONGUE + conductivity = 14 + +/datum/xenoartifact_trait/malfunction/organ_stealer/tongue/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("steal the target's tongue")) diff --git a/code/modules/xenoarchaeology/traits/malfunction/radiation.dm b/code/modules/xenoarchaeology/traits/malfunction/radiation.dm new file mode 100644 index 0000000000000..833277d551730 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/radiation.dm @@ -0,0 +1,23 @@ +/* + Rapid Particle Emmision + Irradiates the artifact and targets +*/ +/datum/xenoartifact_trait/malfunction/radiation + label_name = "R.P.E." + alt_label_name = "Rapid Particle Emmision" + label_desc = "Rapid Particle Emmision: A strange malfunction that causes the Artifact to irradiate itself and its targets." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + ///Max amount of radiation we can deal + var/max_rad = 25 + +/datum/xenoartifact_trait/malfunction/radiation/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/atom/atom_parent = component_parent.parent + atom_parent.rad_act(max_rad*(component_parent.trait_strength/100)) + for(var/atom/target in focus) + target.rad_act(max_rad*(component_parent.trait_strength/100)) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/malfunction/strip.dm b/code/modules/xenoarchaeology/traits/malfunction/strip.dm new file mode 100644 index 0000000000000..cebce34ad2add --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/strip.dm @@ -0,0 +1,27 @@ + +/* + Bluespace Axis Desync + Strips a random article from the target +*/ +/datum/xenoartifact_trait/malfunction/strip + label_name = "B.A.D." + alt_label_name = "Bluespace Axis Desync" + label_desc = "Bluespace Axis Desync: A strange malfunction causes the Artifact to remove articles from the target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/strip/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in focus) + var/list/clothing_list = list() + for(var/obj/item/clothing/I in M.contents) + clothing_list += I + if(!length(clothing_list)) + break + var/obj/item/clothing/C = pick(clothing_list) + if(!HAS_TRAIT_FROM(C, TRAIT_NODROP, GLUED_ITEM_TRAIT)) + M.dropItemToGround(C) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/malfunction/trauma.dm b/code/modules/xenoarchaeology/traits/malfunction/trauma.dm new file mode 100644 index 0000000000000..13953f60a5db5 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/trauma.dm @@ -0,0 +1,32 @@ +/* + Cerebral Dysfunction Emergence + Gives the target a trauma +*/ +/datum/xenoartifact_trait/malfunction/trauma + label_name = "C.D.E." + alt_label_name = "Cerebral Dysfunction Emergence" + label_desc = "Cerebral Dysfunction Emergence: A strange malfunction causes the Artifact to cause traumas to emerge in the target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + ///Possbile traumas + var/list/possible_traumas = list( + /datum/brain_trauma/mild/hallucinations, /datum/brain_trauma/mild/stuttering, /datum/brain_trauma/mild/dumbness, + /datum/brain_trauma/mild/speech_impediment, /datum/brain_trauma/mild/concussion, /datum/brain_trauma/mild/muscle_weakness, + /datum/brain_trauma/mild/expressive_aphasia, /datum/brain_trauma/severe/narcolepsy, /datum/brain_trauma/severe/discoordination, + /datum/brain_trauma/severe/pacifism, /datum/brain_trauma/special/beepsky) + ///Choosen trauma + var/datum/brain_trauma/trauma + +/datum/xenoartifact_trait/malfunction/trauma/New(atom/_parent) + . = ..() + trauma = pick(possible_traumas) + +/datum/xenoartifact_trait/malfunction/trauma/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/M in focus) + M.Unconscious(0.5 SECONDS) + M.gain_trauma(trauma, TRAUMA_RESILIENCE_BASIC) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/malfunction/vomit.dm b/code/modules/xenoarchaeology/traits/malfunction/vomit.dm new file mode 100644 index 0000000000000..58ea19d27d340 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunction/vomit.dm @@ -0,0 +1,23 @@ +/* + Spontaneous Stomach Evacuation + makes the target puke +*/ +/datum/xenoartifact_trait/malfunction/vomit + label_name = "S.S.E." + alt_label_name = "Spontaneous Stomach Evacuation" + label_desc = "Spontaneous Stomach Evacuationc: A strange malfunction causes the Artifact to make the target vomit." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/vomit/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in focus) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.vomit(distance = rand(1, 2)) + else + new /obj/effect/decal/cleanable/vomit(get_turf(component_parent.parent)) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/minors/_minors.dm b/code/modules/xenoarchaeology/traits/minors/_minors.dm new file mode 100644 index 0000000000000..2d9e69721f868 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/_minors.dm @@ -0,0 +1,13 @@ +/* + Minors + These traits cause the xenoartifact to behave uniquely, just misc shit + + * weight - All minors should have a weight that is a multiple of 5 + * conductivity - If a minor should have conductivity, it will be a multiple of 5 too +*/ + +/datum/xenoartifact_trait/minor + priority = TRAIT_PRIORITY_MINOR + register_targets = FALSE + weight = 5 + conductivity = 0 diff --git a/code/modules/xenoarchaeology/traits/minors/aerodynamic.dm b/code/modules/xenoarchaeology/traits/minors/aerodynamic.dm new file mode 100644 index 0000000000000..c2376d7839367 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/aerodynamic.dm @@ -0,0 +1,35 @@ +/* + Aerodynamic + Makes the artifact easy to throw +*/ +/datum/xenoartifact_trait/minor/aerodynamic + material_desc = "aerodynamic" + label_name = "Aerodynamic" + label_desc = "Aerodynamic: The artifact's design seems to incorporate aerodynamicded elements. This will allow the artifact to be thrown further." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = -5 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Old throw range + var/old_throw_range + +/datum/xenoartifact_trait/minor/aerodynamic/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/atom/movable/movable = component_parent.parent + if(ismovable(movable)) + old_throw_range = movable.throw_range + movable.throw_range = 9 + +/datum/xenoartifact_trait/minor/aerodynamic/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + var/atom/movable/movable = component_parent.parent + if(ismovable(movable)) + movable.throw_range = old_throw_range + return ..() + +/datum/xenoartifact_trait/minor/aerodynamic/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/minors/anchor.dm b/code/modules/xenoarchaeology/traits/minors/anchor.dm new file mode 100644 index 0000000000000..06327760327c8 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/anchor.dm @@ -0,0 +1,47 @@ +/* + Anchor + Anchors the artifact +*/ +/datum/xenoartifact_trait/minor/anchor + label_name = "Anchor" + label_desc = "Anchor: The artifact's design seems to incorporate anchoring elements. This will cause the artifact to anchor when triggered, it can also be unanchored with typical tools." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 10 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + +/datum/xenoartifact_trait/minor/anchor/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/atom/movable/movable = component_parent.parent + if(ismovable(movable)) + RegisterSignal(movable, COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), PROC_REF(toggle_anchor)) + +/datum/xenoartifact_trait/minor/anchor/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + var/atom/movable/movable = component_parent.parent + if(ismovable(movable)) + movable.anchored = FALSE + return ..() + +/datum/xenoartifact_trait/minor/anchor/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + toggle_anchor() + +/datum/xenoartifact_trait/minor/anchor/proc/toggle_anchor(datum/source, mob/living/user, obj/item/I, list/recipes) + SIGNAL_HANDLER + + var/atom/movable/movable = component_parent?.parent + //handle being held + if(isliving(movable.loc)) + var/mob/living/M = movable.loc + M.dropItemToGround(movable) + //Anchor + if(ismovable(movable) && isturf(movable.loc)) + movable.anchored = !movable.anchored + playsound(get_turf(component_parent?.parent), 'sound/items/handling/wrench_pickup.ogg', 50, TRUE) + //Message + movable.visible_message("[movable] [movable.anchored ? "anchors to" : "unanchors from"] [get_turf(movable)]!", allow_inside_usr = TRUE) diff --git a/code/modules/xenoarchaeology/traits/minors/aura.dm b/code/modules/xenoarchaeology/traits/minors/aura.dm new file mode 100644 index 0000000000000..1254eb989c344 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/aura.dm @@ -0,0 +1,26 @@ +/* + Aura + Adds nearby atoms to the target list +*/ +/datum/xenoartifact_trait/minor/aura + label_name = "Aura" + label_desc = "Aura: The artifact's design seems to incorporate aura elements. This will cause the artifact to target things nearby." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + extra_target_range = 2 + weight = 15 + conductivity = 5 + ///Max amount of extra targets we can have + var/max_extra_targets = 10 + +/datum/xenoartifact_trait/minor/aura/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in oview(component_parent.target_range, get_turf(component_parent?.parent))) + if(length(component_parent.targets) > (max_extra_targets * (component_parent.trait_strength/100))) + continue + //Only add mobs or items + if(!ismob(target) && !isitem(target)) + continue + component_parent.register_target(target) diff --git a/code/modules/xenoarchaeology/traits/minors/bleeding.dm b/code/modules/xenoarchaeology/traits/minors/bleeding.dm new file mode 100644 index 0000000000000..70652be4798a8 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/bleeding.dm @@ -0,0 +1,66 @@ +/* + Bleeding + The artifact bleeds for a short period after being activated +*/ +/datum/xenoartifact_trait/minor/bleed + label_name = "Bleeding" + label_desc = "Bleeding: The artifact's design seems to incorporate bleeding elements. This will cause the artifact to bleed when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + blacklist_traits = list(/datum/xenoartifact_trait/minor/bleed/fun) + ///Timer stuff to keep track of when we're bleeding + var/bleed_duration = 5 SECONDS + var/bleed_timer + ///Which blood decal do we use? + var/blood_splat = /obj/effect/decal/cleanable/blood + var/blood_tracks = /obj/effect/decal/cleanable/blood/tracks + +/datum/xenoartifact_trait/minor/bleed/trigger(datum/source, _priority, atom/override) + . = ..() + if(!. || bleed_timer) + return + playsound(component_parent.parent, 'sound/effects/splat.ogg', 50, TRUE) + new blood_splat(get_turf(component_parent.parent)) + bleed_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), bleed_duration, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/minor/bleed/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("bleed red blood")) + +/datum/xenoartifact_trait/minor/bleed/catch_move(datum/source, atom/target, dir) + . = ..() + if(!bleed_timer) + return + var/obj/effect/decal/cleanable/blood/tracks/T = new blood_tracks(get_turf(component_parent.parent)) + T.setDir(dir) + +/datum/xenoartifact_trait/minor/bleed/proc/reset_timer() + if(bleed_timer) + deltimer(bleed_timer) + bleed_timer = null + +//Fun variant +/obj/effect/decal/cleanable/blood/fun + +/obj/effect/decal/cleanable/blood/fun/Initialize(mapload) + color = "#[random_color()]" + return ..() + +/obj/effect/decal/cleanable/blood/tracks/fun + +/obj/effect/decal/cleanable/blood/tracks/fun/Initialize(mapload) + color = "#[random_color()]" + return ..() + +/datum/xenoartifact_trait/minor/bleed/fun + label_name = "Bleeding Δ" + label_desc = "Bleeding Δ: The artifact's design seems to incorporate bleeding elements. This will cause the artifact to bleed when triggered." + conductivity = 15 + flags = XENOA_MISC_TRAIT | XENOA_HIDE_TRAIT //Delete this line when the blood changes come back + blacklist_traits = list(/datum/xenoartifact_trait/minor/bleed) + blood_splat = /obj/effect/decal/cleanable/blood/fun + blood_tracks = /obj/effect/decal/cleanable/blood/tracks/fun + +/datum/xenoartifact_trait/minor/bleed/fun/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("bleed 'clown' blood")) diff --git a/code/modules/xenoarchaeology/traits/minors/capacitive.dm b/code/modules/xenoarchaeology/traits/minors/capacitive.dm new file mode 100644 index 0000000000000..2fc37d906966a --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/capacitive.dm @@ -0,0 +1,45 @@ +/* + Capacitive + Gives the artifact extra uses +*/ +/datum/xenoartifact_trait/minor/capacitive + material_desc = "capacitive" + label_name = "Capacitive" + label_desc = "Capacitive: The artifact's design seems to incorporate a capacitive elements. This will cause the artifact to have more uses." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 30 + ///How many extra charges do we get? + var/max_charges = 2 + ///How many extra charges do we have? + var/current_charge + +/datum/xenoartifact_trait/minor/capacitive/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + current_charge = max_charges + component_parent.cooldown_disabled = TRUE + setup_generic_item_hint() + +/datum/xenoartifact_trait/minor/capacitive/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + if(current_charge) + component_parent.reset_timer() + current_charge -= 1 + component_parent.cooldown_disabled = TRUE + else + playsound(get_turf(component_parent?.parent), 'sound/machines/capacitor_charge.ogg', 50, TRUE) + current_charge = max_charges + component_parent.cooldown_disabled = FALSE + +/datum/xenoartifact_trait/minor/capacitive/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/multitool)) + to_chat(user, "[item] detects [current_charge] additional charges!") + return ..() + +/datum/xenoartifact_trait/minor/capacitive/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_DETECT("multitool, which will also reveal the artifact's additional charges.")) diff --git a/code/modules/xenoarchaeology/traits/minors/charged.dm b/code/modules/xenoarchaeology/traits/minors/charged.dm new file mode 100644 index 0000000000000..b9ff743844637 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/charged.dm @@ -0,0 +1,51 @@ +/* + Charged + Increases the artifact trait strength by 25% +*/ +/datum/xenoartifact_trait/minor/charged + material_desc = "charged" + label_name = "Charged" + label_desc = "Charged: The artifact's design seems to incorporate looping elements. This will cause the artifact to produce more powerful effects." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 10 + conductivity = 15 + ///Reference to our particle holder + var/atom/movable/artifact_particle_holder/particle_holder + +/datum/xenoartifact_trait/minor/charged/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + component_parent.trait_strength *= 1.25 + setup_generic_touch_hint() + +/datum/xenoartifact_trait/minor/charged/remove_parent(datum/source, pensive) + if(!component_parent) + return ..() + component_parent.trait_strength /= 1.25 + return ..() + +/datum/xenoartifact_trait/minor/charged/do_hint(mob/user, atom/item) + . = ..() + to_chat(user, "Your hair stands on end!") + +/datum/xenoartifact_trait/minor/charged/generate_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + //Build particle holder + particle_holder = new(component_parent?.parent) + particle_holder.add_emitter(/obj/emitter/electrified, "electrified", 10) + //Layer onto parent + target.vis_contents += particle_holder + +/datum/xenoartifact_trait/minor/charged/cut_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + target.vis_contents -= particle_holder + QDEL_NULL(particle_holder) + +/datum/xenoartifact_trait/minor/charged/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND, XENOA_TRAIT_HINT_APPEARANCE("This trait will make static particles appear around the artifact.")) diff --git a/code/modules/xenoarchaeology/traits/minors/cooling.dm b/code/modules/xenoarchaeology/traits/minors/cooling.dm new file mode 100644 index 0000000000000..f5e247304b068 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/cooling.dm @@ -0,0 +1,43 @@ +/* + Cooling + Decreases the artifact's initial cooldown by 5 seconds +*/ +/datum/xenoartifact_trait/minor/cooling + material_desc = "cooling" + label_name = "Cooling" + label_desc = "Cooling: The artifact's design seems to incorporate cooling elements. This will cause the artifact to cooldown faster." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = -4 SECONDS //Point of balance + weight = 15 + var/atom/movable/artifact_particle_holder/particle_holder + +/datum/xenoartifact_trait/minor/cooling/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + setup_generic_touch_hint() + +/datum/xenoartifact_trait/minor/cooling/do_hint(mob/user, atom/item) + . = ..() + to_chat(user, "[component_parent?.parent] feels cool to the touch!") + +/datum/xenoartifact_trait/minor/cooling/generate_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + //Build particle holder + particle_holder = new(component_parent?.parent) + particle_holder.add_emitter(/obj/emitter/snow, "snow", 10) + //Layer onto parent + target.vis_contents += particle_holder + +/datum/xenoartifact_trait/minor/cooling/cut_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + target.vis_contents -= particle_holder + QDEL_NULL(particle_holder) + +/datum/xenoartifact_trait/minor/cooling/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND, XENOA_TRAIT_HINT_APPEARANCE("This trait will make frost particles appear around the artifact.")) diff --git a/code/modules/xenoarchaeology/traits/minors/delicate.dm b/code/modules/xenoarchaeology/traits/minors/delicate.dm new file mode 100644 index 0000000000000..1dd5b777b2779 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/delicate.dm @@ -0,0 +1,44 @@ +/* + Delicate + The artifact has limited uses +*/ +/datum/xenoartifact_trait/minor/delicate + material_desc = "delicate" + label_name = "Delicate" + label_desc = "Delicate: The artifact's design seems to delicate cooling elements. This will cause the artifact to potentially break." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = -5 + incompatabilities = TRAIT_INCOMPATIBLE_MOB + ///Max amount of uses + var/max_uses + ///How many uses we have left + var/current_uses + +/datum/xenoartifact_trait/minor/delicate/New(atom/_parent) + . = ..() + //Generate uses + max_uses = pick(list(3, 6, 9)) + current_uses = max_uses + +/datum/xenoartifact_trait/minor/delicate/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + playsound(get_turf(component_parent?.parent), 'sound/effects/glass_step.ogg', 50, TRUE) + if(current_uses) + current_uses -= 1 + else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break + component_parent.calcify() + playsound(get_turf(component_parent?.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) + +/datum/xenoartifact_trait/minor/delicate/generate_trait_appearance(atom/target) + . = ..() + target.alpha *= 0.7 + +/datum/xenoartifact_trait/minor/delicate/cut_trait_appearance(atom/target) + . = ..() + target.alpha /= 0.7 + +/datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make the artifact noticeably transparent.")) diff --git a/code/modules/xenoarchaeology/traits/minors/dense.dm b/code/modules/xenoarchaeology/traits/minors/dense.dm new file mode 100644 index 0000000000000..ed7c780ac7485 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/dense.dm @@ -0,0 +1,47 @@ +/* + Dense + Makes the artifact behave like a structure +*/ +/datum/xenoartifact_trait/minor/dense + material_desc = "dense" + label_name = "Dense" + label_desc = "Dense: The artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/ringed, /datum/xenoartifact_trait/minor/shielded, + /datum/xenoartifact_trait/minor/aerodynamic, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/ringed/attack) + weight = 30 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Old value tracker + var/old_density + var/old_atom_flag + var/old_item_flag + +/datum/xenoartifact_trait/minor/dense/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/obj/item/item_parent = component_parent.parent + //Density + old_density = item_parent.density + item_parent.density = TRUE + //Atom flag + old_atom_flag = item_parent.interaction_flags_atom + item_parent.interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + //Item flag + if(isitem(item_parent)) + old_item_flag = item_parent.interaction_flags_item + item_parent.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND + +/datum/xenoartifact_trait/minor/dense/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + var/obj/item/item_parent = component_parent.parent + item_parent.density = old_density + item_parent.interaction_flags_atom = old_atom_flag + if(isitem(item_parent)) + item_parent.interaction_flags_item = old_item_flag + return ..() + +/datum/xenoartifact_trait/minor/dense/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/minors/haunted.dm b/code/modules/xenoarchaeology/traits/minors/haunted.dm new file mode 100644 index 0000000000000..73de78184916f --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/haunted.dm @@ -0,0 +1,114 @@ +/* + Haunted + Allows the artifact to be controlled by ghosts +*/ +/datum/xenoartifact_trait/minor/haunted + label_name = "Haunted" + label_desc = "Haunted: The artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 35 + blacklist_traits = list(/datum/xenoartifact_trait/minor/haunted/instant) + incompatabilities = TRAIT_INCOMPATIBLE_MOB + can_pearl = FALSE + ///Refernce to move component for later cleanup + var/datum/component/deadchat_control/controller + ///How long between moves + var/move_delay = 8 SECONDS + ///Ref to our landmark + var/obj/effect/landmark/landmark + +/datum/xenoartifact_trait/minor/haunted/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/atom/atom_parent = component_parent.parent + controller = atom_parent._AddComponent(list(/datum/component/deadchat_control, "democracy", list( + "up" = CALLBACK(src, PROC_REF(haunted_step), atom_parent, NORTH), + "down" = CALLBACK(src, PROC_REF(haunted_step), atom_parent, SOUTH), + "left" = CALLBACK(src, PROC_REF(haunted_step), atom_parent, WEST), + "right" = CALLBACK(src, PROC_REF(haunted_step), atom_parent, EAST), + "activate" = CALLBACK(src, PROC_REF(activate_parent), atom_parent)), move_delay)) + addtimer(CALLBACK(src, PROC_REF(do_wail)), 35 SECONDS) + //Landmark + landmark = new(component_parent?.parent) + +/datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) + QDEL_NULL(controller) + QDEL_NULL(landmark) + return ..() + +/datum/xenoartifact_trait/minor/haunted/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/storage/book/bible)) + to_chat(user, "[item] upsets the sprits of [component_parent?.parent]!") + return ..() + +/datum/xenoartifact_trait/minor/haunted/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_DETECT("bible"), + XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, every 8 seconds"), + XENOA_TRAIT_HINT_SOUND("ghost moaning")) + +/datum/xenoartifact_trait/minor/haunted/proc/do_wail(repeat = TRUE) + if(QDELETED(src)) + return + var/atom/atom_parent = component_parent.parent + if(isturf(atom_parent.loc)) + playsound(get_turf(component_parent?.parent), 'sound/spookoween/ghost_whisper_short.ogg', 30, TRUE) + addtimer(CALLBACK(src, PROC_REF(do_wail)), 35 SECONDS) + + +/datum/xenoartifact_trait/minor/haunted/proc/haunted_step(atom/movable/target, dir) + if(component_parent.calcified) + return + //Make any mobs drop this before it moves + if(isliving(target.loc)) + var/mob/living/M = target.loc + M.dropItemToGround(target) + playsound(get_turf(target), 'sound/effects/magic.ogg', 50, TRUE) + step(target, dir) + +/datum/xenoartifact_trait/minor/haunted/proc/activate_parent() + if(component_parent.calcified) + return + //Find a target + for(var/atom/target in oview(component_parent.target_range, get_turf(component_parent?.parent))) + component_parent.register_target(target, TRUE) + component_parent.trigger(TRUE) + return + +//Instant variant, no move delay. Can only move when not seen +/datum/xenoartifact_trait/minor/haunted/instant + label_name = "Haunted Δ" + label_desc = "Haunted Δ: The artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly, when not observed." + move_delay = 1 SECONDS + blacklist_traits = list(/datum/xenoartifact_trait/minor/haunted) + conductivity = 5 + ///Cooldown for the use action + var/action_cooldown + var/action_cooldown_time = 8 SECONDS + ///How far we look for mobs + var/seek_distance = 9 + +/datum/xenoartifact_trait/minor/haunted/instant/haunted_step(atom/movable/target, dir) + if(component_parent.calcified) + return + //This may seem scary, and expensive, but it's only called WHEN ghosts try to move the artifact + var/list/mobs = oview(seek_distance, component_parent.parent) + for(var/mob/living/M in mobs) + if(!M.stat && M.ckey) + return + return ..() + +/datum/xenoartifact_trait/minor/haunted/instant/activate_parent() + if(!action_cooldown) + action_cooldown = addtimer(CALLBACK(src, PROC_REF(reset_action_timer)), action_cooldown_time, TIMER_STOPPABLE) + return ..() + +/datum/xenoartifact_trait/minor/haunted/instant/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_DETECT("bible"), + XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, when no-one is looking"), + XENOA_TRAIT_HINT_SOUND("ghost moaning")) + +/datum/xenoartifact_trait/minor/haunted/instant/proc/reset_action_timer() + if(action_cooldown) + deltimer(action_cooldown) + action_cooldown = null diff --git a/code/modules/xenoarchaeology/traits/minors/impulsing.dm b/code/modules/xenoarchaeology/traits/minors/impulsing.dm new file mode 100644 index 0000000000000..1acf3d517ac8c --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/impulsing.dm @@ -0,0 +1,28 @@ +/* + Impulsing + The artifact dashes away when activated +*/ +/datum/xenoartifact_trait/minor/impulse + label_name = "Impulsing" + label_desc = "Impulsing: The artifact's design seems to incorporate impulsing elements. This will cause the artifact to have a impulsing away from its current position, when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 10 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Max force we can use, aka how far we throw things + var/max_force = 7 + +/datum/xenoartifact_trait/minor/impulse/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_edge_target_turf(get_turf(component_parent.parent), pick(NORTH, EAST, SOUTH, WEST)) + var/atom/movable/movable = component_parent.parent + //handle being held + if(isliving(movable.loc)) + var/mob/living/L = movable.loc + L.dropItemToGround(movable) + //Get the fuck outta dodge + component_parent.cooldown_override = TRUE + movable.throw_at(T, max_force*(component_parent.trait_strength/100), 4) + component_parent.cooldown_override = FALSE diff --git a/code/modules/xenoarchaeology/traits/minors/magnetic.dm b/code/modules/xenoarchaeology/traits/minors/magnetic.dm new file mode 100644 index 0000000000000..5774510c832d2 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/magnetic.dm @@ -0,0 +1,56 @@ +/* + Magnetic + The artifact attracts metalic objects when activated +*/ +/datum/xenoartifact_trait/minor/magnetic + label_name = "Magnetic" + label_desc = "Magnetic: The artifact's design seems to incorporate magnetic elements. This will cause the artifact to attract metalic objects when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 + blacklist_traits = list(/datum/xenoartifact_trait/minor/magnetic/push) + ///Maximum magnetic pull + var/max_pull_steps = 2 + ///Maximum range + var/max_pull_range = 4 + +/datum/xenoartifact_trait/minor/magnetic/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(component_parent.parent) + var/pull_steps = max_pull_steps * (component_parent.trait_strength/100) + var/pull_range = max_pull_range * (component_parent.trait_strength/100) + for(var/obj/M in orange(pull_range, T)) + if(M.anchored || !(M.flags_1 & CONDUCT_1)) + continue + INVOKE_ASYNC(src, PROC_REF(magnetize), M, T, pull_steps) + for(var/mob/living/silicon/S in orange(pull_range, T)) + if(isAI(S)) + continue + INVOKE_ASYNC(src, PROC_REF(magnetize), S, T, pull_steps) + +/datum/xenoartifact_trait/minor/magnetic/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pull metalic objects towards it")) + +/datum/xenoartifact_trait/minor/magnetic/proc/magnetize(atom/movable/movable, atom/target, _pull_steps) + for(var/i in 1 to _pull_steps) + magnetic_direction(movable, target) + sleep(1) + +/datum/xenoartifact_trait/minor/magnetic/proc/magnetic_direction(atom/movable/movable, atom/target) + step_towards(movable, target) + +//Inverse variant +/datum/xenoartifact_trait/minor/magnetic/push + label_name = "Magnetic Δ" + label_desc = "Magnetic Δ: The artifact's design seems to incorporate magnetic elements. This will cause the artifact to repulse metalic objects when triggered." + blacklist_traits = list(/datum/xenoartifact_trait/minor/magnetic) + conductivity = 10 + +/datum/xenoartifact_trait/minor/magnetic/push/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("push metalic objects away from it")) + +/datum/xenoartifact_trait/minor/magnetic/push/magnetic_direction(atom/movable/movable, atom/target) + step_away(movable, target) diff --git a/code/modules/xenoarchaeology/traits/minors/ringed.dm b/code/modules/xenoarchaeology/traits/minors/ringed.dm new file mode 100644 index 0000000000000..120755af95fd4 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/ringed.dm @@ -0,0 +1,89 @@ +/* + Ringed + Allows the artifact to be worn in the glove slot +*/ +/datum/xenoartifact_trait/minor/ringed + material_desc = "ringed" + label_name = "Ringed" + label_desc = "Ringed: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn, and catch information from the wearer." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/ringed/attack) + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Old wearable state + var/old_wearable + +/datum/xenoartifact_trait/minor/ringed/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + //Item equipping + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + old_wearable = item_parent.slot_flags + item_parent.slot_flags |= ITEM_SLOT_GLOVES + //Action + RegisterSignal(item_parent, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_action)) + RegisterSignal(item_parent, COMSIG_ITEM_DROPPED, PROC_REF(drop_action)) + +/datum/xenoartifact_trait/minor/ringed/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + item_parent.slot_flags = old_wearable + return ..() + +/datum/xenoartifact_trait/minor/ringed/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pass attacks on the user to the artifact, when worn. This only applies to attacks involving items")) + +/datum/xenoartifact_trait/minor/ringed/proc/equip_action(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + if(slot == ITEM_SLOT_GLOVES) + RegisterSignal(equipper, COMSIG_PARENT_ATTACKBY, PROC_REF(catch_attack)) + +/datum/xenoartifact_trait/minor/ringed/proc/drop_action(datum/source, mob/user) + SIGNAL_HANDLER + + UnregisterSignal(user, COMSIG_PARENT_ATTACKBY) + +//Foward the attack to our artifact +/datum/xenoartifact_trait/minor/ringed/proc/catch_attack(datum/source, obj/item, mob/living, params) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(cool_async_action), item, living, params) + +/datum/xenoartifact_trait/minor/ringed/proc/cool_async_action(obj/item, mob/living, params) + var/atom/atom_parent = component_parent?.parent + atom_parent?.attackby(item, living, params) + +//Variant for when the user attacks +/datum/xenoartifact_trait/minor/ringed/attack + material_desc = "ringed" + label_name = "Ringed Δ" + label_desc = "Ringed Δ: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn, and catch information from the wearer." + conductivity = 15 + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/ringed) + +/datum/xenoartifact_trait/minor/ringed/attack/equip_action(datum/source, mob/equipper, slot) + if(slot == ITEM_SLOT_GLOVES) + RegisterSignal(equipper, COMSIG_MOB_ATTACK_HAND, PROC_REF(catch_user_attack)) + +/datum/xenoartifact_trait/minor/ringed/attack/drop_action(datum/source, mob/user) + UnregisterSignal(user, COMSIG_MOB_ATTACK_HAND) + +/datum/xenoartifact_trait/minor/ringed/attack/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pass attacks from the user to the artifact, when worn")) + +/datum/xenoartifact_trait/minor/ringed/attack/proc/catch_user_attack(datum/source, mob/user, mob/target, params) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(other_cool_async_action), user, target, params) + +/datum/xenoartifact_trait/minor/ringed/attack/proc/other_cool_async_action(mob/user, mob/target, params) + if(user == target) + return + var/obj/item/item_parent = component_parent?.parent + item_parent?.afterattack(target, user, TRUE) diff --git a/code/modules/xenoarchaeology/traits/minors/scoped.dm b/code/modules/xenoarchaeology/traits/minors/scoped.dm new file mode 100644 index 0000000000000..48c5ba6af5a30 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/scoped.dm @@ -0,0 +1,16 @@ +/* + Scoped + Increases target range +*/ +/datum/xenoartifact_trait/minor/scoped + material_desc = "scoped" + label_name = "Scoped" + label_desc = "Scoped: The artifact's design seems to incorporate scoped elements. This will cause the artifact to have a larger target range." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + extra_target_range = 9 + weight = 10 + conductivity = 15 + +/datum/xenoartifact_trait/minor/scoped/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/minors/sentient.dm b/code/modules/xenoarchaeology/traits/minors/sentient.dm new file mode 100644 index 0000000000000..df2cebceffc98 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/sentient.dm @@ -0,0 +1,147 @@ +/* + Sentient + Allows ghosts to control the artifact +*/ +/datum/xenoartifact_trait/minor/sentient + label_name = "Sentient" + label_desc = "Sentient: The artifact's design seems to incorporate sentient elements. This will cause the artifact to have a mind of its own." + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 + incompatabilities = TRAIT_INCOMPATIBLE_MOB + can_pearl = FALSE + ///Mob who lives inside the artifact, and who we give actions to + var/mob/living/simple_animal/shade/sentience/sentience + ///Mob spawner for ghosts + var/obj/effect/mob_spawn/sentient_artifact/mob_spawner + ///Ref to our landmark + var/obj/effect/landmark/landmark + +/datum/xenoartifact_trait/minor/sentient/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + //Register a signal to KILL! + RegisterSignal(component_parent, COMSIG_XENOA_CALCIFIED, PROC_REF(suicide)) + //Setup ghost canidates and mob spawners + if(SSticker.HasRoundStarted()) + INVOKE_ASYNC(src, PROC_REF(get_canidate)) + else + mob_spawner = new(component_parent.parent, src) + //Landmarking + landmark = new(component_parent?.parent) + +/datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) + QDEL_NULL(sentience) + QDEL_NULL(mob_spawner) + QDEL_NULL(landmark) + return ..() + +/datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) + if(isobserver(M) && !sentience?.key && (alert(M, "Are you sure you want to control of [sentience]?", "Assume control of [sentience]", "Yes", "No") == "Yes")) + sentience.key = M.ckey + +/datum/xenoartifact_trait/minor/sentient/proc/get_canidate() + var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [component_parent?.parent]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) + if(LAZYLEN(candidates) && component_parent?.parent) + var/mob/dead/observer/O = pick(candidates) + if(istype(O) && O.ckey) //I though LAZYLEN would catch this, I guess NULL is getting injected somewhere + setup_sentience(O.ckey) + return + mob_spawner = new(component_parent?.parent, src) + +/datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(ckey) + var/atom/atom_parent = component_parent?.parent + if(!component_parent?.parent || !ckey || !atom_parent?.loc) + return + //Sentience + sentience = new(component_parent?.parent) + sentience.name = pick(SSxenoarchaeology.xenoa_artifact_names) + sentience.real_name = "[sentience.name] - [component_parent?.parent]" + sentience.key = ckey + sentience.status_flags |= GODMODE + ADD_TRAIT(sentience, TRAIT_ARTIFACT_IGNORE, TRAIT_GENERIC) + //Stop them from wriggling away + var/atom/movable/movable = component_parent.parent + movable.buckle_mob(movable, TRUE) + //Action + var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(component_parent?.parent, component_parent) + sentience.AddSpell(P) + //Display traits to sentience + to_chat(sentience, "Your traits are: \n") + var/trait_dialogue = "" + for(var/index in component_parent.traits_catagories) + for(var/datum/xenoartifact_trait/T as() in component_parent.traits_catagories[index]) + to_chat(sentience, "[T.label_name]\n") + var/trait_name = T.label_name + trait_name = replacetext(trait_name, "Δ", "delta") + trait_name = replacetext(trait_name, "Σ", "sigma") + trait_name = replacetext(trait_name, "Ω", "omega") + trait_dialogue = "[trait_dialogue]\n[trait_name]" + sentience.add_memory(trait_dialogue) + playsound(get_turf(component_parent?.parent), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) + //Cleanup + QDEL_NULL(mob_spawner) + +//Throw calcification logic here +/datum/xenoartifact_trait/minor/sentient/proc/suicide(datum/source) + SIGNAL_HANDLER + + QDEL_NULL(sentience) + QDEL_NULL(mob_spawner) + +//Spawner for sentience +/obj/effect/mob_spawn/sentient_artifact + death = FALSE + name = "Sentient Xenoartifact" + short_desc = "You're a maleviolent sentience, possesing an ancient alien artifact." + flavour_text = "Return to your master..." + use_cooldown = TRUE + ghost_usable = TRUE + instant = FALSE + roundstart = FALSE + banType = ROLE_SENTIENT_XENOARTIFACT + density = FALSE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + invisibility = 101 + ///Ref to the trait we're handling + var/datum/xenoartifact_trait/minor/sentient/trait + +/obj/effect/mob_spawn/sentient_artifact/Initialize(mapload, datum/xenoartifact_trait/minor/sentient/new_trait) + trait = new_trait + return ..() + +/obj/effect/mob_spawn/sentient_artifact/create(ckey) + trait?.setup_sentience(ckey) + +//Action for sentience +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action + name = "Trigger Artifact" + desc = "Select a target to activate your artifact on." + range = 1 + charge_max = 0 SECONDS + clothes_req = 0 + include_user = 0 + action_icon = 'icons/hud/actions/actions_revenant.dmi' + action_icon_state = "r_transmit" + action_background_icon_state = "bg_spell" + ///Ref to the artifact we're handling + var/datum/component/xenoartifact/sentient_artifact + +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/Initialize(mapload, datum/component/xenoartifact/artifact) + . = ..() + sentient_artifact = artifact + range = sentient_artifact?.target_range + +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/cast(list/targets, mob/user = usr) + if(!sentient_artifact || sentient_artifact.use_cooldown_timer) + if(sentient_artifact?.use_cooldown_timer) + to_chat(user, "The artifact is still cooling down, wait [timeleft(sentient_artifact.use_cooldown_timer)/10] seconds!") + return + for(var/atom/M in targets) + //We have to check the range ourselves + if(get_dist(get_turf(sentient_artifact.parent), get_turf(M)) <= range) + sentient_artifact.register_target(M) + sentient_artifact.trigger() + +/mob/living/simple_animal/shade/sentience + desc = "Wait, what the fuck?" diff --git a/code/modules/xenoarchaeology/traits/minors/sharp.dm b/code/modules/xenoarchaeology/traits/minors/sharp.dm new file mode 100644 index 0000000000000..c5c01a91f0784 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/sharp.dm @@ -0,0 +1,50 @@ +/* + Sharp + Makes the artifact sharp +*/ +/datum/xenoartifact_trait/minor/sharp + material_desc = "sharp" + label_name = "Sharp" + label_desc = "Sharp: The artifact's design seems to incorporate sharp elements. This will cause the artifact to pbe sharper than usual." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///The artifact's old sharpness + var/old_sharp + ///The artifact's old force + var/old_force + var/max_force = 10 + ///The artifact's old attack verbs + var/list/old_verbs + var/list/attack_verbs = list("cleaved", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") + +/datum/xenoartifact_trait/minor/sharp/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + //Sharpness + old_sharp = item_parent.sharpness + item_parent.sharpness = IS_SHARP + //Force + old_force = item_parent.force + item_parent.force = max_force * (component_parent.trait_strength/100) + //Verbs + old_verbs = item_parent.attack_verb_simple + item_parent.attack_verb_simple = attack_verbs + +/datum/xenoartifact_trait/minor/sharp/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + item_parent.sharpness = old_sharp + item_parent.force = old_force + item_parent.attack_verb_simple = old_verbs + return ..() + +/datum/xenoartifact_trait/minor/sharp/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/minors/shielded.dm b/code/modules/xenoarchaeology/traits/minors/shielded.dm new file mode 100644 index 0000000000000..5bc6185601084 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/shielded.dm @@ -0,0 +1,50 @@ +/* + Shielded + Makes the artifact act like a shield +*/ +/datum/xenoartifact_trait/minor/shielded + material_desc = "shielded" + label_name = "Shielded" + label_desc = "Shielded: The artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 15 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Old block level + var/old_block_level + var/max_block_level = 4 + ///old block power + var/old_block_power + var/max_block_power = 80 + ///Old block upgrade + var/old_block_upgrade + +/datum/xenoartifact_trait/minor/shielded/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + //Level + old_block_level = item_parent.block_level + item_parent.block_level = ROUND_UP(max_block_level * (component_parent.trait_strength/100)) + //power + old_block_power = item_parent.block_power + item_parent.block_power = ROUND_UP(max_block_power * (component_parent.trait_strength/100)) + //upgrade + old_block_upgrade = item_parent.block_upgrade_walk + item_parent.block_upgrade_walk = 1 + +/datum/xenoartifact_trait/minor/shielded/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + var/obj/item/item_parent = component_parent.parent + if(isitem(item_parent)) + item_parent.block_level = old_block_level + item_parent.block_power = old_block_power + item_parent.block_upgrade_walk = old_block_upgrade + return ..() + +/datum/xenoartifact_trait/minor/shielded/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED) diff --git a/code/modules/xenoarchaeology/traits/minors/signaller.dm b/code/modules/xenoarchaeology/traits/minors/signaller.dm new file mode 100644 index 0000000000000..c49f3c5705d52 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/signaller.dm @@ -0,0 +1,85 @@ +/* + Signaller + Sends a signal when the artifact is activated +*/ +/datum/xenoartifact_trait/minor/signaller + label_name = "Signaller" + label_desc = "Signaller: The artifact's design seems to incorporate signalling elements. This will cause the artifact to send a signal when activated." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 15 + var/atom/movable/artifact_particle_holder/particle_holder + ///Signal code + var/code + ///Signal frequency + var/datum/radio_frequency/radio_connection + //Signal + var/datum/signal/signal + +/datum/xenoartifact_trait/minor/signaller/New(atom/_parent) + . = ..() + //Code + code = rand(0, 100) + //Signal + signal = new(list("code" = code)) + //Frequency + radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + +/datum/xenoartifact_trait/minor/signaller/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + setup_generic_item_hint() + if(!(locate(/datum/xenoartifact_trait/activator/signal) in component_parent.traits_catagories[TRAIT_PRIORITY_ACTIVATOR])) + addtimer(CALLBACK(src, PROC_REF(do_sonar)), 2 SECONDS) + +/datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) + SSradio.remove_object(src, FREQ_SIGNALER) + QDEL_NULL(signal) + return ..() + +/datum/xenoartifact_trait/minor/signaller/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + INVOKE_ASYNC(src, PROC_REF(do_signal)) + +/datum/xenoartifact_trait/minor/signaller/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/analyzer)) + to_chat(user, "[item] detects an output frequency & code of [FREQ_SIGNALER]-[code]!") + return ..() + +/datum/xenoartifact_trait/minor/signaller/generate_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + particle_holder = new(component_parent?.parent) + particle_holder.add_emitter(/obj/emitter/sonar/out, "sonar", 10) + target.vis_contents += particle_holder + +/datum/xenoartifact_trait/minor/signaller/cut_trait_appearance(atom/movable/target) + . = ..() + if(!ismovable(target)) + return + target.vis_contents -= particle_holder + QDEL_NULL(particle_holder) + +/datum/xenoartifact_trait/minor/signaller/proc/do_signal() + if(!radio_connection || !signal) + return + radio_connection.post_signal(src, signal) + +/datum/xenoartifact_trait/minor/signaller/proc/receive_signal(datum/signal/signal) + return + +/datum/xenoartifact_trait/minor/signaller/proc/do_sonar(repeat = TRUE) + if(QDELETED(src)) + return + playsound(get_turf(component_parent?.parent), 'sound/effects/ping.ogg', 60, TRUE) + var/rand_time = rand(6, 12) SECONDS + addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) + +/datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), + XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact."), + XENOA_TRAIT_HINT_SOUND("sonar ping")) diff --git a/code/modules/xenoarchaeology/traits/minors/slippery.dm b/code/modules/xenoarchaeology/traits/minors/slippery.dm new file mode 100644 index 0000000000000..5599a7acc155e --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/slippery.dm @@ -0,0 +1,32 @@ +/* + Slippery + makes the artifact slippery +*/ +/datum/xenoartifact_trait/minor/slippery + material_desc = "slippery" + label_name = "Slippery" + label_desc = "Slippery: The artifact's design seems to incorporate slippery elements. This will cause the artifact to be slippery." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + conductivity = 5 + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + ///Refernce to slip component for later cleanup + var/datum/component/slippery/slip_comp + +/datum/xenoartifact_trait/minor/slippery/register_parent(datum/source) + . = ..() + if(!component_parent?.parent) + return + var/atom/atom_parent = component_parent.parent + slip_comp = atom_parent.AddComponent(/datum/component/slippery, 60) + +/datum/xenoartifact_trait/minor/slippery/remove_parent(datum/source, pensive) + if(!component_parent?.parent) + return ..() + slip_comp.RemoveComponent() + slip_comp = null + return ..() + +/datum/xenoartifact_trait/minor/slippery/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/minors/sticky.dm b/code/modules/xenoarchaeology/traits/minors/sticky.dm new file mode 100644 index 0000000000000..38e346944ad38 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors/sticky.dm @@ -0,0 +1,39 @@ +/* + Sticky + The artifact briefly becomes sticky when activated +*/ +/datum/xenoartifact_trait/minor/sticky + material_desc = "sticky" + label_name = "Sticky" + label_desc = "Sticky: The artifact's design seems to incorporate sticky elements. This will cause the artifact to briefly become sticky, when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE + weight = 10 + conductivity = 15 + ///Max amount of time we can be sticky for + var/sticky_time = 25 SECONDS + var/sticky_timer + +/datum/xenoartifact_trait/minor/sticky/remove_parent(datum/source, pensive) + var/atom/movable/movable = component_parent?.parent + if(!movable) + return ..() + REMOVE_TRAIT(movable, TRAIT_NODROP, "[REF(src)]") + deltimer(sticky_timer) + return ..() + +/datum/xenoartifact_trait/minor/sticky/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/atom/movable/movable = component_parent.parent + movable.visible_message("[movable] starts secreting a sticky substance!", TRUE, allow_inside_usr = TRUE) + if(HAS_TRAIT_FROM(movable, TRAIT_NODROP, "[REF(src)]")) + return + ADD_TRAIT(movable, TRAIT_NODROP, "[REF(src)]") + sticky_timer = addtimer(CALLBACK(src, PROC_REF(unstick)), sticky_time, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/minor/sticky/proc/unstick() + var/atom/movable/movable = component_parent.parent + REMOVE_TRAIT(movable, TRAIT_NODROP, "[REF(src)]") diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_activators.dm b/code/modules/xenoarchaeology/traits/xenoartifact_activators.dm deleted file mode 100644 index 7ddfc2ac9f9aa..0000000000000 --- a/code/modules/xenoarchaeology/traits/xenoartifact_activators.dm +++ /dev/null @@ -1,172 +0,0 @@ -///Activation traits - only used to generate charge -///============ -/// Default acvitavor, on-use / interact -///============ -/datum/xenoartifact_trait/activator/impact - desc = "Sturdy" - label_desc = "Sturdy: The material is sturdy. The amount of force applied seems to directly correlate to the size of the reaction." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - weight = 30 - -/datum/xenoartifact_trait/activator/impact/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - charge = charge*((thing?.force || 10)*0.1) - X.default_activate(charge, user, target) - -///============ -/// Burn activator, responds to heat -///============ -/datum/xenoartifact_trait/activator/burn - desc = "Flammable" - label_desc = "Flammable: The material is flammable, and seems to react when ignited." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/burn/on_init(obj/item/xenoartifact/X) - ..() - X.max_range += 1 - -/datum/xenoartifact_trait/activator/burn/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) //xenoa item handles this, see process proc there - var/obj/item/xenoartifact/X = source - if(X.process_type != PROCESS_TYPE_LIT && thing.ignition_effect(X, user)) - X.visible_message("The [X.name] sparks on.") - X.process_type = PROCESS_TYPE_LIT - sleep(1.8 SECONDS) //Give them a chance to escape - START_PROCESSING(SSobj, X) - log_game("[key_name_admin(user)] lit [X] at [world.time] using [thing]. [X] located at [AREACOORD(X)].") - -///============ -/// Timed activator, activates on a timer. Timer is turned on when used, has a chance to turn off. -///============ -/datum/xenoartifact_trait/activator/clock - label_name = "Timed" - label_desc = "Timed: The material produces a resonance pattern similar to quartz, causing it to produce a reaction every so often." - charge = 25 - blacklist_traits = list(/datum/xenoartifact_trait/minor/capacitive) - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/clock/on_init(obj/item/xenoartifact/X) - ..() - X.max_range += 1 - X.malfunction_mod = 0.5 - -/datum/xenoartifact_trait/activator/clock/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/clothing/neck/stethoscope)) - to_chat(user, "The [X.name] ticks deep from within.\n") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/clock/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - X.process_type = PROCESS_TYPE_TICK - START_PROCESSING(SSobj, X) - log_game("[key_name_admin(user)] set clock on [X] at [world.time] using [thing]. [X] located at [AREACOORD(X)].") - -///============ -/// Signal activator, responds to respective signals sent through signallers -///============ -/datum/xenoartifact_trait/activator/signal - label_name = "Signal" - label_desc = "Signal: The material receives radio frequencies and reacts when a matching code is delivered." - charge = 25 - signals = list(XENOA_SIGNAL) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/signal/on_init(obj/item/xenoartifact/X) - ..() - X.code = rand(1, 100) //Random code is shared by all signaller traits - X.frequency = FREQ_SIGNALER - X.set_frequency(X.frequency) - X.max_range += 1 - -/datum/xenoartifact_trait/activator/signal/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item.name] displays a signal-input code of [X.code], and frequency [X.frequency].") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/signal/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, target) - log_game("[key_name_admin(user)] signalled [X] at [world.time]. [X] located at [AREACOORD(X)].") - -///============ -/// Battery activator, needs a cell to activate -///============ -/datum/xenoartifact_trait/activator/batteryneed - desc = "Charged" - label_desc = "Charged: The material has a natural power draw. Supplying any current to this will cause a reaction." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/batteryneed/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays a draw of [X.charge_req].") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/batteryneed/pass_input(datum/source, obj/item/stock_parts/cell/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - if(!istype(thing)) - return - if(thing.use(X.charge_req*10)) - X.default_activate(charge, user, user) - -///============ -/// Weighted activator, picking up activates -///============ -/datum/xenoartifact_trait/activator/weighted - desc = "Weighted" - label_desc = "Weighted: The material is weighted and produces a reaction when picked up." - charge = 25 - signals = list(COMSIG_ITEM_PICKUP) - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/major/distablizer) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/weighted/pass_input(datum/source, obj/item/thing, mob/living/carbon/user, mob/living/carbon/human/target) - var/obj/item/clothing/gloves/artifact_pinchers/P - //Grab ref to gloves for check - if(istype(user)) - P = user.get_item_by_slot(ITEM_SLOT_GLOVES) - if(istype(P) && P?.safety) //This trait is a special tism - return - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, user) - -///============ -/// Pitch activator, artifact activates when thrown. Credit to EvilDragon#4532 -///============ -/datum/xenoartifact_trait/activator/pitch - label_name = "Pitched" - label_desc = "Pitched: The material is aerodynamic and activates when thrown." - charge = 25 - blacklist_traits = (/datum/xenoartifact_trait/minor/dense) - signals = list(COMSIG_MOVABLE_IMPACT) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/pitch/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, target) - -///============ -/// Honk, activated when honked or used by a clown -///============ -/datum/xenoartifact_trait/activator/honk - desc = "Honked" - label_desc = "Honked: The material is squishy & humorous. Perhaps the clown would know how to use it?" - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - weight = 25 - -/datum/xenoartifact_trait/activator/honk/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - //Make sure we're being silly before we activate it - isclown( ) refers to the simplemob - if(!(istype(thing, /obj/item/bikehorn) || istype(thing, /obj/item/bikehorn/golden) || isclown(target) || HAS_TRAIT(user, TRAIT_NAIVE) || HAS_TRAIT(target, TRAIT_NAIVE))) - return - charge = charge*((thing?.force || 10)*0.1) - X.default_activate(charge, user, target) diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm b/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm deleted file mode 100644 index 6c579cfac01d0..0000000000000 --- a/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm +++ /dev/null @@ -1,558 +0,0 @@ -//Major traits - The artifact's main gimmick, how it interacts with the world -///============ -/// Capture, moves target inside the artifact -///============ -/datum/xenoartifact_trait/major/capture - desc = "Hollow" - label_desc = "Hollow: The shape is hollow, however the inside is deceptively large." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - var/spawn_russian = FALSE - -/datum/xenoartifact_trait/major/capture/on_init(obj/item/xenoartifact/X) - if(prob(1)) - spawn_russian = TRUE - -/datum/xenoartifact_trait/major/capture/activate(obj/item/xenoartifact/X, atom/target) - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X, force = TRUE) - if(ismovable(target) && (istype(target, /obj/item) || istype(target, /mob/living))) - var/atom/movable/AM = target - if(AM?.anchored || !AM) - return - addtimer(CALLBACK(src, PROC_REF(release), X, AM), X.charge*0.5 SECONDS) - AM.forceMove(X) - X.buckle_mob(AM) - if(isliving(target)) //stop awful hobbit-sis from wriggling - var/mob/living/victim = target - victim.Paralyze(X.charge*0.5 SECONDS, ignore_canstun = TRUE) - X.cooldownmod = X.charge*0.6 SECONDS - -/datum/xenoartifact_trait/major/capture/proc/release(obj/item/xenoartifact/X, var/atom/movable/AM) //Empty contents - if(QDELETED(src) || QDELETED(X) || QDELETED(AM)) - return - var/turf/T = get_turf(X.loc) - AM.set_anchored(FALSE) - AM.forceMove(T) - if(spawn_russian) - new /mob/living/simple_animal/hostile/russian(T) - log_game("[X] spawned (/mob/living/simple_animal/hostile/russian) at [world.time]. [X] located at [AREACOORD(X)]") - spawn_russian = FALSE - -///============ -/// Shock, the artifact electrocutes the target -///============ -/datum/xenoartifact_trait/major/shock - desc = "Conductive" - label_desc = "Conductive: The shape resembles two lighting forks. Subtle arcs seem to leaps across them." - flags = PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/major/shock/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "You feel a slight static after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/major/shock/activate(obj/item/xenoartifact/X, atom/target, mob/user) - do_sparks(pick(1, 2), FALSE, X) - if(istype(target, /obj/item/stock_parts/cell)) - var/obj/item/stock_parts/cell/C = target //Have to type convert to work with other traits - C.give((X.charge/100)*C.maxcharge) - - else if(istype(target, /mob/living)) - var/damage = X.charge*0.25 - var/mob/living/carbon/victim = target - victim.electrocute_act(damage, X, 1, 1) - playsound(get_turf(X), 'sound/machines/defib_zap.ogg', 50, TRUE) - X.cooldownmod = (X.charge*0.1) SECONDS - -///============ -/// Timestop, spawns time-stop effect -///============ -/datum/xenoartifact_trait/major/timestop - desc = "Temporal" - label_desc = "Temporal: The shape is drooling and sluggish. Additionally, light around it seems to invert." - -/datum/xenoartifact_trait/major/timestop/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "Your hand feels slow while stroking the [X.name].") - return TRUE - -/datum/xenoartifact_trait/major/timestop/activate(obj/item/xenoartifact/X, atom/target) - var/turf/T = (get_turf(X?.loc) || get_turf(target?.loc)) - if(!T) - return - new /obj/effect/timestop(T, 2, (X.charge*0.2) SECONDS) - X.cooldownmod = (X.charge*0.35) SECONDS - -///============ -/// Laser, shoots varying laser based on charge -///============ -/datum/xenoartifact_trait/major/laser - desc = "Barreled" - label_desc = "Barreled: The shape resembles the barrel of a gun. It's possible that it might dispense candy." - flags = PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/major/laser/activate(obj/item/xenoartifact/X, atom/target, mob/living/user) - //light target on fire if we're close - if(isliving(target) && get_dist(target, X.loc || user) <= 1) - var/mob/living/victim = target - victim.adjust_fire_stacks(5*(X.charge/X.charge_req)) - victim.IgniteMob() - return - //otherwise shoot laser - var/obj/projectile/A - switch(X.charge) - if(0 to 24) - A = new /obj/projectile/beam/disabler - if(25 to 79) - A = new /obj/projectile/beam/laser - if(80 to 200) - A = new /obj/projectile/beam/laser/heavylaser - //If target is our own turf, aka someone probably threw us, target a random direction to avoid always shooting east - if(istype(target, /turf) && X.loc == target) - target = get_edge_target_turf(pick(NORTH, EAST, SOUTH, WEST)) - //FIRE! - A.preparePixelProjectile(get_turf(target), X) - A.fire() - playsound(get_turf(src), 'sound/mecha/mech_shield_deflect.ogg', 50, TRUE) - -///============ -/// Corginator, turns the target into a corgi for a short time -///============ -/datum/xenoartifact_trait/major/corginator ///All of this is stolen from corgium. - desc = "Fuzzy" //Weirdchamp - label_desc = "Fuzzy: The shape is hard to discern under all the hair sprouting out from the surface. You swear you've heard it bark before." - flags = BLUESPACE_TRAIT - ///List of all affected targets, used for early qdel - var/list/victims = list() - ///Ref to timer - if corgi is deleted early remove this reference to the puppy - var/timer - -/datum/xenoartifact_trait/major/corginator/activate(obj/item/xenoartifact/X, mob/living/target) - X.say(pick("Woof!", "Bark!", "Yap!")) - if(istype(target, /mob/living) && !(istype(target, /mob/living/simple_animal/pet/dog/corgi)) && !IS_DEAD_OR_INCAP(target)) - var/mob/living/simple_animal/pet/dog/corgi/new_corgi = transform(target) - timer = addtimer(CALLBACK(src, PROC_REF(transform_back), new_corgi), (X.charge*0.6) SECONDS, TIMER_STOPPABLE) - victims |= new_corgi - X.cooldownmod = (X.charge*0.8) SECONDS - -/datum/xenoartifact_trait/major/corginator/proc/transform(mob/living/target) - if(!istype(target)) - return - var/obj/shapeshift_holder/H = locate() in target - if(H) - playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) - return - ADD_TRAIT(target, TRAIT_NOBREATH, TRAIT_NOMOBSWAP) - var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new(target.loc) - H = new(new_corgi,src,target) - //hat check - var/mob/living/carbon/C = target - if(istype(C)) - var/obj/item/hat = C.get_item_by_slot(ITEM_SLOT_HEAD) - if(hat?.dog_fashion) - new_corgi.place_on_head(hat,null,FALSE) - RegisterSignal(new_corgi, COMSIG_MOB_DEATH, PROC_REF(transform_back)) - return new_corgi - -/datum/xenoartifact_trait/major/corginator/proc/transform_back(mob/living/simple_animal/pet/dog/corgi/new_corgi) - //Kill timer - deltimer(timer) - timer = null - - var/obj/shapeshift_holder/H = locate() in new_corgi - if(!H) - return - var/mob/living/target = H.stored - UnregisterSignal(new_corgi, COMSIG_MOB_DEATH) - REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_NOMOBSWAP) - victims -= new_corgi - var/turf/T = get_turf(new_corgi) - if(new_corgi.inventory_head && !target.equip_to_slot_if_possible(new_corgi.inventory_head, ITEM_SLOT_HEAD,disable_warning = TRUE, bypass_equip_delay_self=TRUE)) - new_corgi.inventory_head.forceMove(T) - new_corgi.inventory_back?.forceMove(T) - new_corgi.inventory_head = null - new_corgi.inventory_back = null - H.restore(FALSE, FALSE) - target.Knockdown(0.2 SECONDS) - -/datum/xenoartifact_trait/major/corginator/Destroy() //Transform goobers back if artifact is deleted. - . = ..() - if(victims.len) - for(var/mob/living/simple_animal/pet/dog/corgi/H as() in victims) - transform_back(H) - -///============ -/// EMP, produces an empulse -///============ -/datum/xenoartifact_trait/major/emp - label_name = "EMP" - label_desc = "EMP: The shape of the Artifact doesn't resemble anything particularly interesting. Technology around the Artifact seems to malfunction." - flags = URANIUM_TRAIT - weight = 25 //annoying trait - -/datum/xenoartifact_trait/major/emp/activate(obj/item/xenoartifact/X) - playsound(get_turf(X), 'sound/magic/disable_tech.ogg', 50, TRUE) - empulse(get_turf(X.loc), max(1, X.charge*0.03), max(1, X.charge*0.07, 1)) //This might be too big - -///============ -/// Invisible, makes the target invisible for a short time -///============ -/datum/xenoartifact_trait/major/invisible //One step closer to the one ring - label_name = "Transparent" - label_desc = "Transparent: The shape of the Artifact is difficult to perceive. You feel the need to call it, precious..." - weight = 25 - var/list/victims = list() - -/datum/xenoartifact_trait/major/invisible/on_item(obj/item/xenoartifact/X, atom/user, obj/item/I) - if(istype(I) && I.light_power > 0) - to_chat(user, "The [I.name]'s light passes through the structure.") - return TRUE - ..() - -/datum/xenoartifact_trait/major/invisible/activate(obj/item/xenoartifact/X, mob/living/target) - if(isliving(target)) - victims += WEAKREF(target) - hide(target) - addtimer(CALLBACK(src, PROC_REF(reveal), target), ((X.charge*0.4) SECONDS)) - X.cooldownmod = ((X.charge*0.4)+1) SECONDS - -/datum/xenoartifact_trait/major/invisible/proc/hide(mob/living/target) - ADD_TRAIT(target, TRAIT_PACIFISM, type) - animate(target, alpha = 0, time = 5) - -/datum/xenoartifact_trait/major/invisible/proc/reveal(mob/living/target) - if(target) - REMOVE_TRAIT(target, TRAIT_PACIFISM, type) - animate(target, alpha = 255, time = 5) - -/datum/xenoartifact_trait/major/invisible/Destroy() - . = ..() - for(var/M in victims) - var/datum/weakref/r = M - var/mob/living/L = r.resolve() - reveal(L) - -///============ -/// Teleports the target to a random nearby location -///============ -/datum/xenoartifact_trait/major/teleporting - desc = "Displaced" - label_desc = "Displaced: The shape's state is unstable, causing it to shift through planes at a localized axis. Just ask someone from science..." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/major/teleporting/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(istype(target, /atom/movable)) - var/atom/movable/victim = target //typecast to access anchored - if(!victim.anchored) - do_teleport(victim, get_turf(victim), (X.charge*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) - -///============ -/// Lamp, creates a light with random color for a short time -///============ -/datum/xenoartifact_trait/major/lamp - label_name = "Lamp" - label_desc = "Lamp: The Artifact emits light. Nothing in its shape suggests this." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - var/light_mod - -/datum/xenoartifact_trait/major/lamp/on_init(obj/item/xenoartifact/X) - X.light_color = pick(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) - -/datum/xenoartifact_trait/major/lamp/activate(obj/item/xenoartifact/X, atom/target, atom/user) - X.visible_message("The [X] lights up!") - X.set_light(X.charge*0.08, max(X.charge*0.05, 5), X.light_color) - addtimer(CALLBACK(src, PROC_REF(unlight), X), (X.charge*0.6) SECONDS) - X.cooldownmod = (X.charge*0.6) SECONDS - -/datum/xenoartifact_trait/major/lamp/proc/unlight(var/obj/item/xenoartifact/X) - X.set_light(0, 0) - -///============ -/// Forcefield, creates a random shape wizard wall -///============ -/datum/xenoartifact_trait/major/forcefield - label_name = "Wall" - label_desc = "Wall: The Artifact produces a resonance that forms impenetrable walls. Here's one you'll never crawl!" - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - var/size - -/datum/xenoartifact_trait/major/forcefield/on_init(obj/item/xenoartifact/X) - size = pick(1, 3, 5) - -/datum/xenoartifact_trait/major/forcefield/activate(obj/item/xenoartifact/X) - if(size >= 1) - new /obj/effect/forcefield/xenoartifact_type(get_turf(X.loc), (X.charge*0.4) SECONDS) - if(size >= 3) - var/outcome = pick(0, 1) - if(outcome || size >= 5) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, NORTH), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, SOUTH), (X.charge*0.4) SECONDS) - else - new /obj/effect/forcefield/xenoartifact_type(get_step(X, EAST), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, WEST), (X.charge*0.4) SECONDS) - if(size >= 5) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, WEST), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, EAST), (X.charge*0.4) SECONDS) - - X.cooldownmod = (X.charge*0.4) SECONDS - -/obj/effect/forcefield/xenoartifact_type //Special wall type for artifact - desc = "An impenetrable artifact wall." - -///============ -/// Heal, heals a random damage type -///============ -/datum/xenoartifact_trait/major/heal - label_name = "Healing" - label_desc = "Healing: The Artifact repeairs any damaged organic tissue the targat may contain. Widely considered the Holy Grail of Artifact traits." - flags = BLUESPACE_TRAIT - weight = 25 - var/healing_type - -/datum/xenoartifact_trait/major/heal/on_init(obj/item/xenoartifact/X) - healing_type = pick(BRUTE, BURN, TOX) - -/datum/xenoartifact_trait/major/heal/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/healthanalyzer)) - to_chat(user, "The [item] recognizes foreign [healing_type] healing proteins.\n") - return TRUE - ..() - -/datum/xenoartifact_trait/major/heal/activate(obj/item/xenoartifact/X, atom/target) - playsound(get_turf(target), 'sound/magic/staff_healing.ogg', 50, TRUE) - if(istype(target, /mob/living)) - var/mob/living/victim = target - switch(healing_type) - if(BRUTE) - victim.adjustBruteLoss((X.charge*0.25)*-1) - if(BURN) - victim.adjustFireLoss((X.charge*0.25)*-1) - if(TOX) - victim.adjustToxLoss((X.charge*0.25)*-1) - -///============ -/// Chem, injects a random safe chem into target -///============ -/datum/xenoartifact_trait/major/chem - desc = "Hypodermic" - label_desc = "Hypodermic: The Artifact's shape is comprised of many twisting tubes and vials, it seems a liquid may be inside." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - blacklist_traits = list(/datum/xenoartifact_trait/minor/long) - var/datum/reagent/formula - var/amount - -/datum/xenoartifact_trait/major/chem/on_init(obj/item/xenoartifact/X) - amount = pick(7, 14, 21) - formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) - -/datum/xenoartifact_trait/major/chem/activate(obj/item/xenoartifact/X, atom/target) - if(target?.reagents) - playsound(get_turf(X), pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, TRUE) - var/datum/reagents/R = target.reagents - R.add_reagent(formula, amount*(initial(formula.metabolization_rate))) - log_game("[X] injected [key_name_admin(target)] with [amount]u of [formula] at [world.time]. [X] located at [AREACOORD(X)]") - -///============ -/// Push, pushes target away from artifact -///============ -/datum/xenoartifact_trait/major/push - label_name = "Push" - label_desc = "Push: The Artifact pushes anything not bolted down. The shape doesn't suggest this." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/major/push/activate(obj/item/xenoartifact/X, atom/target) - if(ismovable(target)) - var/atom/movable/victim = target - if(victim.anchored) - return - var/atom/trg = get_edge_target_turf(X.loc, get_dir(X.loc, target.loc) || pick(NORTH, EAST, SOUTH, WEST)) - victim.throw_at(get_turf(trg), (X.charge*0.07)+1, 8) - -///============ -/// Pull, pulls target towards artifact -///============ -/datum/xenoartifact_trait/major/pull - label_name = "Pull" - label_desc = "Pull: The Artifact pulls anything not bolted down. The shape doesn't suggest this." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/major/pull/on_init(obj/item/xenoartifact/X) - X.max_range += 1 - -/datum/xenoartifact_trait/major/pull/activate(obj/item/xenoartifact/X, atom/target) - if(ismovable(target)) - var/atom/movable/victim = target - if(victim.anchored) - return - if(get_dist(X, target) <= 1 && isliving(target)) - var/mob/living/living_victim = target - living_victim.Knockdown(SHOVE_KNOCKDOWN_SOLID) - victim.throw_at(get_turf(X), X.charge*0.08, 8) - -///============ -/// Horn, produces a random noise -///============ -/datum/xenoartifact_trait/major/horn - desc = "Horned" - label_name = "Horn" - label_desc = "Horn: The Artifact's shape resembles a horn. These Artifacts are widely deployed by the most clever clowns." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - var/sound - -/datum/xenoartifact_trait/major/horn/on_init(obj/item/xenoartifact/X) - sound = pick(list('sound/effects/adminhelp.ogg', 'sound/effects/applause.ogg', 'sound/effects/bubbles.ogg', - 'sound/effects/empulse.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/explosion_distant.ogg', - 'sound/effects/laughtrack.ogg', 'sound/effects/magic.ogg', 'sound/effects/meteorimpact.ogg', - 'sound/effects/phasein.ogg', 'sound/effects/supermatter.ogg', 'sound/weapons/armbomb.ogg', - 'sound/weapons/blade1.ogg')) - -/datum/xenoartifact_trait/major/horn/activate(obj/item/xenoartifact/X, atom/target, atom/user) - playsound(get_turf(target), sound, 50, FALSE) - -///============ -/// Gas, replaces a random gas with another random gas -///============ -/datum/xenoartifact_trait/major/gas - desc = "Porous" - label_desc = "Porous: The Artifact absorbs a specific nearby gas and replaces it with an undeterminable one." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - var/static/list/valid_inputs = list( - /datum/gas/oxygen = 6, - /datum/gas/nitrogen = 3, - /datum/gas/plasma = 1, - /datum/gas/carbon_dioxide = 1, - /datum/gas/water_vapor = 3 - ) - var/static/list/valid_outputs = list( - /datum/gas/bz = 3, - /datum/gas/hypernoblium = 1, - /datum/gas/plasma = 3, - /datum/gas/tritium = 2, - /datum/gas/nitryl = 1 - ) - var/datum/gas/input - var/datum/gas/output - -/datum/xenoartifact_trait/major/gas/on_init(obj/item/xenoartifact/X) - input = pick_weight(valid_inputs) - valid_outputs -= input //in the rare case the artifact wants to exhcange plasma for more plasma. - output = pick_weight(valid_outputs) - -/datum/xenoartifact_trait/major/gas/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item] detects trace amounts of [initial(output.name)] exchanging with [initial(input.name)].\n") - return TRUE - ..() - -/datum/xenoartifact_trait/major/gas/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/turf/T = get_turf(X) - var/datum/gas_mixture/air = T.return_air() - var/input_id = initial(input.id) - var/output_id = initial(output.id) - var/moles = min(air.get_moles(input_id), 5) - if(moles) - air.adjust_moles(input_id, -moles) - air.adjust_moles(output_id, moles) - -///============ -/// Destabilizing, teleports the victim to that weird place from the exploration meme. -///============ -/datum/xenoartifact_trait/major/distablizer - desc = "Destabilizing" - label_desc = "Destabilizing: The Artifact collapses an improper bluespace matrix on the target, sending them to an unknown location." - weight = 25 - flags = URANIUM_TRAIT - blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) - var/obj/item/xenoartifact/exit - -/datum/xenoartifact_trait/major/distablizer/on_init(obj/item/xenoartifact/X) - exit = X - GLOB.destabliization_exits += X - -/datum/xenoartifact_trait/major/distablizer/on_item(obj/item/xenoartifact/X, mob/living/carbon/human/user, atom/item) - var/obj/item/clothing/gloves/artifact_pinchers/P - if(istype(user)) - P = user.get_item_by_slot(ITEM_SLOT_GLOVES) - if(!P?.safety && do_banish(item)) - to_chat(user, "The [item] dissapears!") - return TRUE - ..() - -/datum/xenoartifact_trait/major/distablizer/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(do_banish(target)) - X.cooldownmod = X.charge*0.2 SECONDS - -/datum/xenoartifact_trait/major/distablizer/proc/do_banish(atom/target) - . = FALSE - if(isliving(exit.loc)) - var/mob/living/holder = exit.loc - holder.dropItemToGround(exit) - if(istype(target, /obj/item/xenoartifact)) - return - if(ismovable(target)) - var/atom/movable/AM = target - if(AM.anchored) - return - if(AM.forceMove(pick(GLOB.destabilization_spawns))) - return TRUE - -/datum/xenoartifact_trait/major/distablizer/Destroy() - GLOB.destabliization_exits -= exit - ..() - -///============ -/// Dissipating, the artifact creates a could of smoke. -///============ -/datum/xenoartifact_trait/major/smokey - desc = "Dissipating" - label_desc = "Dissipating: The Artifact is dissipating as if it was made of smoke." - flags = URANIUM_TRAIT | PLASMA_TRAIT | BLUESPACE_TRAIT - -/datum/xenoartifact_trait/major/smokey/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - var/datum/effect_system/smoke_spread/E = new() - E.set_up(max(3, X.charge*0.08), get_turf(X)) - E.start() - -///============ -/// Marker, colors target with a random color -///============ -/datum/xenoartifact_trait/major/marker - label_name = "Marker" - label_desc = "Marker: The Artifact causes the target to refract a unique color index." - flags = PLASMA_TRAIT | BLUESPACE_TRAIT - ///The color this artifact dispenses - var/color - -/datum/xenoartifact_trait/major/marker/on_init(obj/item/xenoartifact/X) - color = pick(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK, "all") - -/datum/xenoartifact_trait/major/marker/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(color == "all") - target.color = pick(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK) - else - target.color = color - -///============ -/// emote, makes user do a random emote -///============ -/datum/xenoartifact_trait/major/emote - label_name = "Emotional" - label_desc = "Emotional: The Artifact causes the target to experience, or preform, a random emotion." - flags = PLASMA_TRAIT | BLUESPACE_TRAIT | URANIUM_TRAIT - ///Emote to preform - var/datum/emote/emote - -/datum/xenoartifact_trait/major/emote/on_init(obj/item/xenoartifact/X) - emote = pick(GLOB.xenoa_emote) - emote = new emote() - -/datum/xenoartifact_trait/major/emote/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(iscarbon(target)) - emote.run_emote(target) - //Not all mobs can preform the given emotes, spin is pretty common though - else if(isliving(target)) - var/datum/emote/spin/E = new() - E.run_emote(target) - -/datum/xenoartifact_trait/major/emote/Destroy() - . = ..() - QDEL_NULL(emote) diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm b/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm deleted file mode 100644 index 8c9847a3b6a27..0000000000000 --- a/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm +++ /dev/null @@ -1,273 +0,0 @@ -//Malfunctions -//============ -// Bear, produces a bear until it reaches its upper limit -//============ -/datum/xenoartifact_trait/malfunction/bear - label_name = "P.B.R." - label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." - weight = 15 - flags = URANIUM_TRAIT - var/list/bears = list() //bear per bears - -/datum/xenoartifact_trait/malfunction/bear/activate(obj/item/xenoartifact/X) - if(length(bears) >= XENOA_MAX_BEARS) - return - var/turf/T = get_turf(X) - var/mob/living/simple_animal/hostile/bear/malnourished/new_bear = new(T) - new_bear.name = pick("Freddy", "Bearington", "Smokey", "Beorn", "Pooh", "Winnie", "Baloo", "Rupert", "Yogi", "Fozzie", "Boo") //Why not? - bears += new_bear - RegisterSignal(new_bear, COMSIG_MOB_DEATH, PROC_REF(handle_death)) - log_game("[X] spawned a (/mob/living/simple_animal/hostile/bear/malnourished) at [world.time]. [X] located at [AREACOORD(X)]") - X.cooldown += 20 SECONDS - -/datum/xenoartifact_trait/malfunction/bear/proc/handle_death(datum/source) - bears -= source - UnregisterSignal(source, COMSIG_MOB_DEATH) - -//============ -// Badtarget, changes target to user -//============ -/datum/xenoartifact_trait/malfunction/badtarget - label_name = "Maltargeting" - label_desc = "Maltargeting: A strange malfunction that causes the Artifact to always target the original user." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/badtarget/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/mob/living/M - if(isliving(user)) - M = user - else if(isliving(user?.loc)) - M = user.loc - else - return - X.true_target = X.process_target(M) - X.cooldown += 5 SECONDS - -//============ -// Strip, moves a single clothing on target to floor -//============ -/datum/xenoartifact_trait/malfunction/strip - label_name = "B.A.D." - label_desc = "Bluespace Axis Desync: A strange malfunction inside the Artifact causes it to shift the target's realspace position with its bluespace mass in an offset manner. This results in the target dropping all they're wearing. This is probably the plot to a very educational movie." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/strip/activate(obj/item/xenoartifact/X, atom/target) - if(isliving(target)) - var/mob/living/carbon/victim = target - var/list/clothing_list = list() - //Im okay with this targetting clothing in other non-worn slots - for(var/obj/item/clothing/I in victim.contents) - clothing_list += I - //Stops this from stripping funky stuff - var/obj/item/clothing/C = pick(clothing_list) - if(!HAS_TRAIT_FROM(C, TRAIT_NODROP, GLUED_ITEM_TRAIT)) - victim.dropItemToGround(C) - X.cooldown += 10 SECONDS - -//============ -// Trauma, gives target trauma, amazing -//============ -/datum/xenoartifact_trait/malfunction/trauma - label_name = "C.D.E." - label_desc = "Cerebral Dysfunction Emergence: A strange malfunction that causes the Artifact to force brain traumas to develop in a given target." - weight = 25 - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - var/datum/brain_trauma/trauma - -/datum/xenoartifact_trait/malfunction/trauma/on_init(obj/item/xenoartifact/X) - trauma = pick(list( - /datum/brain_trauma/mild/hallucinations, /datum/brain_trauma/mild/stuttering, /datum/brain_trauma/mild/dumbness, - /datum/brain_trauma/mild/speech_impediment, /datum/brain_trauma/mild/concussion, /datum/brain_trauma/mild/muscle_weakness, - /datum/brain_trauma/mild/expressive_aphasia, /datum/brain_trauma/severe/narcolepsy, /datum/brain_trauma/severe/discoordination, - /datum/brain_trauma/severe/pacifism, /datum/brain_trauma/special/beepsky)) - -/datum/xenoartifact_trait/malfunction/trauma/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.Unconscious(0.3 SECONDS) - H.gain_trauma(trauma, TRAUMA_RESILIENCE_BASIC) - X.cooldownmod += 10 SECONDS - -//============ -// Heated, causes artifact explode in flames -//============ -/datum/xenoartifact_trait/malfunction/heated - label_name = "Combustible" - label_desc = "Combustible: A strange malfunction that causes the Artifact to violently combust." - weight = 15 - flags = URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/heated/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/turf/T = get_turf(X) - playsound(T, 'sound/effects/bamf.ogg', 50, TRUE) - for(var/turf/open/turf in RANGE_TURFS(max(1, 4*((X.charge*1.5)/100)), T)) - if(!locate(/obj/effect/safe_fire) in turf) - new /obj/effect/safe_fire(turf) - -//Lights on fire, does nothing else damage / atmos wise -/obj/effect/safe_fire - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - icon = 'icons/effects/fire.dmi' - icon_state = "1" - layer = GASFIRE_LAYER - blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT - light_range = LIGHT_RANGE_FIRE - light_power = 1 - light_color = LIGHT_COLOR_FIRE - -/obj/effect/safe_fire/Initialize(mapload) - . = ..() - for(var/atom/AT in loc) - if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose - AT.fire_act(400, 50) //should be average enough to not do too much damage - addtimer(CALLBACK(src, PROC_REF(after_burn)), 0.3 SECONDS) - -/obj/effect/safe_fire/proc/after_burn() - qdel(src) - -//============ -// Radioactive, makes the artifact more radioactive with use -//============ -/datum/xenoartifact_trait/malfunction/radioactive - label_name = "Radioactive" - label_desc = "Radioactive: The Artifact Emmits harmful particles when a reaction takes place." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/radioactive/on_init(obj/item/xenoartifact/X) - X.rad_act(25) - -/datum/xenoartifact_trait/malfunction/radioactive/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/geiger_counter)) - to_chat(user, "The [X.name] has residual radioactive decay features.") - return TRUE - ..() - -/datum/xenoartifact_trait/malfunction/radioactive/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "You feel pins and needles after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/malfunction/radioactive/activate(obj/item/xenoartifact/X) - X.rad_act(25) - -//============ -// twin, makes an evil twin of the target -//============ -/datum/xenoartifact_trait/malfunction/twin - label_name = "Anti-Cloning" - label_desc = "Anti-Cloning: The Artifact produces an arguably maleviolent clone of target." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT - var/list/clones = list() - -/datum/xenoartifact_trait/malfunction/twin/activate(obj/item/xenoartifact/X, mob/living/target, atom/user, setup) - //Stop artifact making one morbillion clones - if(length(clones) >= XENOA_MAX_CLONES) - return - //Twin setup - var/mob/living/simple_animal/hostile/twin/T = new(get_turf(X)) - //Setup appearance for evil twin - T.name = target.name - T.appearance = target.appearance - if(istype(target) && length(target.vis_contents)) - T.add_overlay(target.vis_contents) - T.alpha = 255 - T.pixel_y = initial(T.pixel_y) - T.pixel_x = initial(T.pixel_x) - T.color = COLOR_BLUE - //Handle limit and hardel - clones += T - RegisterSignal(T, COMSIG_PARENT_QDELETING, PROC_REF(handle_death)) - -/datum/xenoartifact_trait/malfunction/twin/proc/handle_death(datum/source) - clones -= source - UnregisterSignal(source, COMSIG_PARENT_QDELETING) - -/mob/living/simple_animal/hostile/twin - name = "evil twin" - desc = "It looks just like... someone!" - mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) - speak_chance = 0 - turns_per_move = 5 - speed = 0 - maxHealth = 10 - health = 10 - melee_damage = 5 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list("evil_clone") - status_flags = CANPUSH - del_on_death = TRUE - footstep_type = FOOTSTEP_MOB_SHOE - mobchatspan = "syndmob" - -//============ -// explode, a very small explosion takes place, destroying the artifact in the process -//============ -/datum/xenoartifact_trait/malfunction/explode - label_name = "Delaminating" - label_desc = "Delaminating: The Artifact violently collapses, exploding." - flags = URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/explode/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - . = ..() - X.visible_message("The [X] begins to heat up, it's delaminating!") - apply_wibbly_filters(X, 3) - addtimer(CALLBACK(src, PROC_REF(explode), X), 10 SECONDS) - -/datum/xenoartifact_trait/malfunction/explode/proc/explode(obj/item/xenoartifact/X) - SSexplosions.explode(X, 0, 1, 2, 1) - qdel(X) - -//============ -// absorbant, absorbs nearby gasses -//============ -/datum/xenoartifact_trait/malfunction/absorbant - label_name = "Absorbing" - label_desc = "Absorbing: The Artifact absorbs large volumes of nearby gasses." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT - ///What gasses we've S U C K E D - var/datum/gas_mixture/air_contents - ///Gasses we can suck. Currently everything but, it's here if we need to blacklist in the future - var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_O2, GAS_N2, GAS_STIMULUM, GAS_PLUOXIUM) - ///Adjust for balance - I'm sure this will have no ramifications - var/volume = 1000000 - var/volume_rate = 200000 - ///Ref to artifact for destruction - var/obj/item/xenoartifact/parent - -/datum/xenoartifact_trait/malfunction/absorbant/on_init(obj/item/xenoartifact/X) - air_contents = new(volume) - air_contents.set_temperature(T20C) - parent = X - -/datum/xenoartifact_trait/malfunction/absorbant/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("[X] begins to vacuum nearby gasses!") - var/turf/T = get_turf(X) - var/datum/gas_mixture/mixture = T.return_air() - mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) - X.air_update_turf() - -//Throw sucked gas into our tile when we die -/datum/xenoartifact_trait/malfunction/absorbant/Destroy() - . = ..() - var/turf/T = get_turf(parent) - T.assume_air(air_contents) - parent.air_update_turf() - -//============ -// Hallucination, shows a random hallucination to the target once -//============ -/datum/xenoartifact_trait/malfunction/hallucination - label_name = "Hallucinogenic" - label_desc = "Hallucinogenic: The Artifact causes the target to hallucinate." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/hallucination/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(isliving(target)) - var/datum/hallucination/H = pick(GLOB.hallucination_list) - H = new H(target) diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm b/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm deleted file mode 100644 index 8bfb1997822da..0000000000000 --- a/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm +++ /dev/null @@ -1,484 +0,0 @@ -//Minor traits - Use the to define aspects of the artifact without any immediate interaction -//============ -// Looped, increases charge towards 100 -//============ -/datum/xenoartifact_trait/minor/looped - desc = "Looped" - label_desc = "Looped: The Artifact feeds into itself and amplifies its own charge." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/looped/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays a resistance reading of [X.charge_req*0.1].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/looped/activate(obj/item/xenoartifact/X) - X.charge = ((100-X.charge)*0.2)+X.charge //This should generally cut off around 100 - -//============ -// Capacitive, gives the artifact extra uses before it starts cooldown -//============ -/datum/xenoartifact_trait/minor/capacitive - desc = "Capacitive" - label_desc = "Capacitive: The Artifact's structure allows it to hold extra charges." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - var/charges //Extra uses, not total - var/saved_cooldown //This may be considered messy but it's a more practical approach that avoids making an edgecase - -/datum/xenoartifact_trait/minor/capacitive/on_init(obj/item/xenoartifact/X) - charges = pick(0, 1, 2) //Extra charges, not total - -/datum/xenoartifact_trait/minor/capacitive/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The hairs on your neck stand up after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/minor/capacitive/activate(obj/item/xenoartifact/X) - if(!(saved_cooldown) && X.cooldown) - saved_cooldown = X.cooldown //Avoid doing this on init beacause malfunctions can change it in the future - if(charges) - charges -= 1 - X.cooldown = -1000 SECONDS //This is better than making a unique interaction in xenoartifact.dm - return - charges = pick(0, 1, 2) - playsound(get_turf(X), 'sound/machines/capacitor_charge.ogg', 50, TRUE) - X.cooldown = saved_cooldown - saved_cooldown = null - -/datum/xenoartifact_trait/minor/capacitive/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays an overcharge reading of [charges/3].") - return TRUE - return ..() - -//============ -// Dense, makes the artifact mimic a structure -//============ -/datum/xenoartifact_trait/minor/dense //Rather large, quite gigantic, particularly big - desc = "Dense" - label_desc = "Dense: The Artifact is dense and cannot be easily lifted but, the design has a slightly higher reaction rate." - blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/light, /datum/xenoartifact_trait/minor/heavy, /datum/xenoartifact_trait/minor/blocking, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/slippery) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/dense/on_init(obj/item/xenoartifact/X) - X.density = TRUE - X.interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND - X.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND - X.charge_req += 20 - -//============ -// Sharp, makes the artifact do extra damage and slice type -//============ -/datum/xenoartifact_trait/minor/sharp - desc = "Sharp" - label_desc = "Sharp: The Artifact is shaped into a fine point. Perfect for popping balloons." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/sharp/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] feels sharp.") - return TRUE - -/datum/xenoartifact_trait/minor/sharp/on_init(obj/item/xenoartifact/X) - X.sharpness = IS_SHARP_ACCURATE - X.bleed_force = BLEED_CUT - X.force = X.charge_req*0.12 - X.attack_verb_continuous = list("cleaves", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") - X.attack_verb_simple = list("cleave", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") - X.attack_weight = 2 - X.armour_penetration = 5 - -//============ -// Cooler, reduces cooldown times -//============ -/datum/xenoartifact_trait/minor/cooler - desc = "Frosted" - label_desc = "Frosted: The Artifact has the unique property of actively cooling itself. This also seems to reduce time between uses." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/cooler/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] feels cold.") - return TRUE - -/datum/xenoartifact_trait/minor/cooler/on_init(obj/item/xenoartifact/X) - X.cooldown = 4 SECONDS //Might revisit the value. - -/datum/xenoartifact_trait/minor/cooler/activate(obj/item/xenoartifact/X) - X.charge -= 10 - -//============ -// Sentient, allows a ghost to control the artifact -//============ -/datum/xenoartifact_trait/minor/sentient - label_name = "Sentient" - label_desc = "Sentient: The Artifact seems to be alive, influencing events around it. The Artifact wants to return to its master..." - //Slightly increase weight - muh arpee serber - weight = 55 - ///he who lives inside - var/mob/living/simple_animal/shade/man - ///His doorbell - var/obj/effect/mob_spawn/sentient_artifact/S - -/datum/xenoartifact_trait/minor/sentient/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] whispers to you...") - return TRUE - -/datum/xenoartifact_trait/minor/sentient/on_init(obj/item/xenoartifact/X) - addtimer(CALLBACK(src, PROC_REF(get_canidate), X), 5 SECONDS) - RegisterSignal(X, COMSIG_PARENT_EXAMINE, PROC_REF(handle_ghost), TRUE) - -//Proc used to give access to ghosts when original player leaves -/datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) - if(isobserver(M) && man && !man?.key && (alert(M, "Are you sure you want to control of [man]?", "Assume control of [man]", "Yes", "No") == "Yes")) - man.key = M.ckey - -/datum/xenoartifact_trait/minor/sentient/proc/get_canidate(obj/item/xenoartifact/X, mob/M) - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [X.name]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - setup_sentience(X, C.ckey) - return - S = new(get_turf(X), X) - S.density = FALSE - -/datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(obj/item/xenoartifact/X, ckey) - if(!(SSzclear.get_free_z_level())) - playsound(get_turf(X), 'sound/machines/buzz-sigh.ogg', 50, TRUE) - return - man = new(get_turf(X)) - man.name = pick(GLOB.xenoa_artifact_names) - man.real_name = "[man.name] - [X]" - man.key = ckey - man.status_flags |= GODMODE - log_game("[key_name_admin(man)] took control of the sentient [X]. [X] located at [AREACOORD(X)]") - man.forceMove(X) - man.set_anchored(TRUE) - var/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/xeno_senitent_action(,X) - man.AddSpell(P) - //show little guy his traits - to_chat(man, "Your traits are: \n") - for(var/datum/xenoartifact_trait/T in X.traits) - to_chat(man, "[(T.desc || T.label_name)]\n") - if(man.key) - playsound(get_turf(X), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) - qdel(S) - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action //Lets sentience target goober - name = "Activate" - desc = "Select a target to activate your traits on." - range = 1 - charge_max = 0 SECONDS - clothes_req = 0 - include_user = 0 - action_icon = 'icons/hud/actions/actions_revenant.dmi' - action_icon_state = "r_transmit" - action_background_icon_state = "bg_spell" - var/obj/item/xenoartifact/xeno - -CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/proc_holder/spell/targeted/xeno_senitent_action) - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/Initialize(mapload, var/obj/item/xenoartifact/Z) - . = ..() - xeno = Z - range = Z.max_range+1 - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(!xeno) - return - for(var/atom/M in targets) - xeno.true_target += xeno.process_target(M) - xeno.default_activate(xeno.charge_req+10) - charge_max = xeno.cooldown+xeno.cooldownmod - -/datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) - . = ..() - QDEL_NULL(man) //Kill the inner person. Otherwise invisible runs around - QDEL_NULL(S) - -/obj/effect/mob_spawn/sentient_artifact - death = FALSE - name = "Sentient Xenoartifact" - short_desc = "You're a maleviolent sentience, possesing an ancient alien artifact." - flavour_text = "Return to your master..." - use_cooldown = TRUE - banType = ROLE_SENTIENT_XENOARTIFACT - invisibility = 101 - var/obj/item/xenoartifact/artifact - -CREATION_TEST_IGNORE_SUBTYPES(/obj/effect/mob_spawn/sentient_artifact) - -/obj/effect/mob_spawn/sentient_artifact/Initialize(mapload, var/obj/item/xenoartifact/Z) - if(!Z) - qdel(src) - return FALSE - artifact = Z - return ..() - -/obj/effect/mob_spawn/sentient_artifact/create(ckey, name) - var/datum/xenoartifact_trait/minor/sentient/S = artifact.get_trait(/datum/xenoartifact_trait/minor/sentient) - S.setup_sentience(artifact, ckey) - -//============ -// Delicate, makes the artifact have limited uses -//============ -/datum/xenoartifact_trait/minor/delicate - desc = "Fragile" - label_desc = "Fragile: The Artifact is poorly made. Continuous use will destroy it." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/delicate/on_init(obj/item/xenoartifact/X) - X.max_integrity = pick(200, 300, 500, 800, 1000) - X.update_integrity(X.max_integrity) - X.alpha = X.alpha * 0.55 - -/datum/xenoartifact_trait/minor/delicate/activate(obj/item/xenoartifact/X, atom/user) - if(X.get_integrity() > 0) - X.update_integrity(-100) - X.visible_message("The [X.name] cracks!", "The [X.name] cracks!") - else - X.visible_message("The [X.name] shatters!", "The [X.name] shatters!") - var/obj/effect/decal/cleanable/ash/A = new(get_turf(X)) - A.color = X.material - playsound(get_turf(X), 'sound/effects/glassbr1.ogg', 50, TRUE) - qdel(X) - -//============ -// Aura, adds everything in the vicinity to the target list -//============ -/datum/xenoartifact_trait/minor/aura - desc = "Expansive" - label_desc = "Expansive: The Artifact's surface reaches towards every creature in the room. Even the empty space behind you..." - blacklist_traits = list(/datum/xenoartifact_trait/major/timestop, /datum/xenoartifact_trait/minor/long) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/aura/on_init(obj/item/xenoartifact/X) - X.max_range += 2 - -/datum/xenoartifact_trait/minor/aura/activate(obj/item/xenoartifact/X) - for(var/atom/M in oview(min(X.max_range, 5), get_turf(X.loc))) - if(X.true_target.len >= XENOA_MAX_TARGETS) - return - var/obj/item/I = M - if(istype(M, /mob/living)) - X.true_target |= X.process_target(M) - else if(istype(I) && !(I.anchored)) - X.true_target |= X.process_target(I) - -//============ -// Long, makes the artifact ranged, allows effects to select targets from afar -//============ -/datum/xenoartifact_trait/minor/long - desc = "Scoped" - label_desc = "Scoped: The Artifact has an almost magnifying effect to it. You could probably target someone from really far away with it." - blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/long/on_init(obj/item/xenoartifact/X) - X.max_range += 18 - -//============ -// Wearable, allows artifact to be worn like a glove. -//============ -/datum/xenoartifact_trait/minor/wearable - desc = "Shaped" - label_desc = "Shaped: The Artifact is small and shaped. It looks as if it'd fit on someone's finger." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT - -/datum/xenoartifact_trait/minor/wearable/on_init(obj/item/xenoartifact/X) - X.slot_flags = ITEM_SLOT_GLOVES - -/datum/xenoartifact_trait/minor/wearable/activate(obj/item/xenoartifact/X, atom/user) - X.true_target |= list(user) - -//============ -// Allows artifact to act like a shield -//============ -/datum/xenoartifact_trait/minor/blocking - desc = "Shielded" - label_desc = "Shielded: The Artifact's composistion lends itself well to blocking attacks. It would do you good to bring this to a rage cage." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/blocking/on_init(obj/item/xenoartifact/X) - X.block_level = pick(1, 2, 3, 4) - X.block_upgrade_walk = 1 - X.block_power = 25 * pick(0.8, 1, 1.3, 1.5) - -//============ -// Light, allows artifact to be thrown far -//============ -/datum/xenoartifact_trait/minor/light - desc = "Light" - label_desc = "Light: The Artifact is made from a light material. You can pitch it pretty far." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/heavy) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/light/on_init(obj/item/xenoartifact/X) - X.throw_range = 8 - -//============ -// Heavy, artifact cannot be throwwn far -//============ -/datum/xenoartifact_trait/minor/heavy - desc = "Heavy" - label_desc = "Heavy: The Artifact is made from a heavy material. You can't pitch it very far." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/light) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/heavy/on_init(obj/item/xenoartifact/X) - X.throw_range = 1 - -//============ -// Signalsend, activating the artifact sends a set signal -//============ -/datum/xenoartifact_trait/minor/signalsend - label_name = "Signaler" - label_desc = "Signaler: The Artifact sends out a signal everytime it's activated." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/signalsend/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item.name] displays an outputting signal code of [X.code], and frequency [X.frequency].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/signalsend/on_init(obj/item/xenoartifact/X) - X.code = rand(1, 100) - X.frequency = FREQ_SIGNALER - X.set_frequency(X.frequency) - -/datum/xenoartifact_trait/minor/signalsend/activate(obj/item/xenoartifact/X) - var/datum/signal/signal = new(list("code" = X.code)) - X.send_signal(signal) - log_game("[X] sent signal code [X.code] on frequency [X.frequency] at [world.time]. [X] located at [AREACOORD(X)]") - -//============ -// Anchor, the artifact can be anchored, anchors when activated -//============ -/datum/xenoartifact_trait/minor/anchor - desc = "Anchored" - label_desc = "Anchored: The Artifact buckles to the floor with the weight of a sun every time it activates. Heavier than you, somehow." - blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/haunted) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/anchor/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X) - X.visible_message("The [X.name] buckles to the floor!") - X.set_anchored(TRUE) - X.density = TRUE - -/datum/xenoartifact_trait/minor/anchor/on_item(obj/item/xenoartifact/X, atom/user, obj/item/item) - if(item.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You [X.anchored ? "unanchor" : "anchor"] the [X.name] to the [get_turf(X)].") - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X) - X.set_anchored(!X.anchored) - if(!X.get_trait(/datum/xenoartifact_trait/minor/dense)) - X.density = !X.density - return TRUE - return ..() - -//============ -// Slippery, the artifact is slippery. Honk -//============ -/datum/xenoartifact_trait/minor/slippery - desc = "Slippery" - label_desc = "Slippery: The Artifact's surface is perpetually slippery. Popular amongst scientific-clown groups." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - var/datum/component/slippery/slipper - -/datum/xenoartifact_trait/minor/slippery/on_init(obj/item/xenoartifact/X) - slipper = X.AddComponent(/datum/component/slippery, 80) - -/datum/xenoartifact_trait/minor/slippery/Destroy(force, ...) - QDEL_NULL(slipper) - return ..() - -//============ -// haunted, the artifact can be controlled by deadchat, works well with sentient -//============ -/datum/xenoartifact_trait/minor/haunted - label_name = "Haunted" - label_desc = "Haunted: The Artifact's appears to interact with bluespace spatial regression, causing the item to appear haunted." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/wearable) - flags = BLUESPACE_TRAIT - weight = 15 - var/datum/component/deadchat_control/controller - -/datum/xenoartifact_trait/minor/haunted/on_init(obj/item/xenoartifact/X) - controller = X._AddComponent(list(/datum/component/deadchat_control, "democracy", list( - "up" = CALLBACK(src, PROC_REF(haunted_step), X, NORTH), - "down" = CALLBACK(src, PROC_REF(haunted_step), X, SOUTH), - "left" = CALLBACK(src, PROC_REF(haunted_step), X, WEST), - "right" = CALLBACK(src, PROC_REF(haunted_step), X, EAST), - "activate" = CALLBACK(src, PROC_REF(activate_parent), X)), 10 SECONDS)) - -/datum/xenoartifact_trait/minor/haunted/proc/haunted_step(obj/item/xenoartifact/ref, dir) - if(isliving(ref.loc)) //Make any mobs drop this before it moves - var/mob/living/M = ref.loc - M.dropItemToGround(ref) - playsound(get_turf(ref), 'sound/effects/magic.ogg', 50, TRUE) - step(ref, dir) - -///Used for ghost command -/datum/xenoartifact_trait/minor/haunted/proc/activate_parent(obj/item/xenoartifact/ref) - //Get a target to style on - ref.true_target = ref.get_target_in_proximity(min(ref.max_range+1, 5)) - if(ref.true_target.len) - ref.check_charge(ref.true_target[1]) - -/datum/xenoartifact_trait/minor/haunted/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/storage/book/bible)) - to_chat(user, "The [X.name] rumbles on contact with the [item].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) - QDEL_NULL(controller) - return ..() - -//============ -// Delay, delays the activation. Credit to EvilDragon#4532 -//============ -/datum/xenoartifact_trait/minor/delay - label_name = "Delayed" - label_desc = "Delayed: The Artifact's composistion causes activations to be delayed." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - weight = 25 - -/datum/xenoartifact_trait/minor/delay/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("The [X] halts and begins to hum deeply.", "The [X] halts and begins to hum deeply.") - playsound(get_turf(X), 'sound/effects/seedling_chargeup.ogg', 50, TRUE) - sleep(3 SECONDS) - -//============ -// Blink, the artifact dissapears for a short duration after use -//============ -/datum/xenoartifact_trait/minor/blink - label_name = "Desynced" - label_desc = "Desynced: The Artifact falls in & out of existence regularly." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - ///Where your eyes don't go - var/obj/effect/confiscate - -/datum/xenoartifact_trait/minor/blink/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("[X] slips between dimensions!") - confiscate = new(get_turf(X)) - X.forceMove(confiscate) - addtimer(CALLBACK(src, PROC_REF(comeback), X), X.charge*0.20 SECONDS) - -/datum/xenoartifact_trait/minor/blink/proc/comeback(obj/item/xenoartifact/X) - X.visible_message("[X] slips between dimensions!") - X.forceMove(get_turf(confiscate)) - QDEL_NULL(confiscate) - -/datum/xenoartifact_trait/minor/blink/Destroy(force, ...) - . = ..() - if(!isnull(confiscate)) - comeback() diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_traits.dm b/code/modules/xenoarchaeology/traits/xenoartifact_traits.dm deleted file mode 100644 index 688d7b5fd5bbe..0000000000000 --- a/code/modules/xenoarchaeology/traits/xenoartifact_traits.dm +++ /dev/null @@ -1,125 +0,0 @@ -///Xenoartifact traits, datum-ised -/datum/xenoartifact_trait - ///Acts as a descriptor for when examining. Also used for naming stuff in the labeler. Keep these short. - var/desc - ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. - var/label_name - ///Something briefly explaining it in IG terms or a pun. - var/label_desc - ///Asscoiated flags for artifact typing - var/flags = NONE - ///Other traits the original trait wont work with. Referenced when generating traits. - var/list/blacklist_traits = list() - ///Weight in trait list, most traits wont change this - var/weight = 50 - -//Subtype shenanigahns -/datum/xenoartifact_trait/minor //leave these here for later. - -/datum/xenoartifact_trait/major - -/datum/xenoartifact_trait/malfunction - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT - -/datum/xenoartifact_trait/activator - ///How much an activator trait can output on a standard, modified by the artifacts charge_req and circumstances. - var/charge - ///which signals trait responds to - var/list/signals - ///Not used outside of signal handle, please - var/obj/item/xenoartifact/xenoa - -///Proc used to compile trait weights into a list -/proc/compile_artifact_weights(path) - if(!ispath(path)) - return - var/list/temp = subtypesof(path) - var/list/weighted = list() - for(var/datum/xenoartifact_trait/T as() in temp) - weighted += list((T) = initial(T.weight)) - return weighted - -///Compile a blacklist of traits from a given flag/s -/proc/compile_artifact_blacklist(var/flags) - var/list/output = list() - for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) - if(!(initial(T.flags) & flags)) - output += T - return output - -//Activator signal shenanignas -///Passes information into the activator datum to decide if, and how, the artifact activates -/datum/xenoartifact_trait/activator/proc/pass_input(obj/item/xenoartifact/X) - return - -/datum/xenoartifact_trait/activator/on_init(obj/item/xenoartifact/X) - . = ..() - if(!X) - return - xenoa = X - for(var/s in signals) - switch(s) //Translating signal params to vaugely resemble (/obj/item, /mob/living, params) - if(COMSIG_PARENT_ATTACKBY) - RegisterSignal(xenoa, COMSIG_PARENT_ATTACKBY, PROC_REF(translate_attackby)) - if(COMSIG_ITEM_ATTACK) - RegisterSignal(xenoa, COMSIG_ITEM_ATTACK, PROC_REF(translate_attack)) - if(COMSIG_MOVABLE_IMPACT) - RegisterSignal(xenoa, COMSIG_MOVABLE_IMPACT, PROC_REF(translate_impact)) - if(COMSIG_ITEM_AFTERATTACK) - RegisterSignal(xenoa, COMSIG_ITEM_AFTERATTACK, PROC_REF(translate_afterattack)) - if(COMSIG_ITEM_PICKUP) - RegisterSignal(xenoa, COMSIG_ITEM_PICKUP, PROC_REF(translate_pickup)) - if(COMSIG_ITEM_ATTACK_SELF) - RegisterSignal(xenoa, COMSIG_ITEM_ATTACK_SELF, PROC_REF(translate_attack_self)) - if(XENOA_SIGNAL) - RegisterSignal(xenoa, XENOA_SIGNAL, PROC_REF(translate_attackby)) - RegisterSignal(xenoa, XENOA_DEFAULT_SIGNAL, PROC_REF(pass_input)) //Signal sent by handles - -/datum/xenoartifact_trait/activator/Destroy(force, ...) - . = ..() - if(!xenoa) - return - for(var/s in signals) - UnregisterSignal(xenoa, s) - UnregisterSignal(xenoa, XENOA_DEFAULT_SIGNAL) - xenoa = null - -/datum/xenoartifact_trait/activator/proc/translate_attackby(datum/source, obj/item/thing, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, thing, user, user) - -/datum/xenoartifact_trait/activator/proc/translate_attack_self(datum/source, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, user, user) - -/datum/xenoartifact_trait/activator/proc/translate_attack(mob/living/target, mob/living/user) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, user, target) - -/datum/xenoartifact_trait/activator/proc/translate_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, hit_atom, throwingdatum) //Weird order to fix this becuase signals are mean - -/datum/xenoartifact_trait/activator/proc/translate_afterattack(atom/target, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, target, params, user) //Weird order to fix this becuase signals are mean - -/datum/xenoartifact_trait/activator/proc/translate_pickup(mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, params) //Weird order to fix this becuase signals are mean - -//End activator -//Declare procs -/datum/xenoartifact_trait/proc/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup = TRUE) //Typical behaviour - return - -/datum/xenoartifact_trait/proc/on_item(obj/item/xenoartifact/X, atom/user, atom/item) //Item hint responses - return FALSE - -///This is better than initialize just for our specific control purposes, definitely not becuase I forgot to use it somehow. -/datum/xenoartifact_trait/proc/on_init(obj/item/xenoartifact/X) - return - -/datum/xenoartifact_trait/proc/on_touch(obj/item/xenoartifact/X, atom/user) //Touch hint - return FALSE - -//Exploration mission GPS trait -/datum/xenoartifact_trait/special/objective - blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) - -/datum/xenoartifact_trait/special/objective/on_init(obj/item/xenoartifact/X) - X.AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) diff --git a/code/modules/xenoarchaeology/xenoartifact.dm b/code/modules/xenoarchaeology/xenoartifact.dm deleted file mode 100644 index 56b12f6b6f870..0000000000000 --- a/code/modules/xenoarchaeology/xenoartifact.dm +++ /dev/null @@ -1,525 +0,0 @@ -/obj/item/xenoartifact - name = "artifact" - icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - icon_state = "map_editor" - w_class = WEIGHT_CLASS_NORMAL - item_flags = ISWEAPON - light_color = LIGHT_COLOR_FIRE - desc = "A strange alien device. What could it possibly do?" - throw_range = 3 - - ///How much input the artifact is getting from activator traits - var/charge = 0 - ///This isn't a requirement anymore. This just affects how effective the charge is - var/charge_req - ///Processing type, used for tick - var/process_type - ///List of targted entities for traits - var/list/true_target = list() - - ///Associated traits & colour - var/material - ///activation trait, minor 1, minor 2, minor 3, major, malfunction - var/list/traits = list() - ///Internal list of unallowed traits - var/list/blacklist = list() - ///Touch hint - var/datum/xenoartifact_trait/touch_desc - ///used for special examine circumstance, science goggles & ghosts - var/special_desc = "The artifact is made from a" - ///Description used for label, used because directly adding shit to desc isn't a good idea - var/label_desc - ///How far the artifact can reach - var/max_range = 1 - - //Used for signaler trait - var/code - var/frequency - var/datum/radio_frequency/radio_connection - - //Time between uses - var/cooldown = 8 SECONDS - ///Extra time traits can add to the cooldown - var/cooldownmod = 0 - COOLDOWN_DECLARE(xenoa_cooldown) - - ///Everytime the artifact is used this increases. When this is successfully proc'd the artifact gains a malfunction and this is lowered. - var/malfunction_chance = 0 - ///How much the chance can change in a sinlge itteration - var/malfunction_mod = 1 - ///Ref to trait list for malfunctions - var/list/blacklist_ref - - //snowflake variable for shaped - var/transfer_prints = FALSE - -/obj/item/xenoartifact/ComponentInitialize() - . = ..() - AddComponent(/datum/component/xenoartifact_pricing) - AddComponent(/datum/component/discoverable, XENOA_DP, TRUE) //Same values as original artifacts from exploration - -CREATION_TEST_IGNORE_SUBTYPES(/obj/item/xenoartifact) - -/obj/item/xenoartifact/Initialize(mapload, difficulty) - . = ..() - - generate_xenoa_statics() //This wont load if it's already done, aka this wont spam - - blacklist_ref = GLOB.xenoa_bluespace_blacklist - material = difficulty //Difficulty is set, in most cases - if(!material) - material = pick_weight(list(XENOA_BLUESPACE = 8, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) //Maint artifacts and similar situations - - var/price - var/extra_masks = 0 - switch(material) - if(XENOA_BLUESPACE) //Check xenoartifact_materials.dm for info on artifact materials/types/traits - name = "bluespace [name]" - generate_traits(GLOB.xenoa_bluespace_blacklist) - if(!price) - price = pick(100, 200, 300) - extra_masks = pick(1) - - if(XENOA_PLASMA) - name = "plasma [name]" - blacklist_ref = GLOB.xenoa_plasma_blacklist - generate_traits(GLOB.xenoa_plasma_blacklist) - if(!price) - price = pick(200, 300, 500) - malfunction_mod = 3 - extra_masks = pick(1) - - if(XENOA_URANIUM) - name = "uranium [name]" - blacklist_ref = GLOB.xenoa_uranium_blacklist - generate_traits(GLOB.xenoa_uranium_blacklist, TRUE) - if(!price) - price = pick(300, 500, 800) - malfunction_mod = 5 - extra_masks = pick(1) - - if(XENOA_BANANIUM) - name = "bananium [name]" - generate_traits() - if(!price) - price = pick(500, 800, 1000) - malfunction_mod = 5 - extra_masks = 0 - SEND_SIGNAL(src, XENOA_CHANGE_PRICE, price) //update price, bacon requested signals - - //Initialize traits that require that. - for(var/datum/xenoartifact_trait/t as() in traits) - t.on_init(src) - - //Sprite process - //Base texture - var/icon/texture = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "texture-[material]-[pick(1, 2, 3)]") - //Masking - var/list/indecies = list(1, 2, 3, 4, 5) //Indecies for masks - var/index = pick(indecies) - indecies -= index - var/icon/mask = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "mask-[material]-[index]") - for(var/i in 1 to extra_masks) - index = pick(indecies) - indecies -= index - var/icon/extra_mask = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "mask-[material]-[index]") - mask.Blend(extra_mask, ICON_UNDERLAY) - texture.AddAlphaMask(mask) - icon = texture - add_filter("inner_band", 1, list("type" = "outline", "color" = "#000", "size" = 1)) - add_filter("outer_band", 1.1, list("type" = "outline", "color" = material, "size" = 1)) - -/obj/item/xenoartifact/Destroy() - SSradio.remove_object(src, frequency) - for(var/datum/xenoartifact_trait/T as() in traits) - qdel(T) //deleting the traits individually ensures they properly destroy, deleting the list bunks it - traits = null - qdel(touch_desc) - for(var/atom/movable/AM in contents) - if(istype(AM, /obj/item/xenoartifact_label)) //Delete stickers - qdel(AM) - else - AM.forceMove((loc ? loc : get_turf(src))) - return ..() - -/obj/item/xenoartifact/CanAllowThrough(atom/movable/mover, turf/target) //tweedle dee, density feature - if(get_trait(/datum/xenoartifact_trait/minor/dense) || anchored) - return FALSE - return ..() - -/obj/item/xenoartifact/attack_hand(mob/user) //tweedle dum, density feature - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - - if(isliving(loc) && touch_desc?.on_touch(src, user) && user.can_see_reagents()) - balloon_alert(user, (initial(touch_desc.desc) ? initial(touch_desc.desc) : initial(touch_desc.label_name)), material) - - if(get_trait(/datum/xenoartifact_trait/minor/dense) || anchored) - if(process_type == PROCESS_TYPE_LIT) //Snuff out candle - to_chat(user, "You snuff out [name]") - process_type = null - return FALSE - if(P?.safety && isliving(loc)) - SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, src, user, user) //we're in the ghetto now - - if(P?.safety && isliving(loc)) - return - ..() - -/obj/item/xenoartifact/examine(mob/living/carbon/user) - . = ..() - if(user.can_see_reagents()) //Not checking carbon throws a runtime concerning observers - . += "[special_desc]" - if(isobserver(user)) - for(var/datum/xenoartifact_trait/t as() in traits) - . += (t?.desc ? "[t.desc]" : "[t.label_name]") - . += label_desc - -/obj/item/xenoartifact/attack_self(mob/user) - if(!isliving(loc) && (!get_trait(/datum/xenoartifact_trait/minor/dense) || anchored)) - return - - if(process_type == PROCESS_TYPE_LIT) //Snuff out candle - to_chat(user, "You snuff out [name]") - process_type = null - return - - if(isliving(loc) && touch_desc?.on_touch(src, user) && user.can_see_reagents()) - balloon_alert(user, (initial(touch_desc.desc) ? initial(touch_desc.desc) : initial(touch_desc.label_name)), material) - - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety && isliving(loc)) - return - ..() - -/obj/item/xenoartifact/attackby(obj/item/I, mob/living/user, params) - var/tool_text - for(var/datum/xenoartifact_trait/t as() in traits) //chat, bubble-hints & helpers - if(t?.on_item(src, user, I) && user.can_see_reagents()) - tool_text = "[tool_text][t.desc ? t.desc : t.label_name]\n" - if(tool_text) - balloon_alert(user, tool_text, material) - - //allow people to remove stickers - if(I.tool_behaviour == TOOL_WIRECUTTER && (locate(/obj/item/xenoartifact_label) in contents)) - label_desc = null - I.use_tool() - qdel(locate(/obj/item/xenoartifact_label) in contents) - - //Let people label in peace - if(istype(I, /obj/item/xenoartifact_label) || istype(I, /obj/item/xenoartifact_labeler)) - return - - //abort if safety - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety) - to_chat(user, "You perform a safe operation on [src] with [I].") - return - ..() - -/obj/item/xenoartifact/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - //abort if safety - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety) - to_chat(user, "You perform a safe operation on [src].") - return - ..() - -///Run traits. Used to activate all minor, major, and malfunctioning traits in the artifact's trait list. Sets cooldown when properly finished. -/obj/item/xenoartifact/proc/check_charge(mob/user, charge_mod) - log_game("[user] attempted to activate [src] at [world.time]. Located at [AREACOORD(src)].") - - if(COOLDOWN_FINISHED(src, xenoa_cooldown) && !istype(loc, /obj/item/storage)) - COOLDOWN_START(src, xenoa_cooldown, cooldown+cooldownmod) - if(prob(malfunction_chance) && traits.len < 7 + (material == XENOA_URANIUM ? 1 : 0)) //See if we pick up an malfunction - generate_malfunction_unique() - malfunction_chance = 0 //Lower chance after contracting - else //otherwise increase chance. - malfunction_chance = min(malfunction_chance + malfunction_mod, 100) - - charge += charge_mod - charge = (charge+charge_req)/1.9 //Not quite an average. Generally produces better results. - - for(var/datum/xenoartifact_trait/minor/t in traits)//Minor traits aren't apart of the target loop, specifically becuase they pass data into it. - t.activate(src, user, user) - log_game("[src] activated minor trait [t] at [world.time]. Located at [AREACOORD(src)]") - - //Clamp charge to avoid fucky wucky - charge = max(10, charge) - - //Add holder for muh balance - /* - Uncomment this if artifact abuse becomes a huge issue - - if(isliving(loc) || isliving(pulledby)) - var/mob/living/M = isliving(loc) ? loc : pulledby - if(!istype(M.get_item_by_slot(ITEM_SLOT_GLOVES), /obj/item/clothing/gloves/artifact_pinchers) && !istype(get_area(M), /area/science)) - true_target |= list(M) - */ - - for(var/atom/M in true_target) //target loop, majors & malfunctions - if(get_dist(get_turf(src), get_turf(M)) <= max_range) - create_beam(M) //Indicator beam, points to target, M - for(var/datum/xenoartifact_trait/t as() in traits) //Major traits - if(!istype(t, /datum/xenoartifact_trait/minor)) - log_game("[src] activated trait [t] at [world.time]. Located at [AREACOORD(src)]") - t.activate(src, M, user) - if(!get_trait(/datum/xenoartifact_trait/major/horn)) - playsound(get_turf(src), 'sound/magic/blink.ogg', 25, TRUE) - - charge = 0 - true_target?.Cut(1, 0) - -///Generate traits outside of blacklist. Malf = TRUE if you want malfunctioning traits. -/obj/item/xenoartifact/proc/generate_traits(list/blacklist_traits, malf = FALSE) - //Provided blacklist or nothing, covers bananium - blacklist = blacklist_traits?.Copy() || list() - - var/datum/xenoartifact_trait/desc_holder - desc_holder = generate_trait_unique(GLOB.xenoa_activators, blacklist, FALSE) //Activator - special_desc = initial(desc_holder.desc) ? "[special_desc] [initial(desc_holder.desc)]" : "[special_desc]n Unknown" - - desc_holder = null - var/datum/xenoartifact_trait/minor_desc_holder - for(var/i in 1 to 3) - minor_desc_holder = generate_trait_unique(GLOB.xenoa_minors, blacklist, FALSE) //Minor/s - desc_holder = desc_holder ? desc_holder : minor_desc_holder - if(!touch_desc) - touch_desc = traits[traits.len] - if(!touch_desc.on_touch(src, src)) - touch_desc = null //not setting this to null fucks with check, qdel refuses to be helpful another day - - special_desc = initial(desc_holder?.desc) ? "[special_desc] [initial(desc_holder.desc)] material." : "[special_desc] material." - - if(malf) - generate_trait_unique(GLOB.xenoa_malfs, blacklist) //Malf - - desc_holder = generate_trait_unique(GLOB.xenoa_majors, blacklist, FALSE) //Major - special_desc = initial(desc_holder.desc) ? "[special_desc] The shape is [initial(desc_holder.desc)]." : "[special_desc] The shape is Unknown." - - charge_req = rand(1, 10) * 10 - -///generate a single trait against a blacklist. Used in larger /obj/item/xenoartifact/proc/generate_traits() -/obj/item/xenoartifact/proc/generate_trait_unique(list/trait_list, list/blacklist_traits = list()) - var/datum/xenoartifact_trait/new_trait //Selection - var/list/selection = trait_list.Copy() //Selectable traits - selection -= blacklist_traits - if(selection.len < 1) - log_game("An impossible event has occured. [src] has failed to generate any traits!") - return - new_trait = pick_weight(selection) - blacklist += new_trait //Add chosen trait to blacklist - traits += new new_trait - new_trait = new new_trait //type converting doesn't work too well here but this should be fine. - blacklist += new_trait.blacklist_traits //Cant use initial() to access lists without bork'ing it - return new_trait - -///generates a malfunction respective to the artifact's type - don't use anywhere but for check_charge malfunctions -/obj/item/xenoartifact/proc/generate_malfunction_unique(list/blacklist) - var/list/malfunctions = GLOB.xenoa_malfs.Copy() - malfunctions -= blacklist - malfunctions -= traits - if(!malfunctions.len) - return - //Pick one to use - var/datum/xenoartifact_trait/T = pick(malfunctions) - T = new T - traits += T - -///Gets a singular entity, there's a specific traits that handles multiple. -/obj/item/xenoartifact/proc/get_target_in_proximity(range) - for(var/mob/living/M in oview(range, get_turf(src))) - . = process_target(M) - if(isliving(loc) && !.) - . = process_target(loc) - //Return a list becuase byond is fucky and WILL overwrite the typing - return list(.) - -///Returns the desired trait and it's values if it's in the artifact's list -/obj/item/xenoartifact/proc/get_trait(typepath) - return (locate(typepath) in traits) - -///Used for hand-holding secret technique. Pulling entities swaps them for you in the target list. -/obj/item/xenoartifact/proc/process_target(atom/target) - if(ishuman(target)) //early return if deflect chance - var/mob/living/carbon/human/H = target - if(H.wear_suit && H.head && isclothing(H.wear_suit) && isclothing(H.head)) - if(H.anti_artifact_check()) - to_chat(target, "The [name] was unable to target you!") - playsound(get_turf(target), 'sound/weapons/deflect.ogg', 25, TRUE) - return - - if(isliving(target)) //handle pulling - var/mob/living/M = target - . = M?.pulling ? M.pulling : M - else - . = target - RegisterSignal(., COMSIG_PARENT_QDELETING, PROC_REF(on_target_del), TRUE) - return - -///Hard del handle -/obj/item/xenoartifact/proc/on_target_del(atom/target) - UnregisterSignal(target, COMSIG_PARENT_QDELETING) - true_target -= list(target) - -///Helps show how the artifact is working. Hint stuff. Draws a beam between artifact and target -/obj/item/xenoartifact/proc/create_beam(atom/target) - if((locate(src) in target?.contents) || !get_turf(target)) - return - var/datum/beam/xenoa_beam/B = src.Beam(BeamTarget=target,icon_state = "xenoa_beam",icon='icons/obj/xenoarchaeology/xenoartifact.dmi', time = 1.5 SECONDS, beam_type=/obj/effect/ebeam/xenoa_ebeam) - B.beam_color = material - INVOKE_ASYNC(B, TYPE_PROC_REF(/datum/beam/xenoa_beam, Start)) - -///Default template used to interface with activator signals. -/obj/item/xenoartifact/proc/default_activate(chr, mob/user, atom/target) - if(!COOLDOWN_FINISHED(src, xenoa_cooldown)) - return FALSE - charge = chr - true_target |= process_target(target) - check_charge(user) - return TRUE - -///Signaler traits. Sets listening freq -/obj/item/xenoartifact/proc/set_frequency(new_frequency) - SSradio.remove_object(src, frequency) - frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, "[RADIO_XENOA]_[REF(src)]") //not doing the weird filter fucks with other artifacts - -///Signaler traits. Sends signal -/obj/item/xenoartifact/proc/send_signal(datum/signal/signal) - if(!radio_connection||!signal) - return - radio_connection.post_signal(src, signal) - -/obj/item/xenoartifact/receive_signal(datum/signal/signal) - if(!signal || signal.data["code"] != code) - return - SEND_SIGNAL(src, XENOA_SIGNAL, null, get_target_in_proximity(max_range), get_target_in_proximity(max_range)) //I don't think this sends a signal - -/obj/item/xenoartifact/on_block(mob/living/carbon/human/owner, atom/movable/hitby) - . = ..() - if(!(COOLDOWN_FINISHED(src, xenoa_cooldown)) || !get_trait(/datum/xenoartifact_trait/minor/blocking)) - return - SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, src, owner, hitby) //I don't think this sends a signal - -/obj/item/xenoartifact/process(delta_time) - switch(process_type) - if(PROCESS_TYPE_LIT) //Burning - true_target = get_target_in_proximity(min(max_range, 5)) - if(true_target[1]) - visible_message("The [name] flicks out.") - default_activate(25, null, null) - process_type = null - return PROCESS_KILL - if(PROCESS_TYPE_TICK) //Clock-ing - playsound(get_turf(src), 'sound/effects/clock_tick.ogg', 50, TRUE) - visible_message("The [name] ticks.") - true_target = get_target_in_proximity(min(max_range, 5)) - default_activate(25, null, null) - if(DT_PROB(XENOA_TICK_CANCEL_PROB, delta_time) && COOLDOWN_FINISHED(src, xenoa_cooldown)) - process_type = null - return PROCESS_KILL - else - return PROCESS_KILL - -/obj/item/xenoartifact/maint //Semi-toddler-safe version, for maint loot table. - material = XENOA_BLUESPACE - -CREATION_TEST_IGNORE_SUBTYPES(/obj/item/xenoartifact/maint) - -/obj/item/xenoartifact/maint/Initialize(mapload, difficulty) - if(prob(1)) - material = pick(XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM) - difficulty = material - . = ..() - -/datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. - ///Buying and selling related, based on guess qaulity - var/modifier = 0.5 - ///default price gets generated if it isn't set by console. This only happens if the artifact spawns outside of that process - var/price - -/datum/component/xenoartifact_pricing/Initialize(...) - RegisterSignal(parent, XENOA_CHANGE_PRICE, PROC_REF(update_price)) - . = ..() - -/datum/component/xenoartifact_pricing/Destroy(force, silent) - UnregisterSignal(parent, XENOA_CHANGE_PRICE) - ..() - -///Typically used to change internally -/datum/component/xenoartifact_pricing/proc/update_price(datum/source, f_price) - price = f_price - -CREATION_TEST_IGNORE_SUBTYPES(/obj/item/xenoartifact/objective) - -//Objective version for exploration -/obj/item/xenoartifact/objective/Initialize(mapload, difficulty) - traits += new /datum/xenoartifact_trait/special/objective - . = ..() - -/obj/item/xenoartifact/objective/ComponentInitialize() - AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) - AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) - ..() - -/obj/effect/ebeam/xenoa_ebeam //Beam code. This isn't mine. See beam.dm for better documentation. - name = "artifact beam" - -/datum/beam/xenoa_beam - -/datum/beam/xenoa_beam/Draw() - var/Angle = round(get_angle(origin,target)) - var/matrix/rot_matrix = matrix() - var/turf/origin_turf = get_turf(origin) - rot_matrix.Turn(Angle) - - //Translation vector for origin and target - var/DX = (32*target?.x+target?.pixel_x)-(32*origin?.x+origin?.pixel_x) - var/DY = (32*target?.y+target?.pixel_y)-(32*origin?.y+origin?.pixel_y) - var/n = 0 - var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement - - for(n in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X - if(QDELETED(src)) - break - var/obj/effect/ebeam/xenoa_ebeam/X = new(origin_turf) // Start Xenoartifact - This assigns colour to the beam - X.color = beam_color - X.owner = src - elements += X // End Xenoartifact - - //Assign our single visual ebeam to each ebeam's vis_contents - //ends are cropped by a transparent box icon of length-N pixel size laid over the visuals obj - if(n+32>length) - var/icon/II = new(icon, icon_state) - II.DrawBox(null,1,(length-n),32,32) - X.icon = II - else - X.vis_contents += visuals - X.transform = rot_matrix - - //Calculate pixel offsets (If necessary) - var/Pixel_x - var/Pixel_y - if(DX == 0) - Pixel_x = 0 - else - Pixel_x = round(sin(Angle)+32*sin(Angle)*(n+16)/32) - if(DY == 0) - Pixel_y = 0 - else - Pixel_y = round(cos(Angle)+32*cos(Angle)*(n+16)/32) - - //Position the effect so the beam is one continous line - var/a - if(abs(Pixel_x)>32) - a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) - X.x += a - Pixel_x %= 32 - if(abs(Pixel_y)>32) - a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) - X.y += a - Pixel_y %= 32 - - X.pixel_x = Pixel_x - X.pixel_y = Pixel_y - CHECK_TICK diff --git a/code/modules/xenoarchaeology/xenoartifact_console.dm b/code/modules/xenoarchaeology/xenoartifact_console.dm deleted file mode 100644 index f91332916841a..0000000000000 --- a/code/modules/xenoarchaeology/xenoartifact_console.dm +++ /dev/null @@ -1,318 +0,0 @@ -/obj/item/circuitboard/computer/xenoartifact_console - name = "research and development listing console (Computer Board)" - icon_state = "science" - build_path = /obj/machinery/computer/xenoartifact_console - -/obj/item/circuitboard/machine/xenoartifact_inbox - name = "bluespace straythread pad (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/xenoartifact_inbox - req_components = list( - /obj/item/stack/ore/bluespace_crystal = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 1) - def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) - -///Stability lost on purchase -#define STABILITY_COST 30 -///Stability gained on-tick -#define STABILITY_GAIN 5 - -/obj/machinery/computer/xenoartifact_console - name = "research and development listing console" - desc = "A science console used to source sellers, and buyers, for various blacklisted research objects." - icon_screen = "xenoartifact_console" - icon_keyboard = "rd_key" - circuit = /obj/item/circuitboard/computer/xenoartifact_console - - ///Sellers give artifacts - var/list/sellers = list() - ///Buyers take artifacts - var/list/buyers = list() - ///All tabs - var/list/tab_index = list("Listings", "Export", "Linking") - var/current_tab = "Listings" - var/current_tab_info = "Here you can find listings for various research samples, usually fresh from the field. These samples aren't distrubuted by the Nanotrasen affiliated cargo system, so instead listing data is sourced from stray bluespace-threads." - ///used for 'shipping' - var/obj/machinery/xenoartifact_inbox/linked_inbox - ///List of linked machines for UI purposes - var/list/linked_machines = list() - ///Which science server receives points - var/datum/techweb/linked_techweb - ///Actually just a general list of items you've sold - var/list/sold_artifacts = list() - ///Which department's budget receives profit - var/datum/bank_account/budget - ///Stability - lowers as people buy artifacts, stops spam buying - var/stability = 100 - -/obj/machinery/computer/xenoartifact_console/Initialize(mapload) - . = ..() - linked_techweb = SSresearch.science_tech - budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) - sync_devices() - for(var/I in 1 to XENOA_MAX_VENDORS) //Add initial buyers and sellers - var/datum/xenoartifact_seller/S = new - sellers += S - S.generate() - - var/datum/xenoartifact_seller/buyer/B = new - buyers += B - B.generate() - //Start processing to gain stability - START_PROCESSING(SSobj, src) - -/obj/machinery/computer/xenoartifact_console/Destroy() - . = ..() - if(linked_inbox) - on_inbox_del() - qdel(sellers) - qdel(buyers) - qdel(sold_artifacts) - STOP_PROCESSING(SSobj, src) - -/obj/machinery/computer/xenoartifact_console/process() - stability = min(100, stability + STABILITY_GAIN) - //Update UI every 3 seconds, may be delayed - if(world.time % 3 == 0) - ui_update() - -/obj/machinery/computer/xenoartifact_console/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "XenoartifactConsole") - ui.open() - -/obj/machinery/computer/xenoartifact_console/ui_data(mob/user) - var/list/data = list() - data["points"] = budget ? budget.account_balance : 0 - data["seller"] = list() - for(var/datum/xenoartifact_seller/S as() in sellers) //Pass seller data - data["seller"] += list(list( - "name" = S.name, - "dialogue" = S.dialogue, - "price" = S.price, - "id" = REF(S), - )) - data["buyer"] = list() - for(var/datum/xenoartifact_seller/buyer/B as() in buyers) //Buyer data - data["buyer"] += list(list( - "name" = B.name, - "dialogue" = B.dialogue, - "price" = B.price, - "id" = B, - )) - data["sold_artifacts"] = list() - for(var/datum/xenoartifact_info_entry/E as() in sold_artifacts) //Pass seller data - data["sold_artifacts"] += list(list( - "main" = E.main, //Sold time - "gain" = E.gain, //Profits - "traits" = E.traits //traits - )) - data["tab_index"] = tab_index - data["current_tab"] = current_tab - data["tab_info"] = current_tab_info - data["linked_machines"] = linked_machines - data["stability"] = stability - - return data - -/obj/machinery/computer/xenoartifact_console/ui_act(action, params) //I should probably use a switch statement for this but, the for statements look painful - . = TRUE - if(..()) - return - - if(action == "link_nearby") - sync_devices() - return - else if(action == "sell") - sell() - return - else if(copytext(action, 1, 8) == "set_tab") //Set unique tab information - var/t = copytext(action, 9, length(action)+1) - if(current_tab != t) - current_tab = t - switch(t) - if("Listings")//Not the best way of doing this but I can't be fucked otherwise. - current_tab_info = "Here you can find listings for various research samples, usually fresh from the field. These samples aren't distrubuted by the Nanotrasen affiliated cargo system, so instead listing data is sourced from stray bluespace-threads." - if("Export") - current_tab_info = "Sell any export your department produces through open bluespace strings. Anonymously trade and sell ancient alien bombs, explosive slime cores, or just regular bombs." - if("Linking") - current_tab_info = "Link machines to the Listing Console." - return - else //Buy xenoartifact - var/datum/xenoartifact_seller/S = locate(action) - - if(stability < STABILITY_COST) - say("Error. Insufficient thread stability.") - return - if(!linked_inbox) - say("Error. No linked hardware.") - return - else if(budget.account_balance-S.price < 0) - say("Error. Insufficient funds.") - return - - if(linked_inbox && budget.account_balance-S.price >= 0) - var/obj/item/xenoartifact/A = new (get_turf(linked_inbox.loc), S.difficulty) - var/datum/component/xenoartifact_pricing/X = A.GetComponent(/datum/component/xenoartifact_pricing) - if(X) - X.price = S.price //dont bother trying to use internal singals for this - sellers -= S - stability = max(0, stability - STABILITY_COST) - budget.adjust_money(-1*S.price) - say("Purchase complete. [budget.account_balance] credits remaining in Research Budget") - addtimer(CALLBACK(src, PROC_REF(generate_new_seller)), (rand(1,3)*60) SECONDS) - A = null - update_icon() - -//Auto sells item on pad, finds seller for you -/obj/machinery/computer/xenoartifact_console/proc/sell() - if(!linked_inbox) - say("Error. No linked hardware.") - return - var/obj/selling_item - for(var/obj/I in oview(1, linked_inbox)) - for(var/datum/xenoartifact_seller/buyer/B as() in buyers) - if(istype(I, B.buying)) - buyers -= B - addtimer(CALLBACK(src, PROC_REF(generate_new_buyer)), (rand(1,3)*60) SECONDS) - selling_item = I - break - if(selling_item) - break - var/final_price - var/info - if(selling_item) - if(istype(selling_item, /obj/item/xenoartifact)) - var/datum/component/xenoartifact_pricing/X = selling_item.GetComponent(/datum/component/xenoartifact_pricing) - if(X) - //create new info entry datum to store UI dat - var/datum/xenoartifact_info_entry/entry = new() - - //Give rewards - final_price = max(X.modifier*X.price, 1) - budget.adjust_money(final_price) - linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (final_price*XENOA_RP) * (final_price >= X.price)) - linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, ((XENOA_SOLD_DP*(final_price/X.price)) * max(1, final_price/1000)) * (final_price >= X.price)) - - //Handle player info - entry.main = "[selling_item.name] sold at [station_time_timestamp()] for [final_price] credits, bought for [X.price]." - entry.gain = "Awarded [(final_price*2.3) * (final_price >= X.price)] Research Points & [XENOA_SOLD_DP*(final_price/X.price) * (final_price >= X.price)] Discovery Points." - info = "[entry.main]\n[entry.gain]\n" - - //append sticker traits & pass it off - var/obj/item/xenoartifact_label/L = (locate(/obj/item/xenoartifact_label) in selling_item.contents) - var/obj/item/xenoartifact/A = selling_item - for(var/datum/xenoartifact_trait/T as() in L?.trait_list) - var/color = rgb(255, 0, 0) - //using tertiary operator breaks it - if(locate(T) in A.traits) - color =rgb(0, 255, 0) - var/name = (initial(T.desc) || initial(T.label_name)) - info += {"\n[name]"} - entry.traits += list(list("name" = "[name]", "color" = "[color]")) - - sold_artifacts += entry - qdel(selling_item) - else //Future feature, not currently in use, wont delete captains gun. Placeholder - final_price = 120*rand(1, 10) - budget.adjust_money(final_price) - sold_artifacts += info - qdel(selling_item) - if(info) - say(info) - - -/obj/machinery/computer/xenoartifact_console/proc/generate_new_seller() //Called after a short period - var/datum/xenoartifact_seller/S = new - S.generate() - sellers += S - ui_update() - -/obj/machinery/computer/xenoartifact_console/proc/generate_new_buyer() - var/datum/xenoartifact_seller/buyer/B = new - B.generate() - buyers += B - ui_update() - -/obj/machinery/computer/xenoartifact_console/proc/sync_devices() - for(var/obj/machinery/xenoartifact_inbox/I in oview(9,src)) - if(I.linked_console || I.panel_open) - return - if(!(linked_inbox)) - linked_inbox = I - linked_machines += I.name - I.linked_console = src - I.RegisterSignal(src, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/obj/machinery/xenoartifact_inbox, on_machine_del)) - RegisterSignal(I, COMSIG_PARENT_QDELETING, PROC_REF(on_inbox_del)) - say("Successfully linked [I].") - return - say("Unable to find linkable hadrware.") - -/obj/machinery/computer/xenoartifact_console/proc/on_inbox_del() //Hard del measures - SIGNAL_HANDLER - UnregisterSignal(linked_inbox, COMSIG_PARENT_QDELETING) - linked_inbox = null - -#undef STABILITY_COST -#undef STABILITY_GAIN - -/obj/machinery/xenoartifact_inbox - name = "bluespace straythread pad" //Science words - desc = "This machine takes advantage of bluespace thread manipulation to highjack in-coming and out-going bluespace signals. Science uses it to deliver their very legal purchases." //All very sciencey - icon = 'icons/obj/telescience.dmi' - icon_state = "qpad-idle" - circuit = /obj/item/circuitboard/machine/xenoartifact_inbox - var/linked_console - -/obj/machinery/xenoartifact_inbox/proc/on_machine_del() - SIGNAL_HANDLER - UnregisterSignal(linked_console, COMSIG_PARENT_QDELETING) - linked_console = null - -/obj/machinery/xenoartifact_inbox/Destroy() - . = ..() - on_machine_del() - -/datum/xenoartifact_seller //Vendor - var/name - var/price - var/dialogue - var/difficulty //Xenoartifact shit, not exactly difficulty - -/datum/xenoartifact_seller/proc/generate() - name = pick(GLOB.xenoa_seller_names) - dialogue = pick(GLOB.xenoa_seller_dialogue) - price = rand(5,80) * 10 - switch(price) - if(50 to 300) - difficulty = XENOA_BLUESPACE - if(301 to 500) - difficulty = XENOA_PLASMA - if(501 to 700) - difficulty = XENOA_URANIUM - if(701 to 800) - difficulty = XENOA_BANANIUM - price = price * rand(1.0, 1.5) //Measure of error for no particular reason - addtimer(CALLBACK(src, PROC_REF(change_item)), (rand(1,3)*60) SECONDS) - -/datum/xenoartifact_seller/proc/change_item() - generate() - -/datum/xenoartifact_seller/buyer //Buyer off shoot, for player-selling - var/obj/buying - -/datum/xenoartifact_seller/buyer/generate() - name = pick(GLOB.xenoa_seller_names) - buying = pick(/obj/item/xenoartifact) - if(buying == /obj/item/xenoartifact) //Don't bother trying to use istype here - dialogue = "[name] is requesting: Anomaly : Class : Artifact" - addtimer(CALLBACK(src, PROC_REF(change_item)), (rand(1,3)*60) SECONDS) - -//Used to hold information about artifact transactions. Might get standrardized sooner or later. -/datum/xenoartifact_info_entry - var/main ="" - var/gain = "" - var/list/traits = list() diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm deleted file mode 100644 index f944999a3f322..0000000000000 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ /dev/null @@ -1,263 +0,0 @@ -/obj/item/xenoartifact_labeler - name = "artifact labeler" - icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' - icon_state = "xenoartifact_labeler" - desc = "A tool scientists use to label their alien bombs." - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_TINY - - ///Checked trait - var/list/selected_activator_traits = list() - ///Display names - var/list/activator_traits = list() - - var/list/selected_minor_traits = list() - var/list/minor_traits = list() - - var/list/selected_major_traits = list() - var/list/major_traits = list() - - var/list/selected_malfunction_traits = list() - var/list/malfunction_list = list() - - ///trait dialogue essentially - var/list/info_list = list() - - ///Name artifacts something pretty - var/sticker_name - ///passed down to sticker - var/list/sticker_traits = list() - - ///Cooldown for stickers - COOLDOWN_DECLARE(sticker_cooldown) - -/obj/item/xenoartifact_labeler/Initialize(mapload) - . = ..() - generate_xenoa_statics() - //Append activators - activator_traits = get_trait_list_desc(activator_traits, GLOB.xenoa_activators) - //Minors - minor_traits = get_trait_list_desc(minor_traits, GLOB.xenoa_minors) - //Majors - major_traits = get_trait_list_desc(major_traits, GLOB.xenoa_majors) - //Malfs - malfunction_list = get_trait_list_desc(malfunction_list, GLOB.xenoa_malfs) - -/obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "XenoartifactLabeler") - ui.open() - -/obj/item/xenoartifact_labeler/ui_data(mob/user) - var/list/data = list() - data["selected_activator_traits"] = selected_activator_traits - data["activator_traits"] = activator_traits - - data["selected_minor_traits"] = selected_minor_traits - data["minor_traits"] = minor_traits - - data["selected_major_traits"] = selected_major_traits - data["major_traits"] = major_traits - - data["selected_malfunction_traits"] = selected_malfunction_traits - data["malfunction_list"] = malfunction_list - - data["info_list"] = info_list - - return data - -/obj/item/xenoartifact_labeler/ui_act(action, params) - if(..()) - return - //Switch function could work here but it'd be pointless for the 1-2 cases - if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown)) - COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) - create_label(sticker_name) - return - else if(!COOLDOWN_FINISHED(src, sticker_cooldown) && isliving(loc)) - var/mob/living/user = loc - to_chat(user, "The labeler is still printing.") - - if(action == "clear_traits") - clear_selection() - return - - if(action == "change_print_name" && istext(params["name"])) - sticker_name = sanitize_text(params["name"]) - return - - trait_toggle(action, "activator", activator_traits, selected_activator_traits) - trait_toggle(action, "minor", minor_traits, selected_minor_traits) - trait_toggle(action, "major", major_traits, selected_major_traits) - trait_toggle(action, "malfunction", malfunction_list, selected_malfunction_traits) - - update_icon() - return TRUE - -//Get a list of all the specified trait types names, actually -/obj/item/xenoartifact_labeler/proc/get_trait_list_desc(list/traits, list/trait_type) - for(var/datum/xenoartifact_trait/X as() in trait_type) - traits += (initial(X.desc) || initial(X.label_name)) - return traits - -/obj/item/xenoartifact_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? - if(place.Find(culprit)) - return TRUE - return FALSE - -/obj/item/xenoartifact_labeler/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown)) - COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) - create_label(sticker_name, target, user) - else if(!COOLDOWN_FINISHED(src, sticker_cooldown)) - to_chat(user, "The labeler is still printing.") - -///reset all the options -/obj/item/xenoartifact_labeler/proc/clear_selection() - sticker_name = null - info_list = list() - sticker_traits = list() - selected_activator_traits = list() - selected_minor_traits = list() - selected_major_traits = list() - selected_malfunction_traits = list() - ui_update() - -/obj/item/xenoartifact_labeler/proc/create_label(new_name, mob/target, mob/user) - var/obj/item/xenoartifact_label/P = new(get_turf(src)) - if(new_name) - P.name = new_name - P.set_name = TRUE - P.trait_list = sticker_traits - P.info = selected_activator_traits+selected_minor_traits+selected_major_traits+selected_malfunction_traits - P.attempt_attach(target, user, TRUE) - -/obj/item/xenoartifact_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) - var/datum/xenoartifact_trait/description_holder - var/new_trait - for(var/t in trait_list) - new_trait = desc2datum(t) - description_holder = new_trait - if(action != "assign_[toggle_type]_[t]") - continue - if(!look_for(active_trait_list, t)) - active_trait_list += t - info_list += initial(description_holder.label_desc) - sticker_traits += new_trait - else - active_trait_list -= t - info_list -= initial(description_holder.label_desc) - sticker_traits -= new_trait - -//This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking -/obj/item/xenoartifact_labeler/proc/desc2datum(udesc) - for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) - if((udesc == initial(X.desc)) || (udesc == initial(X.label_name))) - return X - CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") - -// Not to be confused with labeler -/obj/item/xenoartifact_label - icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' - icon_state = "sticker_star" - name = "artifact label" - desc = "An adhesive label describing the characteristics of a Xenoartifact." - var/info = "" - var/set_name = FALSE - var/mutable_appearance/sticker_overlay - var/list/trait_list = list() //List of traits used to compare and generate modifier. - -/obj/item/xenoartifact_label/Initialize(mapload) - . = ..() - icon_state = "sticker_[pick("star", "box", "tri", "round")]" - var/sticker_state = "[icon_state]_small" - sticker_overlay = mutable_appearance(icon, sticker_state) - sticker_overlay.layer = FLOAT_LAYER - sticker_overlay.appearance_flags = RESET_COLOR - -/obj/item/xenoartifact_label/proc/attempt_attach(atom/target, mob/user, instant = FALSE) - if(istype(target, /mob/living)) - to_chat(target, "[user] attempts to stick a [src] to you!") - to_chat(user, "You attempt to stick a [src] on [target]!") - if(!do_after(user, 30, target = target)) - if(instant) - qdel(src) - return - if(!user.temporarilyRemoveItemFromInventory(src)) - if(instant) - qdel(src) - return - add_sticker(target) - addtimer(CALLBACK(src, PROC_REF(remove_sticker), target), 15 SECONDS, TIMER_STOPPABLE) - return TRUE - else if(istype(target, /obj/item/xenoartifact)) - var/obj/item/xenoartifact/xenoa_target = target - if(set_name) //You can update the name now - xenoa_target.name = name - calculate_modifier(xenoa_target) - add_sticker(xenoa_target) - if(set_name) - xenoa_target.name = name - if(info) - var/textinfo = list2text(info) - xenoa_target.label_desc = "There's a sticker attached, it says-\n[textinfo]" - return TRUE - -/obj/item/xenoartifact_label/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(proximity_flag) - attempt_attach(target, user, FALSE) - -/obj/item/xenoartifact_label/proc/add_sticker(mob/target) - if(locate(/obj/item/xenoartifact_label) in target) //Remove old stickers - qdel(locate(/obj/item/xenoartifact_label) in target) - target.add_overlay(sticker_overlay) - forceMove(target) - -/obj/item/xenoartifact_label/proc/remove_sticker(mob/target) //Peels off - target.cut_overlay(sticker_overlay) - forceMove(get_turf(target)) - -/obj/item/xenoartifact_label/proc/calculate_modifier(obj/item/xenoartifact/X) //Modifier based off preformance of slueth. To:Do revisit this, complexity would be nice - var/datum/xenoartifact_trait/trait - var/datum/component/xenoartifact_pricing/xenop = X.GetComponent(/datum/component/xenoartifact_pricing) - if(!xenop) - return - xenop.modifier = initial(xenop.modifier) - for(var/t in trait_list) - trait = new t - if(X.get_trait(trait)) - xenop.modifier += 0.15 - else - xenop.modifier -= 0.35 - -/obj/item/xenoartifact_label/proc/list2text(list/listo) //list2params acting weird. Probably already a function for this. - var/text = "" - for(var/X in listo) - text = "[text] [X]\n" - return text - -/obj/item/xenoartifact_labeler/debug - name = "xenoartifact debug labeler" - desc = "Use to create specific Xenoartifacts" - -/obj/item/xenoartifact_labeler/debug/afterattack(atom/target, mob/user) - return - -/obj/item/xenoartifact_labeler/debug/create_label(new_name) - var/obj/item/xenoartifact/A = new(get_turf(loc), XENOA_DEBUGIUM) - say("Created [A] at [A.loc]") - A.charge_req = 100 - A.malfunction_mod = 0 - A.malfunction_chance = 0 - qdel(A.traits) - A.traits = list() - for(var/X in sticker_traits) //Add new ones - say(X) - A.traits += new X - for(var/datum/xenoartifact_trait/t as() in A.traits) //Setup new ones - t.on_init(A) - A = null diff --git a/icons/effects/particles/misc.dmi b/icons/effects/particles/misc.dmi index d51e03633317a..a49bef76a674a 100644 Binary files a/icons/effects/particles/misc.dmi and b/icons/effects/particles/misc.dmi differ diff --git a/icons/effects/particles/weather.dmi b/icons/effects/particles/weather.dmi index b551bab3473e6..ee8e0dbd995a6 100644 Binary files a/icons/effects/particles/weather.dmi and b/icons/effects/particles/weather.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 4497202c665d7..91e3a1be4a7fc 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 892a5043e4965..a51b046568d67 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/sticker.dmi b/icons/obj/sticker.dmi new file mode 100644 index 0000000000000..94ead9e839233 Binary files /dev/null and b/icons/obj/sticker.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 565c8d5ef24b0..b7d7790f792cc 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 7ed89ab8064d9..970d430be37ff 100644 Binary files a/icons/obj/xenoarchaeology/xenoartifact.dmi and b/icons/obj/xenoarchaeology/xenoartifact.dmi differ diff --git a/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi b/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi index 8d38c27a27c26..970e5c450d479 100644 Binary files a/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi and b/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi differ diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index 977c72bbcdd2d..50aed8e8032bc 100644 Binary files a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi and b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi differ diff --git a/sound/spookoween/ghost_whisper_short.ogg b/sound/spookoween/ghost_whisper_short.ogg new file mode 100644 index 0000000000000..be8a4aa47b7de Binary files /dev/null and b/sound/spookoween/ghost_whisper_short.ogg differ diff --git a/strings/names/artifact_sentience.txt b/strings/names/artifact_sentience.txt index 59f8f4a35f57b..9d1c7e7b24f7a 100644 --- a/strings/names/artifact_sentience.txt +++ b/strings/names/artifact_sentience.txt @@ -9,3 +9,22 @@ Adramalech Amon Apollyon Asmodeus +Amadeus +Caesar +Nero +Caligula +Commodus +Elagabalus +Caracalla +Tiberius +Domitian +Honorius +Mammon +Belphegor +Megera +Ctesiphon +Minos +Aeacus +Rhadamanthus +Mahazael +Jeff diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 792ecfcbcd48d..b49e591f40d6d 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -1,151 +1,138 @@ -import { useBackend } from '../backend'; -import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar } from '../components'; +import { useBackend, useSharedState } from '../backend'; +import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar, Flex, Divider, Table } from '../components'; import { formatMoney } from '../format'; import { Window } from '../layouts'; export const XenoartifactConsole = (props, context) => { const { act, data } = useBackend(context); - const { tab_index, current_tab, tab_info, points, stability } = data; - const sellers = Object.values(data.seller); + const [tab, setTab] = useSharedState(context, 'tab', 'listings'); + const { stability, money, purchase_radio, solved_radio, current_tab } = data; + const sellers = data.sellers || []; return ( - + - - - Thread stability - -
- formatMoney(value)} /> - {' credits'} - - }> -
{`${tab_info}`}
-
- - {tab_index.map((tab_name) => ( - - ))} - - {current_tab === 'Listings' && - sellers.map((details) => ( - + + + {`Research Budget: ${money} credits`} + + + - -
+ + {sellers.map((value) => ( + + ))} + ); }; -export const XenoartifactListingSell = (props, context) => { - const { act, data } = useBackend(context); - const { name, dialogue } = props; +const XenoartifactConsoleSellerEntry = (props, context) => { + const { act } = useBackend(context); + const { value } = props; + const stock = value['stock'] || []; return ( - -
- {`${name}:`} -
{`${dialogue}`}
+ +
+
{`${value['dialogue']}`}
+ + {stock.map((stock_list) => ( +
act(`stock_purchase`, { item_id: stock_list['id'], seller_id: value['id'] })}> + {`$${stock_list['cost']}`} + + } + key={stock_list}> +
{`${stock_list['description']}`}
+ +
+ ))}
- +
); }; -export const XenoartifactLinking = (props, context) => { +const XenoartifactConsoleRequestsTab = (props, context) => { const { act, data } = useBackend(context); - const { linked_machines } = data; + const requests = data.active_request || []; return ( - - - {linked_machines.map((machine) => ( -
- {`${machine} connection established.`} -
+ + {requests.map((request) => ( + + + #{request.id} + + {request.object} + + {request.orderer} + + + {request.reason} + + + {formatMoney(request.cost)} cr + + ))} - +
); }; -export const XenoartifactSell = (props, context) => { +const XenoartifactConsoleHistoryTab = (props, context) => { const { act, data } = useBackend(context); - const entries = Object.values(data.sold_artifacts); - const buyers = Object.values(data.buyer); + const history = data.history || []; return ( - -
- - {entries.map((item) => ( -
-
- {`${item.main}`} - {`${item.gain}`} - {item.traits.map((trait) => ( - {`${trait.name}`} - ))} -
-
- ))} -
- -
- {buyers.map((details) => ( - + + {history.map((value) => ( +
+ {value} +
))} -
+ ); }; diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 15f153840a6aa..b584906ae5a58 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -1,19 +1,34 @@ import { useBackend } from '../backend'; -import { Button, Section, Box, Flex, Input, BlockQuote } from '../components'; +import { Button, Section, Box, Flex, Input, BlockQuote, Icon, Divider, Dropdown, Collapsible } from '../components'; import { Window } from '../layouts'; export const XenoartifactLabeler = (props, context) => { return ( - + - +
+ + + + + +
+ +
+ + + +
+ - + - - +
@@ -21,19 +36,9 @@ export const XenoartifactLabeler = (props, context) => { ); }; -const XenoartifactLabelerTraits = (props, context) => { +const XenoartifactlabelerTraits = (props, context) => { const { act, data } = useBackend(context); - const { - selected_activator_traits, - activator_traits, - selected_minor_traits, - minor_traits, - selected_major_traits, - major_traits, - malfunction_list, - selected_malfunction_traits, - info_list, - } = data; + const { activator_traits, minor_traits, major_traits, malfunction_list, enabled_trait_filters, filtered_traits } = data; let alphasort = function (a, b) { return a.localeCompare(b, 'en'); @@ -44,53 +49,41 @@ const XenoartifactLabelerTraits = (props, context) => { const sorted_majors = major_traits.sort(alphasort); const sorted_malfs = malfunction_list.sort(alphasort); + let filtered_activators = sorted_activators.filter((n) => !filtered_traits.includes(n)); + let filtered_minors = sorted_minors.filter((n) => !filtered_traits.includes(n)); + let filtered_majors = sorted_majors.filter((n) => !filtered_traits.includes(n)); + let filtered_malfs = sorted_malfs.filter((n) => !filtered_traits.includes(n)); + return ( - -
+ +
- {sorted_activators.map((trait) => ( - + {filtered_activators.map((trait) => ( + ))}
-
+ +
- {sorted_minors.map((trait) => ( - + {filtered_minors.map((trait) => ( + ))}
-
+ +
- {sorted_majors.map((trait) => ( - + {filtered_majors.map((trait) => ( + ))}
-
+ +
- {sorted_malfs.map((trait) => ( - + {filtered_malfs.map((trait) => ( + ))}
@@ -98,51 +91,85 @@ const XenoartifactLabelerTraits = (props, context) => { ); }; -const XenoartifactLabelerInfo = (props, context) => { +const XenoartifactlabelerInfo = (props, context) => { const { act, data } = useBackend(context); - const { info_list } = data; + const { selected_traits, labeler_traits_filter } = data; return ( - - {info_list.map((info) => ( - + + {selected_traits.map((info) => ( + ))} ); }; -const XenoartifactLabelerGenerateList = (props, context) => { - const { act } = useBackend(context); - const { specific_trait, check_against, trait_type } = props; +const XenoartifactlabelerGenerateEntry = (props, context) => { + const { act, data } = useBackend(context); + const { specific_trait, trait_type } = props; + const { tooltip_stats, selected_traits, deselected_traits } = data; return ( act(`assign_${trait_type}_${specific_trait}`)} + checked={selected_traits.includes(specific_trait)} + color={deselected_traits.includes(specific_trait) ? 'bad' : 'transparent'} + onClick={() => act(`toggle_trait`, { trait_name: specific_trait, select: true })} + tooltip={`${tooltip_stats[specific_trait]['alt_name'] ? `${tooltip_stats[specific_trait]['alt_name']},` : ``} + Weight: ${tooltip_stats[specific_trait]['weight']}, + Conductivity: ${tooltip_stats[specific_trait]['conductivity']}`} + oncontextmenu={(e) => { + e.preventDefault(); + act(`toggle_trait`, { trait_name: specific_trait, select: false }); + }} /> ); }; -const XenoartifactLabelerGenerateInfo = (props, context) => { - const { act } = useBackend(context); +const XenoartifactlabelerGenerateInfo = (props, context) => { + const { act, data } = useBackend(context); const { info } = props; + const { tooltip_stats } = data; return ( -
+
-
{`${info}`}
+
{`${tooltip_stats[info]['desc']}`}
+ {tooltip_stats[info]['hints'].map((hint) => ( +
); }; -const XenoartifactLabelerSticker = (props, context) => { +const XenoartifactlabelerSticker = (props, context) => { const { act } = useBackend(context); return ( - act('change_print_name', { name: input })} />