diff --git a/_maps/RandomRuins/LavaRuins/_maplisting.txt b/_maps/RandomRuins/LavaRuins/_maplisting.txt
deleted file mode 100644
index d0c4a5db64d..00000000000
--- a/_maps/RandomRuins/LavaRuins/_maplisting.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-#List ALL lava ruins here. This file is for small things that would appear in lavaland, like a downed ship or hidden room.
-#Maps must be the full path to them. Any map you make but forget to list here may as well not exist as far as the game is concerned.
-#Blacklisting ruins takes place at conflig/lavaRuinBlacklist.txt, don't remove anything here unless you're removing the map entirely
-
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##BIODOMES
-_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
-_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
-_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm
-
-##RESPAWN
-_maps/RandomRuins/LavaRuins/lavaland_surface_prisoner_crash.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
-
-##SIN
-_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
-
-##MISC
-_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
-_maps/RandomRuins/LavaRuins/lavaland_fountain_hall.dmm
-_maps/RandomRuins/LavaRuins/lavaland_gym.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_ravine.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_ravine_h.dmm
-_maps/RandomRuins/LavaRuins/lavaland_surface_chasm.dmm
\ No newline at end of file
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm
index 155236dd586..c6485f19bd7 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm
@@ -5,7 +5,7 @@
"e" = (/obj/structure/closet,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"f" = (/obj/structure/punching_bag,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"g" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
-"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie{name = "Boss of This Gym"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
+"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie/gymboss,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"i" = (/obj/structure/window{icon_state = "window";dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"j" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"k" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
@@ -15,7 +15,7 @@
"o" = (/obj/structure/stacklifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window";dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"q" = (/obj/structure/window,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
-"r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie{name = "Leatherhead"},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
+"r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie/darkholme,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors)
"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)";icon_state = "splatter6";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)";icon_state = "tracks";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3";icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors)
"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
diff --git a/_maps/RandomRuins/SpaceRuins/_maplisting.txt b/_maps/RandomRuins/SpaceRuins/_maplisting.txt
deleted file mode 100644
index 72681d304a3..00000000000
--- a/_maps/RandomRuins/SpaceRuins/_maplisting.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-#List ALL space ruins here. This file is for small things that would appear in space, like an asteroid or broken escape pod.
-#Maps must be the full path to them. Any map you make but forget to list here may as well not exist as far as the game is concerned.
-#Blacklisting ruins takes place in the config folder file spaceRuinBlacklist.txt, don't remove anything here unless you're removing the map entirely
-
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-_maps/RandomRuins/SpaceRuins/way_home.dmm
-_maps/RandomRuins/SpaceRuins/asteroid1.dmm
-_maps/RandomRuins/SpaceRuins/asteroid2.dmm
-_maps/RandomRuins/SpaceRuins/asteroid3.dmm
-_maps/RandomRuins/SpaceRuins/asteroid4.dmm
-_maps/RandomRuins/SpaceRuins/asteroid5.dmm
-_maps/RandomRuins/SpaceRuins/derelict1.dmm
-_maps/RandomRuins/SpaceRuins/derelict2.dmm
-_maps/RandomRuins/SpaceRuins/derelict3.dmm
-_maps/RandomRuins/SpaceRuins/derelict4.dmm
-_maps/RandomRuins/SpaceRuins/derelict5.dmm
-_maps/RandomRuins/SpaceRuins/spacebar.dmm
-_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
-_maps/RandomRuins/SpaceRuins/deepstorage.dmm
-_maps/RandomRuins/SpaceRuins/emptyshell.dmm
-_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
-_maps/RandomRuins/SpaceRuins/intactemptyship.dmm
-_maps/RandomRuins/SpaceRuins/mechtransport.dmm
-_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
-_maps/RandomRuins/SpaceRuins/onehalf.dmm
\ No newline at end of file
diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
index 8991d416385..57039bae9d3 100644
--- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
+++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
@@ -13,7 +13,7 @@
"am" = (/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered)
"an" = (/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered)
"ao" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/open/floor/grass,/area/ruin/unpowered)
-"ap" = (/mob/living/simple_animal/hostile/asteroid/goldgrub,/turf/open/floor/plating/asteroid,/area/ruin/unpowered)
+"ap" = (/mob/living/simple_animal/hostile/asteroid/goldgrub{will_burrow = 0},/turf/open/floor/plating/asteroid,/area/ruin/unpowered)
"aq" = (/obj/structure/flora/ausbushes/grassybush,/turf/open/floor/grass,/area/ruin/unpowered)
"ar" = (/obj/structure/flora/rock/pile,/turf/open/floor/plating/asteroid,/area/ruin/unpowered)
"as" = (/mob/living/simple_animal/hostile/asteroid/basilisk,/turf/open/floor/plating/asteroid,/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
index 7bbf634d695..51daaeb0132 100644
--- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
+++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm
@@ -104,7 +104,7 @@
"bZ" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/open/floor/plasteel,/area/ruin/unpowered)
"ca" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/floorgrime,/area/ruin/unpowered)
"cb" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/floorgrime,/area/ruin/unpowered)
-"cc" = (/obj/structure/computerframe,/turf/open/floor/plasteel,/area/ruin/unpowered)
+"cc" = (/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/ruin/unpowered)
"cd" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen{dir = 1; name = "Bunker Entrance"; network = list("Bunker1"); pixel_x = 0; pixel_y = 2},/turf/open/floor/plasteel,/area/ruin/unpowered)
"ce" = (/obj/structure/table/reinforced,/obj/machinery/button/door{id = "bunker1"; name = "Inner Doors"; pixel_y = 6},/obj/machinery/button/door{id = "bunker2"; name = "Outer Doors"; pixel_y = -4},/turf/open/floor/plasteel/floorgrime,/area/ruin/unpowered)
"cf" = (/obj/machinery/door/poddoor{id = "bunker1"; name = "Bunker Door"; tag = "inner"},/turf/open/floor/plating,/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
index a89e9b0d62c..b0c1f95d53f 100644
--- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -7,7 +7,7 @@
"g" = (/obj/structure/closet/crate/secure/loot,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
"h" = (/obj/structure/table,/obj/machinery/button/door{id = "mechaship1"; name = "Mecha Cargo Ship Doors"},/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
"i" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
-"j" = (/obj/structure/computerframe,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
+"j" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
"k" = (/obj/effect/decal/cleanable/vomit/old,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
"l" = (/obj/effect/decal/remains/human,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
"m" = (/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel/shuttle,/area/ruin/powered)
diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
index e4e78df2b49..d5af9dd9789 100644
--- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm
+++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
@@ -105,8 +105,8 @@
"ca" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
"cb" = (/obj/structure/table/reinforced,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
"cc" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
-"cd" = (/obj/machinery/light{dir = 1},/obj/structure/computerframe,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
-"ce" = (/obj/structure/computerframe,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
+"cd" = (/obj/machinery/light{dir = 1},/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
+"ce" = (/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
"cf" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Bridge APC"; pixel_y = 24},/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
"cg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table/reinforced,/obj/item/stack/spacecash/c500{pixel_y = 8},/obj/item/stack/spacecash/c1000,/turf/open/floor/plasteel,/area/ruin/onehalf/bridge)
"ch" = (/obj/structure/girder/reinforced,/turf/open/floor/plating/airless,/area/space)
diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
index 8368eef3e58..2403575403f 100644
--- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
+++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
@@ -3,7 +3,7 @@
"c" = (/obj/structure/grille,/turf/open/floor/plating,/area/ruin/unpowered)
"d" = (/turf/closed/wall/r_wall,/area/ruin/unpowered)
"e" = (/obj/structure/table/reinforced,/obj/item/weapon/stock_parts/cell/hyper,/turf/open/floor/plasteel,/area/ruin/unpowered)
-"f" = (/obj/structure/computerframe,/turf/open/floor/plasteel,/area/ruin/unpowered)
+"f" = (/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/ruin/unpowered)
"g" = (/turf/open/floor/plasteel,/area/ruin/unpowered)
"h" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel,/area/ruin/unpowered)
"i" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating,/area/ruin/unpowered)
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 72d1d2d19ee..6ef98e0b2ae 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -2,7 +2,7 @@
"ab" = (/turf/closed/wall/r_wall,/area/awaymission/academy/headmaster)
"ac" = (/mob/living/simple_animal/hostile/carp/ranged{faction = list("wizard")},/turf/open/space,/area/space)
"ad" = (/obj/structure/filingcabinet/filingcabinet,/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
-"ae" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
+"ae" = (/obj/structure/frame/computer{anchored = 1},/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
"af" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/red,/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
"ag" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/blue,/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
"ah" = (/turf/open/floor/carpet,/area/awaymission/academy/headmaster)
@@ -401,7 +401,7 @@
"hK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/weapon/caution,/turf/open/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/academy/academyaft)
"hL" = (/obj/structure/mecha_wreckage/durand,/turf/open/floor/plating,/area/awaymission/academy/classrooms)
"hM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
-"hN" = (/obj/machinery/constructable_frame/machine_frame,/turf/open/floor/plating,/area/awaymission/academy/academyaft)
+"hN" = (/obj/structure/frame/machine,/turf/open/floor/plating,/area/awaymission/academy/academyaft)
"hO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plating,/area/awaymission/academy/academyaft)
"hP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"hQ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
@@ -423,7 +423,7 @@
"ig" = (/obj/item/stack/cable_coil/random,/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"ih" = (/obj/structure/rack,/obj/item/stack/sheet/mineral/plasma{amount = 50},/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"ii" = (/turf/open/floor/grass,/area/awaymission/academy/academyaft)
-"ij" = (/obj/structure/rack,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/relay,/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
+"ij" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,/obj/item/weapon/circuitboard/machine/telecomms/receiver,/obj/item/weapon/circuitboard/machine/telecomms/relay,/turf/open/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft)
"ik" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel,/area/awaymission/academy/academyaft)
"il" = (/turf/open/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft)
"im" = (/obj/structure/mirror{pixel_y = 28},/turf/open/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/academy/academyaft)
diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm
index 4366496499d..10bb875ef54 100644
--- a/_maps/RandomZLevels/centcomAway.dmm
+++ b/_maps/RandomZLevels/centcomAway.dmm
@@ -259,7 +259,7 @@
"eY" = (/turf/closed/wall,/area/awaymission/centcomAway/courtroom)
"eZ" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
"fa" = (/obj/structure/table,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
-"fb" = (/obj/structure/computerframe,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
+"fb" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
"fc" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
"fd" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/open/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
"fe" = (/turf/open/floor/plasteel{icon_state = "green"; dir = 10},/area/awaymission/centcomAway/general)
@@ -471,7 +471,7 @@
"jc" = (/turf/open/floor/plasteel{icon_state = "ironsand4"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/general)
"jd" = (/obj/structure/table/wood{dir = 10},/turf/open/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"je" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
-"jf" = (/obj/structure/computerframe,/turf/open/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
+"jf" = (/obj/structure/frame/computer,/turf/open/floor/plasteel{icon_state = "grimy"},/area/awaymission/centcomAway/general)
"jg" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/open/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jh" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"ji" = (/obj/structure/closet/secure_closet/personal,/turf/open/floor/plasteel{icon_state = "vault"; dir = 1},/area/awaymission/centcomAway/hangar)
@@ -636,7 +636,7 @@
"ml" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/open/floor/plasteel{icon_state = "vault"; dir = 8},/area/awaymission/centcomAway/cafe)
"mm" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mn" = (/obj/structure/table,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
-"mo" = (/obj/structure/computerframe,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
+"mo" = (/obj/structure/frame/computer,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mp" = (/obj/structure/closet/secure_closet/bar,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mq" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mr" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/open/floor/plasteel{icon_state = "redyellowfull"; dir = 5},/area/awaymission/centcomAway/thunderdome)
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index ec6efe1a4c1..94372ad1e39 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -415,7 +415,7 @@
"hY" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/open/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"hZ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the research division and the labs within."; name = "research monitor"; network = list("MO19X","MO19R")},/turf/open/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ia" = (/obj/machinery/computer/aifixer,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"ib" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/circuitboard/teleporter,/turf/open/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
+"ib" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/circuitboard/computer/teleporter,/turf/open/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ic" = (/obj/structure/rack,/obj/item/device/paicard{pixel_x = 4},/turf/open/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"id" = (/obj/structure/rack,/turf/open/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "warnwhite"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
"ie" = (/obj/machinery/door/airlock/glass_medical{glass = 0; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "201"; req_one_access_txt = "0"},/turf/open/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm
index 58e77da0d87..b58f159b2e6 100644
--- a/_maps/RandomZLevels/research.dmm
+++ b/_maps/RandomZLevels/research.dmm
@@ -19,7 +19,7 @@
"as" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/open/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering)
"at" = (/obj/machinery/suit_storage_unit/engine,/turf/open/floor/plating,/area/awaymission/research/interior/engineering)
"au" = (/turf/open/floor/plating,/area/awaymission/research/interior/engineering)
-"av" = (/obj/item/weapon/shard{icon_state = "small"},/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high/empty,/turf/open/floor/plating,/area/awaymission/research/interior/engineering)
+"av" = (/obj/item/weapon/shard{icon_state = "small"},/obj/structure/frame/machine,/obj/item/weapon/circuitboard/machine/smes,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high/empty,/turf/open/floor/plating,/area/awaymission/research/interior/engineering)
"aw" = (/obj/item/weapon/shard{icon_state = "small"},/turf/open/floor/plasteel/whiteyellow/side,/area/awaymission/research/interior/engineering)
"ax" = (/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3},/turf/open/floor/plasteel/whiteyellow/corner{tag = "icon-whiteyellowcorner (WEST)"; icon_state = "whiteyellowcorner"; dir = 8},/area/awaymission/research/interior/engineering)
"ay" = (/obj/structure/chair{dir = 8},/mob/living/simple_animal/hostile/syndicate,/turf/open/floor/plasteel/shuttle/red/syndicate,/area/awaymission/research/interior/engineering)
diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm
index 209ebe93ddd..fd12bea52ab 100644
--- a/_maps/RandomZLevels/snowdin.dmm
+++ b/_maps/RandomZLevels/snowdin.dmm
@@ -329,7 +329,7 @@
"gq" = (/turf/open/floor/plasteel/stairs/right{baseturf = /turf/open/floor/plating/asteroid/snow; temperature = 140},/area/awaymission/snowdin/cave)
"gr" = (/turf/open/floor/plating,/turf/open/floor/plating/snowed,/area/awaymission/snowdin/post)
"gs" = (/obj/structure/girder,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/post)
-"gt" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/obj/machinery/light/small{dir = 1},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
+"gt" = (/obj/structure/frame/machine,/obj/item/weapon/circuitboard/machine/smes,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/obj/machinery/light/small{dir = 1},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
"gu" = (/obj/item/weapon/stock_parts/cell/high/empty,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
"gv" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
"gw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
@@ -464,7 +464,7 @@
"iY" = (/obj/machinery/light/small,/turf/open/floor/plating/asteroid/snow,/area/awaymission/snowdin)
"iZ" = (/obj/machinery/light/small,/turf/open/floor/plating/snowed,/area/awaymission/snowdin)
"ja" = (/obj/item/weapon/shard,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin)
-"jb" = (/obj/structure/computerframe,/turf/open/floor/plasteel/shuttle{baseturf = /turf/open/floor/plating/asteroid/snow; icon_state = "shuttlefloor4"; temperature = 180},/area/awaymission/snowdin)
+"jb" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/shuttle{baseturf = /turf/open/floor/plating/asteroid/snow; icon_state = "shuttlefloor4"; temperature = 180},/area/awaymission/snowdin)
"jc" = (/obj/machinery/door/poddoor/shutters{id = "garagesnow3"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow},/area/awaymission/snowdin/post)
"jd" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/sekret)
"je" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/sekret)
diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
index f30468aae07..7aa34319ef8 100644
--- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm
+++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
@@ -81,7 +81,7 @@
},
/area/shuttle/syndicate)
"aan" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -4024,17 +4024,17 @@
/area/storage/tech)
"ajc" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/pandemic{
+/obj/item/weapon/circuitboard/computer/pandemic{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/weapon/circuitboard/rdconsole,
-/obj/item/weapon/circuitboard/rdserver{
+/obj/item/weapon/circuitboard/computer/rdconsole,
+/obj/item/weapon/circuitboard/machine/rdserver{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/destructive_analyzer,
-/obj/item/weapon/circuitboard/protolathe,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/protolathe,
/turf/open/floor/plasteel{
dir = 5;
icon_state = "yellow"
@@ -4042,11 +4042,11 @@
/area/storage/tech)
"ajd" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/robotics{
+/obj/item/weapon/circuitboard/computer/robotics{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/mecha_control{
+/obj/item/weapon/circuitboard/computer/mecha_control{
pixel_x = 1;
pixel_y = -1
},
@@ -4064,11 +4064,11 @@
/area/storage/tech)
"ajf" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/borgupload{
+/obj/item/weapon/circuitboard/computer/borgupload{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/aiupload{
+/obj/item/weapon/circuitboard/computer/aiupload{
pixel_x = 2;
pixel_y = -2
},
@@ -4076,14 +4076,14 @@
/area/storage/tech)
"ajg" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/message_monitor{
+/obj/item/weapon/circuitboard/computer/message_monitor{
pixel_y = -5
},
-/obj/item/weapon/circuitboard/crew{
+/obj/item/weapon/circuitboard/computer/crew{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/arcade/battle,
+/obj/item/weapon/circuitboard/computer/arcade/battle,
/turf/open/floor/plasteel{
dir = 9;
icon_state = "yellow"
@@ -4483,14 +4483,14 @@
/area/storage/tech)
"ajW" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/cloning,
-/obj/item/weapon/circuitboard/med_data{
+/obj/item/weapon/circuitboard/computer/cloning,
+/obj/item/weapon/circuitboard/computer/med_data{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/clonescanner,
-/obj/item/weapon/circuitboard/clonepod,
-/obj/item/weapon/circuitboard/scan_consolenew,
+/obj/item/weapon/circuitboard/machine/clonescanner,
+/obj/item/weapon/circuitboard/machine/clonepod,
+/obj/item/weapon/circuitboard/computer/scan_consolenew,
/turf/open/floor/plasteel{
dir = 4;
icon_state = "yellow"
@@ -4508,12 +4508,12 @@
/area/storage/tech)
"ajY" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/mining,
-/obj/item/weapon/circuitboard/autolathe{
+/obj/item/weapon/circuitboard/computer/mining,
+/obj/item/weapon/circuitboard/machine/autolathe{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/communications{
+/obj/item/weapon/circuitboard/computer/communications{
pixel_x = 5;
pixel_y = -5
},
@@ -4895,15 +4895,15 @@
/area/storage/tech)
"akI" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/secure_data{
+/obj/item/weapon/circuitboard/computer/secure_data{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/security{
+/obj/item/weapon/circuitboard/computer/security{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/card{
+/obj/item/weapon/circuitboard/computer/card{
pixel_x = 2;
pixel_y = -2
},
@@ -4969,15 +4969,15 @@
/area/storage/tech)
"akO" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/powermonitor{
+/obj/item/weapon/circuitboard/computer/powermonitor{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/stationalert{
+/obj/item/weapon/circuitboard/computer/stationalert{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/atmos_alert{
+/obj/item/weapon/circuitboard/computer/atmos_alert{
pixel_x = 3;
pixel_y = -3
},
@@ -10985,14 +10985,14 @@
/area/tcommsat/computer)
"axw" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/receiver,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/broadcaster,
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/receiver,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
/obj/machinery/atmospherics/components/unary/vent_scrubber{
on = 1
},
@@ -13581,13 +13581,13 @@
name = "Construction Site"
})
"aBX" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plating,
/area/construction/Storage{
name = "Construction Site"
})
"aBY" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plating,
/area/construction/Storage{
name = "Construction Site"
@@ -25626,7 +25626,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
-/obj/item/weapon/circuitboard/solar_control,
+/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/turf/open/floor/plasteel{
icon_state = "yellow"
@@ -45842,7 +45842,7 @@
/turf/open/floor/plasteel/airless,
/area/mine/abandoned)
"bOd" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
/obj/effect/decal/cleanable/cobweb2,
@@ -47113,7 +47113,7 @@
pixel_x = 31
},
/obj/structure/rack,
-/obj/item/weapon/circuitboard/teleporter,
+/obj/item/weapon/circuitboard/computer/teleporter,
/obj/item/weapon/circuitboard/aicore{
pixel_x = -2;
pixel_y = 4
diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index 5ecccfef356..b08b7ff7e43 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -9,7 +9,7 @@
"aai" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aaj" = (/obj/machinery/computer/shuttle/syndicate,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aak" = (/obj/structure/table,/obj/machinery/button/door{id = "syndieshutters"; name = "remote shutter control"; req_access_txt = "150"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
-"aal" = (/obj/structure/computerframe,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
+"aal" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aam" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aan" = (/obj/structure/chair/comfy/black{dir = 1; icon_state = "comfychair"; name = "pilot's chair"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aao" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/device/multitool,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
@@ -75,7 +75,7 @@
"abw" = (/obj/structure/table/optable,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abx" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"aby" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/syndicate)
-"abz" = (/obj/structure/computerframe,/obj/item/weapon/paper{info = "
Teleporter Instruction
- Install circuit board, glass and wiring to complete Teleporter Control Console
- Use a screwdriver, wirecutter and screwdriver again on the Teleporter Station to connect it
- Set destination with Teleporter Control Computer
- Activate Teleporter Hub with Teleporter Station
"; name = "Teleporter Instructions"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
+"abz" = (/obj/structure/frame/computer,/obj/item/weapon/paper{info = "Teleporter Instruction
- Install circuit board, glass and wiring to complete Teleporter Control Console
- Use a screwdriver, wirecutter and screwdriver again on the Teleporter Station to connect it
- Set destination with Teleporter Control Computer
- Activate Teleporter Hub with Teleporter Station
"; name = "Teleporter Instructions"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abA" = (/obj/machinery/teleport/station,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abB" = (/obj/machinery/teleport/hub/syndicate,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate)
"abC" = (/turf/open/floor/plasteel/black,/area/engine/engineering)
@@ -694,7 +694,7 @@
"anr" = (/obj/machinery/computer/arcade,/turf/open/floor/plating,/area/maintenance/fsmaint)
"ans" = (/obj/structure/chair/stool,/obj/machinery/light/small{dir = 1},/turf/open/floor/wood,/area/maintenance/fsmaint)
"ant" = (/obj/structure/flora/kirbyplants{anchored = 1; icon_state = "plant-05"; layer = 4.1; name = "incredibly heavy plant"},/turf/open/floor/wood,/area/maintenance/fsmaint)
-"anu" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/maintenance/fsmaint)
+"anu" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/computer/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/maintenance/fsmaint)
"anv" = (/obj/structure/grille,/turf/open/floor/plating,/area/maintenance/fsmaint)
"anw" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plasteel,/area/maintenance/fsmaint)
"anx" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/open/floor/plasteel,/area/engine/engineering)
@@ -897,7 +897,7 @@
"arm" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel,/area/hallway/primary/port{name = "\improper Northwest Hallway"})
"arn" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "hop shutter"; name = "HoP Office shutter"},/turf/open/floor/plating,/area/crew_quarters/heads)
"aro" = (/obj/structure/table/wood,/obj/item/weapon/storage/box/silver_ids{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/ids,/turf/open/floor/wood,/area/crew_quarters/heads)
-"arp" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 7},/turf/open/floor/wood,/area/crew_quarters/heads)
+"arp" = (/obj/structure/filingcabinet/employment,/turf/open/floor/wood,/area/crew_quarters/heads)
"arq" = (/obj/machinery/vending/cart,/turf/open/floor/wood,/area/crew_quarters/heads)
"arr" = (/obj/machinery/photocopier,/obj/machinery/light{dir = 1},/turf/open/floor/wood,/area/crew_quarters/heads)
"ars" = (/obj/structure/closet/secure_closet/hop,/obj/item/clothing/suit/armor/reactive,/turf/open/floor/wood,/area/crew_quarters/heads)
@@ -1276,7 +1276,7 @@
"ayB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/black,/area/engine/gravity_generator)
"ayC" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plasteel/black,/area/engine/gravity_generator)
"ayD" = (/obj/effect/landmark{name = "lightsout"},/turf/open/floor/wood,/area/library)
-"ayE" = (/obj/structure/table/wood,/obj/item/weapon/storage/pill_bottle/dice,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/wood,/area/library)
+"ayE" = (/obj/structure/table/wood,/obj/item/weapon/book/codex_gigas,/obj/item/weapon/storage/pill_bottle/dice,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/wood,/area/library)
"ayF" = (/obj/effect/landmark/start{name = "Clown"},/turf/open/floor/wood,/area/crew_quarters/theatre)
"ayG" = (/turf/open/floor/wood,/area/crew_quarters/theatre)
"ayH" = (/obj/machinery/camera/autoname{dir = 8},/turf/open/floor/wood,/area/crew_quarters/theatre)
@@ -1555,7 +1555,7 @@
"aDU" = (/obj/structure/cable/cyan{icon_state = "4-8"},/turf/open/floor/plasteel,/area/maintenance/asmaint2)
"aDV" = (/obj/structure/cable/cyan{icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/cyan/hidden,/turf/open/floor/plasteel/warning/corner,/area/maintenance/asmaint2)
"aDW" = (/obj/item/weapon/ed209_assembly,/obj/structure/cable/cyan{icon_state = "0-2"},/turf/open/floor/plating,/area/maintenance/asmaint2)
-"aDX" = (/obj/structure/table,/obj/item/weapon/circuitboard/circuit_imprinter,/turf/open/floor/plating,/area/maintenance/asmaint2)
+"aDX" = (/obj/structure/table,/obj/item/weapon/circuitboard/machine/circuit_imprinter,/turf/open/floor/plating,/area/maintenance/asmaint2)
"aDY" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
"aDZ" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
"aEa" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
@@ -2460,7 +2460,7 @@
"aVr" = (/obj/structure/closet/wardrobe/white/medical,/obj/item/weapon/storage/box/bodybags,/turf/open/floor/plasteel/white,/area/security/warden)
"aVs" = (/obj/structure/closet{name = "chem implant closet"},/obj/item/weapon/reagent_containers/glass/bottle/cyanide,/obj/item/weapon/reagent_containers/glass/bottle/initropidril,/obj/item/weapon/reagent_containers/glass/bottle/coniine,/obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental,/obj/item/weapon/storage/box/chemimp,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/gun/syringe,/obj/item/weapon/storage/box/syringes,/turf/open/floor/plasteel/white,/area/security/warden)
"aVt" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/camera/autoname{icon_state = "camera"; dir = 6},/obj/item/clothing/gloves/color/latex/nitrile,/turf/open/floor/plasteel/white,/area/security/warden)
-"aVu" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/toxins/xenobiology)
+"aVu" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/computer/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/toxins/xenobiology)
"aVv" = (/obj/machinery/button/flasher{id = "permaflash"; name = "perma flasher button"; pixel_x = 0; pixel_y = 28},/turf/open/floor/plasteel,/area/security/brig)
"aVw" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "perma shutter"; name = "perma brig window shutter"},/turf/open/floor/plating,/area/security/brig)
"aVx" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plasteel/warnwhite{icon_state = "warnwhite"; dir = 4},/area/medical/medbay)
@@ -2501,7 +2501,7 @@
"aWg" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plasteel,/area/maintenance/asmaint2)
"aWh" = (/obj/structure/table,/obj/machinery/recharger,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
"aWi" = (/obj/structure/table,/obj/item/device/flashlight/seclite,/obj/item/clothing/suit/armor/vest,/obj/machinery/light{dir = 1},/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/restraints/legcuffs/beartrap,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
-"aWj" = (/obj/item/weapon/circuitboard/security,/turf/open/floor/plating,/area/maintenance/asmaint2)
+"aWj" = (/obj/item/weapon/circuitboard/computer/security,/turf/open/floor/plating,/area/maintenance/asmaint2)
"aWk" = (/obj/structure/window/reinforced,/obj/structure/flora/kirbyplants{icon_state = "plant-17"; layer = 4.1},/turf/open/floor/plasteel/whitebot,/area/maintenance/fore{name = "Security Maintenance"})
"aWl" = (/obj/machinery/vending/assist,/turf/open/floor/plasteel/warning{icon_state = "warning"; dir = 10},/area/maintenance/fore{name = "Security Maintenance"})
"aWm" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/clothing/gloves/color/fyellow,/obj/item/clothing/gloves/color/fyellow,/turf/open/floor/plasteel/warning,/area/maintenance/fore{name = "Security Maintenance"})
@@ -2592,8 +2592,8 @@
"aXT" = (/obj/structure/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/open/floor/plasteel/shuttle,/area/shuttle/arrival)
"aXU" = (/obj/effect/landmark{name = "JoinLate"},/turf/open/floor/plasteel/shuttle,/area/shuttle/arrival)
"aXV" = (/obj/item/device/flashlight/seclite{name = "dusty seclite"; on = 1},/turf/open/floor/plating/asteroid{name = "dirt"},/area/maintenance/asmaint2)
-"aXW" = (/obj/item/weapon/circuitboard/card,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
-"aXX" = (/obj/structure/computerframe,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
+"aXW" = (/obj/item/weapon/circuitboard/computer/card,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
+"aXX" = (/obj/structure/frame/computer,/turf/open/floor/plasteel{icon_state = "showroomfloor"},/area/maintenance/asmaint2)
"aXY" = (/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1},/turf/open/floor/plasteel/white,/area/maintenance/fore{name = "Security Maintenance"})
"aXZ" = (/turf/open/floor/plasteel/bot,/area/maintenance/fore{name = "Security Maintenance"})
"aYa" = (/obj/machinery/atmospherics/pipe/simple/cyan/hidden{icon_state = "intact"; dir = 10},/turf/open/floor/plasteel,/area/maintenance/fore{name = "Security Maintenance"})
@@ -2784,7 +2784,7 @@
"bbD" = (/obj/effect/spawner/lootdrop{loot = list(/obj/item/organ/gland/bloody = 7, /obj/item/organ/gland/bodysnatch = 4, /obj/item/organ/gland/egg = 7, /obj/item/organ/gland/emp = 3, /obj/item/organ/gland/mindshock = 5, /obj/item/organ/gland/plasma = 7, /obj/item/organ/gland/pop = 5, /obj/item/organ/gland/slime = 4, /obj/item/organ/gland/spiderman = 5, /obj/item/organ/gland/ventcrawling = 1, /obj/item/organ/body_egg/alien_embryo = 1, /obj/item/organ/hivelord_core = 2); lootcount = 3; name = "organ spawner"},/obj/structure/closet/secure_closet{name = "xenobiology research materials locker"; req_access_txt = "55"},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"bbE" = (/mob/living/simple_animal/mouse/brown,/turf/open/floor/wood,/area/maintenance/fore{name = "Security Maintenance"})
"bbF" = (/obj/effect/spawner/lootdrop/crate_spawner,/turf/open/floor/plating,/area/maintenance/fore{name = "Security Maintenance"})
-"bbG" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/maintenance/fore{name = "Security Maintenance"})
+"bbG" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/computer/solar_control,/obj/item/weapon/electronics/tracker,/obj/item/weapon/paper/solar,/turf/open/floor/plating,/area/maintenance/fore{name = "Security Maintenance"})
"bbH" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plating,/area/maintenance/fore{name = "Security Maintenance"})
"bbI" = (/obj/machinery/atmospherics/pipe/simple/cyan/hidden{icon_state = "intact"; dir = 5},/turf/open/floor/plating,/area/maintenance/fore{name = "Security Maintenance"})
"bbJ" = (/obj/structure/cable/cyan{icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/cyan/hidden{icon_state = "intact"; dir = 4},/turf/open/floor/plasteel,/area/maintenance/fore{name = "Security Maintenance"})
@@ -2854,7 +2854,7 @@
"bcV" = (/obj/item/weapon/storage/box/lights/mixed,/turf/open/floor/plating,/area/maintenance/asmaint)
"bcW" = (/obj/structure/closet/firecloset,/turf/open/floor/plating,/area/maintenance/asmaint)
"bcX" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating,/area/maintenance/asmaint)
-"bcY" = (/obj/structure/table,/obj/item/weapon/circuitboard/autolathe,/turf/open/floor/plating,/area/maintenance/asmaint2)
+"bcY" = (/obj/structure/table,/obj/item/weapon/circuitboard/machine/autolathe,/turf/open/floor/plating,/area/maintenance/asmaint2)
"bcZ" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/open/floor/plating,/area/maintenance/asmaint2)
"bda" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/transport)
"bdb" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
@@ -2951,6 +2951,7 @@
"beO" = (/obj/structure/window/reinforced,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/obj/machinery/flasher/portable,/turf/open/floor/plasteel/black,/area/security/warden)
"beP" = (/obj/structure/table,/obj/item/clothing/glasses/science,/turf/open/floor/plasteel,/area/toxins/misc_lab)
"beQ" = (/obj/effect/decal/cleanable/blood/old,/obj/item/clothing/glasses/sunglasses,/turf/open/floor/wood{icon_state = "wood-broken"},/area/maintenance/fore{name = "Security Maintenance"})
+"ZAx" = (/obj/structure/table, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /obj/item/clothing/under/burial, /turf/open/floor/plating,/area/maintenance/asmaint2)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -3126,7 +3127,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaJaaJaaJaaaaaaaaaaaaaaJaaJaaJaaJaPHaPHaPHaPHaPHaPHaRkaRkaPHaaaaaaaVmbbHaVmaaaaayaaaaaaaaaaaaaaBaaaaaaaayaaaaaaaZrbcqbcraZraZraZraZraZrbagazLaAxaAZaNEaAxbcsaAxaAxaAxaAxazLaFsaBRaRZaRZaBRazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLazLaZxazLazLaaJaaJaaJaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaaaayaaaaaaaaaaPHbctbctaPHaaaaaaaaaaaTaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaayaaaaaaaZrbaSbcubcvbchbchbcwbcxbaSbcyaAxbbyaHGaAxbczaAxbcAaAxaBbaFCaBbaBbbcBbcBaAxbczbcjbcjbcjazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJbcCaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaPHaQqaQqaPHaayaayaaybcDamzaaBaaBaaBaaBaaBaaBaaBaayaguaguaguaayaZrbaSbcEbcFbcFbcGbcGbcGbcGbcHaDiaDibcIaDibcIaDiaDiaDiaDjbcJaDjaDjaDjaDjaDibcIbcKbcKbcLaTTbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcMbcNaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObcPbcPbcQbcPbcPbcPbcRbcPbcPbcSaayaaaaPHbcTaQqaVmaaaaayaaaaaaaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaZraZraZrbcUbcUaZrbcVbcWbcXazLaAxaBTaAxaAxaAxbcjbcjbcYbcZazLazLazLazLazLazLazLazLazLazLazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObcPbcPbcQbcPbcPbcPbcRbcPbcPbcSaayaaaaPHbcTaQqaVmaaaaayaaaaaaaaaaaaaayaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaZraZraZrbcUbcUaZrbcVbcWbcXazLaAxaBTaAxaAxZAxbcjbcjbcYbcZazLazLazLazLazLazLazLazLazLazLazLaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcObdabdbbdcbddbddbddbddbddbddbddbcQaVmaVmaVmaQqaQqaVmaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaaaaaaaaaaaaaaaaaJaaJaZrbdebdeaZraZraZraZrazLazLazLaBRaBRaBRazLazLazLazLazLaaaaayaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdfbdgbdgbdgbdgbdgbdgbdgbdgbdgbdgbdhbdibdjbdkaQqaQqaVmaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaayaaBaayaaaaaaaaaaaaaaaaaJaZrbdebdebdlbdlbdmaZraaJaaJbdnaaaaaaaaaaayaaaaaaaaaaayaaaaayaayaayaayaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdobdpbdqbdqbdrbdrbdrbdrbdrbdrbdrbcQaVmaVmaVmaQqaQqaPHaaaaayaaaaaaaaaaaaaaaaaaaaaaaaaayaaBaayaaaaaaaaaaaaaaaaaJaZrbdsbdebdebdebdtaZraaJaaJaayaayaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaaaaaaaJaaJaaJaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index 87cdb1c609c..9f1dde54049 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -1434,7 +1434,7 @@
},
/area/shuttle/syndicate)
"acC" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -2533,7 +2533,7 @@
},
/area/shuttle/abandoned)
"aeG" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
/turf/open/floor/plasteel/shuttle{
@@ -2838,7 +2838,7 @@
},
/area/shuttle/abandoned)
"afo" = (
-/obj/item/weapon/circuitboard/operating,
+/obj/item/weapon/circuitboard/computer/operating,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor3"
},
@@ -5745,8 +5745,8 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"alK" = (
-/obj/structure/computerframe,
-/obj/item/weapon/circuitboard/operating,
+/obj/structure/frame/computer,
+/obj/item/weapon/circuitboard/computer/operating,
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"alL" = (
@@ -5889,7 +5889,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"amj" = (
-/obj/item/weapon/circuitboard/sleeper,
+/obj/item/weapon/circuitboard/machine/sleeper,
/obj/structure/mirror{
pixel_x = 28
},
@@ -6259,7 +6259,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"amV" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"amW" = (
@@ -6807,32 +6807,32 @@
"aop" = (
/obj/structure/table,
/obj/item/weapon/stock_parts/manipulator,
-/obj/item/weapon/circuitboard/microwave,
+/obj/item/weapon/circuitboard/machine/microwave,
/turf/open/floor/plating{
broken = 1;
icon_state = "platingdmg3"
},
/area/maintenance/asmaint)
"aoq" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"aor" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
-/obj/item/weapon/circuitboard/arcade/orion_trail,
+/obj/item/weapon/circuitboard/computer/arcade/orion_trail,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"aos" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
/turf/open/floor/plating,
/area/maintenance/asmaint)
"aot" = (
/obj/structure/table,
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"aou" = (
@@ -10768,7 +10768,7 @@
/obj/structure/rack,
/obj/item/weapon/light/tube,
/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/weapon/circuitboard/protolathe,
+/obj/item/weapon/circuitboard/machine/protolathe,
/turf/open/floor/plating,
/area/maintenance/asmaint)
"awc" = (
@@ -17763,7 +17763,7 @@
/area/maintenance/atmos_control)
"aJM" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/circuit_imprinter,
+/obj/item/weapon/circuitboard/machine/circuit_imprinter,
/obj/item/trash/chips,
/turf/open/floor/plating,
/area/maintenance/atmos_control)
@@ -23619,11 +23619,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/robotics{
+/obj/item/weapon/circuitboard/computer/robotics{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/mecha_control{
+/obj/item/weapon/circuitboard/computer/mecha_control{
pixel_x = 1;
pixel_y = -1
},
@@ -23651,11 +23651,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/borgupload{
+/obj/item/weapon/circuitboard/computer/borgupload{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/aiupload{
+/obj/item/weapon/circuitboard/computer/aiupload{
pixel_x = 2;
pixel_y = -2
},
@@ -23675,15 +23675,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/crew{
+/obj/item/weapon/circuitboard/computer/crew{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/card{
+/obj/item/weapon/circuitboard/computer/card{
pixel_x = 2;
pixel_y = -2
},
-/obj/item/weapon/circuitboard/communications{
+/obj/item/weapon/circuitboard/computer/communications{
pixel_x = 5;
pixel_y = -5
},
@@ -23727,7 +23727,7 @@
pixel_x = -30;
pixel_y = 0
},
-/obj/structure/filingcabinet,
+/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"aVu" = (
@@ -23847,7 +23847,7 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"aVH" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
/turf/open/floor/plating{
@@ -23862,7 +23862,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint)
"aVJ" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/effect/spawner/lootdrop{
loot = list(/obj/item/stack/sheet/metal = 1, /obj/item/stack/rods = 2, /obj/item/weapon/shard = 2, "" = 3);
lootcount = 2;
@@ -27242,16 +27242,16 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/cloning{
+/obj/item/weapon/circuitboard/computer/cloning{
pixel_x = 0
},
-/obj/item/weapon/circuitboard/med_data{
+/obj/item/weapon/circuitboard/computer/med_data{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/clonescanner,
-/obj/item/weapon/circuitboard/clonepod,
-/obj/item/weapon/circuitboard/scan_consolenew,
+/obj/item/weapon/circuitboard/machine/clonescanner,
+/obj/item/weapon/circuitboard/machine/clonepod,
+/obj/item/weapon/circuitboard/computer/scan_consolenew,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -27262,11 +27262,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/secure_data{
+/obj/item/weapon/circuitboard/computer/secure_data{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/security{
+/obj/item/weapon/circuitboard/computer/security{
pixel_x = 1;
pixel_y = -1
},
@@ -27281,12 +27281,12 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/mining,
-/obj/item/weapon/circuitboard/autolathe{
+/obj/item/weapon/circuitboard/computer/mining,
+/obj/item/weapon/circuitboard/machine/autolathe{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/arcade/battle,
+/obj/item/weapon/circuitboard/computer/arcade/battle,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -27402,7 +27402,7 @@
"bcx" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/weapon/circuitboard/rdconsole,
+/obj/item/weapon/circuitboard/computer/rdconsole,
/obj/item/weapon/stock_parts/console_screen,
/turf/open/floor/plating{
broken = 1;
@@ -28690,21 +28690,21 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/pandemic{
+/obj/item/weapon/circuitboard/computer/pandemic{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/weapon/circuitboard/rdconsole,
-/obj/item/weapon/circuitboard/rdserver{
+/obj/item/weapon/circuitboard/computer/rdconsole,
+/obj/item/weapon/circuitboard/machine/rdserver{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/destructive_analyzer,
-/obj/item/weapon/circuitboard/protolathe,
-/obj/item/weapon/circuitboard/aifixer,
-/obj/item/weapon/circuitboard/teleporter,
-/obj/item/weapon/circuitboard/circuit_imprinter,
-/obj/item/weapon/circuitboard/mechfab,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/protolathe,
+/obj/item/weapon/circuitboard/computer/aifixer,
+/obj/item/weapon/circuitboard/computer/teleporter,
+/obj/item/weapon/circuitboard/machine/circuit_imprinter,
+/obj/item/weapon/circuitboard/machine/mechfab,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
tag = "icon-manifold-b-f (NORTH)";
dir = 1
@@ -28716,15 +28716,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/powermonitor{
+/obj/item/weapon/circuitboard/computer/powermonitor{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/stationalert{
+/obj/item/weapon/circuitboard/computer/stationalert{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/atmos_alert{
+/obj/item/weapon/circuitboard/computer/atmos_alert{
pixel_x = 3;
pixel_y = -3
},
@@ -28736,12 +28736,12 @@
/area/storage/tech)
"bfd" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/receiver,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/broadcaster,
-/obj/item/weapon/circuitboard/message_monitor{
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/receiver,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
+/obj/item/weapon/circuitboard/computer/message_monitor{
pixel_y = -5
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -37083,7 +37083,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint)
"buF" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plating,
/area/maintenance/fpmaint)
"buG" = (
@@ -38399,7 +38399,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint)
"bwK" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/machinery/power/apc{
aidisabled = 0;
auto_name = 1;
@@ -45512,6 +45512,7 @@
"bIQ" = (
/obj/structure/cult/tome,
/obj/item/clothing/under/suit_jacket/red,
+/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel/cult,
/area/library)
"bIR" = (
@@ -47438,7 +47439,7 @@
/turf/open/floor/plating,
/area/maintenance/fpmaint)
"bMn" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plating,
/area/maintenance/fpmaint)
"bMo" = (
@@ -61853,7 +61854,7 @@
},
/area/toxins/lab)
"cog" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plasteel{
icon_state = "white"
},
@@ -62399,6 +62400,13 @@
dir = 2;
pixel_y = 24
},
+/obj/structure/table/wood,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
/turf/open/floor/plasteel{
icon_state = "dark"
},
@@ -62568,18 +62576,18 @@
},
/area/maintenance/electrical)
"cpA" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel{
icon_state = "floorgrime"
},
/area/construction)
"cpB" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/construction)
"cpC" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/machinery/airalarm{
pixel_y = 23
},
@@ -62600,7 +62608,7 @@
},
/area/construction)
"cpE" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/turf/open/floor/plasteel{
icon_state = "floorgrime"
},
@@ -65375,7 +65383,7 @@
pixel_x = -2;
pixel_y = 4
},
-/obj/item/weapon/circuitboard/teleporter,
+/obj/item/weapon/circuitboard/computer/teleporter,
/obj/item/device/aicard,
/obj/structure/cable/pink{
tag = "icon-2-8";
@@ -72100,7 +72108,7 @@
"cHe" = (
/obj/structure/closet/crate,
/obj/item/weapon/reagent_containers/food/snacks/mint,
-/obj/item/weapon/circuitboard/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"cHf" = (
@@ -74722,8 +74730,8 @@
},
/area/maintenance/asmaint2)
"cLX" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/chem_master,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/chem_master,
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"cLY" = (
diff --git a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
index 65a5dd9837b..8e7fc5e4d84 100644
--- a/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
+++ b/_maps/map_files/EfficiencyStation/EfficiencyStation.dmm
@@ -588,7 +588,7 @@
},
/area/shuttle/syndicate)
"abt" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -1956,7 +1956,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 8;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -1992,7 +1992,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 4;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -2202,8 +2202,8 @@
},
/area/shuttle/abandoned)
"adV" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/chem_dispenser,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/chem_dispenser,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -2213,7 +2213,7 @@
},
/area/shuttle/abandoned)
"adW" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -2777,7 +2777,7 @@
},
/area/shuttle/abandoned)
"aeR" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -2787,8 +2787,8 @@
},
/area/shuttle/abandoned)
"aeS" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/autolathe,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/autolathe,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -3524,8 +3524,8 @@
},
/area/shuttle/abandoned)
"aga" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/cyborgrecharger,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/cyborgrecharger,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -4212,7 +4212,7 @@
},
/area/shuttle/abandoned)
"ahk" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -4244,7 +4244,7 @@
},
/area/shuttle/abandoned)
"ahn" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -14688,7 +14688,7 @@
pixel_x = -2;
pixel_y = 4
},
-/obj/item/weapon/circuitboard/teleporter,
+/obj/item/weapon/circuitboard/computer/teleporter,
/turf/open/floor/plasteel{
dir = 6;
icon_state = "warnwhite"
@@ -17007,11 +17007,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/robotics{
+/obj/item/weapon/circuitboard/computer/robotics{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/mecha_control{
+/obj/item/weapon/circuitboard/computer/mecha_control{
pixel_x = 1;
pixel_y = -1
},
@@ -17022,15 +17022,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/crew{
+/obj/item/weapon/circuitboard/computer/crew{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/card{
+/obj/item/weapon/circuitboard/computer/card{
pixel_x = 2;
pixel_y = -2
},
-/obj/item/weapon/circuitboard/communications{
+/obj/item/weapon/circuitboard/computer/communications{
pixel_x = 5;
pixel_y = -5
},
@@ -17041,11 +17041,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/borgupload{
+/obj/item/weapon/circuitboard/computer/borgupload{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/aiupload{
+/obj/item/weapon/circuitboard/computer/aiupload{
pixel_x = 2;
pixel_y = -2
},
@@ -19057,14 +19057,14 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/cloning,
-/obj/item/weapon/circuitboard/med_data{
+/obj/item/weapon/circuitboard/computer/cloning,
+/obj/item/weapon/circuitboard/computer/med_data{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/clonescanner,
-/obj/item/weapon/circuitboard/clonepod,
-/obj/item/weapon/circuitboard/scan_consolenew,
+/obj/item/weapon/circuitboard/machine/clonescanner,
+/obj/item/weapon/circuitboard/machine/clonepod,
+/obj/item/weapon/circuitboard/computer/scan_consolenew,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -19691,11 +19691,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/secure_data{
+/obj/item/weapon/circuitboard/computer/secure_data{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/security{
+/obj/item/weapon/circuitboard/computer/security{
pixel_x = 1;
pixel_y = -1
},
@@ -20334,15 +20334,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/powermonitor{
+/obj/item/weapon/circuitboard/computer/powermonitor{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/stationalert{
+/obj/item/weapon/circuitboard/computer/stationalert{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/atmos_alert{
+/obj/item/weapon/circuitboard/computer/atmos_alert{
pixel_x = 3;
pixel_y = -3
},
@@ -21705,18 +21705,18 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/pandemic{
+/obj/item/weapon/circuitboard/computer/pandemic{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/weapon/circuitboard/rdconsole,
-/obj/item/weapon/circuitboard/rdserver{
+/obj/item/weapon/circuitboard/computer/rdconsole,
+/obj/item/weapon/circuitboard/machine/rdserver{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/destructive_analyzer,
-/obj/item/weapon/circuitboard/protolathe,
-/obj/item/weapon/circuitboard/aifixer,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/protolathe,
+/obj/item/weapon/circuitboard/computer/aifixer,
/obj/machinery/light_switch{
pixel_x = -25
},
@@ -22455,12 +22455,12 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/mining,
-/obj/item/weapon/circuitboard/autolathe{
+/obj/item/weapon/circuitboard/computer/mining,
+/obj/item/weapon/circuitboard/machine/autolathe{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/arcade/battle,
+/obj/item/weapon/circuitboard/computer/arcade/battle,
/obj/machinery/light/small{
dir = 8
},
@@ -23206,12 +23206,12 @@
/area/hallway/primary/starboard)
"aOL" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/receiver,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/broadcaster,
-/obj/item/weapon/circuitboard/message_monitor{
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/receiver,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
+/obj/item/weapon/circuitboard/computer/message_monitor{
pixel_y = -5
},
/turf/open/floor/plating,
@@ -39741,6 +39741,7 @@
/area/storage/art)
"buT" = (
/obj/structure/cult/tome,
+/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult"
},
@@ -44400,7 +44401,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
-/obj/item/weapon/circuitboard/solar_control,
+/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/obj/item/weapon/paper/solar,
/obj/structure/cable{
@@ -48367,8 +48368,7 @@
name = "Chapel Maintenance"
})
"bKq" = (
-/obj/structure/filingcabinet/chestdrawer,
-/obj/effect/decal/cleanable/cobweb,
+/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"bKr" = (
@@ -57033,9 +57033,13 @@
})
"cay" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris{
- icon_state = "gib6"
- },
+/obj/structure/table,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
/turf/open/floor/plating,
/area/maintenance/port{
name = "Chapel Maintenance"
diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
index 9a976b2f168..afe423895f5 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm
@@ -20887,7 +20887,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
-/obj/item/weapon/circuitboard/solar_control,
+/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/obj/item/weapon/paper/solar,
/turf/open/floor/plasteel{
@@ -24449,12 +24449,12 @@
/turf/open/floor/wood,
/area/lawoffice)
"aNP" = (
-/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/airalarm{
dir = 8;
icon_state = "alarm0";
pixel_x = 24
},
+/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"aNQ" = (
@@ -31654,15 +31654,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/powermonitor{
+/obj/item/weapon/circuitboard/computer/powermonitor{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/stationalert{
+/obj/item/weapon/circuitboard/computer/stationalert{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/atmos_alert{
+/obj/item/weapon/circuitboard/computer/atmos_alert{
pixel_x = 3;
pixel_y = -3
},
@@ -31675,11 +31675,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/secure_data{
+/obj/item/weapon/circuitboard/computer/secure_data{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/security{
+/obj/item/weapon/circuitboard/computer/security{
pixel_x = 1;
pixel_y = -1
},
@@ -31696,16 +31696,16 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/cloning{
+/obj/item/weapon/circuitboard/computer/cloning{
pixel_x = 0
},
-/obj/item/weapon/circuitboard/med_data{
+/obj/item/weapon/circuitboard/computer/med_data{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/clonescanner,
-/obj/item/weapon/circuitboard/clonepod,
-/obj/item/weapon/circuitboard/scan_consolenew,
+/obj/item/weapon/circuitboard/machine/clonescanner,
+/obj/item/weapon/circuitboard/machine/clonepod,
+/obj/item/weapon/circuitboard/computer/scan_consolenew,
/turf/open/floor/plasteel{
icon_state = "dark"
},
@@ -33760,11 +33760,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/borgupload{
+/obj/item/weapon/circuitboard/computer/borgupload{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/aiupload{
+/obj/item/weapon/circuitboard/computer/aiupload{
pixel_x = 2;
pixel_y = -2
},
@@ -33804,14 +33804,14 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/message_monitor{
+/obj/item/weapon/circuitboard/computer/message_monitor{
pixel_y = -5
},
-/obj/item/weapon/circuitboard/arcade/battle{
+/obj/item/weapon/circuitboard/computer/arcade/battle{
pixel_x = -4;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/arcade/orion_trail{
+/obj/item/weapon/circuitboard/computer/arcade/orion_trail{
pixel_x = 4
},
/turf/open/floor/plasteel{
@@ -33823,8 +33823,8 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/mining,
-/obj/item/weapon/circuitboard/autolathe{
+/obj/item/weapon/circuitboard/computer/mining,
+/obj/item/weapon/circuitboard/machine/autolathe{
pixel_x = 3;
pixel_y = -3
},
@@ -33837,17 +33837,17 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/pandemic{
+/obj/item/weapon/circuitboard/computer/pandemic{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/weapon/circuitboard/rdconsole,
-/obj/item/weapon/circuitboard/rdserver{
+/obj/item/weapon/circuitboard/computer/rdconsole,
+/obj/item/weapon/circuitboard/machine/rdserver{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/destructive_analyzer,
-/obj/item/weapon/circuitboard/protolathe,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/protolathe,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel{
icon_state = "dark"
@@ -34518,15 +34518,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/crew{
+/obj/item/weapon/circuitboard/computer/crew{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/card{
+/obj/item/weapon/circuitboard/computer/card{
pixel_x = 2;
pixel_y = -2
},
-/obj/item/weapon/circuitboard/communications{
+/obj/item/weapon/circuitboard/computer/communications{
pixel_x = 5;
pixel_y = -5
},
@@ -35451,11 +35451,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/robotics{
+/obj/item/weapon/circuitboard/computer/robotics{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/mecha_control{
+/obj/item/weapon/circuitboard/computer/mecha_control{
pixel_x = 1;
pixel_y = -1
},
@@ -49939,10 +49939,7 @@
/area/crew_quarters/bar)
"bCu" = (
/obj/structure/table/wood/poker,
-/obj/effect/spawner/lootdrop{
- loot = list(/obj/item/weapon/gun/projectile/revolver/russian = 5, /obj/item/weapon/storage/box/syndie_kit/throwing_weapons, /obj/item/toy/cards/deck/syndicate = 2);
- name = "gambling valuables spawner"
- },
+/obj/effect/spawner/lootdrop/gambling,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"bCv" = (
@@ -56966,14 +56963,14 @@
/area/bridge)
"bOg" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/receiver,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/broadcaster,
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/receiver,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
/obj/machinery/atmospherics/components/unary/vent_pump{
dir = 1;
on = 1
@@ -59352,6 +59349,7 @@
pixel_y = 0
},
/obj/item/clothing/under/suit_jacket/red,
+/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult";
dir = 2
@@ -79100,7 +79098,7 @@
pixel_x = -2;
pixel_y = 4
},
-/obj/item/weapon/circuitboard/teleporter,
+/obj/item/weapon/circuitboard/computer/teleporter,
/turf/open/floor/plasteel{
icon_state = "cafeteria";
dir = 5
@@ -96289,7 +96287,7 @@
},
/area/shuttle/syndicate)
"cXz" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -97778,8 +97776,8 @@
},
/area/shuttle/abandoned)
"daw" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/cyborgrecharger,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/cyborgrecharger,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -97947,7 +97945,7 @@
},
/area/shuttle/abandoned)
"daO" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -98043,7 +98041,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 1;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -98060,7 +98058,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 1;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -98355,7 +98353,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 2;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -98372,7 +98370,7 @@
desc = "A thin layer of dust coating the floor.";
name = "dust"
},
-/obj/machinery/constructable_frame/machine_frame{
+/obj/structure/frame/machine{
desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench.";
dir = 2;
icon = 'icons/obj/Cryogenic2.dmi';
@@ -98468,7 +98466,7 @@
},
/area/shuttle/abandoned)
"dbC" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -98646,7 +98644,7 @@
},
/area/shuttle/abandoned)
"dbS" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -98657,8 +98655,8 @@
},
/area/shuttle/abandoned)
"dbT" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/autolathe,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/autolathe,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -98790,8 +98788,8 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/abandoned)
"dcd" = (
-/obj/machinery/constructable_frame/machine_frame,
-/obj/item/weapon/circuitboard/chem_dispenser,
+/obj/structure/frame/machine,
+/obj/item/weapon/circuitboard/machine/chem_dispenser,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -98801,7 +98799,7 @@
},
/area/shuttle/abandoned)
"dce" = (
-/obj/machinery/constructable_frame/machine_frame,
+/obj/structure/frame/machine,
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
name = "dust"
@@ -100511,12 +100509,18 @@
},
/area/medical/morgue)
"dfx" = (
-/obj/machinery/plantgenes,
-/turf/open/floor/plasteel{
- dir = 9;
- icon_state = "warning"
+/obj/structure/window/reinforced{
+ dir = 4
},
-/area/hydroponics)
+/obj/structure/table/wood,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/turf/open/floor/plating,
+/area/chapel/main)
"dfy" = (
/turf/open/floor/engine/vacuum,
/area/atmos)
@@ -100618,6 +100622,13 @@
},
/turf/open/space,
/area/space)
+"dfI" = (
+/obj/machinery/plantgenes,
+/turf/open/floor/plasteel{
+ dir = 9;
+ icon_state = "warning"
+ },
+/area/hydroponics)
(1,1,1) = {"
aaa
@@ -120854,7 +120865,7 @@ cOU
cRS
cRS
cSP
-cRS
+dfx
cOU
cUb
cOU
@@ -136231,7 +136242,7 @@ bZc
caw
bZc
ccX
-dfx
+dfI
bVf
cuS
ciC
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index aaebffe3620..94f22215cc9 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -3510,6 +3510,7 @@
/obj/item/weapon/folder/red,
/obj/item/weapon/hand_labeler,
/obj/item/clothing/glasses/sunglasses,
+/obj/item/weapon/book/codex_gigas,
/turf/open/floor/carpet,
/area/security/brig)
"hn" = (
@@ -10216,7 +10217,7 @@
/area/crew_quarters/bar)
"uW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/filingcabinet/chestdrawer,
+/obj/structure/filingcabinet/employment,
/turf/open/floor/plasteel,
/area/crew_quarters/heads{
name = "\improper Job Assignment"
@@ -13107,7 +13108,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
-/obj/item/weapon/circuitboard/solar_control,
+/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/obj/item/weapon/paper/solar,
/turf/open/floor/plating{
@@ -13528,7 +13529,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"Cw" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -15520,7 +15521,7 @@
/turf/open/floor/plating,
/area/shuttle/syndicate)
"Hd" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/obj/item/weapon/paper{
info = "Teleporter Instruction
- Install circuit board, glass and wiring to complete Teleporter Control Console
- Use a screwdriver, wirecutter and screwdriver again on the Teleporter Station to connect it
- Set destination with Teleporter Control Computer
- Activate Teleporter Hub with Teleporter Station
";
name = "Teleporter Instructions"
@@ -16130,6 +16131,16 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"IL" = (
+/obj/structure/table,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/obj/item/clothing/under/burial,
+/turf/open/floor/plating,
+/area/hallway/primary/central)
(1,1,1) = {"
aa
@@ -46085,7 +46096,7 @@ nC
jo
bx
bN
-bN
+IL
bx
ps
rE
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 4b6ad4ccfca..355c2d64f14 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -7034,7 +7034,7 @@
/area/maintenance/fpmaint2)
"ann" = (
/obj/item/weapon/electronics/airalarm,
-/obj/item/weapon/circuitboard/seed_extractor,
+/obj/item/weapon/circuitboard/machine/seed_extractor,
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 4;
@@ -7502,7 +7502,7 @@
/area/maintenance/fpmaint2)
"aoo" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/monkey_recycler,
+/obj/item/weapon/circuitboard/machine/monkey_recycler,
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"aop" = (
@@ -9082,10 +9082,10 @@
/turf/open/floor/carpet,
/area/security/detectives_office)
"arV" = (
-/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/structure/filingcabinet/employment,
/turf/open/floor/wood,
/area/lawoffice)
"arW" = (
@@ -10443,11 +10443,11 @@
/obj/item/weapon/shard{
icon_state = "medium"
},
-/obj/item/weapon/circuitboard/operating,
+/obj/item/weapon/circuitboard/computer/operating,
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"auZ" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plating,
/area/maintenance/fpmaint2)
"ava" = (
@@ -20527,6 +20527,7 @@
"aQs" = (
/obj/structure/cult/tome,
/obj/item/clothing/under/suit_jacket/red,
+/obj/item/weapon/book/codex_gigas,
/turf/open/floor/plasteel{
icon_state = "cult";
dir = 2
@@ -35006,7 +35007,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint2)
"buA" = (
-/obj/structure/computerframe,
+/obj/structure/frame/computer,
/turf/open/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
@@ -41168,11 +41169,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/borgupload{
+/obj/item/weapon/circuitboard/computer/borgupload{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/aiupload{
+/obj/item/weapon/circuitboard/computer/aiupload{
pixel_x = 2;
pixel_y = -2
},
@@ -41199,36 +41200,36 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/pandemic{
+/obj/item/weapon/circuitboard/computer/pandemic{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/weapon/circuitboard/rdconsole,
-/obj/item/weapon/circuitboard/rdserver{
+/obj/item/weapon/circuitboard/computer/rdconsole,
+/obj/item/weapon/circuitboard/machine/rdserver{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/destructive_analyzer,
-/obj/item/weapon/circuitboard/protolathe,
+/obj/item/weapon/circuitboard/machine/destructive_analyzer,
+/obj/item/weapon/circuitboard/machine/protolathe,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
-/obj/item/weapon/circuitboard/aifixer,
-/obj/item/weapon/circuitboard/teleporter,
-/obj/item/weapon/circuitboard/circuit_imprinter,
-/obj/item/weapon/circuitboard/mechfab,
+/obj/item/weapon/circuitboard/computer/aifixer,
+/obj/item/weapon/circuitboard/computer/teleporter,
+/obj/item/weapon/circuitboard/machine/circuit_imprinter,
+/obj/item/weapon/circuitboard/machine/mechfab,
/turf/open/floor/plating,
/area/storage/tech)
"bGx" = (
/obj/structure/rack,
-/obj/item/weapon/circuitboard/telecomms/processor,
-/obj/item/weapon/circuitboard/telecomms/receiver,
-/obj/item/weapon/circuitboard/telecomms/server,
-/obj/item/weapon/circuitboard/telecomms/bus,
-/obj/item/weapon/circuitboard/telecomms/broadcaster,
-/obj/item/weapon/circuitboard/message_monitor{
+/obj/item/weapon/circuitboard/machine/telecomms/processor,
+/obj/item/weapon/circuitboard/machine/telecomms/receiver,
+/obj/item/weapon/circuitboard/machine/telecomms/server,
+/obj/item/weapon/circuitboard/machine/telecomms/bus,
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
+/obj/item/weapon/circuitboard/computer/message_monitor{
pixel_y = -5
},
/turf/open/floor/plating,
@@ -41238,12 +41239,12 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/mining,
-/obj/item/weapon/circuitboard/autolathe{
+/obj/item/weapon/circuitboard/computer/mining,
+/obj/item/weapon/circuitboard/machine/autolathe{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/arcade/battle,
+/obj/item/weapon/circuitboard/computer/arcade/battle,
/turf/open/floor/plating,
/area/storage/tech)
"bGz" = (
@@ -41848,15 +41849,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/crew{
+/obj/item/weapon/circuitboard/computer/crew{
pixel_x = -1;
pixel_y = 1
},
-/obj/item/weapon/circuitboard/card{
+/obj/item/weapon/circuitboard/computer/card{
pixel_x = 2;
pixel_y = -2
},
-/obj/item/weapon/circuitboard/communications{
+/obj/item/weapon/circuitboard/computer/communications{
pixel_x = 5;
pixel_y = -5
},
@@ -42787,11 +42788,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/robotics{
+/obj/item/weapon/circuitboard/computer/robotics{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/mecha_control{
+/obj/item/weapon/circuitboard/computer/mecha_control{
pixel_x = 1;
pixel_y = -1
},
@@ -42813,16 +42814,16 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/cloning{
+/obj/item/weapon/circuitboard/computer/cloning{
pixel_x = 0
},
-/obj/item/weapon/circuitboard/med_data{
+/obj/item/weapon/circuitboard/computer/med_data{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/weapon/circuitboard/clonescanner,
-/obj/item/weapon/circuitboard/clonepod,
-/obj/item/weapon/circuitboard/scan_consolenew,
+/obj/item/weapon/circuitboard/machine/clonescanner,
+/obj/item/weapon/circuitboard/machine/clonepod,
+/obj/item/weapon/circuitboard/computer/scan_consolenew,
/turf/open/floor/plating,
/area/storage/tech)
"bJl" = (
@@ -42830,15 +42831,15 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/powermonitor{
+/obj/item/weapon/circuitboard/computer/powermonitor{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/stationalert{
+/obj/item/weapon/circuitboard/computer/stationalert{
pixel_x = 1;
pixel_y = -1
},
-/obj/item/weapon/circuitboard/atmos_alert{
+/obj/item/weapon/circuitboard/computer/atmos_alert{
pixel_x = 3;
pixel_y = -3
},
@@ -42849,11 +42850,11 @@
dir = 8;
layer = 2.9
},
-/obj/item/weapon/circuitboard/secure_data{
+/obj/item/weapon/circuitboard/computer/secure_data{
pixel_x = -2;
pixel_y = 2
},
-/obj/item/weapon/circuitboard/security{
+/obj/item/weapon/circuitboard/computer/security{
pixel_x = 1;
pixel_y = -1
},
@@ -56170,7 +56171,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
-/obj/item/weapon/circuitboard/solar_control,
+/obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/obj/item/weapon/paper/solar,
/turf/open/floor/plasteel,
@@ -63494,7 +63495,7 @@
},
/area/shuttle/abandoned)
"czy" = (
-/obj/structure/computerframe{
+/obj/structure/frame/computer{
anchored = 1
},
/turf/open/floor/plasteel/shuttle{
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index a3b5fe4f31f..fda763709db 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -5872,6 +5872,80 @@
dir = 6
},
/area/ctf)
+"rL" = (
+/obj/effect/landmark/shuttle_import,
+/turf/open/space,
+/area/space)
+"rM" = (
+/turf/closed/wall/shuttle/smooth,
+/area/shuttle/escape)
+"rN" = (
+/obj/machinery/status_display{
+ layer = 4;
+ pixel_x = 0;
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rO" = (
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rP" = (
+/turf/open/floor/plasteel/shuttle/red,
+/area/shuttle/escape)
+"rQ" = (
+/obj/machinery/door/airlock/shuttle,
+/obj/docking_port/stationary{
+ dir = 4;
+ dwidth = 3;
+ height = 8;
+ id = "backup_away";
+ name = "Backup Shuttle Dock";
+ width = 8
+ },
+/obj/docking_port/mobile/emergency/backup,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"rR" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rS" = (
+/obj/structure/table/wood,
+/obj/item/weapon/paper{
+ info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.
We apologise for the inconvinience this may cause you.
Please enjoy the use of this complementary book.
Sincerely,
Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services"
+ },
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rT" = (
+/obj/docking_port/stationary/transit{
+ dir = 8;
+ dwidth = 2;
+ height = 8;
+ id = "backup_transit";
+ width = 8
+ },
+/turf/open/space/transit,
+/area/space)
+"rU" = (
+/obj/machinery/status_display{
+ density = 0;
+ pixel_y = -30;
+ supply_display = 1
+ },
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rV" = (
+/obj/structure/table/wood,
+/obj/item/weapon/book/manual/random,
+/turf/open/floor/plasteel/shuttle/white,
+/area/shuttle/escape)
+"rW" = (
+/obj/machinery/shuttle_manipulator,
+/turf/open/floor/plasteel/black,
+/area/centcom/ferry)
(1,1,1) = {"
aa
@@ -10059,37 +10133,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -10316,37 +10390,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -10573,37 +10647,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -10830,37 +10904,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -11087,37 +11161,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -11344,37 +11418,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -11601,37 +11675,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -11858,37 +11932,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -12115,37 +12189,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -12372,37 +12446,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -12629,37 +12703,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -12886,37 +12960,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -13143,37 +13217,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -13400,37 +13474,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -13657,37 +13731,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -13914,37 +13988,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -14171,37 +14245,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+rT
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -14428,37 +14502,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -14685,37 +14759,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -14942,37 +15016,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -15199,37 +15273,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -15456,37 +15530,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -15713,37 +15787,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -15970,37 +16044,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -16227,37 +16301,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -16484,37 +16558,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -16741,37 +16815,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -16998,37 +17072,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -17255,37 +17329,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -17512,37 +17586,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -17769,37 +17843,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -18026,37 +18100,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -18283,37 +18357,37 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
ab
ab
ab
@@ -38646,7 +38720,7 @@ ab
ab
ab
eJ
-eO
+eP
eO
eO
eO
@@ -38903,7 +38977,7 @@ ab
ab
ab
eJ
-eP
+rW
eO
eO
eW
@@ -56950,7 +57024,7 @@ ab
ab
ab
ab
-ab
+rL
ab
ab
ab
@@ -64761,16 +64835,16 @@ df
dg
cT
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ab
ab
ab
@@ -65018,16 +65092,16 @@ cT
cT
cT
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rM
+rQ
+rM
+rM
+rM
+rM
+rM
+ad
ab
ab
ab
@@ -65275,16 +65349,16 @@ cU
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rN
+rO
+rO
+rO
+rO
+rU
+rM
+ad
ab
ab
ab
@@ -65532,16 +65606,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rO
+rO
+rO
+rO
+rO
+rO
+rM
+ad
ab
ab
ab
@@ -65789,16 +65863,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rP
+rP
+rP
+rP
+rO
+rP
+rM
+ad
ab
ab
ab
@@ -66046,16 +66120,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rP
+rP
+rP
+rP
+rO
+rP
+rM
+ad
ab
ab
ab
@@ -66303,16 +66377,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rO
+rR
+rO
+rO
+rO
+rO
+rM
+ad
ab
ab
ab
@@ -66560,16 +66634,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rN
+rS
+rV
+rO
+rO
+rU
+rM
+ad
ab
ab
ab
@@ -66817,16 +66891,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+rM
+rM
+rM
+rM
+rM
+rM
+rM
+rM
+ad
ab
ab
ab
@@ -67074,16 +67148,16 @@ cV
ad
ab
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
+ad
ab
ab
ab
diff --git a/_maps/map_files/generic/z3.dmm b/_maps/map_files/generic/z3.dmm
index 16243f9502c..140b55a7d2b 100644
--- a/_maps/map_files/generic/z3.dmm
+++ b/_maps/map_files/generic/z3.dmm
@@ -32,7 +32,7 @@
"cj" = (/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
"ck" = (/obj/structure/table,/obj/item/weapon/paper,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
"cl" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/machinery/light/small{dir = 1},/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
-"cm" = (/obj/structure/computerframe,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
+"cm" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
"cn" = (/obj/structure/table,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
"co" = (/obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat{name = "Cuban Pete-Meat"},/turf/open/floor/engine,/area/tcommsat/chamber)
"cp" = (/obj/structure/grille,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
@@ -99,7 +99,7 @@
"dz" = (/obj/effect/decal/cleanable/blood,/obj/item/weapon/scalpel{pixel_y = 12},/turf/open/floor/plasteel/airless{icon_state = "dark"},/area/tcommsat/chamber)
"dA" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plasteel/airless{icon_state = "dark"},/area/tcommsat/chamber)
"dB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plating,/area/tcommsat/chamber)
-"dC" = (/obj/structure/rack,/obj/item/weapon/circuitboard/teleporter,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
+"dC" = (/obj/structure/rack,/obj/item/weapon/circuitboard/computer/teleporter,/turf/open/floor/plasteel/airless,/area/tcommsat/chamber)
"dD" = (/obj/item/device/radio/off,/turf/open/floor/plasteel/airless{icon_state = "dark"},/area/tcommsat/chamber)
"dE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/tcommsat/chamber)
"dF" = (/obj/effect/decal/cleanable/oil,/turf/open/floor/plating/airless,/area/tcommsat/chamber)
@@ -159,11 +159,11 @@
"eH" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/open/floor/plasteel{dir = 10; icon_state = "warning"},/area/tcommsat/chamber)
"eI" = (/turf/open/floor/plasteel{dir = 2; icon_state = "warning"},/area/tcommsat/chamber)
"eJ" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel{dir = 6; icon_state = "warning"},/area/tcommsat/chamber)
-"eL" = (/obj/structure/computerframe,/turf/open/floor/plating,/area/tcommsat/chamber)
+"eL" = (/obj/structure/frame/computer,/turf/open/floor/plating,/area/tcommsat/chamber)
"eM" = (/obj/machinery/teleport/station,/turf/open/floor/plating,/area/tcommsat/chamber)
"eN" = (/obj/machinery/teleport/hub,/turf/open/floor/plating,/area/tcommsat/chamber)
"eO" = (/turf/closed/wall/r_wall,/area/AIsattele)
-"eP" = (/obj/structure/computerframe,/turf/open/floor/plating/airless,/area/AIsattele)
+"eP" = (/obj/structure/frame/computer,/turf/open/floor/plating/airless,/area/AIsattele)
"eQ" = (/obj/machinery/teleport/station,/turf/open/floor/plating/airless,/area/AIsattele)
"eR" = (/obj/machinery/teleport/hub,/turf/open/floor/plating/airless,/area/AIsattele)
"eS" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plating/airless,/area/AIsattele)
@@ -184,7 +184,7 @@
"fh" = (/obj/item/weapon/shard,/obj/item/weapon/electronics/apc,/turf/open/floor/plating/airless,/area/AIsattele)
"fi" = (/obj/structure/closet,/turf/open/floor/plating/airless,/area/AIsattele)
"fj" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/open/floor/plating/airless,/area/AIsattele)
-"fk" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/item/weapon/weldingtool,/obj/item/weapon/wrench,/obj/item/weapon/circuitboard/teleporter,/turf/open/floor/plating/airless,/area/AIsattele)
+"fk" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/item/weapon/weldingtool,/obj/item/weapon/wrench,/obj/item/weapon/circuitboard/computer/teleporter,/turf/open/floor/plating/airless,/area/AIsattele)
"fl" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating/airless,/area/AIsattele)
"fm" = (/obj/structure/lattice,/turf/open/space,/area/AIsattele)
"fn" = (/obj/structure/girder,/turf/open/floor/plating/airless,/area/AIsattele)
diff --git a/_maps/map_files/generic/z4.dmm b/_maps/map_files/generic/z4.dmm
index aec065d7d4f..9ebfeee4a01 100644
--- a/_maps/map_files/generic/z4.dmm
+++ b/_maps/map_files/generic/z4.dmm
@@ -41,7 +41,7 @@
"aO" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel{icon_state = "cafeteria"},/area/djstation)
"aP" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; freerange = 1; listening = 0; name = "Pirate Radio Broadcast Channel"; pixel_x = 0},/turf/open/floor/plasteel{icon_state = "cafeteria"},/area/djstation)
"aQ" = (/obj/structure/table,/obj/item/weapon/paper/djstation,/turf/open/floor/plasteel{icon_state = "cafeteria"},/area/djstation)
-"aR" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/plasteel{icon_state = "grimy"},/area/djstation)
+"aR" = (/obj/structure/frame/computer{anchored = 1},/turf/open/floor/plasteel{icon_state = "grimy"},/area/djstation)
"aS" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel{icon_state = "grimy"},/area/djstation)
"aT" = (/obj/machinery/light/small,/turf/open/floor/plasteel{icon_state = "grimy"},/area/djstation)
"aU" = (/obj/structure/closet,/turf/open/floor/plasteel{icon_state = "grimy"},/area/djstation)
@@ -147,8 +147,8 @@
"cQ" = (/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/gravity_generator)
"cR" = (/obj/structure/window/fulltile,/turf/open/floor/plasteel/airless,/area/derelict/hallway/primary)
"cS" = (/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel,/area/derelict/bridge/access)
-"cT" = (/obj/structure/computerframe,/turf/open/floor/plasteel,/area/derelict/bridge)
-"cU" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/open/floor/plasteel,/area/derelict/bridge)
+"cT" = (/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/derelict/bridge)
+"cU" = (/obj/structure/frame/computer,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/open/floor/plasteel,/area/derelict/bridge)
"cV" = (/obj/structure/table,/turf/open/floor/plasteel,/area/derelict/bridge)
"cW" = (/obj/machinery/computer/security,/turf/open/floor/plasteel,/area/derelict/bridge)
"cX" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/open/floor/plasteel,/area/derelict/bridge)
@@ -246,7 +246,7 @@
"eL" = (/obj/item/stack/cable_coil/cut,/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"eM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"eN" = (/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
-"eO" = (/obj/structure/computerframe,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"eO" = (/obj/structure/frame/computer,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"eP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/open/floor/plasteel,/area/derelict/solar_control)
"eQ" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/open/floor/plasteel,/area/derelict/solar_control)
"eR" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plating/airless,/area/derelict/singularity_engine)
@@ -359,7 +359,7 @@
"gU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/hallway/primary)
"gV" = (/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel,/area/derelict/arrival)
"gW" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/weapon/electronics/airlock,/turf/open/floor/plasteel/airless,/area/derelict/bridge/access)
-"gX" = (/obj/structure/rack,/obj/item/weapon/circuitboard/autolathe,/obj/item/weapon/circuitboard/protolathe{pixel_x = -5; pixel_y = -3},/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"gX" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/autolathe,/obj/item/weapon/circuitboard/machine/protolathe{pixel_x = -5; pixel_y = -3},/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"gY" = (/turf/open/floor/plasteel{dir = 4; icon_state = "chapel"},/area/derelict/medical/chapel)
"gZ" = (/turf/open/floor/plasteel{dir = 1; icon_state = "chapel"},/area/derelict/medical/chapel)
"ha" = (/obj/item/weapon/shard{icon_state = "small"},/turf/open/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
@@ -378,7 +378,7 @@
"hn" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel,/area/derelict/arrival)
"ho" = (/obj/structure/window/reinforced,/turf/open/space,/area/space)
"hp" = (/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/hallway/primary)
-"hq" = (/obj/structure/rack,/obj/item/weapon/circuitboard/circuit_imprinter,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"hq" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/circuit_imprinter,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"hr" = (/obj/structure/window/reinforced,/turf/open/floor/plasteel{dir = 4; icon_state = "chapel"},/area/derelict/medical/chapel)
"hs" = (/obj/structure/window/reinforced,/turf/open/floor/plasteel{dir = 1; icon_state = "chapel"},/area/derelict/medical/chapel)
"ht" = (/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/open/floor/plating/airless,/area/derelict/hallway/primary)
@@ -389,7 +389,7 @@
"hy" = (/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/open/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"hz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"hA" = (/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/medical)
-"hB" = (/obj/structure/computerframe,/obj/item/weapon/circuitboard/rdconsole,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
+"hB" = (/obj/structure/frame/computer,/obj/item/weapon/circuitboard/computer/rdconsole,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"hC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating/airless,/area/space)
"hD" = (/obj/item/weapon/shard,/turf/open/floor/plating/airless,/area/space)
"hE" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plating/airless,/area/space)
@@ -416,7 +416,7 @@
"ia" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/derelict/arrival)
"ib" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating,/area/derelict/arrival)
"ic" = (/obj/structure/window/reinforced{dir = 1},/turf/open/space,/area/space)
-"id" = (/obj/structure/rack,/obj/item/weapon/circuitboard/smes,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"id" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/smes,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"ie" = (/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel/airless{icon_state = "damaged4"},/area/space)
"if" = (/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plasteel{dir = 4; icon_state = "chapel"},/area/derelict/medical/chapel)
"ig" = (/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plasteel{dir = 1; icon_state = "chapel"},/area/derelict/medical/chapel)
@@ -522,7 +522,7 @@
"kp" = (/obj/item/stack/rods,/turf/open/floor/plasteel/airless,/area/derelict/hallway/secondary)
"kq" = (/obj/structure/door_assembly/door_assembly_mai{name = "airlock assembly"},/turf/open/floor/plasteel/airless,/area/derelict/hallway/secondary)
"kr" = (/obj/structure/grille,/turf/open/floor/plating/airless,/area/derelict/bridge/ai_upload)
-"ks" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/stock_parts/console_screen,/turf/open/floor/plating/airless,/area/derelict/gravity_generator)
+"ks" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/frame/machine,/obj/item/weapon/stock_parts/console_screen,/turf/open/floor/plating/airless,/area/derelict/gravity_generator)
"kt" = (/obj/item/weapon/wirecutters,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plasteel/airless,/area/derelict/hallway/secondary)
"ku" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/airless,/area/derelict/se_solar)
"kv" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/item/drone_shell,/turf/open/floor/plasteel/airless,/area/derelict/se_solar)
@@ -571,7 +571,7 @@
"lo" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/wallframe/apc,/turf/open/floor/plating/airless,/area/derelict/gravity_generator)
"lp" = (/obj/machinery/door/window,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"lq" = (/obj/item/weapon/ore/slag,/turf/open/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/gravity_generator)
-"lr" = (/obj/structure/rack,/obj/item/weapon/circuitboard/smes,/turf/open/floor/plasteel,/area/derelict/bridge/access)
+"lr" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/smes,/turf/open/floor/plasteel,/area/derelict/bridge/access)
"ls" = (/obj/item/weapon/stock_parts/matter_bin,/turf/open/space,/area/space)
"lt" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "derelictsolar"; name = "Derelict Solar Array"},/turf/open/floor/plasteel/airless,/area/solar/derelict_aft)
"lu" = (/obj/effect/spawner/lootdrop/maintenance,/turf/open/space,/area/space)
@@ -659,7 +659,7 @@
"mY" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/turf/open/floor/plasteel/airless,/area/derelict/atmospherics)
"mZ" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"na" = (/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/bridge/ai_upload)
-"nb" = (/obj/structure/rack,/obj/item/weapon/circuitboard/microwave,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"nb" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/microwave,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"nc" = (/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/bridge/ai_upload)
"nd" = (/turf/open/space,/area/derelict/bridge/ai_upload)
"ne" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{icon_state = "intact"; dir = 5},/turf/open/floor/plating/airless,/area/derelict/atmospherics)
@@ -669,11 +669,11 @@
"ni" = (/obj/structure/window/reinforced,/turf/open/floor/plasteel/airless,/area/derelict/atmospherics)
"nj" = (/turf/open/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/atmospherics)
"nk" = (/obj/machinery/power/apc{dir = 8; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
-"nl" = (/obj/structure/computerframe,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
+"nl" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"nm" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel,/area/derelict/solar_control)
"nn" = (/turf/open/floor/plasteel{icon_state = "damaged2"; initial_gas_mix = "TEMP=2.7"},/area/derelict/atmospherics)
"no" = (/turf/open/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/atmospherics)
-"np" = (/obj/structure/rack,/obj/item/weapon/circuitboard/cryo_tube,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"np" = (/obj/structure/rack,/obj/item/weapon/circuitboard/machine/cryo_tube,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"nq" = (/obj/machinery/light,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"nr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/closed/wall/r_wall,/area/derelict/bridge/ai_upload)
"ns" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/closed/wall/r_wall,/area/derelict/bridge/ai_upload)
@@ -712,7 +712,7 @@
"nZ" = (/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel/airless,/area/space)
"oa" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plating/airless,/area/derelict/singularity_engine)
"ob" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/open/floor/plating/airless,/area/derelict/singularity_engine)
-"oc" = (/obj/structure/computerframe,/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/medical)
+"oc" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/medical)
"od" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel,/area/derelict/arrival)
"oe" = (/obj/machinery/light{dir = 1},/obj/item/weapon/shard{icon_state = "small"},/turf/open/floor/plating/airless,/area/derelict/medical)
"of" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/open/space,/area/space)
@@ -745,7 +745,7 @@
"oG" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel{dir = 1; icon_state = "chapel"},/area/derelict/medical/chapel)
"oH" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/reagent_containers/glass/beaker,/turf/open/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"oI" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel{dir = 1; icon_state = "chapel"},/area/derelict/medical/chapel)
-"oJ" = (/obj/structure/computerframe,/turf/open/floor/plasteel/airless,/area/derelict/hallway/primary)
+"oJ" = (/obj/structure/frame/computer,/turf/open/floor/plasteel/airless,/area/derelict/hallway/primary)
"oK" = (/obj/item/weapon/reagent_containers/glass/beaker,/turf/open/floor/plasteel/airless{icon_state = "damaged3"},/area/derelict/medical)
"oL" = (/obj/structure/closet/wardrobe/genetics_white,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/open/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"oM" = (/obj/machinery/door/airlock/command{name = "Teleporter Room"},/turf/open/floor/plasteel/airless,/area/derelict/medical/chapel)
@@ -780,7 +780,7 @@
"pp" = (/obj/effect/decal/cleanable/blood/splatter,/turf/open/floor/plasteel/airless,/area/derelict/hallway/primary)
"pq" = (/obj/structure/window/fulltile,/turf/open/space,/area/derelict/atmospherics)
"pr" = (/obj/structure/closet/wardrobe/orange,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/weapon/shovel/spade,/obj/item/weapon/cultivator,/turf/open/floor/plasteel/airless,/area/space)
-"ps" = (/obj/structure/computerframe,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/airless,/area/derelict/atmospherics)
+"ps" = (/obj/structure/frame/computer,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/airless,/area/derelict/atmospherics)
"pt" = (/obj/machinery/light/small,/turf/open/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/atmospherics)
"pu" = (/obj/structure/lattice,/turf/open/space,/area/derelict/atmospherics)
"pv" = (/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/turf/open/floor/plating/airless,/area/derelict/hallway/primary)
@@ -835,7 +835,7 @@
"qu" = (/obj/structure/lattice/catwalk,/turf/open/space,/area/solar/derelict_aft)
"qv" = (/obj/structure/lattice/catwalk,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/open/space,/area/solar/derelict_aft)
"qw" = (/obj/item/device/aicard,/turf/open/floor/plasteel/airless{icon_state = "damaged2"},/area/derelict/bridge/ai_upload)
-"qx" = (/obj/structure/rack,/obj/item/weapon/circuitboard/solar_control,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
+"qx" = (/obj/structure/rack,/obj/item/weapon/circuitboard/computer/solar_control,/turf/open/floor/plasteel,/area/derelict/bridge/ai_upload)
"qy" = (/obj/item/ammo_casing/a357{pixel_x = -5},/obj/item/ammo_casing/a357{pixel_x = 5; pixel_y = 6},/obj/item/ammo_casing/a357,/turf/open/floor/plasteel/airless,/area/derelict/hallway/primary)
"qz" = (/obj/machinery/porta_turret_cover,/turf/open/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
"qA" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/open/floor/plasteel/airless,/area/derelict/bridge/access)
diff --git a/_maps/map_files/generic/z6.dmm b/_maps/map_files/generic/z6.dmm
index 82a78c133c6..8044fc094c2 100644
--- a/_maps/map_files/generic/z6.dmm
+++ b/_maps/map_files/generic/z6.dmm
@@ -186,7 +186,7 @@
"dD" = (/turf/open/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"dE" = (/obj/structure/table,/obj/item/weapon/paper{info = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."; name = "Captain's log entry"},/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
"dF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
-"dG" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
+"dG" = (/obj/structure/frame/computer{anchored = 1},/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
"dH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/open/floor/carpet,/area/awaymission/BMPship/Fore)
"dI" = (/obj/machinery/hydroponics,/turf/open/floor/plasteel{icon_state = "green"; dir = 10},/area/awaymission/BMPship/Midship)
"dJ" = (/turf/open/floor/plasteel{icon_state = "green"},/area/awaymission/BMPship/Midship)
@@ -344,8 +344,8 @@
"gF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plating,/area/awaymission/BMPship/Aft)
"gG" = (/turf/closed/wall/shuttle{icon_state = "swallc2"},/area/awaymission/BMPship/Aft)
"gH" = (/turf/open/floor/plating/airless{icon_state = "platingdmg2"},/turf/closed/wall/shuttle{dir = 3; icon_state = "swall_f10"; layer = 2},/area/awaymission/BMPship/Fore)
-"gI" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/plating/airless{icon_state = "panelscorched"},/area/awaymission/BMPship/Fore)
-"gJ" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/plating/airless{icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
+"gI" = (/obj/structure/frame/computer{anchored = 1},/turf/open/floor/plating/airless{icon_state = "panelscorched"},/area/awaymission/BMPship/Fore)
+"gJ" = (/obj/structure/frame/computer{anchored = 1},/turf/open/floor/plating/airless{icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
"gK" = (/obj/machinery/light/small,/turf/open/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"gL" = (/turf/open/floor/plasteel{icon_state = "platingdmg3"},/area/awaymission/BMPship/Midship)
"gM" = (/turf/open/floor/plasteel{icon_state = "platingdmg1"},/area/awaymission/BMPship/Midship)
diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo_birdboat.dmm
new file mode 100644
index 00000000000..423c397f6c1
--- /dev/null
+++ b/_maps/shuttles/cargo_birdboat.dmm
@@ -0,0 +1,39 @@
+"a" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/supply)
+"b" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/supply)
+"c" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
+"d" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/supply)
+"e" = (/obj/machinery/conveyor{dir = 2; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"f" = (/obj/machinery/conveyor{dir = 8; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"g" = (/obj/machinery/conveyor{dir = 4; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"h" = (/obj/machinery/conveyor{dir = 9; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"i" = (/obj/machinery/conveyor{dir = 1; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"j" = (/obj/machinery/conveyor{dir = 10; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"k" = (/obj/machinery/conveyor{dir = 6; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"l" = (/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 8; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plating,/area/shuttle/supply)
+"m" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"n" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply)
+"o" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply)
+"p" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/obj/machinery/conveyor_switch/oneway{id = "cargoshuttle"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply)
+"q" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10},/turf/open/floor/plating,/area/shuttle/supply)
+"r" = (/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plating,/area/shuttle/supply)
+"s" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/supply)
+"t" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/supply)
+"u" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/supply)
+"v" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/supply)
+"w" = (/turf/open/space,/area/space)
+"x" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/open/floor/plating/airless,/area/shuttle/supply)
+"y" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/supply)
+"z" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/open/floor/plating/airless,/area/shuttle/supply)
+
+(1,1,1) = {"
+abbbbbc
+deffffd
+dggghid
+deffjkl
+dmmmmno
+dmmmmpd
+dmmmmnq
+dgggggr
+stuuutv
+wxyyyzw
+"}
diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo_box.dmm
new file mode 100644
index 00000000000..05df2fa52ba
--- /dev/null
+++ b/_maps/shuttles/cargo_box.dmm
@@ -0,0 +1,37 @@
+"a" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/supply)
+"b" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/supply)
+"c" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
+"d" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/supply)
+"e" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"f" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply)
+"g" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply)
+"h" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply)
+"i" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/turf/open/floor/plating,/area/shuttle/supply)
+"j" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply)
+"k" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/supply)
+"l" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/supply)
+"m" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f6"},/area/shuttle/supply)
+"n" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/supply)
+"o" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/supply)
+"p" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/supply)
+"q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/supply)
+"r" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
+"s" = (/turf/open/space,/area/space)
+"t" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/open/floor/plating/airless,/area/shuttle/supply)
+"u" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/supply)
+"v" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/open/floor/plating/airless,/area/shuttle/supply)
+
+(1,1,1) = {"
+abbbbbc
+deeeeed
+deeeeed
+deeeeef
+deeeeeg
+deeeehd
+deeeeei
+deeeeej
+deeeeed
+kleeemn
+opqqqpr
+stuuuvs
+"}
diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm
new file mode 100644
index 00000000000..d2d0025ee2f
--- /dev/null
+++ b/_maps/shuttles/emergency_airless.dmm
@@ -0,0 +1,43 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/turf/open/floor/plating/airless,/area/shuttle/escape)
+"c" = (/turf/closed/wall,/area/shuttle/escape)
+"d" = (/obj/structure/fireaxecabinet,/turf/closed/wall,/area/shuttle/escape)
+"e" = (/obj/structure/closet/malf,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"f" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"g" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"h" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"i" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"j" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"k" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"l" = (/turf/open/floor/plating,/area/shuttle/escape)
+"m" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"o" = (/obj/docking_port/mobile/emergency{name = "Shuttle Under Construction"},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"p" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"r" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aabcccdccaa
+abbbbbbbbba
+acebbbbfgca
+acebbbbhica
+acebbbbjkca
+abbbbbbbbba
+bbbbbbbbbbc
+lbmnbmnbmbc
+bbmnbmnbmbc
+obmnbmnbmbc
+bbmnbmnbmbc
+bbmnbmnbmbb
+bbbbbbbbbbc
+bbbbbbbbbbc
+abbbbbbbbba
+abbbbbbbpca
+abbbbbbbpca
+acbbbbbbpca
+acbbbbbbbba
+acbbbbbbbca
+aaqqqqqqqaa
+aarrrrrrraa
+"}
diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm
new file mode 100644
index 00000000000..3846904216b
--- /dev/null
+++ b/_maps/shuttles/emergency_bar.dmm
@@ -0,0 +1,86 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ad" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp/green,/turf/open/floor/carpet,/area/shuttle/escape)
+"ae" = (/obj/structure/chair/comfy/brown{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape)
+"af" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/carpet,/area/shuttle/escape)
+"ag" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/cigarettes/cigars/havana,/obj/item/weapon/lighter{pixel_x = -4; pixel_y = 6},/turf/open/floor/carpet,/area/shuttle/escape)
+"ah" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/carpet,/area/shuttle/escape)
+"ai" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape)
+"aj" = (/turf/open/floor/carpet,/area/shuttle/escape)
+"ak" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/carpet,/area/shuttle/escape)
+"al" = (/obj/machinery/computer/security,/turf/open/floor/carpet,/area/shuttle/escape)
+"am" = (/obj/machinery/computer/crew,/turf/open/floor/carpet,/area/shuttle/escape)
+"an" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape)
+"ao" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/carpet,/area/shuttle/escape)
+"ap" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/obj/structure/statue/diamond/captain{anchored = 1; name = "statue of THE captain"},/turf/open/floor/carpet,/area/shuttle/escape)
+"aq" = (/obj/machinery/computer/communications,/turf/open/floor/carpet,/area/shuttle/escape)
+"ar" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/carpet,/area/shuttle/escape)
+"as" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"au" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"av" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aw" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"ax" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"ay" = (/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"az" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aA" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aB" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aD" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aE" = (/obj/structure/chair/wood{dir = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aF" = (/obj/structure/table/wood,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aG" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aH" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar"},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aI" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aK" = (/mob/living/simple_animal/drone/snowflake{desc = "A barkeeping drone, an indestructible robot built to tend bars."; dir = 8; health = 3000; languages = 127; laws = "1. Serve drinks. 2. Talk to patrons. 3. Don't get messed up in their affairs."; maxHealth = 3000; name = "Bardrone"; seeStatic = 0},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aL" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aM" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6; pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aO" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aQ" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aR" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/shuttle/escape)
+"aS" = (/obj/structure/table/wood/poker,/obj/effect/spawner/lootdrop/gambling,/turf/open/floor/wood,/area/shuttle/escape)
+"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aU" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
+"aV" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"aW" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"aX" = (/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"aY" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"aZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"ba" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bb" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bc" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bd" = (/obj/structure/closet/jcloset,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"be" = (/obj/structure/toilet{dir = 1},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bf" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape)
+"bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bi" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aaaaabacacacacacabaaaa
+aaababadaeafaeagababaa
+aaabahaiajajajakalabaa
+aaabamanaoapajakaqabaa
+ababababababarasababab
+abatatatacauavavawaxac
+abayazazaAavavavavavab
+aBaCaDaDacavaEaFaFaFac
+abababababavaEaFavaGab
+aHavavavavavaEaFavaIab
+abaJaJaJavavaEaFaKaLab
+acaMaNaMavavaEaFavaOac
+acaPaPaPavavaEaFavavac
+acavavavavavaEaFaFaFac
+abavavavavavavavavavab
+aQavaRaSaRaTavavavaUab
+ababababababababaVabab
+aWaXaXaXaXaXaYaXaXaZac
+abbaabbbabbcabbdaXaZab
+abbeabbeabbfabbgaXaZac
+ababbhbhbhbhbhbhbhabab
+aaabbibibibibibibiabaa
+"}
diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm
new file mode 100644
index 00000000000..05f356775bd
--- /dev/null
+++ b/_maps/shuttles/emergency_birdboat.dmm
@@ -0,0 +1,78 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape)
+"ac" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape)
+"af" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
+"ag" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ah" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
+"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"aj" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 5},/obj/item/weapon/hemostat,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"ak" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw{pixel_y = 9},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"al" = (/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"ao" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
+"ap" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ar" = (/obj/structure/flora/kirbyplants{icon_state = "plant-22"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"as" = (/turf/closed/wall/shuttle{icon_state = "swall1"; dir = 2},/area/shuttle/escape)
+"at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"au" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"av" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aw" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ay" = (/obj/machinery/door/airlock/glass_command{name = "bridge door"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"az" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aB" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aC" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"aD" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"aE" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
+"aF" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape)
+"aG" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape)
+"aH" = (/turf/closed/wall/shuttle,/area/shuttle/escape)
+"aI" = (/obj/machinery/door/airlock/glass_security{name = "security airlock"; req_access_txt = "63"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"aJ" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"aK" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/escape)
+"aL" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"aM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aN" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aO" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aP" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aQ" = (/obj/structure/table,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aR" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aS" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti{name = "pasghetti"; pixel_x = 4; pixel_y = 7},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aU" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 8; dwidth = 6; height = 18; travelDir = 90; width = 14},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aW" = (/obj/structure/chair{dir = 1},/obj/structure/window/reinforced,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aX" = (/turf/closed/wall/shuttle{icon_state = "swall2"; dir = 2},/area/shuttle/escape)
+"aY" = (/obj/structure/chair,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"aZ" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape)
+"bc" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/escape)
+"bd" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"be" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"bf" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bg" = (/obj/structure/chair,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 1},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+"bi" = (/obj/structure/table/glass,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaabacacacadae
+aaabafagagahadacacacacacaiajakalaman
+abaoapaqaqarasatatatatatamaualalamav
+asawaxaqaqaqayazazazazazamalalalamaA
+agaraqaqaBaragazazazaCaDamalalaEaFaG
+aHagayahacacafagaIagahacaoaJaJaKaLaf
+agaMaNaOaPaQaNaMaNaNaNaNaNaNaNaRaNaR
+agaSaNaOaPaTaNaNaNaNaNaNaNaNaNaRaNaU
+agaSaNaQaVaQaNaNaWaWaWaWaXaJaJaEadaf
+agaSaNaNaNaNaNaNaYaYaYaYasaZalaKaFae
+agaMaNaNaNaNaNaNaNaNaNaNaJalalbaaman
+bbbcbdbdbdbdaNaNaNaNaNaNagalalbeamav
+aabbacacacbcaMbfbgbgbgaMaXbhalbiamaA
+aaaaaaaaaabbacafagagagahaLacacacaLaG
+"}
diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm
new file mode 100644
index 00000000000..87cc48d438c
--- /dev/null
+++ b/_maps/shuttles/emergency_box.dmm
@@ -0,0 +1,88 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape)
+"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape)
+"ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape)
+"af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape)
+"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"am" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"an" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ap" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aq" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"at" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"au" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"av" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"aw" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"ax" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"ay" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aA" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aB" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aC" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aD" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aE" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aF" = (/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/obj/machinery/button/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aG" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aH" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aI" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape)
+"aJ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aK" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aL" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aM" = (/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aN" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"aO" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
+"aP" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency,/turf/open/floor/plating,/area/shuttle/escape)
+"aQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aR" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aS" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aT" = (/obj/structure/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aU" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
+"aW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aX" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aY" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"aZ" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ba" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"bb" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape)
+"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape)
+"bd" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"be" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bf" = (/obj/structure/closet,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape)
+"bg" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape)
+"bh" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape)
+"bi" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bj" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape)
+"bk" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aaaaabacacacacacadaaaa
+aaabaeafagahagaiajadaa
+aaakalamanananaoapakaa
+aaakaqarasatanaoauakaa
+abavawawaxawayazawavad
+akaAaAaAacaBanaCaDaEac
+akaFaGaGaHananananaCak
+aIaGaJaJacaKaLaManaCac
+aNawawawaOaMaMaManaCak
+aPanaQananananananaRak
+akaLanaSaTanaSaTanaUak
+acaLanaSaTanaSaTanaUac
+acaLanaSaTanaSaTanaUac
+acaLanaSaTanaSaTanaUac
+akaLanaSaTanaSaTanaUak
+aVanaWananananananaRak
+aNawawaXawaYacaZacacba
+aVbbbbbbbcakaDaCaCbdac
+akbbbbbbbbakaCaCaCbeak
+akbfbfbgbgakaDaCaCbdac
+bhaxbibibibibibibiaxbj
+aabhbkbkbkbkbkbkbkbjaa
+"}
diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm
new file mode 100644
index 00000000000..2e082b3e67e
--- /dev/null
+++ b/_maps/shuttles/emergency_clown.dmm
@@ -0,0 +1,87 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape)
+"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape)
+"ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape)
+"af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/noslip,/area/shuttle/escape)
+"ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/bluespace,/area/shuttle/escape)
+"ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/bluespace,/area/shuttle/escape)
+"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape)
+"aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape)
+"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/noslip,/area/shuttle/escape)
+"am" = (/obj/structure/chair{dir = 8},/turf/open/floor/bluespace,/area/shuttle/escape)
+"an" = (/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/bluespace,/area/shuttle/escape)
+"ap" = (/obj/machinery/computer/security,/turf/open/floor/noslip,/area/shuttle/escape)
+"aq" = (/obj/machinery/computer/crew,/turf/open/floor/noslip,/area/shuttle/escape)
+"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/bluespace,/area/shuttle/escape)
+"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"at" = (/obj/machinery/computer/communications,/turf/open/floor/noslip,/area/shuttle/escape)
+"au" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"av" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aw" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"ax" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Premium Lounge"; req_access_txt = "0"},/turf/open/floor/bluespace,/area/shuttle/escape)
+"ay" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"az" = (/turf/open/chasm/straight_down/lava_land_surface,/area/shuttle/escape)
+"aA" = (/turf/open/floor/noslip,/area/shuttle/escape)
+"aB" = (/obj/structure/closet/emcloset,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape)
+"aC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape)
+"aD" = (/obj/item/weapon/greentext{anchored = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aE" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/bluespace,/area/shuttle/escape)
+"aF" = (/obj/structure/chair,/turf/open/floor/noslip,/area/shuttle/escape)
+"aG" = (/obj/structure/chair{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape)
+"aH" = (/obj/structure/table,/obj/item/device/multitool/ai_detect,/turf/open/floor/noslip,/area/shuttle/escape)
+"aI" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"aJ" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
+"aK" = (/obj/structure/table,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape)
+"aL" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Snappop(tm)!"},/turf/open/floor/plating,/area/shuttle/escape)
+"aM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"aN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"aO" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape)
+"aP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape)
+"aQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape)
+"aR" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape)
+"aS" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
+"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"aU" = (/obj/item/toy/snappop,/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape)
+"aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/bluespace,/area/shuttle/escape)
+"aW" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"aX" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/bluespace,/area/shuttle/escape)
+"aY" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"aZ" = (/turf/open/floor/mineral/bananium,/area/shuttle/escape)
+"ba" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape)
+"bb" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/noslip,/area/shuttle/escape)
+"bc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/noslip,/area/shuttle/escape)
+"bd" = (/obj/structure/closet/crate/trashcart{desc = "A heavy, metal trashcart with wheels. Feel free to hop in at any time!"},/obj/item/toy/sword,/turf/open/floor/mineral/bananium,/area/shuttle/escape)
+"be" = (/obj/machinery/vending/autodrobe{extended_inventory = 1; scan_id = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape)
+"bf" = (/obj/machinery/vending/clothing{extended_inventory = 1},/turf/open/floor/mineral/bananium,/area/shuttle/escape)
+"bg" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape)
+"bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bi" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape)
+"bj" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aaaaabacacacacacadaaaa
+aaabaeafagahagaiajadaa
+aaakalamanananaoapakaa
+aaakaqarasananaoatakaa
+abauavavawavaxayavauad
+akazazazacaAanaAaBaCac
+akazaDazaEananananaAak
+akazazazacaFaGaHanaAac
+aIavavavaJaKaKaKanaAak
+aLanaMananananananaNak
+akaOanaPaQanaPaRanaOak
+acaOanaPaQanaPaQanaOac
+acaOanaPaQanaPaQanaOac
+acaOanaPaQanaPaQanaOac
+akaOanaPaQanaPaQanaOak
+aSanaTanananananaUaNak
+aIavavaVavaWacaXacacaY
+aSaZaZaZbaakaBaAaAbbac
+akaZaZaZaZakaAaAaAbcak
+akbdbdbebfakaBaAaAbbac
+bgawbhbhbhbhbhbhbhawbi
+aabgbjbjbjbjbjbjbjbiaa
+"}
diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm
new file mode 100644
index 00000000000..db8c02bfc04
--- /dev/null
+++ b/_maps/shuttles/emergency_cramped.dmm
@@ -0,0 +1,39 @@
+"a" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"b" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"c" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape)
+"d" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"f" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"g" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/book/manual/random,/obj/structure/extinguisher_cabinet{pixel_x = -30},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"h" = (/obj/machinery/door/window/southleft,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"i" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/device/gps{gpstag = "STV5"},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape)
+"j" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"k" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dwidth = 3; height = 5; name = "Secure Transport Vessel 5"; width = 14},/turf/open/floor/plating,/area/shuttle/escape)
+"l" = (/turf/open/floor/plating,/area/shuttle/escape)
+"m" = (/obj/structure/closet/emcloset,/turf/open/floor/plating,/area/shuttle/escape)
+"n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
+"o" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/open/floor/plasteel/bot,/area/shuttle/escape)
+"p" = (/obj/structure/closet/crate/secure/loot,/turf/open/floor/plasteel/bot,/area/shuttle/escape)
+"q" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
+"r" = (/obj/structure/closet/crate/secure/weapon,/obj/effect/spawner/lootdrop/armory_contraband,/turf/open/floor/plasteel/bot,/area/shuttle/escape)
+"s" = (/obj/structure/chair{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -30},/turf/open/floor/plating,/area/shuttle/escape)
+"t" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"u" = (/turf/open/space,/area/space)
+"v" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+abbba
+cdefa
+aghij
+kllma
+anloa
+bnlob
+bnlob
+bnlpb
+anlpa
+qllra
+aslra
+qllma
+attta
+uvvvu
+"}
diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm
new file mode 100644
index 00000000000..507090a6124
--- /dev/null
+++ b/_maps/shuttles/emergency_meta.dmm
@@ -0,0 +1,132 @@
+"aa" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ad" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
+"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
+"ag" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
+"ah" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"ai" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aj" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ak" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"al" = (/obj/machinery/status_display{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"am" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"an" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"ao" = (/obj/machinery/recharge_station,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"ap" = (/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
+"aq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"ar" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"as" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"at" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"au" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"av" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"aw" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ay" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"az" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 5; height = 14; width = 25},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aB" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 0; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"aC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"aD" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"aE" = (/obj/structure/chair{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aF" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
+"aG" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -5},/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
+"aH" = (/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
+"aI" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
+"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
+"aK" = (/obj/structure/chair{dir = 8},/obj/structure/sign/bluecross_2{pixel_x = 32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aL" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
+"aM" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
+"aN" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aO" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
+"aP" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
+"aQ" = (/obj/machinery/sleeper{dir = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aT" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aV" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aX" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aY" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aZ" = (/obj/structure/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"ba" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"bb" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bc" = (/obj/structure/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bd" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"be" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2; pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bf" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bg" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bh" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bi" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bj" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bk" = (/obj/machinery/flasher{id = "emshuttlebridgeflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bl" = (/obj/structure/chair{dir = 1},/obj/machinery/button/flasher{id = "emshuttleflash"; name = "brig flasher button"; pixel_y = -23; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bm" = (/obj/structure/chair{dir = 1},/obj/machinery/flasher{id = "emshuttleflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bn" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bo" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bp" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bq" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape)
+"br" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bs" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bt" = (/obj/machinery/button/flasher{id = "emshuttlebridgeflash"; name = "cockpit flasher button"; pixel_y = 24; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bu" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock"; req_access = null; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bv" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
+"bw" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/status_display{pixel_y = 31},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bx" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"by" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bz" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bA" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bB" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bC" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bD" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
+"bE" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bF" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bH" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bJ" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bK" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bM" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bN" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bO" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bQ" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bR" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
+"bS" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
+"bT" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
+"bU" = (/turf/open/space,/area/space)
+"bV" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape)
+"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bX" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape)
+"bY" = (/turf/open/space,/turf/closed/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/escape)
+"bZ" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aaabacabadabadabaeabafafabag
+ahaiajaiakalakamanaoapapaqah
+ahakakakakakakakafapararasah
+atakakakakakakakafaparauavac
+acawakaxacawakaxahayararazac
+aAakakaxaBawakaxacaCauaraDah
+ahaEakaxacawakaxahaFaGaHaIah
+acawakaxaJawakaKaLaMacaNaOaP
+acawakaxacawakaxacaQaQakaRah
+acawakakakakakakaNakakakaSac
+anawakaxacawakaxacaTakakaUac
+adakakaxaJawakaxahaVaWaXaYah
+acawakaxacawakaZaLababbaabaP
+atakakaxaBawakaxahbbbcbdbeah
+ahawakaxacawakaxacbbbfbfbgac
+acakakakakakakakbhbfbfbfbiac
+ahbjakakakbkakbjahblbmbnboah
+aLabbaabbpabbaabbqabaeababaP
+acbrbsakakbtakakbubvahbwbxac
+acbybzakakakbAbBaLbCbDararbC
+acbEakbAbFbzakbGahararararbC
+acbHbIbJbKbLbMbNahbObPbPbQac
+bRabababababababbSababababbT
+bUbVbWbWbWbXbWbWbXbWbWbWbYbU
+bUbUbZbZbZbXbZbZbXbZbZbZbUbU
+"}
diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm
new file mode 100644
index 00000000000..c85ddedd921
--- /dev/null
+++ b/_maps/shuttles/emergency_narnar.dmm
@@ -0,0 +1,73 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/turf/closed/wall/cult,/area/shuttle/escape)
+"c" = (/obj/effect/forcefield/cult,/turf/open/floor/plating,/area/shuttle/escape)
+"d" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"f" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"g" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"h" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"i" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"j" = (/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"k" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"l" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"m" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"n" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"r" = (/obj/machinery/door/airlock/cult/unruned/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"s" = (/obj/machinery/status_display,/turf/closed/wall/cult,/area/shuttle/escape)
+"t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"w" = (/mob/living/simple_animal/hostile/construct/builder,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"x" = (/obj/machinery/door/airlock/cult,/turf/open/floor/plating,/area/shuttle/escape)
+"y" = (/obj/effect/decal/cleanable/blood/gibs/up,/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"z" = (/obj/effect/rune/raise_dead,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"A" = (/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"B" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"C" = (/mob/living/simple_animal/hostile/construct/armored,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"D" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"E" = (/obj/machinery/door/airlock/cult,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape)
+"F" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null; icon_state = "extinguisher_empty"; opened = 1; pixel_x = 27; pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"H" = (/mob/living/simple_animal/hostile/construct/wraith,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"I" = (/obj/effect/rune/narsie,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"J" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "left eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"L" = (/obj/effect/decal/cleanable/blood/drip,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"N" = (/obj/machinery/door/airlock/cult/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"O" = (/obj/structure/dresser,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"P" = (/obj/structure/showcase/horrific_experiment,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"R" = (/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"S" = (/obj/structure/table/wood,/obj/item/weapon/tome,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"T" = (/obj/structure/bed,/obj/item/weapon/bedsheet/cult,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"U" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"V" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+aabcccccbaa
+abbdefegbba
+abhijjjklba
+abmnojjkpba
+bbbbbqrsbbb
+bjjjjjjjtuc
+bjvjwjwjjjb
+xjjyjzjAvjc
+bjABjCjDAjb
+EjjFjjjjjGb
+bjzHjIjHzjb
+cjjjjjjjjjc
+cjADjCjDAjc
+cjjAjzjAjjc
+bjjjJjKvjjb
+xjvjLjLjjMb
+bbqNbscrccb
+xjjjObtLjPc
+bjjjMbjjjQb
+bRRSTbtjjPc
+bbUUUUUUUbb
+abVVVVVVVba
+"}
diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm
new file mode 100644
index 00000000000..5b51ab7b5b1
--- /dev/null
+++ b/_maps/shuttles/emergency_supermatter.dmm
@@ -0,0 +1,69 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"c" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"d" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"e" = (/obj/structure/closet/radiation{anchored = 1},/obj/item/clothing/glasses/meson/engine,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"f" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"g" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"h" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"i" = (/obj/machinery/shower{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape)
+"j" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
+"k" = (/obj/structure/reflector/box{anchored = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"l" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
+"m" = (/obj/machinery/shower{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape)
+"n" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"o" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"p" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
+"q" = (/turf/open/floor/plating,/area/shuttle/escape)
+"r" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
+"s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"t" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
+"u" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; base_icon_state = "darkmatter"; explosion_power = 20; gasefficency = 0.15; icon_state = "darkmatter"; name = "anchored supermatter crystal"},/turf/open/floor/plating,/area/shuttle/escape)
+"v" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/snappops{pixel_x = 4; pixel_y = -4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"w" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"x" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Hyperfractal Gigashuttle"},/turf/open/floor/plating,/area/shuttle/escape)
+"y" = (/obj/machinery/door/airlock/external{name = "Emergency Launch Catwalk"; req_access = null; req_access_txt = "10;13"},/turf/open/floor/plating,/area/shuttle/escape)
+"z" = (/turf/open/floor/plating/airless,/area/shuttle/escape)
+"A" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"B" = (/obj/structure/reflector/double{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"C" = (/obj/structure/reflector/double{tag = "icon-reflector_double (NORTH)"; icon_state = "reflector_double"; dir = 1; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"D" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"E" = (/turf/open/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/shuttle/escape)
+"F" = (/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
+"G" = (/turf/open/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/shuttle/escape)
+"H" = (/turf/open/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/shuttle/escape)
+"I" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; name = "anchored supermatter shard"},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"J" = (/turf/open/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/shuttle/escape)
+"K" = (/turf/open/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/shuttle/escape)
+"L" = (/turf/open/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/shuttle/escape)
+"M" = (/turf/open/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/shuttle/escape)
+"N" = (/obj/machinery/power/emitter/energycannon{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"O" = (/obj/structure/chair,/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
+"P" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"Q" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"R" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+
+(1,1,1) = {"
+abcdddddcba
+abefeeefeba
+adeghhhgeda
+aceijklmeca
+aneopqrsena
+adeopqrseda
+bbeopqrsebb
+tggopursggt
+cvgopqrsgwc
+xggopqrsggt
+bndcpqrcdnb
+aaabdydbaaa
+aaaaqzqaaaa
+aAqqBzCqqDa
+azaaazaaaza
+aEFGazaEFGa
+aHIJzzzHIJa
+aKLMazaKLMa
+aqqaazaaqqa
+aNNzEOGzNNa
+aPPaHQJaPPa
+aRRaKLMaRRa
+"}
diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm
new file mode 100644
index 00000000000..66b39b7dd87
--- /dev/null
+++ b/_maps/shuttles/ferry_base.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/transport)
+"c" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/transport)
+"d" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plating,/area/shuttle/transport)
+"e" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/transport)
+"f" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/transport)
+"g" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/transport)
+"h" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"i" = (/obj/machinery/computer/shuttle/ferry/request,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"j" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"k" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"l" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"m" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; travelDir = 180; width = 5},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"n" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/transport)
+"o" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport)
+"p" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"q" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"r" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/transport)
+
+(1,1,1) = {"
+abccdccceccf
+bghijjjjjjjd
+kllllllllllm
+noppqqqqqqqd
+anccdccceccr
+"}
diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm
new file mode 100644
index 00000000000..9267e97bcf0
--- /dev/null
+++ b/_maps/shuttles/ferry_lighthouse.dmm
@@ -0,0 +1,81 @@
+"aa" = (/turf/open/space,/area/shuttle/transport)
+"ab" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l";dir = 4},/turf/open/floor/plating/airless,/area/shuttle/transport)
+"ac" = (/obj/structure/shuttle/engine/heater{icon_state = "heater";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/transport)
+"ad" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/transport)
+"ae" = (/turf/open/space,/area/space)
+"af" = (/turf/closed/wall/r_wall,/area/shuttle/transport)
+"ag" = (/turf/open/floor/plating/airless,/area/shuttle/transport)
+"ah" = (/obj/structure/foamedmetal,/turf/open/space,/area/shuttle/transport)
+"ai" = (/obj/machinery/vending/liberationstation,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aj" = (/obj/machinery/door/airlock/vault,/turf/open/floor/plating/airless,/area/shuttle/transport)
+"ak" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"al" = (/obj/machinery/computer/shuttle/ferry/request,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"am" = (/obj/structure/grille{density = 0;icon_state = "brokengrille"},/turf/open/floor/plating/airless,/area/shuttle/transport)
+"an" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/vending/autodrobe,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"ao" = (/obj/structure/mirror/magic/badmin{pixel_x = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"ap" = (/turf/closed/wall,/area/shuttle/transport)
+"aq" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/vending/clothing,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"ar" = (/obj/structure/chair,/turf/open/floor/wood,/area/shuttle/transport)
+"as" = (/obj/machinery/shield,/turf/open/space,/area/shuttle/transport)
+"at" = (/obj/machinery/door/airlock,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"au" = (/turf/open/floor/wood,/area/shuttle/transport)
+"av" = (/obj/machinery/door/airlock/wood,/turf/open/floor/wood,/area/shuttle/transport)
+"aw" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/closed/wall/shuttle/smooth,/area/shuttle/transport)
+"ax" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/transport)
+"ay" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plating,/area/shuttle/transport)
+"az" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/transport)
+"aA" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/transport)
+"aB" = (/obj/structure/grille{density = 0;icon_state = "brokengrille"},/obj/structure/window/fulltile,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aC" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/wood,/area/shuttle/transport)
+"aD" = (/turf/open/floor/carpet,/area/shuttle/transport)
+"aE" = (/turf/open/floor/bluespace,/area/shuttle/transport)
+"aF" = (/obj/machinery/vending/sovietsoda,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aG" = (/obj/machinery/vending/snack,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aH" = (/obj/machinery/newscaster{pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aI" = (/obj/structure/bed,/obj/item/weapon/bedsheet/wiz,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aK" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp/green,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aL" = (/turf/closed/wall/rust,/area/shuttle/transport)
+"aM" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/wood,/area/shuttle/transport)
+"aN" = (/obj/machinery/power/grounding_rod{anchored = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aO" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 9;height = 27;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 16},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aP" = (/obj/machinery/vending/magivend,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aQ" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aR" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/wood,/area/shuttle/transport)
+"aS" = (/obj/structure/table/wood,/obj/item/toy/crayon/spraycan,/turf/open/floor/wood,/area/shuttle/transport)
+"aT" = (/obj/structure/bed,/obj/item/weapon/bedsheet/centcom,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aU" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rainbow,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aV" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aW" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aX" = (/obj/structure/window/fulltile,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aY" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/closed/wall/shuttle/smooth,/area/shuttle/transport)
+"aZ" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/transport)
+"ba" = (/obj/machinery/conveyor{dir = 1;id = "garbage"},/turf/open/floor/wood,/area/shuttle/transport)
+"bb" = (/obj/machinery/conveyor{dir = 1;id = "garbage";layer = 2.5},/turf/open/floor/wood,/area/shuttle/transport)
+"bc" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/vending_refill/snack,/turf/open/floor/wood,/area/shuttle/transport)
+"bd" = (/obj/structure/flora/kirbyplants/dead{desc = "It doesn't look very healthy...";name = "potted plant"},/turf/open/floor/wood,/area/shuttle/transport)
+"be" = (/obj/machinery/conveyor{dir = 4;id = "garbage"},/turf/open/floor/wood,/area/shuttle/transport)
+"bf" = (/obj/machinery/conveyor{dir = 4;id = "garbage"},/obj/structure/plasticflaps,/turf/open/floor/wood,/area/shuttle/transport)
+"bg" = (/obj/machinery/conveyor{dir = 10;id = "garbage";verted = -1},/turf/open/floor/wood,/area/shuttle/transport)
+"bh" = (/obj/structure/foamedmetal,/turf/open/floor/plating/airless,/area/shuttle/transport)
+"bi" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/transport)
+"bj" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/open/floor/plating/airless,/area/shuttle/transport)
+
+(1,1,1) = {"
+aaaaabacadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+afafafafadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaafagahaiadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+agajagahakaladaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaafamanaoapadadapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaafafaqakapararapapapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+agaaaaasakatauauavauapapapawawadadaxaxayaxaxaxazaxaxaA
+agagagaBakapauauaCaDaDaDaEaEaEakaFaGaHaIakaJaJaJaJaKay
+aaaaaaasakaLauauaMaDaDaDaNaNaEaEaEaEaEaEaEaEaEaEaEaEaO
+aaaaagasaPaQauaRaSaDaDaDaEaEaEakaTaUaVaWaWaWaWaWaWaWay
+aaabacaXaXapauauaMaDaDaDadadadaYawadaxayaxaxaxazaxaxaZ
+aaaaagahbaaLaLbbbcbdadadadaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaaaaaahbebebfbgadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaaaagahbhbhadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+abacagbibiadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+aaaaaabjbjadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
+"}
diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm
new file mode 100644
index 00000000000..e8bb7a536ce
--- /dev/null
+++ b/_maps/shuttles/ferry_meat.dmm
@@ -0,0 +1,32 @@
+"a" = (/turf/open/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/transport)
+"c" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/transport)
+"d" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/transport)
+"e" = (/turf/open/floor/plasteel/freezer,/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/transport)
+"f" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"g" = (/obj/machinery/computer/shuttle/ferry/request,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"h" = (/obj/structure/closet/secure_closet/freezer/meat{name = "\"meat\" fridge"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/killertomato,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human{name = "human meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly{name = "flyman meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine{name = "golem meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard{name = "lizard meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant{name = "podperson meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow{name = "shadowling meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime{name = "slimeperson meat"},/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie{name = "rotten meat"},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"i" = (/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"j" = (/obj/machinery/gibber,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"k" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = 30;tag = "n"},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"l" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"m" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made";name = "old sink";pixel_y = 28},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"n" = (/obj/effect/decal/cleanable/dirt,/obj/structure/chair,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"o" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plating,/area/shuttle/transport)
+"p" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"q" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 2;height = 12;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 5},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"r" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/transport)
+"s" = (/turf/open/floor/plasteel/freezer,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport)
+"t" = (/obj/structure/closet/chefcloset,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"u" = (/obj/structure/kitchenspike,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"v" = (/obj/machinery/door/airlock/freezer{name = "Meat Tradeship Backroom";req_access = "28"},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"w" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"x" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/transport)
+
+(1,1,1) = {"
+abcccccccccd
+befghijklmno
+piiiiiiiliiq
+rstuuuiiviwo
+arcccccccccx
+"}
diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm
new file mode 100644
index 00000000000..44db343ee14
--- /dev/null
+++ b/_maps/shuttles/whiteship_box.dmm
@@ -0,0 +1,85 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/abandoned)
+"ac" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned)
+"ad" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship"; launch_status = 0; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 35},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
+"af" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ag" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"ah" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/abandoned)
+"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/abandoned)
+"aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ak" = (/obj/structure/table,/obj/item/device/radio/off,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"al" = (/obj/structure/table,/obj/item/weapon/screwdriver,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/abandoned)
+"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"ao" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"ap" = (/turf/closed/wall/shuttle{icon_state = "swall_f15"},/area/shuttle/abandoned)
+"aq" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/abandoned)
+"ar" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"as" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/abandoned)
+"at" = (/turf/open/floor/plating,/area/shuttle/abandoned)
+"au" = (/turf/closed/wall/shuttle{icon_state = "swall_f13"},/area/shuttle/abandoned)
+"av" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/breath,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aw" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plating,/area/shuttle/abandoned)
+"ax" = (/obj/machinery/mass_driver{dir = 4; icon_state = "mass_driver"; id = "oldship_gun"},/turf/open/floor/plating,/area/shuttle/abandoned)
+"ay" = (/obj/machinery/door/poddoor{id = "oldship_gun"; name = "pod bay door"},/turf/open/floor/plating,/area/shuttle/abandoned)
+"az" = (/turf/closed/wall/shuttle{icon_state = "swall_f12"},/area/shuttle/abandoned)
+"aA" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
+"aB" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"aC" = (/turf/closed/wall/shuttle{icon_state = "swall_f17"},/area/shuttle/abandoned)
+"aD" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plating,/area/shuttle/abandoned)
+"aE" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aF" = (/turf/closed/wall/shuttle{icon_state = "swall_f14"},/area/shuttle/abandoned)
+"aG" = (/obj/structure/rack,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aH" = (/obj/structure/computerframe{anchored = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aI" = (/turf/closed/wall/shuttle{icon_state = "swall_f11"},/area/shuttle/abandoned)
+"aJ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aK" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aL" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/shuttle/abandoned)
+"aM" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aN" = (/obj/machinery/door/window,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
+"aO" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
+"aP" = (/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aQ" = (/obj/structure/table,/obj/item/weapon/gun/energy/laser/retro,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aR" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aS" = (/obj/structure/chair{dir = 4},/obj/effect/decal/remains/human,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aT" = (/obj/machinery/computer/shuttle/white_ship,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aU" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aV" = (/obj/structure/table,/obj/item/weapon/tank/internals/oxygen,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aW" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/abandoned)
+"aX" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/abandoned)
+"aY" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
+"aZ" = (/obj/machinery/door/window/northright,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor5"},/area/shuttle/abandoned)
+"ba" = (/obj/machinery/portable_atmospherics/scrubber,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_f18"},/area/shuttle/abandoned)
+"bc" = (/obj/item/device/multitool,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bd" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"be" = (/turf/closed/wall/shuttle{icon_state = "swall_f16"},/area/shuttle/abandoned)
+"bf" = (/obj/item/weapon/scalpel,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/obj/effect/decal/remains/human,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaaaaaaaaaaaaabadaeaeaeaeaeaeafacaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaagahacaaaaaaaaabaiajajakalajajajajamaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaoapacaaaaabaqaiajajajajajajajarasaeacaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaoatapacabaqauamavajajajajajajajawaxayaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaoatatasahauajamavajajajajajazaqaeahaAac
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaeaCataDajaEajasaFaGajajajazaqauaHaHaIai
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaqaeaiajajajaIahaeaeafaAaqauajaJaJaKam
+aaaaaaaaaaaaaaaaaaaaaaaaaaabaAahauajamajajajajajajajajaIaiajajajajajaL
+abaAaeaeaeaeaeaeaeaAacaaabaqauajajajamajajazaeaeafaFajajamajajajajajaL
+aqauajajajajajajajaIaqaeaqauajajajajaMajajamaNaOajamajajaLajajajaPaQaL
+afajajajajajajajajajafajafajajajajajaRajajamajajajamajajaRajajajaSaTaL
+aqaFajajajajajajaUazaqaeaqaFajajajajaMajajamajaVajamajajaLajajajaPaPaL
+aWahaeaeaeaeaeaeaeahaXaaaWaqaFajajajamajajamajaYaZamajajamajajajajajaL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaWahaAaFbaamajajaIafaeaeauajajamaPajajajajaL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaqaeaiajajajajajajajajajamaPajajajajam
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaagaebbataDajajajajajajaEajbcamaPajbdajazai
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaoatatasaAaAaAafaeaeaLaLaLahaeaFaHazaqaX
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaoatbeaXaWaqaiajajajbfajajajajaIaAaqaXaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaanaobeaXaaaaaWaqaFbgajajajajajajaHasaXaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaAaXaaaaaaaaaWahaAaFajbhajajazaeaXaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaWaXaaaaaaaaaaaaaaaWahaeaeaeaeaXaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm
new file mode 100644
index 00000000000..834aaa68d89
--- /dev/null
+++ b/_maps/shuttles/whiteship_meta.dmm
@@ -0,0 +1,176 @@
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/abandoned)
+"ac" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
+"ae" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/abandoned)
+"af" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/abandoned)
+"ag" = (/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 27},/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"ah" = (/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"ai" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/abandoned)
+"aj" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned)
+"ak" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"al" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/abandoned)
+"am" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/abandoned)
+"an" = (/obj/structure/toilet{pixel_y = 9},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/greenglow{desc = "Looks like something's sprung a leak"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ao" = (/obj/structure/mirror{pixel_x = 28; pixel_y = 0},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ap" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/abandoned)
+"aq" = (/obj/structure/closet/wardrobe/mixed,/obj/item/clothing/under/rank/centcom_officer{desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; name = "\improper dusty old Centcom jumpsuit"},/obj/item/clothing/under/rank/centcom_commander{desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; name = "\improper dusty old Centcom jumpsuit"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ar" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice{pixel_y = 3},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"as" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_y = 2},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"at" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"au" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"av" = (/turf/closed/wall/shuttle{icon_state = "swall1"},/area/shuttle/abandoned)
+"aw" = (/obj/structure/sign/vacuum{pixel_x = -32},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"ax" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"ay" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/roller{pixel_y = 4},/obj/item/device/healthanalyzer,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"az" = (/obj/structure/closet/crate{name = "spare equipment crate"},/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/relic,/obj/item/device/t_scanner,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"aA" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/cigbutt,/obj/structure/closet/crate{icon_state = "crateopen"; name = "spare equipment crate"; opened = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/weapon/tank/internals/air,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"aB" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"aC" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"aD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"aE" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/abandoned)
+"aF" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/abandoned)
+"aG" = (/obj/machinery/door/airlock/shuttle{name = "bathroom"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aH" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/ash{desc = "They look like human remains, and have clearly been gnawed at."; icon = 'icons/effects/blood.dmi'; icon_state = "remains"; name = "remains"},/obj/item/weapon/gun/energy/laser/retro,/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aI" = (/obj/structure/bed,/obj/item/weapon/bedsheet/centcom,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aJ" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aK" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/oil,/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aL" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aM" = (/obj/machinery/door/airlock/shuttle{name = "E.V.A. equipment"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aN" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/ash{desc = "They look like human remains, and have clearly been gnawed at."; icon = 'icons/effects/blood.dmi'; icon_state = "remains"; name = "remains"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aO" = (/obj/machinery/door/airlock/shuttle{name = "cargo bay"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/abandoned)
+"aP" = (/obj/effect/decal/cleanable/oil,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/abandoned)
+"aQ" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/abandoned)
+"aR" = (/obj/effect/decal/cleanable/robot_debris/old,/obj/effect/decal/cleanable/oil,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/abandoned)
+"aS" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/machinery/door/window/westright{dir = 4},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/weapon/soap/nanotrasen,/obj/effect/decal/cleanable/ash{desc = "They look like human remains, and have clearly been gnawed at."; icon = 'icons/effects/blood.dmi'; icon_state = "remains"; name = "remains"},/obj/effect/decal/cleanable/blood/gibs/old,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aT" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/mirror{pixel_x = 28; pixel_y = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aU" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"aV" = (/obj/structure/bed,/obj/item/weapon/bedsheet/centcom,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aW" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = -2; pixel_y = 2},/obj/item/stack/rods{amount = 50},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/weapon/wrench,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aX" = (/obj/structure/rack{dir = 8; layer = 2.9; pixel_y = 2},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aY" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"aZ" = (/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/abandoned)
+"ba" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/cyborgrecharger,/obj/effect/decal/cleanable/oil,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"bb" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"bc" = (/obj/structure/closet/firecloset/full,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/abandoned)
+"bd" = (/obj/machinery/door/airlock/shuttle{name = "bathroom"},/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"be" = (/turf/closed/wall/shuttle{icon_state = "swall1"; dir = 2},/area/shuttle/abandoned)
+"bf" = (/obj/machinery/door/airlock/shuttle{name = "dormitory"},/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bg" = (/obj/machinery/vending/boozeomat{icon_deny = "smartfridge"; icon_state = "smartfridge"; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
+"bh" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/abandoned)
+"bi" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/abandoned)
+"bj" = (/obj/machinery/door/airlock/shuttle{name = "recovery shuttle interior airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bk" = (/turf/closed/wall/shuttle{icon_state = "swallc3"; dir = 2},/area/shuttle/abandoned)
+"bl" = (/obj/machinery/door/airlock/shuttle{name = "cargo bay"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/abandoned)
+"bm" = (/obj/machinery/vending/cigarette{use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bn" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/blood/gibs/limb,/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bo" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bp" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bq" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/cobweb2,/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"br" = (/obj/structure/computerframe,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bs" = (/obj/structure/table,/obj/item/device/camera,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bt" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/weapon/storage/photo_album,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bu" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 6},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bv" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/sign/vacuum{pixel_x = -32},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bw" = (/obj/machinery/vending/coffee{pixel_x = -2; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bx" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"by" = (/obj/structure/chair,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bz" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bA" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/constructable_frame/machine_frame{desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; dir = 1; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper-o"; name = "broken hypersleep chamber"; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bB" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/constructable_frame/machine_frame{desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; dir = 1; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper-o"; name = "broken hypersleep chamber"; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bC" = (/obj/structure/chair/office/light{dir = 4},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bD" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/device/gps{gpstag = "NTREC1"; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bE" = (/obj/machinery/door/airlock/shuttle{name = "recovery shuttle interior airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bF" = (/obj/structure/chair{dir = 4},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bG" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 4},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bJ" = (/obj/structure/chair{dir = 8},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bK" = (/obj/machinery/door/airlock/shuttle{name = "living quarters"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bL" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/roller{pixel_x = -3; pixel_y = 7},/obj/item/roller{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bM" = (/obj/item/clothing/suit/bio_suit,/obj/item/clothing/suit/bio_suit,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/bio_hood,/obj/item/clothing/head/bio_hood,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bN" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/ash{desc = "They look like human remains, and have clearly been gnawed at."; icon = 'icons/effects/blood.dmi'; icon_state = "remains"; name = "remains"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bO" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/blood/gibs/limb,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bP" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/suit/armor/vest,/obj/structure/table,/obj/item/clothing/head/helmet/swat/nanotrasen,/obj/item/clothing/head/helmet/swat/nanotrasen,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bQ" = (/obj/item/weapon/storage/toolbox/emergency{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -3},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bR" = (/obj/machinery/door/airlock/shuttle{name = "bridge"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bS" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/chair/comfy/black{dir = 4},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bT" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/computer/shuttle/white_ship,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bU" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"bV" = (/obj/machinery/vending/cola{pixel_x = -1; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bW" = (/obj/structure/chair{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bX" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/constructable_frame/machine_frame{desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; dir = 2; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper-o"; name = "broken hypersleep chamber"; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bY" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/constructable_frame/machine_frame{desc = "A NanoTrasen hypersleep chamber - this one appears broken. There are exposed bolts for easy detachment using a wrench."; dir = 2; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper-o"; name = "broken hypersleep chamber"; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"bZ" = (/obj/structure/chair/office/light,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ca" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/clothing/head/centhat{desc = "There's a gouge through the top where something has clawed clean through it. Whoever was wearing it probably doesn't need a hat any more."; name = "\improper damaged CentCom hat"},/obj/effect/decal/cleanable/ash{desc = "They look like human remains, and have clearly been gnawed at."; icon = 'icons/effects/blood.dmi'; icon_state = "remains"; name = "remains"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cb" = (/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cc" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/abandoned)
+"cd" = (/obj/machinery/vending/snack{pixel_x = -1; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ce" = (/obj/structure/sign/science{pixel_y = -32},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cf" = (/obj/structure/computerframe,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cg" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/device/megaphone,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ch" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/device/mass_spectrometer,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ci" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cj" = (/obj/structure/sign/botany,/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/abandoned)
+"ck" = (/obj/machinery/door/airlock/shuttle{name = "hydroponics"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cl" = (/obj/machinery/door/airlock/shuttle{name = "kitchen"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cm" = (/obj/machinery/door/airlock/shuttle{name = "laboratory"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cn" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/abandoned)
+"co" = (/obj/machinery/door/airlock/shuttle{icon_state = "door_closed"; name = "medbay"; welded = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cp" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/abandoned)
+"cq" = (/obj/item/weapon/storage/bag/plants/portaseeder,/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh{pixel_x = -2; pixel_y = 3},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cr" = (/obj/machinery/biogenerator{idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cs" = (/obj/machinery/vending/hydroseeds{pixel_x = 2; use_power = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ct" = (/obj/machinery/processor,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cu" = (/obj/structure/kitchenspike,/obj/effect/decal/cleanable/blood/gibs/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cv" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/item/weapon/storage/box/donkpockets,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/cobweb2,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cw" = (/obj/machinery/constructable_frame/machine_frame,/obj/effect/decal/cleanable/oil,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cx" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/autolathe,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cy" = (/obj/machinery/sleeper{dir = 4; use_power = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cz" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/random,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/xenoblood,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cA" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cB" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/clothing/suit/apron,/obj/item/weapon/shovel/spade,/obj/item/weapon/cultivator,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/weapon/wirecutters,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/reagent_containers/glass/bucket,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cC" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cD" = (/obj/machinery/smartfridge{use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/abandoned)
+"cE" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cF" = (/obj/effect/decal/cleanable/egg_smudge,/obj/effect/decal/cleanable/flour,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cG" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/kitchen/knife,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cH" = (/obj/machinery/constructable_frame/machine_frame,/obj/item/weapon/circuitboard/chem_dispenser,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cI" = (/obj/structure/chair/office/light,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cJ" = (/obj/machinery/constructable_frame/machine_frame,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cK" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0; req_access_txt = "0"; use_power = 0},/obj/machinery/iv_drip{density = 0; pixel_x = -8},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cL" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/ash,/obj/effect/decal/cleanable/xenoblood,/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cM" = (/obj/effect/decal/cleanable/xenoblood,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/ash{desc = "A pile of remains that look vaguely humanoid. The skull is abnormally elongated, and there are burns through some of the other bones."; icon = 'icons/effects/blood.dmi'; icon_state = "remainsxeno"; name = "remains"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cN" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/xenoblood,/obj/effect/decal/cleanable/xenoblood/xgibs/limb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"cO" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
+"cP" = (/obj/machinery/hydroponics/constructable,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cQ" = (/obj/machinery/hydroponics/constructable,/obj/item/seeds/glowshroom,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cR" = (/obj/structure/table,/obj/machinery/reagentgrinder{pixel_y = 6},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cS" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/weapon/storage/box/monkeycubes{pixel_y = 4},/obj/item/weapon/storage/fancy/egg_box{pixel_y = 5},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/reagent_containers/dropper,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/soymilk,/obj/item/weapon/reagent_containers/food/condiment/soymilk,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cW" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cX" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cY" = (/obj/structure/table,/obj/item/weapon/defibrillator,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"cZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/syringe,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"da" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/clothing/suit/apron/surgical,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"db" = (/obj/structure/table,/obj/item/weapon/storage/backpack/dufflebag/med{contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/razor); desc = "A large dufflebag for holding extra medical supplies - this one seems to be designed for holding surgical tools."; name = "surgical dufflebag"; pixel_y = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+
+(1,1,1) = {"
+aaaaabacadaeacaeadacadaeaeadafagahaiadaeaeadajaaaaaaaa
+aaakalamanaoapaqarapasatatauavawaxavayazaAaBapaaaaaaaa
+aaaCaDaEaFaGapaHaIapaJaKaxaLaMaLaNaOaPaQaQaRaeaaaaaaaa
+aaaCaDapaSaTapaUaVapaWaXaLaYaZaxaLaZbaaQbbbcapaaaaaaaa
+aaaCaialaFbdbebfbgaladafaMbhbibjbjbkaFblaiadalaeaeajaa
+abaeambmaLbnbobpaLaLbqapaxaLaLaLaxaLaLaLapbrbsbtbuaeaa
+avbvavbwaLbxbybybybzaLavaLbAbBbpaLbAbAaLavbCaxaLbDaeaa
+ahaxbEaxaLbFbGbHbIbJaxbKaLbLbMbNbObPbQaxbRaLaLbSbTaeaa
+aZbUaZbVaLbzbWbWbWbxaLaZaLbXbYaLaxbXbYaLaZbZbpcacbaeaa
+ccaeamcdaLaLaLaLaLaLaLapaLaLceaLaLaLaLaLapcfcgchciaeaa
+aaaCbkacadcjckbhafclbhaladacaFcmbhaccncobkadacaeaecpaa
+aaaCaDapcqcraxcsapaLctcucvapcwaLcxapcyaxczcAapaaaaaaaa
+aaaCaDapcBaxaLcCcDcEaxcFcGapcHcIcJapcKcLcMcNaeaaaaaaaa
+aacOacamcPcPcQcPapcRcScTcUapcVcWcXapcYcZdadbapaaaaaaaa
+aaaaccaladaeaeadaladaeaeadaladaeadaladaeaeadcpaaaaaaaa
+"}
diff --git a/code/__DEFINES/contracts.dm b/code/__DEFINES/contracts.dm
new file mode 100644
index 00000000000..cba98a29b24
--- /dev/null
+++ b/code/__DEFINES/contracts.dm
@@ -0,0 +1,42 @@
+#define CONTRACT_POWER "power"
+#define CONTRACT_WEALTH "wealth"
+#define CONTRACT_PRESTIGE "prestige"
+#define CONTRACT_MAGIC "magic"
+#define CONTRACT_REVIVE "revive"
+#define CONTRACT_KNOWLEDGE "knowledge"
+#define CONTRACT_UNWILLING "unwilling"
+
+#define BANE_SALT "salt"
+#define BANE_LIGHT "light"
+#define BANE_IRON "iron"
+#define BANE_WHITECLOTHES "whiteclothes"
+#define BANE_SILVER "silver"
+#define BANE_HARVEST "harvest"
+#define BANE_TOOLBOX "toolbox"
+
+#define OBLIGATION_FOOD "food"
+#define OBLIGATION_DRINK "drink"
+#define OBLIGATION_GREET "greet"
+#define OBLIGATION_PRESENCEKNOWN "presenceknown"
+#define OBLIGATION_SAYNAME "sayname"
+#define OBLIGATION_ANNOUNCEKILL "announcekill"
+#define OBLIGATION_ANSWERTONAME "answername"
+
+#define BAN_HURTWOMAN "hurtwoman"
+#define BAN_CHAPEL "chapel"
+#define BAN_HURTPRIEST "hurtpriest"
+#define BAN_AVOIDWATER "avoidwater"
+#define BAN_STRIKEUNCONCIOUS "strikeunconcious"
+#define BAN_HURTLIZARD "hurtlizard"
+#define BAN_HURTANIMAL "hurtanimal"
+
+#define BANISH_WATER "water"
+#define BANISH_COFFIN "coffin"
+#define BANISH_FORMALDYHIDE "embalm"
+#define BANISH_RUNES "runes"
+#define BANISH_CANDLES "candles"
+#define BANISH_DESTRUCTION "destruction"
+#define BANISH_FUNERAL_GARB "funeral"
+
+#define LORE 1
+#define LAW 2
\ No newline at end of file
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 9ca921c0cda..27252048b47 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -25,14 +25,17 @@
#define DATA_HUD_MEDICAL_ADVANCED 4
#define DATA_HUD_DIAGNOSTIC 5
//antag HUD defines
-#define ANTAG_HUD_CULT 6
-#define ANTAG_HUD_REV 7
-#define ANTAG_HUD_OPS 8
-#define ANTAG_HUD_WIZ 9
-#define ANTAG_HUD_SHADOW 10
-#define ANTAG_HUD_HOG_BLUE 11
-#define ANTAG_HUD_HOG_RED 12
-#define ANTAG_HUD_TRAITOR 13
-#define ANTAG_HUD_NINJA 14
-#define ANTAG_HUD_CHANGELING 15
-#define ANTAG_HUD_ABDUCTOR 16
+#define ANTAG_HUD_CULT 6
+#define ANTAG_HUD_REV 7
+#define ANTAG_HUD_OPS 8
+#define ANTAG_HUD_WIZ 9
+#define ANTAG_HUD_SHADOW 10
+#define ANTAG_HUD_HOG_BLUE 11
+#define ANTAG_HUD_HOG_RED 12
+#define ANTAG_HUD_TRAITOR 13
+#define ANTAG_HUD_NINJA 14
+#define ANTAG_HUD_CHANGELING 15
+#define ANTAG_HUD_ABDUCTOR 16
+#define ANTAG_HUD_DEVIL 17
+#define ANTAG_HUD_SINTOUCHED 18
+#define ANTAG_HUD_SOULLESS 19
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index e13ea1a5174..9b9bc263e6d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -420,3 +420,6 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define MAP_MAXX 4
#define MAP_MAXY 5
#define MAP_MAXZ 6
+
+// Shuttle return values
+#define SHUTTLE_ALREADY_DOCKED 7
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 916ff182f3c..980436018c6 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -24,6 +24,7 @@
#define ROLE_REVENANT "revenant"
#define ROLE_HOG_GOD "hand of god: god"
#define ROLE_HOG_CULTIST "hand of god: cultist"
+#define ROLE_DEVIL "devil"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
@@ -48,4 +49,5 @@ var/global/list/special_roles = list(
ROLE_ABDUCTOR = /datum/game_mode/abduction,
ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
+ ROLE_DEVIL = /datum/game_mode/devil
)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index ce70339a466..5058f8ace1f 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -355,6 +355,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
// mob_list.Add(M)
// for(var/mob/living/silicon/hive_mainframe/M in world)
// mob_list.Add(M)
+ for(var/mob/living/carbon/true_devil/M in sortmob)
+ moblist.Add(M)
return moblist
//E = MC^2
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index ebe953f7c83..b88a9362eb4 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -56,5 +56,9 @@ var/list/sortedAreas = list()
//List of preloaded templates
var/list/datum/map_template/map_templates = list()
+
+var/list/datum/map_template/ruins_templates = list()
var/list/datum/map_template/space_ruins_templates = list()
-var/list/datum/map_template/lava_ruins_templates = list()
\ No newline at end of file
+var/list/datum/map_template/lava_ruins_templates = list()
+
+var/list/datum/map_template/shuttle_templates = list()
diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm
index 6413d6642e2..e3c4b4f04d0 100644
--- a/code/_onclick/autoclick.dm
+++ b/code/_onclick/autoclick.dm
@@ -12,13 +12,15 @@
/client/MouseUp(object, location, control, params)
selected_target = null
-/client/MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params)
- if(selected_target)
+/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
+ if(selected_target && over_object.IsAutoclickable())
selected_target = over_object
/mob/proc/CanMobAutoclick(object, location, params)
-/mob/living/CanMobAutoclick(object, location, params)
+/mob/living/carbon/CanMobAutoclick(atom/object, location, params)
+ if(!object.IsAutoclickable())
+ return
var/obj/item/h = get_active_hand()
if(h)
. = h.CanItemAutoclick(object, location, params)
@@ -29,4 +31,13 @@
var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds
/obj/item/weapon/gun/CanItemAutoclick(object, location, params)
- . = automatic
\ No newline at end of file
+ . = automatic
+
+/atom/proc/IsAutoclickable()
+ . = 1
+
+/obj/screen/IsAutoclickable()
+ . = 0
+
+/obj/screen/click_catcher/IsAutoclickable()
+ . = 1
\ No newline at end of file
diff --git a/code/_onclick/hud/demon.dm b/code/_onclick/hud/demon.dm
new file mode 100644
index 00000000000..fc0d923e080
--- /dev/null
+++ b/code/_onclick/hud/demon.dm
@@ -0,0 +1,75 @@
+/datum/hud/devil/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
+ ..()
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ using = new /obj/screen/drop()
+ using.icon = ui_style
+ using.screen_loc = ui_drone_drop
+ static_inventory += using
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.update_icon(mymob)
+ pull_icon.screen_loc = ui_drone_pull
+ static_inventory += pull_icon
+
+ inv_box = new /obj/screen/inventory/hand()
+ inv_box.name = "right hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_r"
+ inv_box.screen_loc = ui_rhand
+ inv_box.slot_id = slot_r_hand
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory/hand()
+ inv_box.name = "left hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "hand_l"
+ inv_box.screen_loc = ui_lhand
+ inv_box.slot_id = slot_l_hand
+ static_inventory += inv_box
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_1_m"
+ using.screen_loc = ui_swaphand1
+ using.layer = 19
+ static_inventory += using
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand2
+ using.layer = 19
+ static_inventory += using
+
+ zone_select = new /obj/screen/zone_sel()
+ zone_select.icon = ui_style
+ zone_select.update_icon(mymob)
+
+ lingchemdisplay = new /obj/screen/ling/chems()
+
+/datum/hud/devil/persistant_inventory_update()
+ if(!mymob)
+ return
+ var/mob/living/carbon/true_devil/D = mymob
+
+ if(hud_version != HUD_STYLE_NOHUD)
+ if(D.r_hand)
+ D.r_hand.screen_loc = ui_rhand
+ D.client.screen += D.r_hand
+ if(D.l_hand)
+ D.l_hand.screen_loc = ui_lhand
+ D.client.screen += D.l_hand
+ else
+ if(D.r_hand)
+ D.r_hand.screen_loc = null
+ if(D.l_hand)
+ D.l_hand.screen_loc = null
+
+/mob/living/carbon/true_devil/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/devil(src, ui_style2icon(client.prefs.UI_style))
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 067730d32bf..93dd4a0555a 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -173,6 +173,8 @@
var/generate_minimaps = 0
var/grey_assistants = 0
+ var/lavaland_budget = 60
+
var/aggressive_changelog = 0
var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors
@@ -584,6 +586,8 @@
config.starlight = 1
if("grey_assistants")
config.grey_assistants = 1
+ if("lavaland_budget")
+ config.lavaland_budget = text2num(value)
if("no_summon_guns")
config.no_summon_guns = 1
if("no_summon_magic")
@@ -751,4 +755,4 @@
if(!statclick)
statclick = new/obj/effect/statclick/debug("Edit", src)
- stat("[name]:", statclick)
\ No newline at end of file
+ stat("[name]:", statclick)
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index d48be2c82c4..a01c867c134 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -85,7 +85,8 @@ var/global/datum/controller/master/Master = new()
var/mining_type = MINETYPE
if(mining_type == "lavaland")
- seedRuins(5, 5, /area/lavaland/surface/outdoors, lava_ruins_templates)
+ seedRuins(5, config.lavaland_budget, \
+ /area/lavaland/surface/outdoors, lava_ruins_templates)
spawn_rivers()
else
make_mining_asteroid_secrets()
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index cb33b9d7356..e2df3ccd9f6 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -11,6 +11,7 @@ var/datum/subsystem/shuttle/SSshuttle
//emergency shuttle stuff
var/obj/docking_port/mobile/emergency/emergency
+ var/obj/docking_port/mobile/emergency/backup/backup_shuttle
var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds)
var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds)
var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
@@ -39,6 +40,8 @@ var/datum/subsystem/shuttle/SSshuttle
return ..()
if(!emergency)
WARNING("No /obj/docking_port/mobile/emergency placed on the map!")
+ if(!backup_shuttle)
+ WARNING("No /obj/docking_port/mobile/emergency/backup placed on the map!")
if(!supply)
WARNING("No /obj/docking_port/mobile/supply placed on the map!")
@@ -76,8 +79,11 @@ var/datum/subsystem/shuttle/SSshuttle
/datum/subsystem/shuttle/proc/requestEvac(mob/user, call_reason)
if(!emergency)
- throw EXCEPTION("requestEvac(): There is no emergency shuttle! The game will be unresolvable. This is likely due to a mapping error")
- return
+ WARNING("requestEvac(): There is no emergency shuttle, but the shuttle was called. Using the backup shuttle instead.")
+ if(!backup_shuttle)
+ throw EXCEPTION("requestEvac(): There is no emergency shuttle, or backup shuttle! The game will be unresolvable. This is likely due to a mapping error")
+ return
+ emergency = backup_shuttle
if(world.time - round_start_time < config.shuttle_refuel_delay)
user << "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again."
@@ -118,6 +124,13 @@ var/datum/subsystem/shuttle/SSshuttle
return
+// Called when an emergency shuttle mobile docking port is
+// destroyed, which will only happen with admin intervention
+/datum/subsystem/shuttle/proc/emergencyDeregister()
+ // When a new emergency shuttle is created, it will override the
+ // backup shuttle.
+ src.emergency = src.backup_shuttle
+
/datum/subsystem/shuttle/proc/cancelEvac(mob/user)
if(canRecall())
emergency.cancel(get_area(user))
@@ -182,13 +195,15 @@ var/datum/subsystem/shuttle/SSshuttle
/datum/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed)
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
+ var/obj/docking_port/stationary/D = getDock(dockId)
+
if(!M)
return 1
if(timed)
- if(M.request(getDock(dockId)))
+ if(M.request(D))
return 2
else
- if(M.dock(getDock(dockId)))
+ if(M.dock(D))
return 2
return 0 //dock successful
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 89d3e04808f..742c700ebb9 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -262,6 +262,7 @@ var/record_id_num = 1001
L.fields["species"] = H.dna.species.type
L.fields["features"] = H.dna.features
L.fields["image"] = image
+ L.fields["reference"] = H
locked += L
return
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 87a55138682..74f67b22f74 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -155,7 +155,7 @@ var/list/diseases = subtypesof(/datum/disease)
if(disease_flags & CAN_RESIST)
if(!(type in affected_mob.resistances))
affected_mob.resistances += type
- remove_virus()
+ remove_virus()
qdel(src)
diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm
index 3a947256fcb..a545622036a 100644
--- a/code/datums/helper_datums/map_template.dm
+++ b/code/datums/helper_datums/map_template.dm
@@ -9,6 +9,7 @@
/datum/map_template/New(path = null, map = null, rename = null)
if(path)
mappath = path
+ if(mappath)
preload_size(mappath)
if(map)
mapfile = map
@@ -62,10 +63,12 @@
/datum/map_template/proc/get_file()
if(mapfile)
- return mapfile
- if(mappath)
- mapfile = file(mappath)
- return mapfile
+ . = mapfile
+ else if(mappath)
+ . = file(mappath)
+
+ if(!.)
+ world.log << "The file of [src] appears to be empty/non-existent."
/datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE)
var/turf/placement = T
@@ -83,16 +86,39 @@
map_templates[T.name] = T
preloadRuinTemplates()
+ preloadShuttleTemplates()
/proc/preloadRuinTemplates()
- var/list/potentialSpaceRuins = generateMapList(filename = "_maps/RandomRuins/SpaceRuins/_maplisting.txt", blacklist = "config/spaceRuinBlacklist.txt")
- for(var/ruin in potentialSpaceRuins)
- var/datum/map_template/T = new(path = "[ruin]", rename = "[ruin]")
- space_ruins_templates[T.name] = T
- map_templates[T.name] = T
+ // Still supporting bans by filename
+ var/list/banned = generateMapList("config/lavaRuinBlacklist.txt")
+ banned += generateMapList("config/spaceRuinBlacklist.txt")
- var/list/potentialLavaRuins = generateMapList(filename = "_maps/RandomRuins/LavaRuins/_maplisting.txt", blacklist = "config/lavaRuinBlacklist.txt")
- for(var/ruin in potentialLavaRuins)
- var/datum/map_template/T = new(path = "[ruin]", rename = "[ruin]")
- lava_ruins_templates[T.name] = T
- map_templates[T.name] = T
\ No newline at end of file
+ for(var/item in subtypesof(/datum/map_template/ruin))
+ var/datum/map_template/ruin/ruin_type = item
+ // screen out the abstract subtypes
+ if(!initial(ruin_type.id))
+ continue
+ var/datum/map_template/ruin/R = new ruin_type()
+
+ if(banned.Find(R.mappath))
+ continue
+
+ map_templates[R.name] = R
+ ruins_templates[R.name] = R
+
+ if(istype(R, /datum/map_template/ruin/lavaland))
+ lava_ruins_templates[R.name] = R
+ else if(istype(R, /datum/map_template/ruin/space))
+ space_ruins_templates[R.name] = R
+
+
+/proc/preloadShuttleTemplates()
+ for(var/item in subtypesof(/datum/map_template/shuttle))
+ var/datum/map_template/shuttle/shuttle_type = item
+ if(!(initial(shuttle_type.suffix)))
+ continue
+
+ var/datum/map_template/shuttle/S = new shuttle_type()
+
+ shuttle_templates[S.name] = S
+ map_templates[S.name] = S
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 8698e29a382..2b7eee8a730 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -18,6 +18,9 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
+ ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),\
+ ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),\
+ ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),\
)
/datum/atom_hud
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 1587bc4b8d2..60d4d992d88 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -57,9 +57,13 @@
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
var/datum/gang/gang_datum //Which gang this mind belongs to, if any
+ var/datum/devilinfo/devilinfo //Information about the devil, if any.
+ var/damnation_type = 0
+ var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
/datum/mind/New(var/key)
src.key = key
+ soulOwner = src
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
@@ -539,6 +543,24 @@
sections["monkey"] = text
+ /** devil ***/
+ text = "devil"
+ if(ticker.mode.config_tag == "devil")
+ text = uppertext(text)
+ text = "[text]: "
+ if(src in ticker.mode.devils)
+ text += "DEVIL|sintouched|human"
+ else if(src in ticker.mode.sintouched)
+ text += "devil|SINTOUCHED|human"
+ else
+ text += "devil|sintouched|HUMAN"
+
+ if(current && current.client && (ROLE_DEVIL in current.client.prefs.be_special))
+ text += "|Enabled in Prefs"
+ else
+ text += "|Disabled in Prefs"
+ sections["devil"] = text
+
/** SILICON ***/
@@ -1163,6 +1185,45 @@
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
log_admin("[key_name(usr)] has thrall'ed [current].")
+ else if(href_list["devil"])
+ switch(href_list["devil"])
+ if("clear")
+ if(src in ticker.mode.devils)
+ if(istype(current,/mob/living/carbon/true_devil/))
+ usr << "This cannot be used on true or arch-devils."
+ else
+ ticker.mode.devils -= src
+ special_role = null
+ current << "Your infernal link has been severed! You are no longer a devil!"
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
+ RemoveSpell(/obj/effect/proc_holder/spell/dumbfire/fireball/hellish)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_contract)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_pitchfork)
+ message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
+ devilinfo = null
+ log_admin("[key_name(usr)] has de-devil'ed [current].")
+ else if(src in ticker.mode.sintouched)
+ ticker.mode.sintouched -= src
+ message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
+ log_admin("[key_name(usr)] has de-sintouch'ed [current].")
+ if("devil")
+ if(!ishuman(current))
+ usr << "This only works on humans!"
+ return
+ ticker.mode.devils += src
+ special_role = "devil"
+ ticker.mode.finalize_devil(src)
+ announceDevilLaws()
+ if("sintouched")
+ if(ishuman(current))
+ ticker.mode.sintouched += src
+ var/mob/living/carbon/human/H = current
+ H.influenceSin()
+ message_admins("[key_name_admin(usr)] has sintouch'ed [current].")
+ else
+ usr << "This only works on humans!"
+ return
+
else if(href_list["abductor"])
switch(href_list["abductor"])
if("clear")
@@ -1569,7 +1630,6 @@
ticker.mode.greet_hog_follower(src,colour)
ticker.mode.update_hog_icons_added(src, colour)
-
/datum/mind/proc/make_Handofgod_god(colour)
switch(colour)
if("red")
@@ -1611,6 +1671,25 @@
var/obj/effect/proc_holder/spell/S = X
S.action.Grant(new_character)
+/datum/mind/proc/disrupt_spells(delay, list/exceptions = New())
+ for(var/X in spell_list)
+ var/obj/effect/proc_holder/spell/S = X
+ for(var/type in exceptions)
+ if(istype(S, type))
+ continue
+ S.charge_counter = delay
+ spawn(0)
+ S.start_recharge()
+
+/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
+ for(var/mob/dead/observer/G in dead_mob_list)
+ if(G.mind == src)
+ if(G.can_reenter_corpse || even_if_they_cant_reenter)
+ return G
+ break
+
+
+
/mob/proc/sync_mind()
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
mind.active = 1 //indicates that the mind is currently synced with a client
@@ -1721,4 +1800,4 @@
/mob/living/simple_animal/hostile/construct/mind_initialize()
..()
mind.assigned_role = "[initial(name)]"
- mind.special_role = "Cultist"
\ No newline at end of file
+ mind.special_role = "Cultist"
diff --git a/code/datums/ruins.dm b/code/datums/ruins.dm
new file mode 100644
index 00000000000..d9c2ca348d5
--- /dev/null
+++ b/code/datums/ruins.dm
@@ -0,0 +1,22 @@
+/datum/map_template/ruin
+ //name = "A Chest of Doubloons"
+ name = null
+ var/id = null // For blacklisting purposes, all ruins need an id
+ var/description = "In the middle of a clearing in the rockface, there's a \
+ chest filled with gold coins with Spanish engravings. How is there a \
+ wooden container filled with 18th century coinage in the middle of a \
+ lavawracked hellscape? It is clearly a mystery."
+
+ var/cost = null
+ var/allow_duplicates = TRUE
+
+ var/prefix = null
+ var/suffix = null
+
+/datum/map_template/ruin/New()
+ if(!name && id)
+ name = id
+
+ mappath = prefix + suffix
+ ..(path = mappath)
+
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
new file mode 100644
index 00000000000..a6679321d81
--- /dev/null
+++ b/code/datums/ruins/lavaland.dm
@@ -0,0 +1,221 @@
+/datum/map_template/ruin/lavaland
+ prefix = "_maps/RandomRuins/LavaRuins/"
+
+/datum/map_template/ruin/lavaland/biodome
+ cost = 5
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/biodome/beach
+ name = "Biodome Beach"
+ id = "biodome-beach"
+ description = "Seemingly plucked from a tropical destination, this beach \
+ is calm and cool, with the salty waves roaring softly in the \
+ background. Comes with a rustic wooden bar and suicidal bartender."
+ suffix = "lavaland_biodome_beach.dmm"
+
+/datum/map_template/ruin/lavaland/biodome/winter
+ name = "Biodome Winter"
+ id = "biodome-winter"
+ description = "For those getaways where you want to get back to nature, \
+ but you don't want to leave the fortified military compound where you \
+ spend your days. Includes a unique(*) laser pistol display case, \
+ and the recently introduced I.C.E(tm)."
+ suffix = "lavaland_surface_biodome_winter.dmm"
+
+/datum/map_template/ruin/lavaland/biodome/clown
+ name = "Biodome Clown Planet"
+ id = "biodome-clown"
+ description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!"
+ suffix = "lavaland_biodome_clown_planet.dmm"
+
+/datum/map_template/ruin/lavaland/cube
+ name = "The Wishgranter Cube"
+ id = "wishgranter-cube"
+ description = "Nothing good can come from this. Learn from their mistakes \
+ and turn around."
+ suffix = "lavaland_surface_cube.dmm"
+ cost = 10
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/prisoners
+ name = "Prisoner Crash"
+ id = "prisoner-crash"
+ description = "This incredibly high security shuttle clearly didn't have \
+ 'avoiding lavafilled hellscapes' as a design priority. As such, it \
+ has crashed, waking the prisoners from their cryostasis, and setting \
+ them loose on the wastes. If they live long enough, that is."
+ suffix = "lavaland_surface_prisoner_crash.dmm"
+ cost = 15
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/seed_vault
+ name = "Seed Vault"
+ id = "seed-vault"
+ description = "The creators of these vaults were a highly advanced and \
+ benevolent race, and launched many into the stars, hoping to aid \
+ fledgling civilizations. However, all the inhabitants seem to do is \
+ grow drugs and guns."
+ suffix = "lavaland_surface_seed_vault.dmm"
+ cost = 10
+
+/datum/map_template/ruin/lavaland/ash_walker
+ name = "Ash Walker Nest"
+ id = "ash-walker"
+ description = "A race of unbreathing lizards live here, that run faster \
+ than a human can, worship a broken dead city, and are capable of \
+ reproducing by something involving tentacles? Probably best to \
+ stay clear."
+ suffix = "lavaland_surface_ash_walker1.dmm"
+ cost = 20
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/free_golem
+ name = "Free Golem Ship"
+ id = "golem-ship"
+ description = "Lumbering humanoids, made out of precious metals, move \
+ inside this ship. They frequently leave to mine more minerals, \
+ which they somehow turn into more of them. Seem very intent on \
+ research and individual liberty, and also geology based naming?"
+ cost = 20
+ suffix = "lavaland_surface_golem_ship.dmm"
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/animal_hospital
+ name = "Animal Hospital"
+ id = "animal-hospital"
+ description = "Rats with cancer do not live very long. And the ones that \
+ wake up from cryostasis seem to commit suicide out of boredom."
+ cost = 5
+ suffix = "lavaland_surface_animal_hospital.dmm"
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/sin
+ cost = 10
+
+/datum/map_template/ruin/lavaland/sin/envy
+ name = "Ruin of Envy"
+ id = "envy"
+ description = "When you get what they have, then you'll finally be happy."
+ suffix = "lavaland_surface_envy.dmm"
+
+/datum/map_template/ruin/lavaland/sin/gluttony
+ name = "Ruin of Gluttony"
+ id = "gluttony"
+ description = "If you eat enough, then eating will be all that you do."
+ suffix = "lavaland_surface_gluttony.dmm"
+
+/datum/map_template/ruin/lavaland/sin/greed
+ name = "Ruin of Greed"
+ id = "greed"
+ description = "Sure you don't need magical powers, but you WANT them, and \
+ that's what's important."
+ suffix = "lavaland_surface_greed.dmm"
+
+/datum/map_template/ruin/lavaland/sin/pride
+ name = "Ruin of Pride"
+ id = "pride"
+ description = "Wormhole lifebelts are for LOSERS, who you are better than."
+ suffix = "lavaland_surface_pride.dmm"
+
+/datum/map_template/ruin/lavaland/sin/sloth
+ name = "Ruin of Sloth"
+ id = "sloth"
+ description = "..."
+ suffix = "lavaland_surface_sloth.dmm"
+ // Generates nothing but atmos runtimes and salt
+ cost = 0
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/ato
+ name = "Automated Trade Outpost"
+ id = "ato"
+ description = "A sign at the front says 'Stealing is bad.'"
+ suffix = "lavaland_surface_automated_trade_outpost.dmm"
+ cost = 5
+
+/datum/map_template/ruin/lavaland/ufo_crash
+ name = "UFO Crash"
+ id = "ufo-crash"
+ description = "Turns out that keeping your abductees unconcious is really \
+ important. Who knew?"
+ suffix = "lavaland_surface_ufo_crash.dmm"
+ cost = 5
+
+/datum/map_template/ruin/lavaland/ww_vault
+ name = "Wishgranter Vault"
+ id = "ww-vault"
+ description = "Scrawled on the large double doors is both a message and a \
+ warning: 'meat grinder requires sacri...'. You're not so sure about \
+ this anymore."
+ suffix = "lavaland_surface_ww_vault.dmm"
+ cost = 20
+
+/datum/map_template/ruin/lavaland/xeno_nest
+ name = "Xenomorph Nest"
+ id = "xeno-nest"
+ description = "These xenomorphs got bored of horrifically slaughtering \
+ people on space stations, and have settled down on a nice lava filled \
+ hellscape to focus on what's really important in life. Quality memes."
+ suffix = "lavaland_surface_xeno_nest.dmm"
+ cost = 20
+
+/datum/map_template/ruin/lavaland/fountain
+ name = "Fountain Hall"
+ id = "fountain"
+ description = "The fountain has a warning on the side. DANGER: May have \
+ undeclared side effects that only become obvious when implemented."
+ suffix = "lavaland_fountain_hall.dmm"
+ cost = 5
+
+/datum/map_template/ruin/lavaland/zombie_gym
+ name = "Zombie Gym"
+ id = "zombie-gym"
+ description = "The patrons at this gym are serious about health, and \
+ making sure people work on their cardio."
+ suffix = "lavaland_gym.dmm"
+ cost = 10
+
+/datum/map_template/ruin/lavaland/survivalcapsule
+ name = "Survival Capsule Ruins"
+ id = "survivalcapsule"
+ description = "What was once sanctuary to the common miner, \
+ is now their tomb."
+ suffix = "lavaland_surface_survivalpod.dmm"
+ cost = 5
+
+/datum/map_template/ruin/lavaland/wwiioutpost
+ name = "Strange Outpost"
+ id = "nazi"
+ description = "The ruins of an outpost, skeletons and empty shell casings litter the interior of \
+ the structure. Some of these uniforms look awfully strange.."
+ suffix = "lavaland_surface_wwiioutpost.dmm"
+ cost = 20
+
+/datum/map_template/ruin/lavaland/tomb
+ name = "Strange Outpost"
+ id = "tomb"
+ description = "A strange tomb, housing the dead of whatever strange civilization \
+ lived here before. You swear you hear rattling coming from the inside."
+ suffix = "lavaland_surface_tomb.dmm"
+ cost = 10
+
+/datum/map_template/ruin/lavaland/chasm
+ name = "A Big Hole"
+ id = "hole"
+ description = "A really big hole in the ground. Falling in is ill-advised."
+ suffix = "lavaland_surface_chasm.dmm"
+ cost = 0
+
+/datum/map_template/ruin/lavaland/chasm/ravine
+ name = "A Long Vertical Hole"
+ id = "longhole"
+ description = "A long hole across a section of land. Some call it a ravine, \
+ but I think it could also just be a really big crevice."
+ suffix = "lavaland_surface_ravine.dmm"
+
+/datum/map_template/ruin/lavaland/chasm/ravine/horizontal
+ name = "A Long Horizontal Hole"
+ id = "longholehorizontal"
+ description = "A long hole across a section of land. Some call it a ravine, \
+ but I think it could also just be a really big crevice. Now in horizontal flavor."
+ suffix = "lavaland_surface_ravine_h.dmm"
\ No newline at end of file
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
new file mode 100644
index 00000000000..de83a4bedb4
--- /dev/null
+++ b/code/datums/ruins/space.dm
@@ -0,0 +1,157 @@
+/datum/map_template/ruin/space
+ prefix = "_maps/RandomRuins/SpaceRuins/"
+ cost = 1
+
+/datum/map_template/ruin/space/zoo
+ id = "zoo"
+ suffix = "abandonedzoo.dmm"
+ name = "Biological Storage Facility"
+ description = "In case society crumbles, we will be able to restore our \
+ zoos to working order with the breeding stock kept in these 100% \
+ secure and unbreachable storage facilities. At no point has anything \
+ escaped. That's our story, and we're sticking to it."
+
+/datum/map_template/ruin/space/asteroid1
+ id = "asteroid1"
+ suffix = "asteroid1.dmm"
+ name = "Asteroid 1"
+ description = "I-spy with my little eye, something beginning with R."
+
+/datum/map_template/ruin/space/asteroid2
+ id = "asteroid2"
+ suffix = "asteroid2.dmm"
+ name = "Asteroid 2"
+ description = "Oh my god, a giant rock!"
+
+/datum/map_template/ruin/space/asteroid3
+ id = "asteroid3"
+ suffix = "asteroid3.dmm"
+ name = "Asteroid 3"
+ description = "This asteroid floating in space has no official \
+ designation, because the scientist that discovered it deemed it \
+ 'super dull'."
+
+/datum/map_template/ruin/space/asteroid4
+ id = "asteroid4"
+ suffix = "asteroid4.dmm"
+ name = "Asteroid 4"
+ description = "Nanotrasen Escape Pods have a 100%* success rate, and a \
+ 99%* customer satisfaction rate. *Please note that these statistics, \
+ are taken from pods that have successfully docked with a recovery \
+ vessel."
+
+/datum/map_template/ruin/space/asteroid5
+ id = "asteroid5"
+ suffix = "asteroid5.dmm"
+ name = "Asteroid 5"
+ description = "Oh my god, another giant rock!"
+
+/datum/map_template/ruin/space/deep_storage
+ id = "deep-storage"
+ suffix = "deepstorage.dmm"
+ name = "Survivalist Bunker"
+ description = "Assume the best, prepare for the worst. Generally, you \
+ should do so by digging a three man heavily fortified bunker into \
+ a giant unused asteroid. Then make it self sufficient, mask any \
+ evidence of construction, hook it covertly into the \
+ telecommunications network and hope for the best."
+
+/datum/map_template/ruin/space/derelict1
+ id = "derelict1"
+ suffix = "derelict1.dmm"
+ name = "Derelict 1"
+ description = "Nothing to see here citizen, move along, certainly no \
+ xeno outbreaks on this piece of station debris. That purple stuff? \
+ It's uh... station nectar. It's a top secret research installation."
+
+/datum/map_template/ruin/space/derelict2
+ id = "derelict2"
+ suffix = "derelict2.dmm"
+ name = "Dinner for Two"
+ description = "Oh this is the night\n\
+ It's a beautiful night\n\
+ And we call it bella notte"
+
+/datum/map_template/ruin/space/derelict3
+ id = "derelict3"
+ suffix = "derelict3.dmm"
+ name = "Derelict 3"
+ description = "These hulks were once part of a larger structure, where \
+ the three great \[REDACTED\] were forged."
+
+/datum/map_template/ruin/space/derelict4
+ id = "derelict4"
+ suffix = "derelict4.dmm"
+ name = "Derelict 4"
+ description = "Centcom ferries have never crashed, will never crash, \
+ there is no current investigation into a crashed ferry, and we \
+ will not let Internal Affairs trample over high security information \
+ in the name of this baseless witchhunt."
+
+/datum/map_template/ruin/space/derelict5
+ id = "derelict5"
+ suffix = "derelict5.dmm"
+ name = "Derelict 5"
+ description = "The plan is, we put a whole bunch of crates full of \
+ treasure in this disused warehouse, launch it into space, and then \
+ ignore it. Forever."
+
+/datum/map_template/ruin/space/empty_shell
+ id = "empty-shell"
+ suffix = "emptyshell.dmm"
+ name = "Empty Shell"
+ description = "Cosy, rural property availible for young professional \
+ couple. Only twelve parsecs from the nearest hyperspace lane!"
+
+/datum/map_template/ruin/space/gas_the_lizards
+ id = "gas-the-lizards"
+ suffix = "gasthelizards.dmm"
+ name = "Disposal Facility 17"
+ description = "Gas efficiency at 95.6%, fluid elimination at 96.2%. \
+ Will require renewed supplies of 'carpet' before the end of the \
+ quarter."
+
+/datum/map_template/ruin/space/intact_empty_ship
+ id = "intact-empty-ship"
+ suffix = "intactemptyship.dmm"
+ name = "Authorship"
+ description = "Just somewhere quiet, where I can focus on my work with \
+ no interruptions."
+
+/datum/map_template/ruin/space/mech_transport
+ id = "mech-transport"
+ suffix = "mechtransport.dmm"
+ name = "CF Corsair"
+ description = "Well, when is it getting here? I have bills to pay; very \
+ well-armed clients who want their shipments as soon as possible! I \
+ don't care, just find it!"
+
+/datum/map_template/ruin/space/onehalf
+ id = "onehalf"
+ suffix = "onehalf.dmm"
+ name = "DK Excavator 453"
+ description = "Based on the trace elements we've detected on the \
+ gutted asteroids, we suspect that a mining ship using a restricted \
+ engine is somewhere in the area. We'd like to request a patrol vessel \
+ to investigate."
+
+/datum/map_template/ruin/space/spacebar
+ id = "spacebar"
+ suffix = "spacebar.dmm"
+ name = "The Rampant Golem and Yellow Hound"
+ description = "No questions asked. No shoes/foot protection, no service. \
+ No tabs. No violence in the inside areas. That's it. Welcome to the \
+ Rampant Golem and Yellow Hound. Can I take your order?"
+
+/datum/map_template/ruin/space/turreted_outpost
+ id = "turreted-outpost"
+ suffix = "turretedoutpost.dmm"
+ name = "Unnamed Turreted Outpost"
+ description = "We'd ask them to stop blaring that ruskiepop music, but \
+ none of us are brave enough to go near those death turrets they have."
+
+/datum/map_template/ruin/space/way_home
+ id = "way-home"
+ suffix = "way_home.dmm"
+ name = "Salvation"
+ description = "In the darkest times, we will find our way home."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
new file mode 100644
index 00000000000..d7497bbe415
--- /dev/null
+++ b/code/datums/shuttles.dm
@@ -0,0 +1,160 @@
+/datum/map_template/shuttle
+ name = "Base Shuttle Template"
+ var/prefix = "_maps/shuttles/"
+ var/suffix
+ var/port_id
+
+ var/description
+ var/admin_notes
+
+/datum/map_template/shuttle/New()
+ mappath = "[prefix][port_id]_[suffix].dmm"
+ . = ..()
+
+/datum/map_template/shuttle/emergency
+ port_id = "emergency"
+ name = "Base Shuttle Template (Emergency)"
+
+/datum/map_template/shuttle/cargo
+ port_id = "cargo"
+ name = "Base Shuttle Template (Cargo)"
+
+/datum/map_template/shuttle/ferry
+ port_id = "ferry"
+ name = "Base Shuttle Template (Ferry)"
+
+/datum/map_template/shuttle/whiteship
+ port_id = "whiteship"
+
+// Shuttles start here:
+
+/datum/map_template/shuttle/emergency/airless
+ suffix = "airless"
+ name = "(Shuttle Under Construction)"
+ description = "The documentation hasn't been finished yet for this \
+ shuttle.\n\
+ In case of emergency: Break glass."
+
+/datum/map_template/shuttle/emergency/bar
+ suffix = "bar"
+ name = "The Emergency Escape Bar"
+ description = "Features include a very tough Bardrone, with laws to be \
+ a good bartender, bathroom, a quality lounge for the heads, and a \
+ small gambling table."
+ admin_notes = "Bardrone should be controlled by a player, either admin \
+ or ghost, has modified drone laws, can speak human and see normally."
+
+/datum/map_template/shuttle/emergency/birdboat
+ suffix = "birdboat"
+ name = "emergency shuttle (Birdboat)"
+
+/datum/map_template/shuttle/emergency/box
+ suffix = "box"
+ name = "emergency shuttle (Box)"
+
+/datum/map_template/shuttle/emergency/clown
+ suffix = "clown"
+ name = "Snappop(tm)!"
+ description = "Hey kids and grownups! Are you bored of DULL and TEDIOUS \
+ shuttle journeys after you're evacuating for probably BORING reasons. \
+ Well then order the Snappop(tm) today! We've got fun activities for \
+ everyone, an all access cockpit, and no boring security brig! Boo! \
+ Play dress up with your friends! Collect all the bedsheets before \
+ your neighbour does! Check if the AI is watching you with our patent \
+ pending \"Peeping Tom AI Multitool Detector\" or PEEEEEETUR for \
+ short. Have a fun ride!"
+ admin_notes = "Brig is replaced by anchored greentext book surrounded by \
+ lavaland chasms, stationside door has been removed to prevent \
+ accidental dropping."
+
+/datum/map_template/shuttle/emergency/cramped
+ suffix = "cramped"
+ name = "Secure Transport Vessel 5 (STV5)"
+ description = "Well, looks like Centcomm only had this ship in the area, \
+ they probably weren't expecting you to need evac for a while. \
+ Probably best if you don't rifle around in whatever equipment they \
+ were transporting. I hope you're friendly with your coworkers, \
+ because there is very little space in this thing.\n\
+ \n\
+ Contains contraband armory guns, maintenance loot, and abandoned \
+ crates!"
+ admin_notes = "Due to origin as a solo piloted secure vessel, has an \
+ active GPS onboard labeled STV5."
+
+/datum/map_template/shuttle/emergency/meta
+ suffix = "meta"
+ name = "emergency shuttle (Metastation)"
+
+/datum/map_template/shuttle/emergency/narnar
+ suffix = "narnar"
+ name = "Shuttle 667"
+ description = "Looks like this shuttle may have wandered into the \
+ darkness between the stars on route to the station. Let's not think \
+ too hard about where all the bodies came from."
+ admin_notes = "Contains real cult ruins, mob eyeballs, and inactive \
+ constructs. Put players in constructs if you want them to move. \
+ Cloning pods in 'medbay' area are showcases and nonfunctional."
+
+/datum/map_template/shuttle/emergency/supermatter
+ suffix = "supermatter"
+ name = "Hyperfractal Gigashuttle"
+ description = "\"I dunno, this seems kinda needlessly complicated.\"\n\
+ \"This shuttle has very a very high safety record, according to \
+ Centcom Officer Cadet Yins.\"\n\
+ \"Are you sure?\"\n\
+ \"Yes, it has a safety record of N-A-N, which is apparently \
+ larger than 100%.\""
+ admin_notes = "Supermatter that spawns on shuttle is special anchored \
+ 'hugbox' supermatter that cannot take damage and does not take in \
+ or emit gas. Outside of admin intervention, it cannot explode. \
+ It does, however, still dust anything on contact, emits high levels \
+ of radiation, and induce hallucinations in anyone looking at it \
+ without protective goggles. Emitters spawn powered on, expect \
+ admin notices, they are harmless."
+
+/datum/map_template/shuttle/ferry/base
+ suffix = "base"
+ name = "transport ferry"
+ description = "Standard issue Box/Metastation Centcom ferry."
+
+/datum/map_template/shuttle/ferry/meat
+ suffix = "meat"
+ name = "\"meat\" ferry"
+ description = "Ahoy! We got all kinds o' meat aft here. Meat from plant \
+ people, people who be dark, not in a racist way, just they're dark \
+ black. Oh and lizard meat too,mighty popular that is. Definitely \
+ 100% fresh, just ask this guy here. *person on meatspike moans* See? \
+ Definitely high quality meat, nothin' wrong with it, nothin' added, \
+ definitely no zombifyin' reagents!"
+ admin_notes = "Meat currently contains no zombifying reagents, lizard on \
+ meatspike must be spawned in."
+
+/datum/map_template/shuttle/ferry/lighthouse
+ suffix = "lighthouse"
+ name = "The Lighthouse(?)"
+ description = "*static*... part of a much larger vessel, possibly \
+ military in origin. The weapon markings aren't anything we've seen \
+ ... static ... by almost never the same person twice, possible use \
+ of unknown storage ... static ... seeing ERT officers onboard, but \
+ no missions are on file for ... static ... static ... annoying \
+ jingle ... only at The LIGHTHOUSE! Fulfilling needs you didn't even \
+ know you had. We've got EVERYTHING, and something else!"
+ admin_notes = "Currently larger than ferry docking port on Box, will not \
+ hit anything, but must be force docked. Trader and ERT bodyguards are \
+ not included."
+
+/datum/map_template/shuttle/whiteship/box
+ suffix = "box"
+ name = "NT Medical Ship"
+
+/datum/map_template/shuttle/whiteship/meta
+ suffix = "meta"
+ name = "NT Recovery White-ship"
+
+/datum/map_template/shuttle/cargo/box
+ suffix = "box"
+ name = "supply shuttle (Box)"
+
+/datum/map_template/shuttle/cargo/birdboat
+ suffix = "birdboat"
+ name = "supply shuttle (Birdboat)"
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 4a37ef1503a..f39494cefbc 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -79,7 +79,7 @@
if(!A.secondsElectrified)
A.secondsElectrified = 30
A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- add_logs(usr, A, "electrified", addition="at [A.x],[A.y],[A.z]")
+ add_logs(usr, A, "electrified")
spawn(10)
if(A)
while (A.secondsElectrified > 0)
@@ -136,7 +136,7 @@
if(A.secondsElectrified != -1)
A.secondsElectrified = -1
A.shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- add_logs(usr, A, "electrified", addition="at [A.x],[A.y],[A.z]")
+ add_logs(usr, A, "electrified")
if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable.
A.safe = mend
if(WIRE_TIMING) // Cut to disable auto-close, mend to re-enable.
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 920d71870a2..bb4f8d28ffa 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1328,6 +1328,25 @@ var/list/teleportlocs = list()
icon_state = "tcomsatlounge"
+// Hell
+/area/hell
+ name = "Hell Lobby"
+ //icon = "ICON FILENAME"
+ //icon_state = "NAME OF ICON"
+ requires_power = 0
+ music = "music/music.ogg"
+
+/area/hell/trial1
+ name = "Hell Trial1"
+ //icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
+
+/area/hell/trial1
+ name = "Hell Trial2"
+ //icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
+
+/area/hell/trial1
+ name = "Hell Trial3"
+ //icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
// Away Missions
/area/awaymission
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 038b52b7a91..61366698333 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -312,6 +312,8 @@ var/list/blood_splatter_icons = list()
blood_DNA = null
return 1
+/atom/proc/wash_cream()
+ return 1
/atom/proc/get_global_map_pos()
if(!islist(global_map) || isemptylist(global_map)) return
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 4185dc51a4b..677601cd544 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -70,7 +70,10 @@
/proc/RoundHealth(mob/living/M)
if(M.stat == DEAD)
return "health-100" //what's our health? it doesn't matter, we're dead
- var/resulthealth = (M.health / M.maxHealth) * 100
+ var/maxhealth = M.maxHealth
+ if(iscarbon(M) && M.health < 0)
+ maxhealth = 100 //so crit shows up right for aliens and other high-health carbon mobs; noncarbons don't have crit.
+ var/resulthealth = (M.health / maxhealth) * 100
switch(resulthealth)
if(100 to INFINITY)
return "health100"
@@ -147,10 +150,10 @@
/mob/living/carbon/med_hud_set_status()
var/image/holder = hud_list[STATUS_HUD]
- if(stat == DEAD)
- holder.icon_state = "huddead"
- else if(status_flags & XENO_HOST)
+ if(status_flags & XENO_HOST)
holder.icon_state = "hudxeno"
+ else if(stat == DEAD)
+ holder.icon_state = "huddead"
else if(check_virus())
holder.icon_state = "hudill"
else
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 680317bb768..179d87099e2 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -15,6 +15,7 @@
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
if(!iscultist(user))
user.Weaken(5)
+ user.unEquip(src, 1)
user.visible_message("A powerful force shoves [user] away from [target]!", \
"\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")
if(ishuman(user))
@@ -50,7 +51,7 @@
/obj/item/weapon/restraints/legcuffs/bola/cult
- name = "nar'sian bola"
+ name = "nar'sien bola"
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
icon_state = "bola_cult"
breakouttime = 45
@@ -116,19 +117,215 @@
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
/obj/item/clothing/head/helmet/space/cult
- name = "nar-sian bruiser's helmet"
- desc = "A heavily-armored helmet worn by warriors of the Nar-Sian cult. It can withstand hard vacuum."
+ name = "nar-sien hardened helmet"
+ desc = "A heavily-armored helmet worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
icon_state = "cult_helmet"
item_state = "cult_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/cult
- name = "nar-sian bruiser's armor"
+ name = "nar-sien hardened armor"
icon_state = "cult_armor"
item_state = "cult_armor"
- desc = "A heavily-armored exosuit worn by warriors of the Nar-Sian cult. It can withstand hard vacuum."
- w_class = 3
+ desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
+ w_class = 2
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+
+/obj/item/weapon/sharpener/cult
+ name = "eldritch whetstone"
+ desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
+ used = 0
+ increment = 5
+ max = 40
+ prefix = "darkened"
+
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield
+ name = "empowered cultist armor"
+ desc = "Empowered garb which creates a powerful shield around the user."
+ icon_state = "cult_armor"
+ item_state = "cult_armor"
+ w_class = 4
+ armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30)
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ var/current_charges = 3
+ var/shield_state = "shield-red"
+ hooded = 1
+ hoodtype = /obj/item/clothing/head/cult_hoodie
+
+/obj/item/clothing/head/cult_hoodie
+ name = "empowered cultist armor"
+ desc = "Empowered garb which creates a powerful shield around the user."
+ icon_state = "cult_hoodalt"
+ armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30)
+ body_parts_covered = HEAD
+ flags = NODROP
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield/pickup(mob/living/user)
+ ..()
+ if(!iscultist(user))
+ user << "\"I wouldn't advise that.\""
+ user << "An overwhelming sense of nausea overpowers you!"
+ user.unEquip(src, 1)
+ user.Dizzy(30)
+ user.Weaken(5)
+
+
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, attack_text, isinhands)
+ if(current_charges > 0)
+ var/datum/effect_system/spark_spread/s = new
+ s.set_up(2, 1, src)
+ s.start()
+ owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!")
+ current_charges--
+ if(current_charges <= 0)
+ owner.visible_message("[owner]'s shield is destroyed!")
+ shield_state = "broken"
+ owner.update_inv_wear_suit()
+ return 1
+ return 0
+
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
+ . = list()
+ if(!isinhands)
+ . += image(icon = 'icons/effects/effects.dmi', icon_state = "[shield_state]")
+
+/obj/item/clothing/suit/hooded/cultrobes/berserker
+ name = "flagellant's robes"
+ desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
+ icon_state = "cultrobes"
+ item_state = "cultrobes"
+ flags_inv = HIDEJUMPSUIT
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
+ slowdown = -1
+ hooded = 1
+ hoodtype = /obj/item/clothing/head/berserkerhood
+
+/obj/item/clothing/head/berserkerhood
+ name = "flagellant's robes"
+ desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
+ icon_state = "culthood"
+ body_parts_covered = HEAD
+ flags = NODROP
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+ armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
+
+/obj/item/clothing/suit/hooded/cultrobes/berserker/pickup(mob/living/user)
+ ..()
+ if(!iscultist(user))
+ user << "\"I wouldn't advise that.\""
+ user << "An overwhelming sense of nausea overpowers you!"
+ user.unEquip(src, 1)
+ user.Dizzy(30)
+ user.Weaken(5)
+
+/obj/item/clothing/glasses/night/cultblind
+ desc = "May nar-sie guide you through the darkness and shield you from the light."
+ name = "zealot's blindfold"
+ icon_state = "blindfold"
+ item_state = "blindfold"
+ darkness_view = 8
+ flash_protect = 1
+
+/obj/item/clothing/glasses/night/cultblind/pickup(mob/living/user)
+ ..()
+ if(!iscultist(user))
+ user << "\"I wouldn't advise that.\""
+ user << "An overwhelming sense of nausea overpowers you!"
+ user.unEquip(src, 1)
+ user.Dizzy(30)
+ user.Weaken(5)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
+ name = "flask of unholy water"
+ desc = "Toxic to nonbelievers; this water renews and reinvigorates the faithful of nar'sie."
+ icon_state = "holyflask"
+ color = "#333333"
+ list_reagents = list("unholywater" = 40)
+
+/obj/item/device/shuttle_curse
+ name = "cursed orb"
+ desc = "You peer within this smokey orb and glimpse terrible fates befalling the escape shuttle."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state ="bluespace"
+ color = "#ff0000"
+ var/global/curselimit = 0
+
+/obj/item/device/shuttle_curse/attack_self(mob/user)
+ if(!iscultist(user))
+ user.unEquip(src, 1)
+ user.Weaken(5)
+ user << "A powerful force shoves you away from [src]!"
+ return
+ if(curselimit > 1)
+ user << "We have exhausted our ability to curse the shuttle."
+ return
+ if(SSshuttle.emergency.mode == SHUTTLE_CALL)
+ var/cursetime = 1500
+ var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
+ SSshuttle.emergency.setTimer(timer)
+ user << "You shatter the orb! A dark essence spirals into the air, then disappears."
+ playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1)
+ qdel(src)
+ sleep(20)
+ var/global/list/curses
+ if(!curses)
+ curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by two minutes.",
+ "The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by two minutes.",
+ "The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by two minutes.",
+ "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by two minutes.",
+ "A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by two minutes.",
+ "The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.")
+ var/message = pick_n_take(curses)
+ priority_announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
+ curselimit++
+
+/obj/item/device/cult_shift
+ name = "veil shifter"
+ desc = "The veil between worlds is weak, this relic teleports you forward a small distance. It may be used twice before its power is lost."
+ icon = 'icons/obj/cult.dmi'
+ icon_state ="shifter"
+ var/uses = 2
+
+/obj/item/device/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
+ var/mob/living/carbon/human/H = user
+ if(H.pulling && (istype(H.pulling, /mob/living)))
+ var/mob/living/victim = H.pulling
+ if(!victim.anchored)
+ victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
+ return
+
+/obj/item/device/cult_shift/attack_self(mob/user)
+ if(!iscultist(user))
+ user.unEquip(src, 1)
+ user.Weaken(5)
+ user << "A powerful force shoves you away from [src]!"
+ return
+ uses--
+ if (uses<1)
+ qdel(src)
+ var/mob/living/carbon/human/H = user
+ var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
+ var/turf/mobloc = get_turf(H.loc)//Safety
+
+ if(destination&&istype(mobloc, /turf))//So we don't teleport out of containers
+ spawn(0)
+ playsound(H.loc, "sparks", 50, 1)
+ anim(mobloc,src,'icons/mob/mob.dmi',,"cultout",,H.dir)
+
+ handle_teleport_grab(destination, H)
+ H.loc = destination
+
+ spawn(0)
+ PoolOrNew(/obj/effect/particle_effect/sparks, H.loc)
+ playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(H.loc, "sparks", 50, 1)
+ anim(H.loc,H,'icons/mob/mob.dmi',,"cultin",,H.dir)
+
+ else
+ H << "The veil cannot be torn here!"
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index d0df29a0c6e..3c3ccf77cdb 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -2,32 +2,146 @@
density = 1
anchored = 1
icon = 'icons/obj/cult.dmi'
+ var/cooldowntime = 0
+ var/health = 100
+ var/maxhealth = 100
+/obj/structure/cult/proc/getETA()
+ var/time = round((0-(world.time-cooldowntime))/600, 1)
+ var/eta = "[time] minutes."
+ if(time == 1)
+ eta = "about one minute."
+ else if(time == 0)
+ eta = "less than thirty seconds."
+ return eta
+
/obj/structure/cult/talisman
name = "altar"
- desc = "A bloodstained altar dedicated to Nar-Sie"
+ desc = "A bloodstained altar dedicated to Nar-Sie."
icon_state = "talismanaltar"
+
+/obj/structure/cult/talisman/attack_hand(mob/living/user)
+ if(!iscultist(user))
+ user << "You don't even begin to understand what these words mean..."
+ return
+ if(cooldowntime > world.time)
+ user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ return
+ cooldowntime = world.time + 2400
+ var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water")
+ switch(choice)
+ if("Eldritch Whetstone")
+ var/obj/item/weapon/sharpener/cult/N = new(get_turf(src))
+ user << "You kneel before the altar and your faith is rewarded with an [N.name]!"
+ if("Zealot's Blindfold")
+ var/obj/item/clothing/glasses/night/cultblind/N = new(get_turf(src))
+ user << "You kneel before the altar and your faith is rewarded with a [N.name]!"
+ if("Flask of Unholy Water")
+ var/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater/N = new(get_turf(src))
+ user << "You kneel before the altar and your faith is rewarded with a [N.name]!"
+
+
/obj/structure/cult/forge
name = "daemon forge"
- desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie"
+ desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie."
icon_state = "forge"
+ luminosity = 3
+
+/obj/structure/cult/forge/attack_hand(mob/living/user)
+ if(!iscultist(user))
+ user << "You don't even begin to understand what these words mean..."
+ return
+ if(cooldowntime > world.time)
+ user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ return
+ cooldowntime = world.time + 2400
+ var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit")
+ switch(choice)
+ if("Shielded Robe")
+ var/obj/item/clothing/suit/hooded/cultrobes/cult_shield/N = new(get_turf(src))
+ user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ if("Flagellant's Robe")
+ var/obj/item/clothing/suit/hooded/cultrobes/berserker/N = new(get_turf(src))
+ user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ if("Nar-Sien Hardsuit")
+ new /obj/item/clothing/head/helmet/space/cult(get_turf(src))
+ var /obj/item/clothing/suit/space/cult/N = new(get_turf(src))
+ user << "You work the forge as dark knowledge guides your hands, creating [N]!"
/obj/structure/cult/pylon
name = "pylon"
- desc = "A floating crystal that hums with an unearthly energy"
+ desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
icon_state = "pylon"
luminosity = 5
+ var/heal_delay = 50
+ var/last_shot = 0
+ var/list/corruption = list()
+
+/obj/structure/cult/pylon/New()
+ SSobj.processing |= src
+ corruption += get_turf(src)
+ for(var/i in 1 to 5)
+ for(var/t in corruption)
+ var/turf/T = t
+ corruption |= T.GetAtmosAdjacentTurfs()
+ ..()
+
+/obj/structure/cult/pylon/Destroy()
+ SSobj.processing.Remove(src)
+ return ..()
+
+/obj/structure/cult/pylon/process()
+ if((last_shot + heal_delay) <= world.time)
+ last_shot = world.time
+ for(var/mob/living/L in range(5, src))
+ if(iscultist(L))
+ var/mob/living/carbon/human/H = L
+ if(istype(H))
+ L.adjustBruteLoss(-1, 0)
+ L.adjustFireLoss(-1, 0)
+ L.updatehealth()
+ if(istype(L, /mob/living/simple_animal/hostile/construct))
+ var/mob/living/simple_animal/M = L
+ if(M.health < M.maxHealth)
+ M.adjustHealth(-2)
+ if(corruption.len)
+ var/turf/T = pick_n_take(corruption)
+ corruption -= T
+ if (istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava))
+ return
+ T.ChangeTurf(/turf/open/floor/engine/cult)
/obj/structure/cult/tome
- name = "desk"
- desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl"
+ name = "archives"
+ desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
icon_state = "tomealtar"
luminosity = 1
+/obj/structure/cult/tome/attack_hand(mob/living/user)
+ if(!iscultist(user))
+ user << "You don't even begin to understand what these words mean..."
+ return
+ if(cooldowntime > world.time)
+ user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ return
+ cooldowntime = world.time + 2400
+ var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Shift")
+ switch(choice)
+ if("Supply Talisman")
+ var/obj/item/weapon/paper/talisman/supply/N = new(get_turf(src))
+ N.uses = 2
+ user << "You summon [N] from the archives!"
+ if("Shuttle Curse")
+ var/obj/item/device/shuttle_curse/N = new(get_turf(src))
+ user << "You summon [N] from the archives!"
+ if("Veil Shift")
+ var /obj/item/device/cult_shift/N = new(get_turf(src))
+ user << "You summon [N] from the archives!"
+
/obj/effect/gateway
name = "gateway"
- desc = "You're pretty sure that abyss is staring back"
+ desc = "You're pretty sure that abyss is staring back."
icon = 'icons/obj/cult.dmi'
icon_state = "hole"
density = 1
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 4b75c8ce9d1..44e546a9f76 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -34,6 +34,7 @@ To draw a rune, use an arcane tome.
var/scribe_damage = 0.1 //how much damage you take doing it
var/allow_excess_invokers = 0 //if we allow excess invokers when being invoked
+ var/construct_invoke = 1 //if constructs can invoke it
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
var/keyword //The actual keyword for the rune
@@ -74,6 +75,13 @@ To draw a rune, use an arcane tome.
else
fail_invoke(user)
+/obj/effect/rune/attack_animal(mob/living/simple_animal/M)
+ if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
+ if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
+ attack_hand(M)
+ else
+ M << "You are unable to invoke the rune!"
+
/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding
visible_message("[src] fades away.")
invisibility = INVISIBILITY_OBSERVER
@@ -631,6 +639,7 @@ var/list/teleport_runes = list()
icon_state = "6"
color = rgb(126, 23, 23)
rune_in_use = 0 //One at a time, please!
+ construct_invoke = 0
var/mob/living/affecting = null
/obj/effect/rune/astral/examine(mob/user)
@@ -770,6 +779,7 @@ var/list/teleport_runes = list()
icon_state = "4"
color = rgb(200, 0, 0)
req_cultists = 3
+ construct_invoke = 0
/obj/effect/rune/blood_boil/invoke(var/list/invokers)
..()
@@ -797,6 +807,7 @@ var/list/teleport_runes = list()
cultist_desc = "manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
+ construct_invoke = 0
color = rgb(200, 0, 0)
/obj/effect/rune/manifest/New(loc)
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 0125bec86da..09d2e4be1c3 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -321,16 +321,28 @@
user << "This talisman will only work on a stack of metal sheets!"
log_game("Construct talisman failed - not a valid target")
-/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/metal/target, mob/user, proximity_flag, click_parameters)
+/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
..()
- if(proximity_flag && istype(target) && iscultist(user))
- var/turf/T = get_turf(target)
- if(target.use(25))
- new /obj/structure/constructshell(T)
- user << "The talisman clings to the metal and twists it into a construct shell!"
+ if(proximity_flag && iscultist(user))
+ if(istype(target, /obj/item/stack/sheet/metal))
+ var/turf/T = get_turf(target)
+ if(target.use(25))
+ new /obj/structure/constructshell(T)
+ user << "The talisman clings to the metal and twists it into a construct shell!"
+ user << sound('sound/effects/magic.ogg',0,1,25)
+ PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, T)
+ qdel(src)
+ if(istype(target, /obj/item/stack/sheet/plasteel))
+ var/quantity = target.amount
+ var/turf/T = get_turf(target)
+ new /obj/item/stack/sheet/runed_metal(T,quantity)
+ target.use(quantity)
+ user << "The talisman clings to the plasteel and runes of power appear on the surface!"
+ user << sound('sound/effects/magic.ogg',0,1,25)
+ PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, T)
qdel(src)
else
- user << "The talisman requires at least 25 sheets of metal!"
+ user << "The talisman requires metal or plasteel!"
//Talisman of Shackling: Applies special cuffs directly from the talisman
@@ -390,6 +402,6 @@
origin_tech = "materials=2;magnets=5"
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
- user.visible_message("[user]'s [src] shatter in a discharge of dark magic!", \
+ user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \
"Your [src] shatters in a discharge of dark magic!")
qdel(src)
diff --git a/code/game/gamemodes/demon/demon.dm b/code/game/gamemodes/demon/demon.dm
new file mode 100644
index 00000000000..743e95ad910
--- /dev/null
+++ b/code/game/gamemodes/demon/demon.dm
@@ -0,0 +1,40 @@
+var/global/list/whiteness = list (
+ /obj/item/clothing/under/color/white = 2,
+ /obj/item/clothing/under/rank/bartender = 1,
+ /obj/item/clothing/under/rank/chef = 1,
+ /obj/item/clothing/under/rank/chief_engineer = 1,
+ /obj/item/clothing/under/rank/scientist = 1,
+ /obj/item/clothing/under/rank/chemist = 1,
+ /obj/item/clothing/under/rank/chief_medical_officer = 1,
+ /obj/item/clothing/under/rank/geneticist = 1,
+ /obj/item/clothing/under/rank/virologist = 1,
+ /obj/item/clothing/under/rank/nursesuit = 1,
+ /obj/item/clothing/under/rank/medical = 1,
+ /obj/item/clothing/under/rank/det = 1,
+ /obj/item/clothing/under/suit_jacket/white = 0.5,
+ /obj/item/clothing/under/burial = 1
+)
+
+
+
+/mob/living/proc/check_devil_bane_multiplier(obj/item/weapon, mob/living/attacker)
+ switch(mind.devilinfo.bane)
+ if(BANE_WHITECLOTHES)
+ if(istype(attacker, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = attacker
+ if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(whiteness[U.type])
+ src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.")
+ return whiteness[U.type] + 1
+ if(BANE_TOOLBOX)
+ if(istype(weapon,/obj/item/weapon/storage/toolbox))
+ src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!")
+ return 2.5 // Will take four hits with a normal toolbox.
+ if(BANE_HARVEST)
+ if(istype(weapon,/obj/item/weapon/reagent_containers/food/snacks/grown/))
+ src.visible_message("The spirits of the harvest aid in the exorcism.", "The harvest spirits are harming you.")
+ src.Weaken(2)
+ qdel(weapon)
+ return 2
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/demon/demon_game_mode.dm b/code/game/gamemodes/demon/demon_game_mode.dm
new file mode 100644
index 00000000000..06856715515
--- /dev/null
+++ b/code/game/gamemodes/demon/demon_game_mode.dm
@@ -0,0 +1,108 @@
+/datum/game_mode
+ var/list/datum/mind/sintouched = list()
+ var/list/datum/mind/devils = list()
+ var/devil_ascended = 0 // Number of arch devils on station
+
+/datum/game_mode/proc/auto_declare_completion_sintouched()
+ var/text = ""
+ if(sintouched.len)
+ text += "
The sintouched were:"
+ var/list/sintouchedUnique = uniqueList(sintouched)
+ for(var/S in sintouchedUnique)
+ var/datum/mind/sintouched_mind = S
+ text += printplayer(sintouched_mind)
+ text += printobjectives(sintouched_mind)
+ text += "
"
+ text += "
"
+ world << text
+
+/datum/game_mode/proc/auto_declare_completion_devils()
+ /var/text = ""
+ if(devils.len)
+ text += "
The devils were:"
+ for(var/D in devils)
+ var/datum/mind/devil = D
+ text += printplayer(devil)
+ text += printdevilinfo(devil)
+ text += printobjectives(devil)
+ text += "
"
+ world << text
+
+/datum/game_mode/devil
+
+
+/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
+ var/mob/living/carbon/human/S = devil_mind.current
+ var/trueName= randomDevilName()
+ var/datum/objective/devil/soulquantity/soulquant = new
+ soulquant.owner = devil_mind
+ var/datum/objective/devil/soulquality/soulqual = new
+ soulqual.owner = devil_mind
+ devil_mind.objectives += soulqual
+ devil_mind.objectives += soulquant
+ devil_mind.devilinfo = devilInfo(trueName, 1)
+ devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]
[lawlorify[LAW][devil_mind.devilinfo.ban]]
[lawlorify[LAW][devil_mind.devilinfo.bane]]
[lawlorify[LAW][devil_mind.devilinfo.obligation]]
[lawlorify[LAW][devil_mind.devilinfo.banish]]
")
+ devil_mind.devilinfo.owner = devil_mind
+ devil_mind.devilinfo.give_base_spells(1)
+ spawn(10)
+ if(devil_mind.assigned_role == "Clown")
+ S << "Your infernal nature has allowed you to overcome your clownishness."
+ S.dna.remove_mutation(CLOWNMUT)
+
+/datum/mind/proc/announceDevilLaws()
+ if(!devilinfo)
+ return
+ current << "You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp."
+ current << "However, your infernal form is not without weaknesses."
+ current << lawlorify[LAW][src.devilinfo.bane]
+ current << lawlorify[LAW][src.devilinfo.ban]
+ current << lawlorify[LAW][src.devilinfo.obligation]
+ current << lawlorify[LAW][src.devilinfo.banish]
+ current << "
Remember, the crew can research your weaknesses if they find out your devil name.
"
+ var/obj_count = 1
+ current << "Your current objectives:"
+ for(var/O in objectives)
+ var/datum/objective/objective = O
+ current << "Objective #[obj_count]: [objective.explanation_text]"
+ obj_count++
+
+/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
+ if(!ply.devilinfo)
+ return ""
+ var/text = "The devil's true name is: [ply.devilinfo.truename]"
+ text += "The devil's bans were:"
+ text += " [lawlorify[LORE][ply.devilinfo.ban]]"
+ text += " [lawlorify[LORE][ply.devilinfo.bane]]"
+ text += " [lawlorify[LORE][ply.devilinfo.obligation]]"
+ text += " [lawlorify[LORE][ply.devilinfo.banish]]"
+ return text
+
+/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
+ hud.join_hud(devil_mind.current)
+ set_antag_hud(devil_mind.current, "devil")
+
+/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
+ hud.leave_hud(devil_mind.current)
+ set_antag_hud(devil_mind.current, null)
+
+/datum/game_mode/proc/update_sintouch_icons_added(datum/mind/sin_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
+ hud.join_hud(sin_mind.current)
+ set_antag_hud(sin_mind.current, "sintouched")
+
+/datum/game_mode/proc/update_sintouch_icons_removed(datum/mind/sin_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
+ hud.leave_hud(sin_mind.current)
+ set_antag_hud(sin_mind.current, null)
+
+/datum/game_mode/proc/update_soulless_icons_added(datum/mind/soulless_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
+ hud.join_hud(soulless_mind.current)
+ set_antag_hud(soulless_mind.current, "soulless")
+
+/datum/game_mode/proc/update_soulless_icons_removed(datum/mind/soulless_mind)
+ var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
+ hud.leave_hud(soulless_mind.current)
+ set_antag_hud(soulless_mind.current, null)
diff --git a/code/game/gamemodes/demon/demoninfo.dm b/code/game/gamemodes/demon/demoninfo.dm
new file mode 100644
index 00000000000..5c013496cac
--- /dev/null
+++ b/code/game/gamemodes/demon/demoninfo.dm
@@ -0,0 +1,413 @@
+#define POWERUPTHRESHOLD 3 //How many souls are needed per stage.
+
+#define BASIC_DEVIL 0
+#define BLOOD_LIZARD 1
+#define TRUE_DEVIL 2
+#define ARCH_DEVIL 3
+
+#define SOULVALUE soulsOwned.len-reviveNumber
+
+#define DEVILRESURRECTTIME 600
+
+var/global/list/allDevils = list()
+var/global/list/lawlorify = list (
+ LORE = list(
+ OBLIGATION_FOOD = "This devil seems to always offer it's victims food before slaughtering them.",
+ OBLIGATION_DRINK = "This devil seems to always offer it's victims a drink before slaughtering them.",
+ OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.",
+ OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.",
+ OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.",
+ OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.",
+ OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.",
+ BANE_SILVER = "Silver seems to gravely injure this devil.",
+ BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.",
+ BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.",
+ BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.",
+ BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.",
+ BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.",
+ BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.",
+ BAN_HURTWOMAN = "This devil seems to prefer hunting men.",
+ BAN_CHAPEL = "This devil avoids holy ground.",
+ BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.",
+ BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.",
+ BAN_STRIKEUNCONCIOUS = "This devil only shows interest in those who are awake.",
+ BAN_HURTLIZARD = "This devil will not strike a lizardman first.",
+ BAN_HURTANIMAL = "This devil avoids hurting animals.",
+ BANISH_WATER = "To banish the devil, you must sprinkle holy water upon it's body.",
+ BANISH_COFFIN = "This devil will return to life if it's remains are not placed within a coffin.",
+ BANISH_FORMALDYHIDE = "To banish the devil, you must inject it's lifeless body with embalming fluid.",
+ BANISH_RUNES = "This devil will resurrect after death, unless it's remains are within a rune.",
+ BANISH_CANDLES = "A large number of candles will prevent it from resurrecting.",
+ BANISH_DESTRUCTION = "It's corpse must be utterly destroyed to prevent resurrection.",
+ BANISH_FUNERAL_GARB = "Funeral garments will prevent the devil from resurrecting."
+ ),
+ LAW = list(
+ OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.",
+ OBLIGATION_DRINK = "When not acting in self defense, you must always offer your victim drink before harming them.",
+ OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.",
+ OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.",
+ OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.",
+ OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.",
+ OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.",
+ BAN_HURTWOMAN = "You must never harm a female outside of self defense.",
+ BAN_CHAPEL = "You must never attempt to enter the chapel.",
+ BAN_HURTPRIEST = "You must never attack a priest.",
+ BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
+ BAN_STRIKEUNCONCIOUS = "You must never strike an unconcious person.",
+ BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.",
+ BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
+ BANE_SILVER = "Silver, in all of it's forms shall be your downfall.",
+ BANE_SALT = "Salt will disrupt your magical abilities.",
+ BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.",
+ BANE_IRON = "Cold wrought iron shall act as poison to you.",
+ BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.",
+ BANE_HARVEST = "The fruits of the harvest shall be your downfall.",
+ BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.",
+ BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.",
+ BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.",
+ BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.",
+ BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.",
+ BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.",
+ BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
+ BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
+ )
+ )
+
+/datum/devilinfo/
+ var/datum/mind/owner = null
+ var/obligation
+ var/ban
+ var/bane
+ var/banish
+ var/truename
+ var/list/datum/mind/soulsOwned = new
+ var/reviveNumber = 0
+ var/form = BASIC_DEVIL
+ var/exists = 0
+
+/proc/randomDevilInfo(name = randomDevilName())
+ var/datum/devilinfo/devil = new
+ devil.truename = name
+ devil.bane = randomdevilbane()
+ devil.obligation = randomdevilobligation()
+ devil.ban = randomdevilban()
+ devil.banish = randomdevilbanish()
+ return devil
+
+/proc/devilInfo(name, saveDetails = 0)
+ if(allDevils[lowertext(name)])
+ return allDevils[lowertext(name)]
+ else
+ var/datum/devilinfo/devil = randomDevilInfo(name)
+ allDevils[lowertext(name)] = devil
+ devil.exists = saveDetails
+ return devil
+
+
+
+/proc/randomDevilName()
+ var/preTitle = ""
+ var/title = ""
+ var/mainName = ""
+ var/suffix = ""
+ if(prob(65))
+ if(prob(35))
+ preTitle = pick("Dark ", "Hellish ", "Fiery ", "Sinful ", "Blood ")
+ title = pick("Lord ", "Fallen Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept ")
+ var/probability = 100
+ mainName = pick("Hal", "Ve", "Odr", "Neit", "Ci", "Quon", "Mya", "Folth", "Wren", "Gyer", "Geyr", "Hil", "Niet", "Twou", "Hu", "Don")
+ while(prob(probability))
+ mainName += pick("hal", "ve", "odr", "neit", "ca", "quon", "mya", "folth", "wren", "gyer", "geyr", "hil", "niet", "twoe", "phi", "coa")
+ probability -= 20
+ if(prob(40))
+ suffix = pick(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")
+ return preTitle + title + mainName + suffix
+
+/proc/randomdevilobligation()
+ return pick(OBLIGATION_FOOD, OBLIGATION_DRINK, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
+
+/proc/randomdevilban()
+ return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
+
+/proc/randomdevilbane()
+ return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX)
+
+/proc/randomdevilbanish()
+ return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
+
+/datum/devilinfo/proc/add_soul(datum/mind/soul)
+ if(soulsOwned.Find(soul))
+ return
+ soulsOwned += soul
+ switch(SOULVALUE)
+ if(0)
+ owner.current << "Your hellish powers have been restored."
+ give_base_spells()
+ if(POWERUPTHRESHOLD)
+ increase_blood_lizard()
+ if(POWERUPTHRESHOLD*2)
+ increase_true_devil()
+ if(POWERUPTHRESHOLD*3)
+ increase_arch_devil()
+
+/datum/devilinfo/proc/remove_soul(datum/mind/soul)
+ if(soulsOwned.Remove(soul))
+ check_regression()
+
+/datum/devilinfo/proc/check_regression()
+ if (form == ARCH_DEVIL)
+ return //arch devil can't regress
+ switch(SOULVALUE)
+ if(-1)
+ remove_spells()
+ owner.current << "As punishment for your failures, all of your powers except contract creation have been revoked."
+ if(POWERUPTHRESHOLD-1)
+ regress_humanoid()
+ if(POWERUPTHRESHOLD*2-1)
+ regress_blood_lizard()
+
+/datum/devilinfo/proc/increase_form()
+ switch(form)
+ if(BASIC_DEVIL)
+ increase_blood_lizard()
+ if(BLOOD_LIZARD)
+ increase_true_devil()
+ if(TRUE_DEVIL)
+ increase_arch_devil()
+
+/datum/devilinfo/proc/regress_humanoid()
+ owner.current << "Your powers weaken, have more contracts be signed to regain power."
+ if(istype(owner.current, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = owner.current
+ H.set_species(/datum/species/human, 1)
+ H.regenerate_icons()
+ give_base_spells()
+ form = BASIC_DEVIL
+
+/datum/devilinfo/proc/regress_blood_lizard()
+ var/mob/living/carbon/true_devil/D = owner.current
+ D << "Your powers weaken, have more contracts be signed to regain power."
+ D.oldform.loc = D.loc
+ owner.transfer_to(D.oldform)
+ give_lizard_spells()
+ qdel(D)
+ form = BLOOD_LIZARD
+
+
+/datum/devilinfo/proc/increase_blood_lizard()
+ owner.current << "You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard."
+ sleep(50)
+ if(istype(owner.current, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = owner.current
+ H.set_species(/datum/species/lizard, 1)
+ H.underwear = "Nude"
+ H.undershirt = "Nude"
+ H.socks = "Nude"
+ H.dna.features["mcolor"] = "511" //A deep red
+ H.regenerate_icons()
+ else //Did the devil get hit by a staff of transmutation?
+ owner.current.color = "#501010"
+ give_lizard_spells()
+ form = BLOOD_LIZARD
+
+
+
+/datum/devilinfo/proc/increase_true_devil()
+ owner.current << "You feel as though your current form is about to shed. You will soon turn into a true devil."
+ sleep(50)
+ var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
+ A.faction |= "hell"
+ owner.current.loc = A
+ A.oldform = owner.current
+ owner.transfer_to(A)
+ A.set_name()
+ give_true_spells()
+ form = TRUE_DEVIL
+
+
+/datum/devilinfo/proc/increase_arch_devil()
+ var/mob/living/carbon/true_devil/D = owner.current
+ D << "You feel as though your form is about to ascend."
+ sleep(50)
+ if(!D)
+ return
+ D.visible_message("[D]'s skin begins to erupt with spikes.", \
+ "Your flesh begins creating a shield around yourself.")
+ sleep(100)
+ if(!D)
+ return
+ D.visible_message("The horns on [D]'s head slowly grow and elongate.", \
+ "Your body continues to mutate. Your telepathic abilities grow.")
+ sleep(90)
+ if(!D)
+ return
+ D.visible_message("[D]'s body begins to violently stretch and contort.", \
+ "You begin to rend apart the final barriers to ultimate power.")
+ sleep(40)
+ if(!D)
+ return
+ D << "Yes!"
+ sleep(10)
+ if(!D)
+ return
+ D << "YES!!"
+ sleep(10)
+ if(!D)
+ return
+ D << "YE--"
+ sleep(1)
+ if(!D)
+ return
+ world << "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\""
+ world << 'sound/hallucinations/veryfar_noise.ogg'
+ give_arch_spells()
+ D.convert_to_archdevil()
+ var/area/A = get_area(owner.current)
+ if(A)
+ notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, attack_not_jump = 1)
+ sleep(50)
+ if(!ticker.mode.devil_ascended)
+ SSshuttle.emergency.request(null, 0.3)
+ ticker.mode.devil_ascended++
+ form = ARCH_DEVIL
+
+/datum/devilinfo/proc/remove_spells()
+ for(var/X in owner.spell_list)
+ var/obj/effect/proc_holder/spell/S = X
+ if(!istype(S, /obj/effect/proc_holder/spell/targeted/summon_contract))
+ owner.RemoveSpell(S)
+
+/datum/devilinfo/proc/give_summon_contract()
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null))
+
+
+/datum/devilinfo/proc/give_base_spells(give_summon_contract = 0)
+ remove_spells()
+ owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork(null))
+ if(give_summon_contract)
+ give_summon_contract()
+
+/datum/devilinfo/proc/give_lizard_spells()
+ remove_spells()
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
+
+/datum/devilinfo/proc/give_true_spells()
+ remove_spells()
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork/greater(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball/hellish(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
+ //owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null)) TODO LORDPIDEY add this spell
+
+/datum/devilinfo/proc/give_arch_spells()
+ remove_spells()
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_pitchfork/ascended(null))
+ //owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null)) TODO LORDPIDEY
+
+/datum/devilinfo/proc/beginResurrectionCheck(mob/living/body)
+ if(SOULVALUE>0)
+ owner.current<< "Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body."
+ sleep(DEVILRESURRECTTIME)
+ if (!body || body.stat == DEAD)
+ if(SOULVALUE>0)
+ if(check_banishment(body))
+ owner.current<< "Unfortunately, the mortals have finished a ritual that prevents your resurrection."
+ return -1
+ else
+ owner.current<< "WE LIVE AGAIN!"
+ return hellish_resurrection(body)
+ else
+ owner.current<< "Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect."
+ return -1
+ else
+ owner.current << " You seem to have resurrected without your hellish powers."
+ else
+ owner.current << "Your hellish powers are too weak to resurrect yourself."
+
+/datum/devilinfo/proc/check_banishment(mob/living/body)
+ switch(banish)
+ if(BANISH_WATER)
+ if(istype(body, /mob/living/carbon))
+ var/mob/living/carbon/H = body
+ return H.reagents.has_reagent("holy water")
+ return 0
+ if(BANISH_COFFIN)
+ return (body && istype(body.loc, /obj/structure/closet/coffin))
+ if(BANISH_FORMALDYHIDE)
+ if(istype(body, /mob/living/carbon))
+ var/mob/living/carbon/H = body
+ return H.reagents.has_reagent("formaldehyde")
+ return 0
+ if(BANISH_RUNES)
+ if(body)
+ for(var/obj/effect/decal/cleanable/crayon/R in range(0,body))
+ if (R.name == "rune")
+ return 1
+ return 0
+ if(BANISH_CANDLES)
+ if(body)
+ var/count = 0
+ for(var/obj/item/candle/C in range(1,body))
+ count += C.lit
+ if(count>=4)
+ return 1
+ return 0
+ if(BANISH_DESTRUCTION)
+ if(body)
+ return 0
+ return 1
+ if(BANISH_FUNERAL_GARB)
+ if(istype(body, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = body
+ if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial))
+ return 1
+ return 0
+
+/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
+ message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.")
+ if(SOULVALUE < POWERUPTHRESHOLD * 3) // once ascended, arch devils do not go down in power by any means.
+ reviveNumber++
+ if(body)
+ body.revive(1,0)
+ body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
+ if(istype(body, /mob/living/carbon/true_devil))
+ var/mob/living/carbon/true_devil/D = body
+ if(D.oldform)
+ D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
+ else
+ if(blobstart.len > 0)
+ var/turf/targetturf = get_turf(pick(blobstart))
+ var/mob/currentMob = owner.current
+ if(!currentMob)
+ currentMob = owner.get_ghost()
+ if(!currentMob)
+ message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
+ return -1 //
+ if(currentMob.mind != owner)
+ message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
+ return -1
+ currentMob.change_mob_type( /mob/living/carbon/human , targetturf, null, 1)
+ var/mob/living/carbon/human/H = owner.current
+ give_summon_contract()
+ if(SOULVALUE >= POWERUPTHRESHOLD)
+ H.set_species(/datum/species/lizard, 1)
+ H.underwear = "Nude"
+ H.undershirt = "Nude"
+ H.socks = "Nude"
+ H.dna.features["mcolor"] = "511"
+ H.regenerate_icons()
+ if(SOULVALUE >= POWERUPTHRESHOLD * 2) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
+ var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
+ A.faction |= "hell"
+ H.forceMove(A)
+ A.oldform = H
+ A.set_name()
+ owner.transfer_to(A)
+ if(SOULVALUE >= POWERUPTHRESHOLD * 3)
+ A.convert_to_archdevil()
+
+ else
+ throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
+ check_regression()
\ No newline at end of file
diff --git a/code/game/gamemodes/demon/imp/imp.dm b/code/game/gamemodes/demon/imp/imp.dm
new file mode 100644
index 00000000000..76696ced406
--- /dev/null
+++ b/code/game/gamemodes/demon/imp/imp.dm
@@ -0,0 +1,56 @@
+//////////////////The Monster
+
+/mob/living/simple_animal/imp
+ name = "imp"
+ real_name = "imp"
+ desc = "A large, menacing creature covered in armored black scales."
+ speak_emote = list("cackles")
+ emote_hear = list("cackles","screeches")
+ response_help = "thinks better of touching"
+ response_disarm = "flails at"
+ response_harm = "punches"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "imp"
+ icon_living = "imp"
+ speed = 1
+ a_intent = "harm"
+ stop_automated_movement = 1
+ status_flags = CANPUSH
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 250 //Weak to cold
+ maxbodytemp = INFINITY
+ faction = list("hell")
+ attacktext = "wildly tears into"
+ maxHealth = 200
+ health = 200
+ healable = 0
+ environment_smash = 1
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+ see_in_dark = 8
+ var/boost = 0
+ bloodcrawl = BLOODCRAWL_EAT
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ var/list/consumed_mobs = list()
+ var/playstyle_string = "You are an imp, a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
+ Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
+ of intentionally harming a fellow devil."
+
+/mob/living/simple_animal/imp/New()
+ ..()
+ boost = world.time + 30
+
+/mob/living/simple_animal/imp/Life()
+ ..()
+ if(boost[src] screams in agony as it sublimates into a sulfurous smoke.")
+ ghostize()
+ qdel(src)
diff --git a/code/game/gamemodes/demon/objectives.dm b/code/game/gamemodes/demon/objectives.dm
new file mode 100644
index 00000000000..bdcac75b8e2
--- /dev/null
+++ b/code/game/gamemodes/demon/objectives.dm
@@ -0,0 +1,62 @@
+/datum/objective/devil
+ dangerrating = 5
+
+/datum/objective/devil/soulquantity
+ explanation_text = "You shouldn't see this text. Error:DEVIL1"
+ var/quantity = 4
+
+/datum/objective/devil/soulquantity/New()
+ quantity = pick(4,5)
+ explanation_text = "Purchase, and retain control over at least [quantity] souls."
+
+/datum/objective/devil/soulquantity/check_completion()
+ var/count = 0
+ for(var/S in owner.devilinfo.soulsOwned)
+ var/datum/mind/L = S
+ if(L.soulOwner != L)
+ count++
+ return count >= quantity
+
+/datum/objective/devil/soulquality
+ explanation_text = "You shouldn't see this text. Error:DEVIL2"
+ var/contractType
+ var/quantity
+
+/datum/objective/devil/soulquality/New()
+ contractType = pick(CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_REVIVE, CONTRACT_KNOWLEDGE/*, CONTRACT_UNWILLING*/)
+ var/contractName
+ quantity = pick(1,2)
+ switch(contractType)
+ if(CONTRACT_POWER)
+ contractName = "for power"
+ if(CONTRACT_WEALTH)
+ contractName = "for wealth"
+ if(CONTRACT_PRESTIGE)
+ contractName = "for prestige"
+ if(CONTRACT_MAGIC)
+ contractName = "for magic"
+ if(CONTRACT_REVIVE)
+ contractName = "of revival"
+ if(CONTRACT_KNOWLEDGE)
+ contractName = "for knowledge"
+ //if(CONTRACT_UNWILLING) //Makes round unfun.
+ // contractName = "against their will"
+ explanation_text = "Have mortals sign at least [quantity] contracts [contractName]"
+
+/datum/objective/devil/soulquality/check_completion()
+ var/count = 0
+ for(var/S in owner.devilinfo.soulsOwned)
+ var/datum/mind/L = S
+ if(L.soulOwner != L && L.damnation_type == contractType)
+ count++
+ return count>=quantity
+
+/datum/objective/devil/sintouch
+ var/quantity
+
+/datum/objective/devil/sintouch/New()
+ quantity = pick(4,5)
+ explanation_text = "Ensure at least [quantity] mortals are sintouched."
+
+/datum/objective/devil/sintouch/check_completion()
+ return quantity>=ticker.mode.sintouched.len
\ No newline at end of file
diff --git a/code/game/gamemodes/demon/true_demon/_true_demon.dm b/code/game/gamemodes/demon/true_demon/_true_demon.dm
new file mode 100644
index 00000000000..36d491df5f9
--- /dev/null
+++ b/code/game/gamemodes/demon/true_demon/_true_demon.dm
@@ -0,0 +1,195 @@
+#define DEVIL_HANDS_LAYER 1
+#define DEVIL_HEAD_LAYER 2
+#define DEVIL_TOTAL_LAYERS 2
+
+
+/mob/living/carbon/true_devil
+ name = "True Devil"
+ desc = "A pile of infernal energy, taking a vaguely humanoid form."
+ icon = 'icons/mob/32x64.dmi'
+ icon_state = "true_devil"
+ gender = NEUTER
+ health = 350
+ maxHealth = 350
+ ventcrawler = 0
+ density = 0
+ pass_flags = 0
+ var/ascended = 0
+ sight = (SEE_TURFS | SEE_OBJS)
+ status_flags = CANPUSH
+ languages = ALL //The devil speaks all languages meme
+ mob_size = MOB_SIZE_LARGE
+ var/mob/living/oldform
+ var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
+
+/mob/living/carbon/true_devil/New()
+ internal_organs += new /obj/item/organ/brain/
+ internal_organs += new /obj/item/organ/tongue
+ for(var/X in internal_organs)
+ var/obj/item/organ/I = X
+ I.Insert(src)
+ ..()
+
+
+/mob/living/carbon/true_devil/proc/convert_to_archdevil()
+ maxHealth = 5000 // not an IMPOSSIBLE amount, but still near impossible.
+ ascended = 1
+ health = maxHealth
+ icon_state = "arch_devil"
+
+/mob/living/carbon/true_devil/proc/set_name()
+ name = mind.devilinfo.truename
+ real_name = name
+
+/mob/living/carbon/true_devil/Login()
+ ..()
+ mind.announceDevilLaws()
+
+
+/mob/living/carbon/true_devil/death(gibbed)
+ stat = DEAD
+ ..(gibbed)
+ drop_l_hand()
+ drop_r_hand()
+ spawn (0)
+ mind.devilinfo.beginResurrectionCheck(src)
+
+
+/mob/living/carbon/true_devil/examine(mob/user)
+ var/msg = "*---------*\nThis is \icon[src] [src]!\n"
+
+ //Left hand items
+ if(l_hand && !(l_hand.flags&ABSTRACT))
+ if(l_hand.blood_DNA)
+ msg += "It is holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] blood-stained [l_hand.name] in its left hand!\n"
+ else
+ msg += "It is holding \icon[l_hand] \a [l_hand] in its left hand.\n"
+
+ //Right hand items
+ if(r_hand && !(r_hand.flags&ABSTRACT))
+ if(r_hand.blood_DNA)
+ msg += "It is holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] blood-stained [r_hand.name] in its right hand!\n"
+ else
+ msg += "It is holding \icon[r_hand] \a [r_hand] in its right hand.\n"
+
+ //Braindead
+ if(!client && stat != DEAD)
+ msg += "The devil seems to be in deep contemplation.\n"
+
+ //Damaged
+ if(stat == DEAD)
+ msg += "The hellfire seems to have been extinguished, for now at least.\n"
+ else if(health < (maxHealth/10))
+ msg += "You can see hellfire inside of it's gaping wounds.\n"
+ else if(health < (maxHealth/2))
+ msg += "You can see hellfire inside of it's wounds.\n"
+ msg += "*---------*"
+ user << msg
+
+
+/mob/living/carbon/true_devil/IsAdvancedToolUser()
+ return 1
+
+
+/mob/living/carbon/true_devil/canUseTopic()
+ if(stat)
+ return
+ return 1
+
+
+/mob/living/carbon/true_devil/assess_threat()
+ return 666
+
+/mob/living/carbon/true_devil/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
+ if(mind && mind.devilinfo.bane == BANE_LIGHT)
+ if(has_bane(BANE_LIGHT))
+ mind.disrupt_spells(-500)
+ return ..() //flashes don't stop devils UNLESS it's their bane.
+
+
+/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
+ var/weakness = check_weakness(I, user)
+ apply_damage(I.force * weakness, I.damtype, def_zone)
+ var/message_verb = ""
+ if(I.attack_verb && I.attack_verb.len)
+ message_verb = "[pick(I.attack_verb)]"
+ else if(I.force)
+ message_verb = "attacked"
+
+ var/attack_message = "[src] has been [message_verb] with [I]."
+ if(user)
+ user.do_attack_animation(src)
+ if(user in viewers(src, null))
+ attack_message = "[user] has [message_verb] [src] with [I]!"
+ if(message_verb)
+ visible_message("[attack_message]",
+ "[attack_message]")
+
+/mob/living/carbon/true_devil/UnarmedAttack(atom/A, proximity)
+ A.attack_hand(src)
+
+/mob/living/carbon/true_devil/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/mob/living/carbon/true_devil/ex_act(severity)
+ if(ascended)
+ return 0
+ return ..()
+
+/mob/living/carbon/true_devil/singularity_act()
+ if(ascended)
+ return 0
+ return ..()
+
+/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
+ if(ascended || user.mind.soulOwner == src.mind)
+ var/mob/living/simple_animal/imp/S = new(get_turf(loc))
+ S.key = user.key
+ S.mind.assigned_role = "Imp"
+ S.mind.special_role = "Imp"
+ var/datum/objective/newobjective = new
+ newobjective.explanation_text = "Try to get a promotion to a higher devilic rank."
+ S.mind.objectives += newobjective
+ S << S.playstyle_string
+ S << "Objective #[1]: [newobjective.explanation_text]"
+ return
+ else
+ return ..()
+
+/mob/living/carbon/true_devil/can_be_revived()
+ return 1
+
+/mob/living/carbon/true_devil/resist_fire()
+ //They're immune to fire.
+
+/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
+ if(..())
+ switch(M.a_intent)
+ if ("harm")
+ var/damage = rand(1, 5)
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[M] has punched [src]!", \
+ "[M] has punched [src]!")
+ adjustBruteLoss(damage)
+ add_logs(M, src, "attacked")
+ updatehealth()
+ if ("disarm")
+ if (!lying && !ascended) //No stealing the arch devil's pitchfork.
+ if (prob(5))
+ Paralyse(2)
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ add_logs(M, src, "pushed")
+ visible_message("[M] has pushed down [src]!", \
+ "[M] has pushed down [src]!")
+ else
+ if (prob(25))
+ drop_item()
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("[M] has disarmed [src]!", \
+ "[M] has disarmed [src]!")
+ else
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ visible_message("[M] has attempted to disarm [src]!")
+
+/mob/living/carbon/true_devil/handle_breathing()
+ // devils do not need to breathe
diff --git a/code/game/gamemodes/demon/true_demon/inventory.dm b/code/game/gamemodes/demon/true_demon/inventory.dm
new file mode 100644
index 00000000000..23035370135
--- /dev/null
+++ b/code/game/gamemodes/demon/true_demon/inventory.dm
@@ -0,0 +1,61 @@
+/mob/living/carbon/true_devil/unEquip(obj/item/I, force)
+ if(..(I,force))
+ update_inv_hands()
+ return 1
+ return 0
+
+/mob/living/carbon/true_devil/proc/update_inv_hands()
+ //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_image should use the down sprite when facing down, left, or right, and the up sprite when facing up.
+ remove_overlay(DEVIL_HANDS_LAYER)
+ var/list/hands_overlays = list()
+
+ if(r_hand)
+
+ var/r_state = r_hand.item_state
+ if(!r_state)
+ r_state = r_hand.icon_state
+
+ var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
+
+ hands_overlays += r_hand_image
+
+ if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
+ r_hand.layer = 20
+ r_hand.screen_loc = ui_rhand
+ client.screen |= r_hand
+
+ if(l_hand)
+
+ var/l_state = l_hand.item_state
+ if(!l_state)
+ l_state = l_hand.icon_state
+
+ var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
+
+ hands_overlays += l_hand_image
+
+ if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
+ l_hand.layer = 20
+ l_hand.screen_loc = ui_lhand
+ client.screen |= l_hand
+ if(hands_overlays.len)
+ devil_overlays[DEVIL_HANDS_LAYER] = hands_overlays
+ apply_overlay(DEVIL_HANDS_LAYER)
+
+/mob/living/carbon/true_devil/update_inv_l_hand()
+ update_inv_hands()
+
+
+/mob/living/carbon/true_devil/update_inv_r_hand()
+ update_inv_hands()
+
+/mob/living/carbon/true_devil/remove_overlay(cache_index)
+ if(devil_overlays[cache_index])
+ overlays -= devil_overlays[cache_index]
+ devil_overlays[cache_index] = null
+
+
+/mob/living/carbon/true_devil/apply_overlay(cache_index)
+ var/image/I = devil_overlays[cache_index]
+ if(I)
+ overlays += I
\ No newline at end of file
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index b4cd86efb66..ae28e671888 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -172,7 +172,8 @@
/datum/game_mode/proc/check_finished() //to be called by ticker
if(replacementmode && round_converted == 2)
return replacementmode.check_finished()
- if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || station_was_nuked)
+ if((SSshuttle.emergency && SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) \
+ || station_was_nuked)
return 1
if(!round_converted && (!config.continuous[config_tag] || (config.continuous[config_tag] && config.midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 307b26857ae..2374d6382de 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -163,6 +163,7 @@
AL.close()
AL.bolt() //Bolt it!
AL.secondsElectrified = -1 //Shock it!
+ AL.shockedby += "\[[time_stamp()]\][src](ckey:[src.ckey])"
else if(!D.stat) //So that only powered doors are closed.
D.close() //Close ALL the doors!
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 03d896d0e1d..b0509ca1b28 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -1,24 +1,45 @@
////Deactivated swarmer shell////
-/obj/item/unactivated_swarmer
+/obj/item/device/unactivated_swarmer
name = "unactivated swarmer"
desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this."
icon = 'icons/mob/swarmer.dmi'
icon_state = "swarmer_unactivated"
+ origin_tech = "bluespace=4;materials=4;programming=6"
+ materials = list(MAT_METAL=10000, MAT_GLASS=4000)
-/obj/item/unactivated_swarmer/New()
- notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, attack_not_jump = 1)
+
+/obj/item/device/unactivated_swarmer/New()
+ if(!crit_fail)
+ notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, attack_not_jump = 1)
..()
-/obj/item/unactivated_swarmer/Topic(href, href_list)
+/obj/item/device/unactivated_swarmer/Topic(href, href_list)
if(href_list["ghostjoin"])
var/mob/dead/observer/ghost = usr
if(istype(ghost))
attack_ghost(ghost)
-/obj/item/unactivated_swarmer/attack_ghost(mob/user)
+/obj/item/device/unactivated_swarmer/attackby(obj/item/weapon/W, mob/user, params)
+ ..()
+ if(istype(W, /obj/item/weapon/screwdriver) && !crit_fail)
+ user.visible_message("[usr.name] deactivates [src].",
+ "After some fiddling, you find a way to disable [src]'s power source.",
+ "You hear clicking.")
+ name = "deactivated swarmer"
+ desc = "A shell of swarmer that was completely powered down. It no longer can activate itself."
+ crit_fail = 1
+
+/obj/item/device/unactivated_swarmer/attack_ghost(mob/user)
+ if(crit_fail)
+ user << "This swarmer shell is completely depowered. You cannot activate it."
+ return
+
var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No")
if(be_swarmer == "No")
return
+ if(crit_fail)
+ user << "Swarmer has been depowered."
+ return
if(qdeleted(src))
user << "Swarmer has been occupied by someone else."
return
@@ -26,6 +47,13 @@
S.key = user.key
qdel(src)
+
+/obj/item/device/unactivated_swarmer/deactivated
+ name = "deactivated swarmer"
+ desc = "A shell of swarmer that was completely powered down. It no longer can activate itself."
+ crit_fail = 1
+
+
////The Mob itself////
/mob/living/simple_animal/hostile/swarmer
@@ -494,7 +522,7 @@
src << "This is not a suitable location for replicating ourselves. We need more room."
return
if(do_mob(src, src, 100))
- if(Fabricate(/obj/item/unactivated_swarmer, 50))
+ if(Fabricate(/obj/item/device/unactivated_swarmer, 50))
playsound(loc,'sound/items/poster_being_created.ogg',50, 1, -1)
/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
index ce74d37a293..364a74aeb0c 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
@@ -15,7 +15,7 @@
return 0
if(!the_gateway)
return 0
- new /obj/item/unactivated_swarmer(get_turf(the_gateway))
+ new /obj/item/device/unactivated_swarmer(get_turf(the_gateway))
if(prob(25)) //25% chance to announce it to the crew
var/swarmer_report = "[command_name()] High-Priority Update"
swarmer_report += "
Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index 5e3dc15f8d9..624660cdb8d 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -52,6 +52,20 @@
..()
return
+/mob/living/simple_animal/hostile/morph/med_hud_set_health()
+ if(morphed)
+ var/image/holder = hud_list[HEALTH_HUD]
+ holder.icon_state = null
+ return //we hide medical hud while morphed
+ ..()
+
+/mob/living/simple_animal/hostile/morph/med_hud_set_status()
+ if(morphed)
+ var/image/holder = hud_list[STATUS_HUD]
+ holder.icon_state = null
+ return //we hide medical hud while morphed
+ ..()
+
/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it
if(istype(A,/obj/screen))
return 0
@@ -96,6 +110,8 @@
speed = 0
morph_time = world.time + MORPH_COOLDOWN
+ med_hud_set_health()
+ med_hud_set_status() //we're an object honest
return
/mob/living/simple_animal/hostile/morph/proc/restore()
@@ -120,6 +136,8 @@
speed = initial(speed)
morph_time = world.time + MORPH_COOLDOWN
+ med_hud_set_health()
+ med_hud_set_status() //we are not an object
/mob/living/simple_animal/hostile/morph/death(gibbed)
if(morphed)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 5725354a7ea..7ca8a800923 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -43,6 +43,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
speed = 1
unique_name = 1
+ hud_possible = list(ANTAG_HUD)
var/essence = 75 //The resource, and health, of revenants.
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
@@ -133,6 +134,12 @@
essencecolor = "#1D2953" //oh jeez you're dying
hud_used.healths.maptext = "[essence]E
"
+/mob/living/simple_animal/revenant/med_hud_set_health()
+ return //we use no hud
+
+/mob/living/simple_animal/revenant/med_hud_set_status()
+ return //we use no hud
+
/mob/living/simple_animal/revenant/say(message)
if(!message)
return
diff --git a/code/game/gamemodes/miniantags/sintouched/objectives.dm b/code/game/gamemodes/miniantags/sintouched/objectives.dm
new file mode 100644
index 00000000000..86572782ca8
--- /dev/null
+++ b/code/game/gamemodes/miniantags/sintouched/objectives.dm
@@ -0,0 +1,35 @@
+/datum/objective/sintouched
+ dangerrating = 5
+ completed = 1
+
+/* NO ERP OBJECTIVE FOR YOU.
+/datum/objective/sintouched/lust
+ dangerrating = 3 // it's not AS dangerous.
+
+/datum/objective/sintouched/lust/New()
+ var/mob/dead/D = pick(dead_mob_list)
+ if(prob(50) && D)
+ explanation_text = "You know that [D] has perished.... and you think [D] is kinda cute. Make sure everyone knows how HOT [D]'s lifeless body is."
+ else
+ explanation_text = "Go get married, then immediately cheat on your new spouse." */
+
+/datum/objective/sintouched/gluttony
+ explanation_text = "Everything is so delicious. Go eat everything."
+
+/datum/objective/sintouched/greed
+ explanation_text = "You want MORE, more money, more wealth, more riches. Go get it, but don't hurt people for it."
+
+/datum/objective/sintouched/sloth
+ explanation_text = "You just get tired randomly. Go take a nap at a time that would inconvenience other people."
+
+/datum/objective/sintouched/wrath
+ explanation_text = "What have your coworkers ever done for you? Don't offer to help them in any matter, and refuse if asked."
+
+/datum/objective/sintouched/envy
+ explanation_text = "Why should you be stuck with your rank? Show everyone you can do other jobs too, and don't let anyone stop you, least of all because you have no training"
+
+/datum/objective/sintouched/pride
+ explanation_text = "You are the BEST thing on the station. Make sure everyone knows it."
+
+/datum/objective/sintouched/acedia
+ explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
\ No newline at end of file
diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
index 3195368f124..4f2725dce69 100644
--- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm
+++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
@@ -14,6 +14,7 @@
speed = 0
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ hud_possible = list(ANTAG_HUD)
response_help = "pokes"
response_disarm = "flails at"
@@ -31,6 +32,12 @@
faction = list("faithless")
+/mob/living/simple_animal/ascendant_shadowling/med_hud_set_health()
+ return //we're invincible!
+
+/mob/living/simple_animal/ascendant_shadowling/med_hud_set_status()
+ return //we're invincible!
+
/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(movement_dir = 0)
return 1 //copypasta from carp code
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 68cc017cfd3..253c17eeeb0 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -25,16 +25,20 @@
/obj/machinery/sleeper/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- component_parts += new /obj/item/weapon/circuitboard/sleeper(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/sleeper(null)
+ B.apply_default_parts(src)
update_icon()
+/obj/item/weapon/circuitboard/machine/sleeper
+ name = "circuit board (Sleeper)"
+ build_path = /obj/machinery/sleeper
+ origin_tech = "programming=3;biotech=2;engineering=3;materials=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 2)
+
/obj/machinery/sleeper/RefreshParts()
var/E
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
@@ -186,4 +190,4 @@
/obj/machinery/sleeper/old
- icon_state = "oldpod"
+ icon_state = "oldpod"
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index 13426cbbdfe..7c5abe61c07 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -4,7 +4,6 @@
/obj/machinery/door/airlock
var/id_tag
var/frequency
- var/shockedby = list()
var/datum/radio_frequency/radio_connection
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 393f2f4f600..529e77bf55a 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -32,14 +32,19 @@ var/list/announcement_systems = list()
announcement_systems += src
radio = new /obj/item/device/radio/headset/ai(src)
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/announcement_system(null)
- component_parts += new /obj/item/stack/cable_coil(null, 2)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/announcement_system(null)
+ B.apply_default_parts(src)
update_icon()
+/obj/item/weapon/circuitboard/machine/announcement_system
+ name = "circuit board (Announcement System)"
+ build_path = /obj/machinery/announcement_system
+ origin_tech = "programming=3;bluespace=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
/obj/machinery/announcement_system/update_icon()
if(is_operational())
icon_state = (panel_open ? "AAS_On_Open" : "AAS_On")
@@ -178,4 +183,4 @@ var/list/announcement_systems = list()
/obj/machinery/announcement_system/emag_act()
if(!emagged)
emagged = 1
- act_up()
+ act_up()
\ No newline at end of file
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 5e03d4b9dc3..4014ad407ec 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -47,20 +47,23 @@
/obj/machinery/autolathe/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/autolathe(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1))
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null)
+ B.apply_default_parts(src)
wires = new /datum/wires/autolathe(src)
files = new /datum/research/autolathe(src)
matching_designs = list()
+/obj/item/weapon/circuitboard/machine/autolathe
+ name = "circuit board (Autolathe)"
+ build_path = /obj/machinery/autolathe
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 3,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
/obj/machinery/autolathe/Destroy()
qdel(wires)
wires = null
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 604fb26bed0..ddbdcfa4e09 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -25,16 +25,8 @@
/obj/machinery/clonepod/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/clonepod(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null)
+ B.apply_default_parts(src)
/obj/machinery/clonepod/RefreshParts()
speed_coeff = 0
@@ -47,6 +39,16 @@
if(heal_level > 100)
heal_level = 100
+/obj/item/weapon/circuitboard/machine/clonepod
+ name = "circuit board (Clone Pod)"
+ build_path = /obj/machinery/clonepod
+ origin_tech = "programming=3;biotech=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
@@ -201,7 +203,7 @@
return
if((src.occupant) && (src.occupant.loc == src))
- if((src.occupant.stat == DEAD) || (src.occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes.
+ if((src.occupant.stat == DEAD) || (src.occupant.suiciding) || !occupant.key || src.occupant.hellbound) //Autoeject corpses and suiciding dudes.
src.locked = 0
src.go_out()
src.connected_message("Clone Rejected: Deceased.")
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index ea7a6a1c704..0989ee50a59 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -3,7 +3,7 @@
desc = "Used to monitor the vitals of a patient during surgery."
icon_screen = "crew"
icon_keyboard = "med_key"
- circuit = /obj/item/weapon/circuitboard/operating
+ circuit = /obj/item/weapon/circuitboard/computer/operating
var/mob/living/carbon/human/patient = null
var/obj/structure/table/optable/table = null
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 69c53cf517b..962fb705408 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -4,7 +4,7 @@
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupier = null
var/active = 0
- circuit = /obj/item/weapon/circuitboard/aifixer
+ circuit = /obj/item/weapon/circuitboard/computer/aifixer
icon_keyboard = "tech_key"
icon_screen = "ai-fixer"
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index d35ba8c6bb8..253a3c1c8d7 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -1,1111 +1,1115 @@
-/obj/machinery/computer/arcade/
- name = "random arcade"
- desc = "random arcade machine"
- icon_state = "arcade"
- icon_keyboard = null
- icon_screen = "invaders"
- var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
- /obj/item/toy/AI = 2,
- /obj/item/clothing/under/syndicate/tacticool = 2,
- /obj/item/toy/sword = 2,
- /obj/item/toy/gun = 2,
- /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
- /obj/item/weapon/storage/box/fakesyndiesuit = 2,
- /obj/item/weapon/storage/crayons = 2,
- /obj/item/toy/spinningtoy = 2,
- /obj/item/toy/prize/ripley = 1,
- /obj/item/toy/prize/fireripley = 1,
- /obj/item/toy/prize/deathripley = 1,
- /obj/item/toy/prize/gygax = 1,
- /obj/item/toy/prize/durand = 1,
- /obj/item/toy/prize/honk = 1,
- /obj/item/toy/prize/marauder = 1,
- /obj/item/toy/prize/seraph = 1,
- /obj/item/toy/prize/mauler = 1,
- /obj/item/toy/prize/odysseus = 1,
- /obj/item/toy/prize/phazon = 1,
- /obj/item/toy/prize/reticence = 1,
- /obj/item/toy/cards/deck = 2,
- /obj/item/toy/nuke = 2,
- /obj/item/toy/minimeteor = 2,
- /obj/item/toy/carpplushie = 2,
- /obj/item/toy/foamblade = 2,
- /obj/item/toy/redbutton = 2,
- /obj/item/toy/talking/owl = 2,
- /obj/item/toy/talking/griffin = 2,
- /obj/item/weapon/coin/antagtoken = 2,
- /obj/item/stack/tile/fakespace/loaded = 2,
- /obj/item/toy/toy_xeno = 2,
- /obj/item/weapon/restraints/handcuffs/fake = 2
- )
-
-/obj/machinery/computer/arcade/New()
- ..()
- // If it's a generic arcade machine, pick a random arcade
- // circuit board for it and make the new machine
- if(!circuit)
- var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade))
- var/obj/item/weapon/circuitboard/CB = new choice()
- new CB.build_path(loc, CB)
- qdel(src)
-
-/obj/machinery/computer/arcade/proc/prizevend()
- if(!contents.len)
- var/prizeselect = pickweight(prizes)
- new prizeselect(src.loc)
-
- if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
- new /obj/item/toy/ammo/gun(src.loc)
-
- else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
- new /obj/item/clothing/head/syndicatefake(src.loc)
-
- else
- var/atom/movable/prize = pick(contents)
- prize.loc = src.loc
-
-/obj/machinery/computer/arcade/emp_act(severity)
- ..(severity)
-
- if(stat & (NOPOWER|BROKEN))
- return
-
- var/empprize = null
- var/num_of_prizes = 0
- switch(severity)
- if(1)
- num_of_prizes = rand(1,4)
- if(2)
- num_of_prizes = rand(0,2)
- for(var/i = num_of_prizes; i > 0; i--)
- empprize = pickweight(prizes)
- new empprize(src.loc)
- explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes)
-
-
-// ** BATTLE ** //
-
-
-/obj/machinery/computer/arcade/battle
- name = "arcade machine"
- desc = "Does not support Pinball."
- icon_state = "arcade"
- circuit = /obj/item/weapon/circuitboard/arcade/battle
- var/enemy_name = "Space Villian"
- var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc
- var/player_hp = 30 //Player health/attack points
- var/player_mp = 10
- var/enemy_hp = 45 //Enemy health/attack points
- var/enemy_mp = 20
- var/gameover = 0
- var/blocked = 0 //Player cannot attack/heal while set
- var/turtle = 0
-
-/obj/machinery/computer/arcade/battle/New()
- ..()
- var/name_action
- var/name_part1
- var/name_part2
-
- name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
-
- name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
- name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
-
- src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
- src.name = (name_action + name_part1 + name_part2)
-
-/obj/machinery/computer/arcade/battle/attack_hand(mob/user)
- if(..())
- return
- user.set_machine(src)
- var/dat = "Close"
- dat += "[src.enemy_name]
"
-
- dat += "
[src.temp]
"
- dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]"
-
- if (src.gameover)
- dat += "New Game"
- else
- dat += "Attack | "
- dat += "Heal | "
- dat += "Recharge Power"
-
- dat += ""
-
- //user << browse(dat, "window=arcade")
- //onclose(user, "arcade")
- var/datum/browser/popup = new(user, "arcade", "Space Villian 2000")
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/computer/arcade/battle/Topic(href, href_list)
- if(..())
- return
-
- if (!src.blocked && !src.gameover)
- if (href_list["attack"])
- src.blocked = 1
- var/attackamt = rand(2,6)
- src.temp = "You attack for [attackamt] damage!"
- playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.updateUsrDialog()
- if(turtle > 0)
- turtle--
-
- sleep(10)
- src.enemy_hp -= attackamt
- src.arcade_action()
-
- else if (href_list["heal"])
- src.blocked = 1
- var/pointamt = rand(1,3)
- var/healamt = rand(6,8)
- src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
- playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.updateUsrDialog()
- turtle++
-
- sleep(10)
- src.player_mp -= pointamt
- src.player_hp += healamt
- src.blocked = 1
- src.updateUsrDialog()
- src.arcade_action()
-
- else if (href_list["charge"])
- src.blocked = 1
- var/chargeamt = rand(4,7)
- src.temp = "You regain [chargeamt] points"
- playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.player_mp += chargeamt
- if(turtle > 0)
- turtle--
-
- src.updateUsrDialog()
- sleep(10)
- src.arcade_action()
-
- if (href_list["close"])
- usr.unset_machine()
- usr << browse(null, "window=arcade")
-
- else if (href_list["newgame"]) //Reset everything
- temp = "New Round"
- player_hp = 30
- player_mp = 10
- enemy_hp = 45
- enemy_mp = 20
- gameover = 0
- turtle = 0
-
- if(emagged)
- src.New()
- emagged = 0
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/obj/machinery/computer/arcade/battle/proc/arcade_action()
- if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0))
- if(!gameover)
- src.gameover = 1
- src.temp = "[src.enemy_name] has fallen! Rejoice!"
- playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
-
- if(emagged)
- feedback_inc("arcade_win_emagged")
- new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
- new /obj/item/clothing/head/collectable/petehat(src.loc)
- message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
- src.New()
- emagged = 0
- else
- feedback_inc("arcade_win_normal")
- prizevend()
-
- else if (emagged && (turtle >= 4))
- var/boomamt = rand(5,10)
- src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
- playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.player_hp -= boomamt
-
- else if ((src.enemy_mp <= 5) && (prob(70)))
- var/stealamt = rand(2,3)
- src.temp = "[src.enemy_name] steals [stealamt] of your power!"
- playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.player_mp -= stealamt
- src.updateUsrDialog()
-
- if (src.player_mp <= 0)
- src.gameover = 1
- sleep(10)
- src.temp = "You have been drained! GAME OVER"
- playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
- if(emagged)
- feedback_inc("arcade_loss_mana_emagged")
- usr.gib()
- else
- feedback_inc("arcade_loss_mana_normal")
-
- else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
- src.temp = "[src.enemy_name] heals for 4 health!"
- playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.enemy_hp += 4
- src.enemy_mp -= 4
-
- else
- var/attackamt = rand(3,6)
- src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
- playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
- src.player_hp -= attackamt
-
- if ((src.player_mp <= 0) || (src.player_hp <= 0))
- src.gameover = 1
- src.temp = "You have been crushed! GAME OVER"
- playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
- if(emagged)
- feedback_inc("arcade_loss_hp_emagged")
- usr.gib()
- else
- feedback_inc("arcade_loss_hp_normal")
-
- src.blocked = 0
- return
-
-
-/obj/machinery/computer/arcade/battle/emag_act(mob/user)
- if(!emagged)
- temp = "If you die in the game, you die for real!"
- player_hp = 30
- player_mp = 10
- enemy_hp = 45
- enemy_mp = 20
- gameover = 0
- blocked = 0
-
- emagged = 1
-
- enemy_name = "Cuban Pete"
- name = "Outbomb Cuban Pete"
-
-
- src.updateUsrDialog()
-
-
-
-// *** THE ORION TRAIL ** //
-
-#define ORION_TRAIL_WINTURN 9
-
-//Orion Trail Events
-#define ORION_TRAIL_RAIDERS "Raiders"
-#define ORION_TRAIL_FLUX "Interstellar Flux"
-#define ORION_TRAIL_ILLNESS "Illness"
-#define ORION_TRAIL_BREAKDOWN "Breakdown"
-#define ORION_TRAIL_LING "Changelings?"
-#define ORION_TRAIL_LING_ATTACK "Changeling Ambush"
-#define ORION_TRAIL_MALFUNCTION "Malfunction"
-#define ORION_TRAIL_COLLISION "Collision"
-#define ORION_TRAIL_SPACEPORT "Spaceport"
-#define ORION_TRAIL_BLACKHOLE "BlackHole"
-
-#define ORION_STATUS_START 1
-#define ORION_STATUS_NORMAL 2
-#define ORION_STATUS_GAMEOVER 3
-#define ORION_STATUS_MARKET 4
-
-/obj/machinery/computer/arcade/orion_trail
- name = "The Orion Trail"
- desc = "Learn how our ancestors got to Orion, and have fun in the process!"
- icon_state = "arcade"
- circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
- var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
- var/engine = 0
- var/hull = 0
- var/electronics = 0
- var/food = 80
- var/fuel = 60
- var/turns = 4
- var/alive = 4
- var/eventdat = null
- var/event = null
- var/list/settlers = list("Harry","Larry","Bob")
- var/list/events = list(ORION_TRAIL_RAIDERS = 3,
- ORION_TRAIL_FLUX = 1,
- ORION_TRAIL_ILLNESS = 3,
- ORION_TRAIL_BREAKDOWN = 2,
- ORION_TRAIL_LING = 3,
- ORION_TRAIL_MALFUNCTION = 2,
- ORION_TRAIL_COLLISION = 1,
- ORION_TRAIL_SPACEPORT = 2
- )
- var/list/stops = list()
- var/list/stopblurbs = list()
- var/lings_aboard = 0
- var/spaceport_raided = 0
- var/spaceport_freebie = 0
- var/last_spaceport_action = ""
- var/gameStatus = ORION_STATUS_START
- var/canContinueEvent = 0
-
-/obj/machinery/computer/arcade/orion_trail/New()
- ..()
- // Sets up the main trail
- stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime")
- stopblurbs = list(
- "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.",
- "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.",
- "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.",
- "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.",
- "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.",
- "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.",
- "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.",
- "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.",
- "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!"
- )
-
-/obj/machinery/computer/arcade/orion_trail/proc/newgame()
- // Set names of settlers in crew
- settlers = list()
- for(var/i = 1; i <= 3; i++)
- add_crewmember()
- add_crewmember("[usr]")
- // Re-set items to defaults
- engine = 1
- hull = 1
- electronics = 1
- food = 80
- fuel = 60
- alive = 4
- turns = 1
- event = null
- gameStatus = ORION_STATUS_NORMAL
- lings_aboard = 0
-
- //spaceport junk
- spaceport_raided = 0
- spaceport_freebie = 0
- last_spaceport_action = ""
-
-/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user)
- if(..())
- return
- if(fuel <= 0 || food <=0 || settlers.len == 0)
- gameStatus = ORION_STATUS_GAMEOVER
- event = null
- user.set_machine(src)
- var/dat = ""
- if(gameStatus == ORION_STATUS_GAMEOVER)
- dat = "Game Over
"
- dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever."
- if(settlers.len == 0)
- dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy."
- else
- if(food <= 0)
- dat += "
You ran out of food and starved."
- if(emagged)
- user.nutrition = 0 //yeah you pretty hongry
- user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
- if(fuel <= 0)
- dat += "
You ran out of fuel, and drift, slowly, into a star."
- if(emagged)
- var/mob/living/M = user
- M.adjust_fire_stacks(5)
- M.IgniteMob() //flew into a star, so you're on fire
- user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames."
- dat += "
OK...
"
-
- if(emagged)
- user << "You're never going to make it to Orion..."
- user.death()
- emagged = 0 //removes the emagged status after you lose
- gameStatus = ORION_STATUS_START
- name = "The Orion Trail"
- desc = "Learn how our ancestors got to Orion, and have fun in the process!"
-
- else if(event)
- dat = eventdat
- else if(gameStatus == ORION_STATUS_NORMAL)
- var/title = stops[turns]
- var/subtext = stopblurbs[turns]
- dat = "[title]
"
- dat += "[subtext]"
- dat += "Crew:
"
- dat += english_list(settlers)
- dat += "
Food: [food] | Fuel: [fuel]"
- dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
- if(turns == 7)
- dat += "Go Around Continue
"
- else
- dat += "Continue
"
- dat += "Kill a crewmember
"
- dat += "Close
"
- else
- dat = "The Orion Trail
"
- dat += "
Experience the journey of your ancestors!
"
- dat += "New Game"
- dat += "Close
"
- var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/computer/arcade/orion_trail/Topic(href, href_list)
- if(..())
- return
- if(href_list["close"])
- usr.unset_machine()
- usr << browse(null, "window=arcade")
-
- if(busy)
- return
- busy = 1
-
- if (href_list["continue"]) //Continue your travels
- if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7)
- if(turns >= ORION_TRAIL_WINTURN)
- win()
- else
- food -= (alive+lings_aboard)*2
- fuel -= 5
- if(turns == 2 && prob(30))
- event = ORION_TRAIL_COLLISION
- event()
- else if(prob(75))
- event = pickweight(events)
- if(lings_aboard)
- if(event == ORION_TRAIL_LING || prob(55))
- event = ORION_TRAIL_LING_ATTACK
- event()
- turns += 1
- if(emagged)
- var/mob/living/carbon/M = usr //for some vars
- switch(event)
- if(ORION_TRAIL_RAIDERS)
- if(prob(50))
- usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
- M.hallucination += 30
- else
- usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
- M.take_organ_damage(30)
- playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1)
- if(ORION_TRAIL_ILLNESS)
- var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
- if(severity == 1)
- M << "You suddenly feel slightly nauseous." //got off lucky
- if(severity == 2)
- usr << "You suddenly feel extremely nauseous and hunch over until it passes."
- M.Stun(3)
- if(severity >= 3) //you didn't pray hard enough
- M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
- M.Stun(5)
- sleep(30)
- M.vomit(50)
- if(ORION_TRAIL_FLUX)
- if(prob(75))
- M.Weaken(3)
- say("A sudden gust of powerful wind slams [M] into the floor!")
- M.take_organ_damage(25)
- playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
- else
- M << "A violent gale blows past you, and you barely manage to stay standing!"
- if(ORION_TRAIL_COLLISION) //by far the most damaging event
- if(prob(90))
- playsound(src.loc, 'sound/effects/bang.ogg', 100, 1)
- var/turf/open/floor/F
- for(F in orange(1, src))
- F.ChangeTurf(F.baseturf)
- say("Something slams into the floor around [src], exposing it to space!")
- if(hull)
- sleep(10)
- say("A new floor suddenly appears around [src]. What the hell?")
- playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
- var/turf/open/space/T
- for(T in orange(1, src))
- T.ChangeTurf(/turf/open/floor/plating/)
- else
- say("Something slams into the floor around [src] - luckily, it didn't get through!")
- playsound(src.loc, 'sound/effects/bang.ogg', 50, 1)
- if(ORION_TRAIL_MALFUNCTION)
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1)
- src.visible_message("[src] malfunctions, randomizing in-game stats!")
- var/oldfood = food
- var/oldfuel = fuel
- food = rand(10,80) / rand(1,2)
- fuel = rand(10,60) / rand(1,2)
- if(electronics)
- sleep(10)
- if(oldfuel > fuel && oldfood > food)
- src.audible_message("[src] lets out a somehow reassuring chime.")
- else if(oldfuel < fuel || oldfood < food)
- src.audible_message("[src] lets out a somehow ominous chime.")
- food = oldfood
- fuel = oldfuel
- playsound(src.loc, 'sound/machines/chime.ogg', 50, 1)
-
- else if(href_list["newgame"]) //Reset everything
- if(gameStatus == ORION_STATUS_START)
- newgame()
- else if(href_list["menu"]) //back to the main menu
- if(gameStatus == ORION_STATUS_GAMEOVER)
- gameStatus = ORION_STATUS_START
- event = null
- food = 80
- fuel = 60
- settlers = list("Harry","Larry","Bob")
- else if(href_list["slow"]) //slow down
- if(event == ORION_TRAIL_FLUX)
- food -= (alive+lings_aboard)*2
- fuel -= 5
- event = null
- else if(href_list["pastblack"]) //slow down
- if(turns == 7)
- food -= ((alive+lings_aboard)*2)*3
- fuel -= 15
- turns += 1
- event = null
- else if(href_list["useengine"]) //use parts
- if(event == ORION_TRAIL_BREAKDOWN)
- engine = max(0, --engine)
- event = null
- else if(href_list["useelec"]) //use parts
- if(event == ORION_TRAIL_MALFUNCTION)
- electronics = max(0, --electronics)
- event = null
- else if(href_list["usehull"]) //use parts
- if(event == ORION_TRAIL_COLLISION)
- hull = max(0, --hull)
- event = null
- else if(href_list["wait"]) //wait 3 days
- if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION)
- food -= ((alive+lings_aboard)*2)*3
- event = null
- else if(href_list["keepspeed"]) //keep speed
- if(event == ORION_TRAIL_FLUX)
- if(prob(75))
- event = "Breakdown"
- event()
- else
- event = null
- else if(href_list["blackhole"]) //keep speed past a black hole
- if(turns == 7)
- if(prob(75))
- event = ORION_TRAIL_BLACKHOLE
- event()
- if(emagged) //has to be here because otherwise it doesn't work
- playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1)
- say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
- usr.Stun(10) //you can't run :^)
- var/S = new /obj/singularity/academy(usr.loc)
- emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
- sleep(50)
- say("[S] winks out, just as suddenly as it appeared.")
- qdel(S)
- else
- event = null
- turns += 1
- else if(href_list["holedeath"])
- if(event == ORION_TRAIL_BLACKHOLE)
- gameStatus = ORION_STATUS_GAMEOVER
- event = null
- else if(href_list["eventclose"]) //end an event
- if(canContinueEvent)
- event = null
-
- else if(href_list["killcrew"]) //shoot a crewmember
- if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING)
- var/sheriff = remove_crewmember() //I shot the sheriff
- playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1)
-
- if(settlers.len == 0 || alive == 0)
- say("The last crewmember [sheriff], shot themselves, GAME OVER!")
- if(emagged)
- usr.death(0)
- emagged = 0
- gameStatus = ORION_STATUS_GAMEOVER
- event = null
- else if(emagged)
- if(usr.name == sheriff)
- say("The crew of the ship chose to kill [usr.name]!")
- usr.death(0)
-
- if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places
- event = null
-
- //Spaceport specific interactions
- //they get a header because most of them don't reset event (because it's a shop, you leave when you want to)
- //they also call event() again, to regen the eventdata, which is kind of odd but necessary
- else if(href_list["buycrew"]) //buy a crewmember
- if(gameStatus == ORION_STATUS_MARKET)
- if(!spaceport_raided && food >= 10 && fuel >= 10)
- var/bought = add_crewmember()
- last_spaceport_action = "You hired [bought] as a new crewmember."
- fuel -= 10
- food -= 10
- event()
-
- else if(href_list["sellcrew"]) //sell a crewmember
- if(gameStatus == ORION_STATUS_MARKET)
- if(!spaceport_raided && settlers.len > 1)
- var/sold = remove_crewmember()
- last_spaceport_action = "You sold your crewmember, [sold]!"
- fuel += 7
- food += 7
- event()
-
- else if(href_list["leave_spaceport"])
- if(gameStatus == ORION_STATUS_MARKET)
- event = null
- gameStatus = ORION_STATUS_NORMAL
- spaceport_raided = 0
- spaceport_freebie = 0
- last_spaceport_action = ""
-
- else if(href_list["raid_spaceport"])
- if(gameStatus == ORION_STATUS_MARKET)
- if(!spaceport_raided)
- var/success = min(15 * alive,100) //default crew (4) have a 60% chance
- spaceport_raided = 1
-
- var/FU = 0
- var/FO = 0
- if(prob(success))
- FU = rand(5,15)
- FO = rand(5,15)
- last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
- else
- FU = rand(-5,-15)
- FO = rand(-5,-15)
- last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
-
- //your chance of lose a crewmember is 1/2 your chance of success
- //this makes higher % failures hurt more, don't get cocky space cowboy!
- if(prob(success*5))
- var/lost_crew = remove_crewmember()
- last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
- if(emagged)
- say("WEEWOO WEEWOO, Spaceport Security en route!")
- for(var/i, i<=3, i++)
- var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src))
- O.target = usr
-
-
- fuel += FU
- food += FO
- event()
-
- else if(href_list["buyparts"])
- if(gameStatus == ORION_STATUS_MARKET)
- if(!spaceport_raided && fuel > 5)
- switch(text2num(href_list["buyparts"]))
- if(1) //Engine Parts
- engine++
- last_spaceport_action = "Bought Engine Parts"
- if(2) //Hull Plates
- hull++
- last_spaceport_action = "Bought Hull Plates"
- if(3) //Spare Electronics
- electronics++
- last_spaceport_action = "Bought Spare Electronics"
- fuel -= 5 //they all cost 5
- event()
-
- else if(href_list["trade"])
- if(gameStatus == ORION_STATUS_MARKET)
- if(!spaceport_raided)
- switch(text2num(href_list["trade"]))
- if(1) //Fuel
- if(fuel > 5)
- fuel -= 5
- food += 5
- last_spaceport_action = "Traded Fuel for Food"
- event()
- if(2) //Food
- if(food > 5)
- fuel += 5
- food -= 5
- last_spaceport_action = "Traded Food for Fuel"
- event()
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- busy = 0
- return
-
-
-/obj/machinery/computer/arcade/orion_trail/proc/event()
- eventdat = "[event]
"
- canContinueEvent = 0
- switch(event)
- if(ORION_TRAIL_RAIDERS)
- eventdat += "Raiders have come aboard your ship!"
- if(prob(50))
- var/sfood = rand(1,10)
- var/sfuel = rand(1,10)
- food -= sfood
- fuel -= sfuel
- eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
- else if(prob(10))
- var/deadname = remove_crewmember()
- eventdat += "
[deadname] tried to fight back but was killed."
- else
- eventdat += "
Fortunately you fended them off without any trouble."
- eventdat += "Continue
"
- eventdat += "Close
"
- canContinueEvent = 1
-
- if(ORION_TRAIL_FLUX)
- eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
- eventdat += "
What will you do?"
- eventdat += "Slow Down Continue
"
- eventdat += "Close
"
-
- if(ORION_TRAIL_ILLNESS)
- eventdat += "A deadly illness has been contracted!"
- var/deadname = remove_crewmember()
- eventdat += "
[deadname] was killed by the disease."
- eventdat += "Continue
"
- eventdat += "Close
"
- canContinueEvent = 1
-
- if(ORION_TRAIL_BREAKDOWN)
- eventdat += "Oh no! The engine has broken down!"
- eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
- if(engine >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
-
- if(ORION_TRAIL_MALFUNCTION)
- eventdat += "The ship's systems are malfunctioning!"
- eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI."
- if(electronics >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
-
- if(ORION_TRAIL_COLLISION)
- eventdat += "Something hit us! Looks like there's some hull damage."
- if(prob(25))
- var/sfood = rand(5,15)
- var/sfuel = rand(5,15)
- food -= sfood
- fuel -= sfuel
- eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space."
- if(prob(10))
- var/deadname = remove_crewmember()
- eventdat += "
[deadname] was killed by rapid depressurization."
- eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together."
- if(hull >= 1)
- eventdat += "Use PartWait
"
- else
- eventdat += "Wait
"
- eventdat += "Close
"
-
- if(ORION_TRAIL_BLACKHOLE)
- eventdat += "You were swept away into the black hole."
- eventdat += "Oh...
"
- eventdat += "Close
"
- settlers = list()
-
- if(ORION_TRAIL_LING)
- eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..."
- if(settlers.len <= 2)
- eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..."
- eventdat += "Continue
"
- eventdat += "Close
"
- if(prob(10)) // "likely", I didn't say it was guaranteed!
- lings_aboard = min(++lings_aboard,2)
- else
- if(lings_aboard) //less likely to stack lings
- if(prob(20))
- lings_aboard = min(++lings_aboard,2)
- else if(prob(70))
- lings_aboard = min(++lings_aboard,2)
-
- eventdat += "Kill a crewmember
"
- eventdat += "Risk it
"
- eventdat += "Close
"
- canContinueEvent = 1
-
- if(ORION_TRAIL_LING_ATTACK)
- if(lings_aboard <= 0) //shouldn't trigger, but hey.
- eventdat += "Haha, fooled you, there are no changelings on board!"
- eventdat += "
(You should report this to a coder :S)"
- else
- var/ling1 = remove_crewmember()
- var/ling2 = ""
- if(lings_aboard >= 2)
- ling2 = remove_crewmember()
-
- eventdat += "Oh no, some of your crew are Changelings!"
- if(ling2)
- eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!"
- else
- eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!"
-
- var/chance2attack = alive*20
- if(prob(chance2attack))
- var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance
- if(prob(chancetokill))
- var/deadguy = remove_crewmember()
- eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!"
- else
- eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!"
- eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww"
- if(ling2)
- food += 30
- lings_aboard = max(0,lings_aboard-2)
- else
- food += 15
- lings_aboard = max(0,--lings_aboard)
- else
- eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!"
- if(ling2)
- lings_aboard = max(0,lings_aboard-2)
- else
- lings_aboard = max(0,--lings_aboard)
-
- eventdat += "Continue
"
- eventdat += "Close
"
- canContinueEvent = 1
-
-
- if(ORION_TRAIL_SPACEPORT)
- gameStatus = ORION_STATUS_MARKET
- if(spaceport_raided)
- eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!"
- if(last_spaceport_action)
- eventdat += "
Last Spaceport Action: [last_spaceport_action]"
- eventdat += "Depart Spaceport
"
- eventdat += "Close
"
- else
- eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!"
- eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..."
- eventdat += "
Trading terms: FU = Fuel, FO = Food"
- if(last_spaceport_action)
- eventdat += "
Last Spaceport Action: [last_spaceport_action]"
- eventdat += "Crew:
"
- eventdat += english_list(settlers)
- eventdat += "
Food: [food] | Fuel: [fuel]"
- eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
-
-
- //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port)
- if(!spaceport_freebie && (fuel < 20 || food < 20))
- spaceport_freebie++
- var/FU = 10
- var/FO = 10
- var/freecrew = 0
- if(prob(30))
- FU = 25
- FO = 25
-
- if(prob(10))
- add_crewmember()
- freecrew++
-
- eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)"
- if(freecrew)
- eventdat += "
You also gain a new crewmember!"
-
- fuel += FU
- food += FO
-
- //CREW INTERACTIONS
- eventdat += "Crew Management:
"
-
- //Buy crew
- if(food >= 10 && fuel >= 10)
- eventdat += "Hire a new Crewmember (-10FU,-10FO)
"
- else
- eventdat += "Cant afford a new Crewmember
"
-
- //Sell crew
- if(settlers.len > 1)
- eventdat += "Sell crew for Fuel and Food (+7FU,+7FO)
"
- else
- eventdat += "Cant afford to sell a Crewmember
"
-
- //BUY/SELL STUFF
- eventdat += "Spare Parts:
"
-
- //Engine parts
- if(fuel > 5)
- eventdat += "Buy Engine Parts (-5FU)
"
- else
- eventdat += "Cant afford to buy Engine Parts"
-
- //Hull plates
- if(fuel > 5)
- eventdat += "
Buy Hull Plates (-5FU)
"
- else
- eventdat += "Cant afford to buy Hull Plates"
-
- //Electronics
- if(fuel > 5)
- eventdat += "
Buy Spare Electronics (-5FU)
"
- else
- eventdat += "Cant afford to buy Spare Electronics"
-
- //Trade
- if(fuel > 5)
- eventdat += "
Trade Fuel for Food (-5FU,+5FO)
"
- else
- eventdat += "Cant afford to Trade Fuel for Food
5)
- eventdat += "Trade Food for Fuel (+5FU,-5FO)
"
- else
- eventdat += "Cant afford to Trade Food for Fuel
!! Raid Spaceport !!"
-
- eventdat += "Depart Spaceport
"
-
-
-//Add Random/Specific crewmember
-/obj/machinery/computer/arcade/orion_trail/proc/add_crewmember(var/specific = "")
- var/newcrew = ""
- if(specific)
- newcrew = specific
- else
- if(prob(50))
- newcrew = pick(first_names_male)
- else
- newcrew = pick(first_names_female)
- if(newcrew)
- settlers += newcrew
- alive++
- return newcrew
-
-
-//Remove Random/Specific crewmember
-/obj/machinery/computer/arcade/orion_trail/proc/remove_crewmember(var/specific = "", var/dont_remove = "")
- var/list/safe2remove = settlers
- var/removed = ""
- if(dont_remove)
- safe2remove -= dont_remove
- if(specific && specific != dont_remove)
- safe2remove = list(specific)
- else
- removed = pick(safe2remove)
-
- if(removed)
- if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously
- lings_aboard = max(0,--lings_aboard)
- settlers -= removed
- alive--
- return removed
-
-
-/obj/machinery/computer/arcade/orion_trail/proc/win()
- gameStatus = ORION_STATUS_START
- say("Congratulations, you made it to Orion!")
- if(emagged)
- new /obj/item/weapon/orion_ship(src.loc)
- message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
- log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
- else
- prizevend()
- emagged = 0
- name = "The Orion Trail"
- desc = "Learn how our ancestors got to Orion, and have fun in the process!"
-
-/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
- if(!emagged)
- user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode."
- name = "The Orion Trail: Realism Edition"
- desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
- newgame()
- emagged = 1
-
-/mob/living/simple_animal/hostile/syndicate/ranged/orion
- name = "Spaceport Security"
- desc = "The Premier security forces for all spaceports found along the Orion Trail."
- faction = list("orion")
- loot = list(/obj/effect/mob_spawn/human/corpse/orionsecurity,
- /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted,
- /obj/item/weapon/shield/energy)
-
-/obj/effect/mob_spawn/human/corpse/orionsecurity
- name = "Spaceport Security"
- uniform = /obj/item/clothing/under/syndicate
- suit = /obj/item/clothing/suit/armor/vest
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- radio = /obj/item/device/radio/headset
- mask = /obj/item/clothing/mask/gas
- helmet = /obj/item/clothing/head/helmet/swat
- back = /obj/item/weapon/storage/backpack
- has_id = 1
- id_job = "Officer"
- id_access = "Syndicate"
-
-/obj/item/weapon/orion_ship
- name = "model settler ship"
- desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
- icon = 'icons/obj/toy.dmi'
- icon_state = "ship"
- w_class = 2
- var/active = 0 //if the ship is on
-
-/obj/item/weapon/orion_ship/examine(mob/user)
- ..()
- if(!(in_range(user, src)))
- return
- if(!active)
- user << "There's a little switch on the bottom. It's flipped down."
- else
- user << "There's a little switch on the bottom. It's flipped up."
-
-/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse
- if(active)
- return
-
- message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
- log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
-
- user << "You flip the switch on the underside of [src]."
- active = 1
- src.visible_message("[src] softly beeps and whirs to life!")
- playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1)
- say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.")
- sleep(20)
- src.visible_message("[src] begins to vibrate...")
- say("Uh, Port? Having some issues with our reactor, could you check it out? Over.")
- sleep(30)
- say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-")
- playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1)
- sleep(3.6)
- src.visible_message("[src] explodes!")
- explosion(src.loc, 2,4,8, flame_range = 16)
- qdel(src)
-
-
-#undef ORION_TRAIL_WINTURN
-#undef ORION_TRAIL_RAIDERS
-#undef ORION_TRAIL_FLUX
-#undef ORION_TRAIL_ILLNESS
-#undef ORION_TRAIL_BREAKDOWN
-#undef ORION_TRAIL_LING
-#undef ORION_TRAIL_LING_ATTACK
-#undef ORION_TRAIL_MALFUNCTION
-#undef ORION_TRAIL_COLLISION
-#undef ORION_TRAIL_SPACEPORT
-#undef ORION_TRAIL_BLACKHOLE
-
-#undef ORION_STATUS_START
-#undef ORION_STATUS_NORMAL
-#undef ORION_STATUS_GAMEOVER
-#undef ORION_STATUS_MARKET
+/obj/machinery/computer/arcade/
+ name = "random arcade"
+ desc = "random arcade machine"
+ icon_state = "arcade"
+ icon_keyboard = null
+ icon_screen = "invaders"
+ var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
+ /obj/item/toy/AI = 2,
+ /obj/item/toy/codex_gigas = 2,
+ /obj/item/clothing/under/syndicate/tacticool = 2,
+ /obj/item/toy/sword = 2,
+ /obj/item/toy/gun = 2,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
+ /obj/item/weapon/storage/box/fakesyndiesuit = 2,
+ /obj/item/weapon/storage/crayons = 2,
+ /obj/item/toy/spinningtoy = 2,
+ /obj/item/toy/prize/ripley = 1,
+ /obj/item/toy/prize/fireripley = 1,
+ /obj/item/toy/prize/deathripley = 1,
+ /obj/item/toy/prize/gygax = 1,
+ /obj/item/toy/prize/durand = 1,
+ /obj/item/toy/prize/honk = 1,
+ /obj/item/toy/prize/marauder = 1,
+ /obj/item/toy/prize/seraph = 1,
+ /obj/item/toy/prize/mauler = 1,
+ /obj/item/toy/prize/odysseus = 1,
+ /obj/item/toy/prize/phazon = 1,
+ /obj/item/toy/prize/reticence = 1,
+ /obj/item/toy/cards/deck = 2,
+ /obj/item/toy/nuke = 2,
+ /obj/item/toy/minimeteor = 2,
+ /obj/item/toy/carpplushie = 2,
+ /obj/item/toy/foamblade = 2,
+ /obj/item/toy/redbutton = 2,
+ /obj/item/toy/talking/owl = 2,
+ /obj/item/toy/talking/griffin = 2,
+ /obj/item/weapon/coin/antagtoken = 2,
+ /obj/item/stack/tile/fakespace/loaded = 2,
+ /obj/item/toy/toy_xeno = 2,
+ /obj/item/weapon/restraints/handcuffs/fake = 2
+ )
+
+/obj/machinery/computer/arcade/New()
+ ..()
+ // If it's a generic arcade machine, pick a random arcade
+ // circuit board for it and make the new machine
+ if(!circuit)
+ var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/computer/arcade))
+ var/obj/item/weapon/circuitboard/CB = new choice()
+ new CB.build_path(loc, CB)
+ qdel(src)
+
+/obj/machinery/computer/arcade/proc/prizevend()
+ if(prob(0.0001)) //1 in a million
+ new /obj/item/weapon/gun/energy/pulse(src)
+
+ if(!contents.len)
+ var/prizeselect = pickweight(prizes)
+ new prizeselect(src.loc)
+
+ if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
+ new /obj/item/toy/ammo/gun(src.loc)
+
+ else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
+ new /obj/item/clothing/head/syndicatefake(src.loc)
+
+ else
+ var/atom/movable/prize = pick(contents)
+ prize.loc = src.loc
+
+/obj/machinery/computer/arcade/emp_act(severity)
+ ..(severity)
+
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ var/empprize = null
+ var/num_of_prizes = 0
+ switch(severity)
+ if(1)
+ num_of_prizes = rand(1,4)
+ if(2)
+ num_of_prizes = rand(0,2)
+ for(var/i = num_of_prizes; i > 0; i--)
+ empprize = pickweight(prizes)
+ new empprize(src.loc)
+ explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes)
+
+
+// ** BATTLE ** //
+
+
+/obj/machinery/computer/arcade/battle
+ name = "arcade machine"
+ desc = "Does not support Pinball."
+ icon_state = "arcade"
+ circuit = /obj/item/weapon/circuitboard/computer/arcade/battle
+ var/enemy_name = "Space Villian"
+ var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc
+ var/player_hp = 30 //Player health/attack points
+ var/player_mp = 10
+ var/enemy_hp = 45 //Enemy health/attack points
+ var/enemy_mp = 20
+ var/gameover = 0
+ var/blocked = 0 //Player cannot attack/heal while set
+ var/turtle = 0
+
+/obj/machinery/computer/arcade/battle/New()
+ ..()
+ var/name_action
+ var/name_part1
+ var/name_part2
+
+ name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ")
+
+ name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
+ name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers")
+
+ src.enemy_name = replacetext((name_part1 + name_part2), "the ", "")
+ src.name = (name_action + name_part1 + name_part2)
+
+/obj/machinery/computer/arcade/battle/attack_hand(mob/user)
+ if(..())
+ return
+ user.set_machine(src)
+ var/dat = "Close"
+ dat += "[src.enemy_name]
"
+
+ dat += "
[src.temp]
"
+ dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]"
+
+ if (src.gameover)
+ dat += "New Game"
+ else
+ dat += "Attack | "
+ dat += "Heal | "
+ dat += "Recharge Power"
+
+ dat += ""
+
+ //user << browse(dat, "window=arcade")
+ //onclose(user, "arcade")
+ var/datum/browser/popup = new(user, "arcade", "Space Villian 2000")
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ return
+
+/obj/machinery/computer/arcade/battle/Topic(href, href_list)
+ if(..())
+ return
+
+ if (!src.blocked && !src.gameover)
+ if (href_list["attack"])
+ src.blocked = 1
+ var/attackamt = rand(2,6)
+ src.temp = "You attack for [attackamt] damage!"
+ playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.updateUsrDialog()
+ if(turtle > 0)
+ turtle--
+
+ sleep(10)
+ src.enemy_hp -= attackamt
+ src.arcade_action()
+
+ else if (href_list["heal"])
+ src.blocked = 1
+ var/pointamt = rand(1,3)
+ var/healamt = rand(6,8)
+ src.temp = "You use [pointamt] magic to heal for [healamt] damage!"
+ playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.updateUsrDialog()
+ turtle++
+
+ sleep(10)
+ src.player_mp -= pointamt
+ src.player_hp += healamt
+ src.blocked = 1
+ src.updateUsrDialog()
+ src.arcade_action()
+
+ else if (href_list["charge"])
+ src.blocked = 1
+ var/chargeamt = rand(4,7)
+ src.temp = "You regain [chargeamt] points"
+ playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.player_mp += chargeamt
+ if(turtle > 0)
+ turtle--
+
+ src.updateUsrDialog()
+ sleep(10)
+ src.arcade_action()
+
+ if (href_list["close"])
+ usr.unset_machine()
+ usr << browse(null, "window=arcade")
+
+ else if (href_list["newgame"]) //Reset everything
+ temp = "New Round"
+ player_hp = 30
+ player_mp = 10
+ enemy_hp = 45
+ enemy_mp = 20
+ gameover = 0
+ turtle = 0
+
+ if(emagged)
+ src.New()
+ emagged = 0
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
+
+/obj/machinery/computer/arcade/battle/proc/arcade_action()
+ if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0))
+ if(!gameover)
+ src.gameover = 1
+ src.temp = "[src.enemy_name] has fallen! Rejoice!"
+ playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
+
+ if(emagged)
+ feedback_inc("arcade_win_emagged")
+ new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
+ new /obj/item/clothing/head/collectable/petehat(src.loc)
+ message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
+ log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
+ src.New()
+ emagged = 0
+ else
+ feedback_inc("arcade_win_normal")
+ prizevend()
+
+ else if (emagged && (turtle >= 4))
+ var/boomamt = rand(5,10)
+ src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!"
+ playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.player_hp -= boomamt
+
+ else if ((src.enemy_mp <= 5) && (prob(70)))
+ var/stealamt = rand(2,3)
+ src.temp = "[src.enemy_name] steals [stealamt] of your power!"
+ playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.player_mp -= stealamt
+ src.updateUsrDialog()
+
+ if (src.player_mp <= 0)
+ src.gameover = 1
+ sleep(10)
+ src.temp = "You have been drained! GAME OVER"
+ playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
+ if(emagged)
+ feedback_inc("arcade_loss_mana_emagged")
+ usr.gib()
+ else
+ feedback_inc("arcade_loss_mana_normal")
+
+ else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4))
+ src.temp = "[src.enemy_name] heals for 4 health!"
+ playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.enemy_hp += 4
+ src.enemy_mp -= 4
+
+ else
+ var/attackamt = rand(3,6)
+ src.temp = "[src.enemy_name] attacks for [attackamt] damage!"
+ playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10)
+ src.player_hp -= attackamt
+
+ if ((src.player_mp <= 0) || (src.player_hp <= 0))
+ src.gameover = 1
+ src.temp = "You have been crushed! GAME OVER"
+ playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
+ if(emagged)
+ feedback_inc("arcade_loss_hp_emagged")
+ usr.gib()
+ else
+ feedback_inc("arcade_loss_hp_normal")
+
+ src.blocked = 0
+ return
+
+
+/obj/machinery/computer/arcade/battle/emag_act(mob/user)
+ if(!emagged)
+ temp = "If you die in the game, you die for real!"
+ player_hp = 30
+ player_mp = 10
+ enemy_hp = 45
+ enemy_mp = 20
+ gameover = 0
+ blocked = 0
+
+ emagged = 1
+
+ enemy_name = "Cuban Pete"
+ name = "Outbomb Cuban Pete"
+
+
+ src.updateUsrDialog()
+
+
+
+// *** THE ORION TRAIL ** //
+
+#define ORION_TRAIL_WINTURN 9
+
+//Orion Trail Events
+#define ORION_TRAIL_RAIDERS "Raiders"
+#define ORION_TRAIL_FLUX "Interstellar Flux"
+#define ORION_TRAIL_ILLNESS "Illness"
+#define ORION_TRAIL_BREAKDOWN "Breakdown"
+#define ORION_TRAIL_LING "Changelings?"
+#define ORION_TRAIL_LING_ATTACK "Changeling Ambush"
+#define ORION_TRAIL_MALFUNCTION "Malfunction"
+#define ORION_TRAIL_COLLISION "Collision"
+#define ORION_TRAIL_SPACEPORT "Spaceport"
+#define ORION_TRAIL_BLACKHOLE "BlackHole"
+
+#define ORION_STATUS_START 1
+#define ORION_STATUS_NORMAL 2
+#define ORION_STATUS_GAMEOVER 3
+#define ORION_STATUS_MARKET 4
+
+/obj/machinery/computer/arcade/orion_trail
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+ icon_state = "arcade"
+ circuit = /obj/item/weapon/circuitboard/computer/arcade/orion_trail
+ var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
+ var/engine = 0
+ var/hull = 0
+ var/electronics = 0
+ var/food = 80
+ var/fuel = 60
+ var/turns = 4
+ var/alive = 4
+ var/eventdat = null
+ var/event = null
+ var/list/settlers = list("Harry","Larry","Bob")
+ var/list/events = list(ORION_TRAIL_RAIDERS = 3,
+ ORION_TRAIL_FLUX = 1,
+ ORION_TRAIL_ILLNESS = 3,
+ ORION_TRAIL_BREAKDOWN = 2,
+ ORION_TRAIL_LING = 3,
+ ORION_TRAIL_MALFUNCTION = 2,
+ ORION_TRAIL_COLLISION = 1,
+ ORION_TRAIL_SPACEPORT = 2
+ )
+ var/list/stops = list()
+ var/list/stopblurbs = list()
+ var/lings_aboard = 0
+ var/spaceport_raided = 0
+ var/spaceport_freebie = 0
+ var/last_spaceport_action = ""
+ var/gameStatus = ORION_STATUS_START
+ var/canContinueEvent = 0
+
+/obj/machinery/computer/arcade/orion_trail/New()
+ ..()
+ // Sets up the main trail
+ stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime")
+ stopblurbs = list(
+ "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.",
+ "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.",
+ "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.",
+ "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.",
+ "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.",
+ "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.",
+ "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.",
+ "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.",
+ "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!"
+ )
+
+/obj/machinery/computer/arcade/orion_trail/proc/newgame()
+ // Set names of settlers in crew
+ settlers = list()
+ for(var/i = 1; i <= 3; i++)
+ add_crewmember()
+ add_crewmember("[usr]")
+ // Re-set items to defaults
+ engine = 1
+ hull = 1
+ electronics = 1
+ food = 80
+ fuel = 60
+ alive = 4
+ turns = 1
+ event = null
+ gameStatus = ORION_STATUS_NORMAL
+ lings_aboard = 0
+
+ //spaceport junk
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
+
+/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user)
+ if(..())
+ return
+ if(fuel <= 0 || food <=0 || settlers.len == 0)
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ user.set_machine(src)
+ var/dat = ""
+ if(gameStatus == ORION_STATUS_GAMEOVER)
+ dat = "Game Over
"
+ dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever."
+ if(settlers.len == 0)
+ dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy."
+ else
+ if(food <= 0)
+ dat += "
You ran out of food and starved."
+ if(emagged)
+ user.nutrition = 0 //yeah you pretty hongry
+ user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
+ if(fuel <= 0)
+ dat += "
You ran out of fuel, and drift, slowly, into a star."
+ if(emagged)
+ var/mob/living/M = user
+ M.adjust_fire_stacks(5)
+ M.IgniteMob() //flew into a star, so you're on fire
+ user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames."
+ dat += "
OK...
"
+
+ if(emagged)
+ user << "You're never going to make it to Orion..."
+ user.death()
+ emagged = 0 //removes the emagged status after you lose
+ gameStatus = ORION_STATUS_START
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+ else if(event)
+ dat = eventdat
+ else if(gameStatus == ORION_STATUS_NORMAL)
+ var/title = stops[turns]
+ var/subtext = stopblurbs[turns]
+ dat = "[title]
"
+ dat += "[subtext]"
+ dat += "Crew:
"
+ dat += english_list(settlers)
+ dat += "
Food: [food] | Fuel: [fuel]"
+ dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
+ if(turns == 7)
+ dat += "Go Around Continue
"
+ else
+ dat += "Continue
"
+ dat += "Kill a crewmember
"
+ dat += "Close
"
+ else
+ dat = "The Orion Trail
"
+ dat += "
Experience the journey of your ancestors!
"
+ dat += "New Game"
+ dat += "Close
"
+ var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700)
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ return
+
+/obj/machinery/computer/arcade/orion_trail/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["close"])
+ usr.unset_machine()
+ usr << browse(null, "window=arcade")
+
+ if(busy)
+ return
+ busy = 1
+
+ if (href_list["continue"]) //Continue your travels
+ if(gameStatus == ORION_STATUS_NORMAL && !event && turns != 7)
+ if(turns >= ORION_TRAIL_WINTURN)
+ win()
+ else
+ food -= (alive+lings_aboard)*2
+ fuel -= 5
+ if(turns == 2 && prob(30))
+ event = ORION_TRAIL_COLLISION
+ event()
+ else if(prob(75))
+ event = pickweight(events)
+ if(lings_aboard)
+ if(event == ORION_TRAIL_LING || prob(55))
+ event = ORION_TRAIL_LING_ATTACK
+ event()
+ turns += 1
+ if(emagged)
+ var/mob/living/carbon/M = usr //for some vars
+ switch(event)
+ if(ORION_TRAIL_RAIDERS)
+ if(prob(50))
+ usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
+ M.hallucination += 30
+ else
+ usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
+ M.take_organ_damage(30)
+ playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1)
+ if(ORION_TRAIL_ILLNESS)
+ var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
+ if(severity == 1)
+ M << "You suddenly feel slightly nauseous." //got off lucky
+ if(severity == 2)
+ usr << "You suddenly feel extremely nauseous and hunch over until it passes."
+ M.Stun(3)
+ if(severity >= 3) //you didn't pray hard enough
+ M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
+ M.Stun(5)
+ sleep(30)
+ M.vomit(50)
+ if(ORION_TRAIL_FLUX)
+ if(prob(75))
+ M.Weaken(3)
+ say("A sudden gust of powerful wind slams [M] into the floor!")
+ M.take_organ_damage(25)
+ playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
+ else
+ M << "A violent gale blows past you, and you barely manage to stay standing!"
+ if(ORION_TRAIL_COLLISION) //by far the most damaging event
+ if(prob(90))
+ playsound(src.loc, 'sound/effects/bang.ogg', 100, 1)
+ var/turf/open/floor/F
+ for(F in orange(1, src))
+ F.ChangeTurf(F.baseturf)
+ say("Something slams into the floor around [src], exposing it to space!")
+ if(hull)
+ sleep(10)
+ say("A new floor suddenly appears around [src]. What the hell?")
+ playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
+ var/turf/open/space/T
+ for(T in orange(1, src))
+ T.ChangeTurf(/turf/open/floor/plating/)
+ else
+ say("Something slams into the floor around [src] - luckily, it didn't get through!")
+ playsound(src.loc, 'sound/effects/bang.ogg', 50, 1)
+ if(ORION_TRAIL_MALFUNCTION)
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1)
+ src.visible_message("[src] malfunctions, randomizing in-game stats!")
+ var/oldfood = food
+ var/oldfuel = fuel
+ food = rand(10,80) / rand(1,2)
+ fuel = rand(10,60) / rand(1,2)
+ if(electronics)
+ sleep(10)
+ if(oldfuel > fuel && oldfood > food)
+ src.audible_message("[src] lets out a somehow reassuring chime.")
+ else if(oldfuel < fuel || oldfood < food)
+ src.audible_message("[src] lets out a somehow ominous chime.")
+ food = oldfood
+ fuel = oldfuel
+ playsound(src.loc, 'sound/machines/chime.ogg', 50, 1)
+
+ else if(href_list["newgame"]) //Reset everything
+ if(gameStatus == ORION_STATUS_START)
+ newgame()
+ else if(href_list["menu"]) //back to the main menu
+ if(gameStatus == ORION_STATUS_GAMEOVER)
+ gameStatus = ORION_STATUS_START
+ event = null
+ food = 80
+ fuel = 60
+ settlers = list("Harry","Larry","Bob")
+ else if(href_list["slow"]) //slow down
+ if(event == ORION_TRAIL_FLUX)
+ food -= (alive+lings_aboard)*2
+ fuel -= 5
+ event = null
+ else if(href_list["pastblack"]) //slow down
+ if(turns == 7)
+ food -= ((alive+lings_aboard)*2)*3
+ fuel -= 15
+ turns += 1
+ event = null
+ else if(href_list["useengine"]) //use parts
+ if(event == ORION_TRAIL_BREAKDOWN)
+ engine = max(0, --engine)
+ event = null
+ else if(href_list["useelec"]) //use parts
+ if(event == ORION_TRAIL_MALFUNCTION)
+ electronics = max(0, --electronics)
+ event = null
+ else if(href_list["usehull"]) //use parts
+ if(event == ORION_TRAIL_COLLISION)
+ hull = max(0, --hull)
+ event = null
+ else if(href_list["wait"]) //wait 3 days
+ if(event == ORION_TRAIL_BREAKDOWN || event == ORION_TRAIL_MALFUNCTION || event == ORION_TRAIL_COLLISION)
+ food -= ((alive+lings_aboard)*2)*3
+ event = null
+ else if(href_list["keepspeed"]) //keep speed
+ if(event == ORION_TRAIL_FLUX)
+ if(prob(75))
+ event = "Breakdown"
+ event()
+ else
+ event = null
+ else if(href_list["blackhole"]) //keep speed past a black hole
+ if(turns == 7)
+ if(prob(75))
+ event = ORION_TRAIL_BLACKHOLE
+ event()
+ if(emagged) //has to be here because otherwise it doesn't work
+ playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1)
+ say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
+ usr.Stun(10) //you can't run :^)
+ var/S = new /obj/singularity/academy(usr.loc)
+ emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
+ sleep(50)
+ say("[S] winks out, just as suddenly as it appeared.")
+ qdel(S)
+ else
+ event = null
+ turns += 1
+ else if(href_list["holedeath"])
+ if(event == ORION_TRAIL_BLACKHOLE)
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ else if(href_list["eventclose"]) //end an event
+ if(canContinueEvent)
+ event = null
+
+ else if(href_list["killcrew"]) //shoot a crewmember
+ if(gameStatus == ORION_STATUS_NORMAL || event == ORION_TRAIL_LING)
+ var/sheriff = remove_crewmember() //I shot the sheriff
+ playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1)
+
+ if(settlers.len == 0 || alive == 0)
+ say("The last crewmember [sheriff], shot themselves, GAME OVER!")
+ if(emagged)
+ usr.death(0)
+ emagged = 0
+ gameStatus = ORION_STATUS_GAMEOVER
+ event = null
+ else if(emagged)
+ if(usr.name == sheriff)
+ say("The crew of the ship chose to kill [usr.name]!")
+ usr.death(0)
+
+ if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places
+ event = null
+
+ //Spaceport specific interactions
+ //they get a header because most of them don't reset event (because it's a shop, you leave when you want to)
+ //they also call event() again, to regen the eventdata, which is kind of odd but necessary
+ else if(href_list["buycrew"]) //buy a crewmember
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && food >= 10 && fuel >= 10)
+ var/bought = add_crewmember()
+ last_spaceport_action = "You hired [bought] as a new crewmember."
+ fuel -= 10
+ food -= 10
+ event()
+
+ else if(href_list["sellcrew"]) //sell a crewmember
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && settlers.len > 1)
+ var/sold = remove_crewmember()
+ last_spaceport_action = "You sold your crewmember, [sold]!"
+ fuel += 7
+ food += 7
+ event()
+
+ else if(href_list["leave_spaceport"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ event = null
+ gameStatus = ORION_STATUS_NORMAL
+ spaceport_raided = 0
+ spaceport_freebie = 0
+ last_spaceport_action = ""
+
+ else if(href_list["raid_spaceport"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided)
+ var/success = min(15 * alive,100) //default crew (4) have a 60% chance
+ spaceport_raided = 1
+
+ var/FU = 0
+ var/FO = 0
+ if(prob(success))
+ FU = rand(5,15)
+ FO = rand(5,15)
+ last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
+ else
+ FU = rand(-5,-15)
+ FO = rand(-5,-15)
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
+
+ //your chance of lose a crewmember is 1/2 your chance of success
+ //this makes higher % failures hurt more, don't get cocky space cowboy!
+ if(prob(success*5))
+ var/lost_crew = remove_crewmember()
+ last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
+ if(emagged)
+ say("WEEWOO WEEWOO, Spaceport Security en route!")
+ for(var/i, i<=3, i++)
+ var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src))
+ O.target = usr
+
+
+ fuel += FU
+ food += FO
+ event()
+
+ else if(href_list["buyparts"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided && fuel > 5)
+ switch(text2num(href_list["buyparts"]))
+ if(1) //Engine Parts
+ engine++
+ last_spaceport_action = "Bought Engine Parts"
+ if(2) //Hull Plates
+ hull++
+ last_spaceport_action = "Bought Hull Plates"
+ if(3) //Spare Electronics
+ electronics++
+ last_spaceport_action = "Bought Spare Electronics"
+ fuel -= 5 //they all cost 5
+ event()
+
+ else if(href_list["trade"])
+ if(gameStatus == ORION_STATUS_MARKET)
+ if(!spaceport_raided)
+ switch(text2num(href_list["trade"]))
+ if(1) //Fuel
+ if(fuel > 5)
+ fuel -= 5
+ food += 5
+ last_spaceport_action = "Traded Fuel for Food"
+ event()
+ if(2) //Food
+ if(food > 5)
+ fuel += 5
+ food -= 5
+ last_spaceport_action = "Traded Food for Fuel"
+ event()
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ busy = 0
+ return
+
+
+/obj/machinery/computer/arcade/orion_trail/proc/event()
+ eventdat = "[event]
"
+ canContinueEvent = 0
+ switch(event)
+ if(ORION_TRAIL_RAIDERS)
+ eventdat += "Raiders have come aboard your ship!"
+ if(prob(50))
+ var/sfood = rand(1,10)
+ var/sfuel = rand(1,10)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
+ else if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] tried to fight back but was killed."
+ else
+ eventdat += "
Fortunately you fended them off without any trouble."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_FLUX)
+ eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
+ eventdat += "
What will you do?"
+ eventdat += "Slow Down Continue
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_ILLNESS)
+ eventdat += "A deadly illness has been contracted!"
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by the disease."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_BREAKDOWN)
+ eventdat += "Oh no! The engine has broken down!"
+ eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
+ if(engine >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_MALFUNCTION)
+ eventdat += "The ship's systems are malfunctioning!"
+ eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI."
+ if(electronics >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_COLLISION)
+ eventdat += "Something hit us! Looks like there's some hull damage."
+ if(prob(25))
+ var/sfood = rand(5,15)
+ var/sfuel = rand(5,15)
+ food -= sfood
+ fuel -= sfuel
+ eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space."
+ if(prob(10))
+ var/deadname = remove_crewmember()
+ eventdat += "
[deadname] was killed by rapid depressurization."
+ eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together."
+ if(hull >= 1)
+ eventdat += "Use PartWait
"
+ else
+ eventdat += "Wait
"
+ eventdat += "Close
"
+
+ if(ORION_TRAIL_BLACKHOLE)
+ eventdat += "You were swept away into the black hole."
+ eventdat += "Oh...
"
+ eventdat += "Close
"
+ settlers = list()
+
+ if(ORION_TRAIL_LING)
+ eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..."
+ if(settlers.len <= 2)
+ eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..."
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ if(prob(10)) // "likely", I didn't say it was guaranteed!
+ lings_aboard = min(++lings_aboard,2)
+ else
+ if(lings_aboard) //less likely to stack lings
+ if(prob(20))
+ lings_aboard = min(++lings_aboard,2)
+ else if(prob(70))
+ lings_aboard = min(++lings_aboard,2)
+
+ eventdat += "Kill a crewmember
"
+ eventdat += "Risk it
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+ if(ORION_TRAIL_LING_ATTACK)
+ if(lings_aboard <= 0) //shouldn't trigger, but hey.
+ eventdat += "Haha, fooled you, there are no changelings on board!"
+ eventdat += "
(You should report this to a coder :S)"
+ else
+ var/ling1 = remove_crewmember()
+ var/ling2 = ""
+ if(lings_aboard >= 2)
+ ling2 = remove_crewmember()
+
+ eventdat += "Oh no, some of your crew are Changelings!"
+ if(ling2)
+ eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!"
+ else
+ eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!"
+
+ var/chance2attack = alive*20
+ if(prob(chance2attack))
+ var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance
+ if(prob(chancetokill))
+ var/deadguy = remove_crewmember()
+ eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!"
+ else
+ eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!"
+ eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww"
+ if(ling2)
+ food += 30
+ lings_aboard = max(0,lings_aboard-2)
+ else
+ food += 15
+ lings_aboard = max(0,--lings_aboard)
+ else
+ eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!"
+ if(ling2)
+ lings_aboard = max(0,lings_aboard-2)
+ else
+ lings_aboard = max(0,--lings_aboard)
+
+ eventdat += "Continue
"
+ eventdat += "Close
"
+ canContinueEvent = 1
+
+
+ if(ORION_TRAIL_SPACEPORT)
+ gameStatus = ORION_STATUS_MARKET
+ if(spaceport_raided)
+ eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Depart Spaceport
"
+ eventdat += "Close
"
+ else
+ eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!"
+ eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..."
+ eventdat += "
Trading terms: FU = Fuel, FO = Food"
+ if(last_spaceport_action)
+ eventdat += "
Last Spaceport Action: [last_spaceport_action]"
+ eventdat += "Crew:
"
+ eventdat += english_list(settlers)
+ eventdat += "
Food: [food] | Fuel: [fuel]"
+ eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]"
+
+
+ //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port)
+ if(!spaceport_freebie && (fuel < 20 || food < 20))
+ spaceport_freebie++
+ var/FU = 10
+ var/FO = 10
+ var/freecrew = 0
+ if(prob(30))
+ FU = 25
+ FO = 25
+
+ if(prob(10))
+ add_crewmember()
+ freecrew++
+
+ eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)"
+ if(freecrew)
+ eventdat += "
You also gain a new crewmember!"
+
+ fuel += FU
+ food += FO
+
+ //CREW INTERACTIONS
+ eventdat += "Crew Management:
"
+
+ //Buy crew
+ if(food >= 10 && fuel >= 10)
+ eventdat += "Hire a new Crewmember (-10FU,-10FO)
"
+ else
+ eventdat += "Cant afford a new Crewmember
"
+
+ //Sell crew
+ if(settlers.len > 1)
+ eventdat += "Sell crew for Fuel and Food (+7FU,+7FO)
"
+ else
+ eventdat += "Cant afford to sell a Crewmember
"
+
+ //BUY/SELL STUFF
+ eventdat += "Spare Parts:
"
+
+ //Engine parts
+ if(fuel > 5)
+ eventdat += "Buy Engine Parts (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Engine Parts"
+
+ //Hull plates
+ if(fuel > 5)
+ eventdat += "
Buy Hull Plates (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Hull Plates"
+
+ //Electronics
+ if(fuel > 5)
+ eventdat += "
Buy Spare Electronics (-5FU)
"
+ else
+ eventdat += "Cant afford to buy Spare Electronics"
+
+ //Trade
+ if(fuel > 5)
+ eventdat += "
Trade Fuel for Food (-5FU,+5FO)
"
+ else
+ eventdat += "Cant afford to Trade Fuel for Food
5)
+ eventdat += "Trade Food for Fuel (+5FU,-5FO)
"
+ else
+ eventdat += "Cant afford to Trade Food for Fuel
!! Raid Spaceport !!"
+
+ eventdat += "Depart Spaceport
"
+
+
+//Add Random/Specific crewmember
+/obj/machinery/computer/arcade/orion_trail/proc/add_crewmember(var/specific = "")
+ var/newcrew = ""
+ if(specific)
+ newcrew = specific
+ else
+ if(prob(50))
+ newcrew = pick(first_names_male)
+ else
+ newcrew = pick(first_names_female)
+ if(newcrew)
+ settlers += newcrew
+ alive++
+ return newcrew
+
+
+//Remove Random/Specific crewmember
+/obj/machinery/computer/arcade/orion_trail/proc/remove_crewmember(var/specific = "", var/dont_remove = "")
+ var/list/safe2remove = settlers
+ var/removed = ""
+ if(dont_remove)
+ safe2remove -= dont_remove
+ if(specific && specific != dont_remove)
+ safe2remove = list(specific)
+ else
+ removed = pick(safe2remove)
+
+ if(removed)
+ if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously
+ lings_aboard = max(0,--lings_aboard)
+ settlers -= removed
+ alive--
+ return removed
+
+
+/obj/machinery/computer/arcade/orion_trail/proc/win()
+ gameStatus = ORION_STATUS_START
+ say("Congratulations, you made it to Orion!")
+ if(emagged)
+ new /obj/item/weapon/orion_ship(src.loc)
+ message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ else
+ prizevend()
+ emagged = 0
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
+ if(!emagged)
+ user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode."
+ name = "The Orion Trail: Realism Edition"
+ desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
+ newgame()
+ emagged = 1
+
+/mob/living/simple_animal/hostile/syndicate/ranged/orion
+ name = "Spaceport Security"
+ desc = "The Premier security forces for all spaceports found along the Orion Trail."
+ faction = list("orion")
+ loot = list(/obj/effect/mob_spawn/human/corpse/orionsecurity,
+ /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted,
+ /obj/item/weapon/shield/energy)
+
+/obj/effect/mob_spawn/human/corpse/orionsecurity
+ name = "Spaceport Security"
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/vest
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ radio = /obj/item/device/radio/headset
+ mask = /obj/item/clothing/mask/gas
+ helmet = /obj/item/clothing/head/helmet/swat
+ back = /obj/item/weapon/storage/backpack
+ has_id = 1
+ id_job = "Officer"
+ id_access = "Syndicate"
+
+/obj/item/weapon/orion_ship
+ name = "model settler ship"
+ desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ship"
+ w_class = 2
+ var/active = 0 //if the ship is on
+
+/obj/item/weapon/orion_ship/examine(mob/user)
+ ..()
+ if(!(in_range(user, src)))
+ return
+ if(!active)
+ user << "There's a little switch on the bottom. It's flipped down."
+ else
+ user << "There's a little switch on the bottom. It's flipped up."
+
+/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse
+ if(active)
+ return
+
+ message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
+ log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
+
+ user << "You flip the switch on the underside of [src]."
+ active = 1
+ src.visible_message("[src] softly beeps and whirs to life!")
+ playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1)
+ say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.")
+ sleep(20)
+ src.visible_message("[src] begins to vibrate...")
+ say("Uh, Port? Having some issues with our reactor, could you check it out? Over.")
+ sleep(30)
+ say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-")
+ playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1)
+ sleep(3.6)
+ src.visible_message("[src] explodes!")
+ explosion(src.loc, 2,4,8, flame_range = 16)
+ qdel(src)
+
+
+#undef ORION_TRAIL_WINTURN
+#undef ORION_TRAIL_RAIDERS
+#undef ORION_TRAIL_FLUX
+#undef ORION_TRAIL_ILLNESS
+#undef ORION_TRAIL_BREAKDOWN
+#undef ORION_TRAIL_LING
+#undef ORION_TRAIL_LING_ATTACK
+#undef ORION_TRAIL_MALFUNCTION
+#undef ORION_TRAIL_COLLISION
+#undef ORION_TRAIL_SPACEPORT
+#undef ORION_TRAIL_BLACKHOLE
+
+#undef ORION_STATUS_START
+#undef ORION_STATUS_NORMAL
+#undef ORION_STATUS_GAMEOVER
+#undef ORION_STATUS_MARKET
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index e6f306e03c8..6d3587d5507 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -1,7 +1,7 @@
/obj/machinery/computer/atmos_alert
name = "atmospheric alert console"
desc = "Used to monitor the station's air alarms."
- circuit = /obj/item/weapon/circuitboard/atmos_alert
+ circuit = /obj/item/weapon/circuitboard/computer/atmos_alert
icon_screen = "alert:0"
icon_keyboard = "atmos_key"
var/list/priority_alarms = list()
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 32e3ae5c38e..3f40993ffad 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -68,7 +68,7 @@
desc = "Used to monitor the station's atmospherics sensors."
icon_screen = "tank"
icon_keyboard = "atmos_key"
- circuit = /obj/item/weapon/circuitboard/atmos_control
+ circuit = /obj/item/weapon/circuitboard/computer/atmos_control
var/frequency = 1441
var/list/sensors = list(
@@ -146,7 +146,7 @@
var/input_tag
var/output_tag
frequency = 1441
- circuit = /obj/item/weapon/circuitboard/atmos_control/tank
+ circuit = /obj/item/weapon/circuitboard/computer/atmos_control/tank
var/list/input_info
var/list/output_info
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 620b7f37e6a..73717cf3f7c 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -1,292 +1,10 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-/obj/structure/computerframe
- density = 1
- anchored = 0
- name = "computer-frame"
- icon = 'icons/obj/stock_parts.dmi'
+/obj/structure/frame/computer
+ name = "computer frame"
icon_state = "0"
- var/state = 0
- var/obj/item/weapon/circuitboard/circuit = null
-// weight = 1.0E8
-
-/obj/item/weapon/circuitboard
- density = 0
anchored = 0
- w_class = 2
- name = "circuit board"
- icon = 'icons/obj/module.dmi'
- icon_state = "id_mod"
- item_state = "electronic"
- origin_tech = "programming=2"
- materials = list(MAT_GLASS=200)
- var/frequency = null
- var/build_path = null
- var/board_type = "computer"
- var/list/req_components = null
- var/powernet = null
- var/list/records = null
- var/frame_desc = null
+ state = 0
-/obj/item/weapon/circuitboard/turbine_computer
- name = "circuit board (Turbine Computer)"
- build_path = /obj/machinery/computer/turbine_computer
- origin_tech = "programming=4;engineering=4;powerstorage=4"
-/obj/item/weapon/circuitboard/telesci_console
- name = "circuit board (Telescience Console)"
- build_path = /obj/machinery/computer/telescience
- origin_tech = "programming=3;bluespace=2"
-/obj/item/weapon/circuitboard/message_monitor
- name = "circuit board (Message Monitor)"
- build_path = /obj/machinery/computer/message_monitor
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/security
- name = "circuit board (Security)"
- build_path = /obj/machinery/computer/security
-/obj/item/weapon/circuitboard/aicore
- name = "circuit board (AI core)"
- origin_tech = "programming=4;biotech=2"
- board_type = "other"
-/obj/item/weapon/circuitboard/aiupload
- name = "circuit board (AI Upload)"
- build_path = /obj/machinery/computer/upload/ai
- origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/borgupload
- name = "circuit board (Cyborg Upload)"
- build_path = /obj/machinery/computer/upload/borg
- origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/med_data
- name = "circuit board (Medical Records Console)"
- build_path = /obj/machinery/computer/med_data
-/obj/item/weapon/circuitboard/pandemic
- name = "circuit board (PanD.E.M.I.C. 2200)"
- build_path = /obj/machinery/computer/pandemic
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/scan_consolenew
- name = "circuit board (DNA Machine)"
- build_path = /obj/machinery/computer/scan_consolenew
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/communications
- name = "circuit board (Communications)"
- build_path = /obj/machinery/computer/communications
- origin_tech = "programming=2;magnets=2"
- var/lastTimeUsed = 0
-
-/obj/item/weapon/circuitboard/card
- name = "circuit board (ID Console)"
- build_path = /obj/machinery/computer/card
-/obj/item/weapon/circuitboard/card/centcom
- name = "circuit board (Centcom ID Console)"
- build_path = /obj/machinery/computer/card/centcom
-/obj/item/weapon/circuitboard/card/minor
- name = "circuit board (Department Management Console)"
- build_path = /obj/machinery/computer/card/minor
- var/target_dept = 1
-//obj/item/weapon/circuitboard/shield
-// name = "Circuit board (Shield Control)"
-// build_path = /obj/machinery/computer/stationshield
-/obj/item/weapon/circuitboard/teleporter
- name = "circuit board (Teleporter)"
- build_path = /obj/machinery/computer/teleporter
- origin_tech = "programming=2;bluespace=2"
-/obj/item/weapon/circuitboard/secure_data
- name = "circuit board (Security Records Console)"
- build_path = /obj/machinery/computer/secure_data
-/obj/item/weapon/circuitboard/stationalert
- name = "circuit board (Station Alerts)"
- build_path = /obj/machinery/computer/station_alert
-/*/obj/item/weapon/circuitboard/atmospheresiphonswitch
- name = "circuit board (Atmosphere siphon control)"
- build_path = /obj/machinery/computer/atmosphere/siphonswitch*/
-/obj/item/weapon/circuitboard/atmos_control
- name = "circuit board (Atmospheric Monitor)"
- build_path = /obj/machinery/computer/atmos_control
-/obj/item/weapon/circuitboard/atmos_control/tank
- name = "circuit board (Tank Control)"
- build_path = /obj/machinery/computer/atmos_control/tank
- origin_tech = "programming=2;engineering=3;materials=2"
-/obj/item/weapon/circuitboard/atmos_alert
- name = "circuit board (Atmospheric Alert)"
- build_path = /obj/machinery/computer/atmos_alert
-/obj/item/weapon/circuitboard/pod
- name = "circuit board (Massdriver control)"
- build_path = /obj/machinery/computer/pod
-/obj/item/weapon/circuitboard/robotics
- name = "circuit board (Robotics Control)"
- build_path = /obj/machinery/computer/robotics
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/cloning
- name = "circuit board (Cloning)"
- build_path = /obj/machinery/computer/cloning
- origin_tech = "programming=3;biotech=3"
-/obj/item/weapon/circuitboard/arcade/battle
- name = "circuit board (Arcade Battle)"
- build_path = /obj/machinery/computer/arcade/battle
- origin_tech = "programming=1"
-/obj/item/weapon/circuitboard/arcade/orion_trail
- name = "circuit board (Orion Trail)"
- build_path = /obj/machinery/computer/arcade/orion_trail
-/obj/item/weapon/circuitboard/turbine_control
- name = "circuit board (Turbine control)"
- build_path = /obj/machinery/computer/turbine_computer
-/obj/item/weapon/circuitboard/solar_control
- name = "circuit board (Solar Control)" //name fixed 250810
- build_path = /obj/machinery/power/solar_control
- origin_tech = "programming=2;powerstorage=2"
-/obj/item/weapon/circuitboard/powermonitor
- name = "circuit board (Power Monitor)" //name fixed 250810
- build_path = /obj/machinery/computer/monitor
-/obj/item/weapon/circuitboard/olddoor
- name = "circuit board (DoorMex)"
- build_path = /obj/machinery/computer/pod/old
-/obj/item/weapon/circuitboard/syndicatedoor
- name = "circuit board (ProComp Executive)"
- build_path = /obj/machinery/computer/pod/old/syndicate
-/obj/item/weapon/circuitboard/swfdoor
- name = "circuit board (Magix)"
- build_path = /obj/machinery/computer/pod/old/swf
-/obj/item/weapon/circuitboard/prisoner
- name = "circuit board (Prisoner Management Console)"
- build_path = /obj/machinery/computer/prisoner
-/obj/item/weapon/circuitboard/rdconsole
- name = "circuit board (RD Console)"
- build_path = /obj/machinery/computer/rdconsole/core
-/obj/item/weapon/circuitboard/mecha_control
- name = "circuit board (Exosuit Control Console)"
- build_path = /obj/machinery/computer/mecha
-/obj/item/weapon/circuitboard/rdservercontrol
- name = "circuit board (R&D Server Control)"
- build_path = /obj/machinery/computer/rdservercontrol
-/obj/item/weapon/circuitboard/crew
- name = "circuit board (Crew Monitoring Console)"
- build_path = /obj/machinery/computer/crew
- origin_tech = "programming=3;biotech=2;magnets=2"
-/obj/item/weapon/circuitboard/mech_bay_power_console
- name = "circuit board (Mech Bay Power Control Console)"
- build_path = /obj/machinery/computer/mech_bay_power_console
- origin_tech = "programming=2;powerstorage=3"
-/obj/item/weapon/circuitboard/cargo
- name = "circuit board (Supply Console)"
- build_path = /obj/machinery/computer/cargo
- origin_tech = "programming=3"
- var/contraband = 0
- var/emagged = 0
-/obj/item/weapon/circuitboard/cargo/request
- name = "circuit board (Supply Request Console)"
- build_path = /obj/machinery/computer/cargo/request
-/obj/item/weapon/circuitboard/operating
- name = "circuit board (Operating Computer)"
- build_path = /obj/machinery/computer/operating
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/mining
- name = "circuit board (Outpost Status Display)"
- build_path = /obj/machinery/computer/security/mining
-/obj/item/weapon/circuitboard/comm_monitor
- name = "circuit board (Telecommunications Monitor)"
- build_path = /obj/machinery/computer/telecomms/monitor
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/comm_server
- name = "circuit board (Telecommunications Server Monitor)"
- build_path = /obj/machinery/computer/telecomms/server
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/shuttle
- name = "circuit board (Shuttle)"
- build_path = /obj/machinery/computer/shuttle
- var/shuttleId
- var/possible_destinations = ""
-/obj/item/weapon/circuitboard/labor_shuttle
- name = "circuit board (Labor Shuttle)"
- build_path = /obj/machinery/computer/shuttle/labor
-/obj/item/weapon/circuitboard/labor_shuttle/one_way
- name = "circuit board (Prisoner Shuttle Console)"
- build_path = /obj/machinery/computer/shuttle/labor/one_way
-/obj/item/weapon/circuitboard/ferry
- name = "circuit board (Transport Ferry)"
- build_path = /obj/machinery/computer/shuttle/ferry
-/obj/item/weapon/circuitboard/ferry/request
- name = "circuit board (Transport Ferry Console)"
- build_path = /obj/machinery/computer/shuttle/ferry/request
-/obj/item/weapon/circuitboard/mining_shuttle
- name = "circuit board (Mining Shuttle)"
- build_path = /obj/machinery/computer/shuttle/mining
-/obj/item/weapon/circuitboard/white_ship
- name = "circuit board (White Ship)"
- build_path = /obj/machinery/computer/shuttle/white_ship
-/obj/item/weapon/circuitboard/holodeck// Not going to let people get this, but it's just here for future
- name = "circuit board (Holodeck Control)"
- build_path = /obj/machinery/computer/holodeck
- origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/aifixer
- name = "circuit board (AI Integrity Restorer)"
- build_path = /obj/machinery/computer/aifixer
- origin_tech = "programming=3;biotech=2"
-/*/obj/item/weapon/circuitboard/prison_shuttle
- name = "circuit board (Prison Shuttle)"
- build_path = /obj/machinery/computer/prison_shuttle*/
-/obj/item/weapon/circuitboard/slot_machine
- name = "circuit board (Slot Machine)"
- build_path = /obj/machinery/computer/slot_machine
- origin_tech = "programming=1"
-/obj/item/weapon/circuitboard/libraryconsole
- name = "circuit board (Library Visitor Console)"
- build_path = /obj/machinery/computer/libraryconsole
- origin_tech = "programming=1"
-
-/obj/item/weapon/circuitboard/card/minor/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/device/multitool))
- var/list/dept_list = list("general","security","medical","science","engineering")
- var/choice = input("Currently set to [dept_list[target_dept]] personnel database. Changing to:","Multitool-Circuitboard interface") as null|anything in dept_list
- if(choice)
- target_dept = dept_list.Find(choice)
- return
-
-/obj/item/weapon/circuitboard/cargo/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/device/multitool))
- if(!emagged)
- contraband = !contraband
- user << "Receiver spectrum set to [contraband ? "Broad" : "Standard"]."
- else
- user << "The spectrum chip is unresponsive."
- if(istype(I,/obj/item/weapon/card/emag))
- if(!emagged)
- contraband = TRUE
- emagged = TRUE
- user << "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband."
-
-/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/weapon/screwdriver))
- if(build_path == /obj/machinery/computer/rdconsole/core)
- name = "circuit board (RD Console - Robotics)"
- build_path = /obj/machinery/computer/rdconsole/robotics
- user << "Access protocols successfully updated."
- else
- name = "circuit board (RD Console)"
- build_path = /obj/machinery/computer/rdconsole/core
- user << "Defaulting access protocols."
- return
-
-/obj/item/weapon/circuitboard/libraryconsole/attackby(obj/item/I, mob/user, params)
- if(istype(I,/obj/item/weapon/screwdriver))
- if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement)
- name = "circuit board (Library Visitor Console)"
- build_path = /obj/machinery/computer/libraryconsole
- user << "Defaulting access protocols."
- else
- name = "circuit board (Book Inventory Management Console)"
- build_path = /obj/machinery/computer/libraryconsole/bookmanagement
- user << "Access protocols successfully updated."
- return
-
-/obj/item/weapon/circuitboard/shuttle/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/device/multitool))
- var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null)
- if(chosen_id >= 0)
- shuttleId = chosen_id
- else
- shuttleId = initial(shuttleId)
- return
-
-/obj/structure/computerframe/attackby(obj/item/P, mob/user, params)
+/obj/structure/frame/computer/attackby(obj/item/P, mob/user, params)
add_fingerprint(user)
switch(state)
if(0)
@@ -319,19 +37,19 @@
user << "You unfasten the frame."
anchored = 0
state = 0
- if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
- var/obj/item/weapon/circuitboard/B = P
- if(B.board_type == "computer")
- if(!user.drop_item())
- return
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You place the circuit board inside the frame."
- icon_state = "1"
- circuit = P
- circuit.add_fingerprint(user)
- P.loc = null
- else
- user << "This frame does not accept circuit boards of this type!"
+ if(istype(P, /obj/item/weapon/circuitboard/computer) && !circuit)
+ if(!user.drop_item())
+ return
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ user << "You place the circuit board inside the frame."
+ icon_state = "1"
+ circuit = P
+ circuit.add_fingerprint(user)
+ P.loc = null
+
+ else if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
+ user << "This frame does not accept circuit boards of this type!"
+
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "You screw the circuit board into place."
@@ -402,3 +120,291 @@
var/obj/B = new src.circuit.build_path (src.loc, circuit)
transfer_fingerprints_to(B)
qdel(src)
+
+
+
+/obj/item/weapon/circuitboard
+ name = "circuit board"
+ icon = 'icons/obj/module.dmi'
+ icon_state = "id_mod"
+ item_state = "electronic"
+ origin_tech = "programming=2"
+ materials = list(MAT_GLASS=1000)
+ w_class = 2
+ var/build_path = null
+
+/obj/item/weapon/circuitboard/computer/turbine_computer
+ name = "circuit board (Turbine Computer)"
+ build_path = /obj/machinery/computer/turbine_computer
+ origin_tech = "programming=4;engineering=4;powerstorage=4"
+/obj/item/weapon/circuitboard/computer/telesci_console
+ name = "circuit board (Telescience Console)"
+ build_path = /obj/machinery/computer/telescience
+ origin_tech = "programming=3;bluespace=2"
+/obj/item/weapon/circuitboard/computer/message_monitor
+ name = "circuit board (Message Monitor)"
+ build_path = /obj/machinery/computer/message_monitor
+ origin_tech = "programming=3"
+/obj/item/weapon/circuitboard/computer/security
+ name = "circuit board (Security Cameras)"
+ build_path = /obj/machinery/computer/security
+
+/obj/item/weapon/circuitboard/computer/aiupload
+ name = "circuit board (AI Upload)"
+ build_path = /obj/machinery/computer/upload/ai
+ origin_tech = "programming=4"
+/obj/item/weapon/circuitboard/computer/borgupload
+ name = "circuit board (Cyborg Upload)"
+ build_path = /obj/machinery/computer/upload/borg
+ origin_tech = "programming=4"
+/obj/item/weapon/circuitboard/computer/med_data
+ name = "circuit board (Medical Records Console)"
+ build_path = /obj/machinery/computer/med_data
+/obj/item/weapon/circuitboard/computer/pandemic
+ name = "circuit board (PanD.E.M.I.C. 2200)"
+ build_path = /obj/machinery/computer/pandemic
+ origin_tech = "programming=2;biotech=2"
+/obj/item/weapon/circuitboard/computer/scan_consolenew
+ name = "circuit board (DNA Machine)"
+ build_path = /obj/machinery/computer/scan_consolenew
+ origin_tech = "programming=2;biotech=2"
+/obj/item/weapon/circuitboard/computer/communications
+ name = "circuit board (Communications)"
+ build_path = /obj/machinery/computer/communications
+ origin_tech = "programming=2;magnets=2"
+ var/lastTimeUsed = 0
+
+/obj/item/weapon/circuitboard/computer/card
+ name = "circuit board (ID Console)"
+ build_path = /obj/machinery/computer/card
+/obj/item/weapon/circuitboard/computer/card/centcom
+ name = "circuit board (Centcom ID Console)"
+ build_path = /obj/machinery/computer/card/centcom
+
+/obj/item/weapon/circuitboard/computer/card/minor
+ name = "circuit board (Department Management Console)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = 1
+ var/list/dept_list = list("General","Security","Medical","Science","Engineering")
+
+/obj/item/weapon/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1)
+ user << "You set the board to \"[dept_list[target_dept]]\"."
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/card/minor/examine(user)
+ ..()
+ user << "Currently set to \"[dept_list[target_dept]]\"."
+
+//obj/item/weapon/circuitboard/computer/shield
+// name = "Circuit board (Shield Control)"
+// build_path = /obj/machinery/computer/stationshield
+/obj/item/weapon/circuitboard/computer/teleporter
+ name = "circuit board (Teleporter)"
+ build_path = /obj/machinery/computer/teleporter
+ origin_tech = "programming=2;bluespace=2"
+/obj/item/weapon/circuitboard/computer/secure_data
+ name = "circuit board (Security Records Console)"
+ build_path = /obj/machinery/computer/secure_data
+/obj/item/weapon/circuitboard/computer/stationalert
+ name = "circuit board (Station Alerts)"
+ build_path = /obj/machinery/computer/station_alert
+/*/obj/item/weapon/circuitboard/computer/atmospheresiphonswitch
+ name = "circuit board (Atmosphere siphon control)"
+ build_path = /obj/machinery/computer/atmosphere/siphonswitch*/
+/obj/item/weapon/circuitboard/computer/atmos_control
+ name = "circuit board (Atmospheric Monitor)"
+ build_path = /obj/machinery/computer/atmos_control
+/obj/item/weapon/circuitboard/computer/atmos_control/tank
+ name = "circuit board (Tank Control)"
+ build_path = /obj/machinery/computer/atmos_control/tank
+ origin_tech = "programming=2;engineering=3;materials=2"
+/obj/item/weapon/circuitboard/computer/atmos_alert
+ name = "circuit board (Atmospheric Alert)"
+ build_path = /obj/machinery/computer/atmos_alert
+/obj/item/weapon/circuitboard/computer/pod
+ name = "circuit board (Massdriver control)"
+ build_path = /obj/machinery/computer/pod
+/obj/item/weapon/circuitboard/computer/robotics
+ name = "circuit board (Robotics Control)"
+ build_path = /obj/machinery/computer/robotics
+ origin_tech = "programming=3"
+/obj/item/weapon/circuitboard/computer/cloning
+ name = "circuit board (Cloning)"
+ build_path = /obj/machinery/computer/cloning
+ origin_tech = "programming=3;biotech=3"
+/obj/item/weapon/circuitboard/computer/arcade/battle
+ name = "circuit board (Arcade Battle)"
+ build_path = /obj/machinery/computer/arcade/battle
+ origin_tech = "programming=1"
+/obj/item/weapon/circuitboard/computer/arcade/orion_trail
+ name = "circuit board (Orion Trail)"
+ build_path = /obj/machinery/computer/arcade/orion_trail
+/obj/item/weapon/circuitboard/computer/turbine_control
+ name = "circuit board (Turbine control)"
+ build_path = /obj/machinery/computer/turbine_computer
+/obj/item/weapon/circuitboard/computer/solar_control
+ name = "circuit board (Solar Control)" //name fixed 250810
+ build_path = /obj/machinery/power/solar_control
+ origin_tech = "programming=2;powerstorage=2"
+/obj/item/weapon/circuitboard/computer/powermonitor
+ name = "circuit board (Power Monitor)" //name fixed 250810
+ build_path = /obj/machinery/computer/monitor
+/obj/item/weapon/circuitboard/computer/olddoor
+ name = "circuit board (DoorMex)"
+ build_path = /obj/machinery/computer/pod/old
+/obj/item/weapon/circuitboard/computer/syndicatedoor
+ name = "circuit board (ProComp Executive)"
+ build_path = /obj/machinery/computer/pod/old/syndicate
+/obj/item/weapon/circuitboard/computer/swfdoor
+ name = "circuit board (Magix)"
+ build_path = /obj/machinery/computer/pod/old/swf
+/obj/item/weapon/circuitboard/computer/prisoner
+ name = "circuit board (Prisoner Management Console)"
+ build_path = /obj/machinery/computer/prisoner
+
+
+/obj/item/weapon/circuitboard/computer/rdconsole
+ name = "circuit board (RD Console)"
+ build_path = /obj/machinery/computer/rdconsole/core
+
+/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params)
+ if(istype(I,/obj/item/weapon/screwdriver))
+ if(build_path == /obj/machinery/computer/rdconsole/core)
+ name = "circuit board (RD Console - Robotics)"
+ build_path = /obj/machinery/computer/rdconsole/robotics
+ user << "Access protocols successfully updated."
+ else
+ name = "circuit board (RD Console)"
+ build_path = /obj/machinery/computer/rdconsole/core
+ user << "Defaulting access protocols."
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/mecha_control
+ name = "circuit board (Exosuit Control Console)"
+ build_path = /obj/machinery/computer/mecha
+/obj/item/weapon/circuitboard/computer/rdservercontrol
+ name = "circuit board (R&D Server Control)"
+ build_path = /obj/machinery/computer/rdservercontrol
+/obj/item/weapon/circuitboard/computer/crew
+ name = "circuit board (Crew Monitoring Console)"
+ build_path = /obj/machinery/computer/crew
+ origin_tech = "programming=3;biotech=2;magnets=2"
+/obj/item/weapon/circuitboard/computer/mech_bay_power_console
+ name = "circuit board (Mech Bay Power Control Console)"
+ build_path = /obj/machinery/computer/mech_bay_power_console
+ origin_tech = "programming=2;powerstorage=3"
+
+/obj/item/weapon/circuitboard/computer/cargo
+ name = "circuit board (Supply Console)"
+ build_path = /obj/machinery/computer/cargo
+ origin_tech = "programming=3"
+ var/contraband = 0
+ var/emagged = 0
+
+/obj/item/weapon/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params)
+ if(istype(I,/obj/item/device/multitool))
+ if(!emagged)
+ contraband = !contraband
+ user << "Receiver spectrum set to [contraband ? "Broad" : "Standard"]."
+ else
+ user << "The spectrum chip is unresponsive."
+ else if(istype(I,/obj/item/weapon/card/emag))
+ if(!emagged)
+ contraband = TRUE
+ emagged = TRUE
+ user << "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband."
+ else
+ return ..()
+
+
+/obj/item/weapon/circuitboard/computer/cargo/request
+ name = "circuit board (Supply Request Console)"
+ build_path = /obj/machinery/computer/cargo/request
+
+/obj/item/weapon/circuitboard/computer/operating
+ name = "circuit board (Operating Computer)"
+ build_path = /obj/machinery/computer/operating
+ origin_tech = "programming=2;biotech=2"
+/obj/item/weapon/circuitboard/computer/mining
+ name = "circuit board (Outpost Status Display)"
+ build_path = /obj/machinery/computer/security/mining
+/obj/item/weapon/circuitboard/computer/comm_monitor
+ name = "circuit board (Telecommunications Monitor)"
+ build_path = /obj/machinery/computer/telecomms/monitor
+ origin_tech = "programming=3"
+/obj/item/weapon/circuitboard/computer/comm_server
+ name = "circuit board (Telecommunications Server Monitor)"
+ build_path = /obj/machinery/computer/telecomms/server
+ origin_tech = "programming=3"
+
+/obj/item/weapon/circuitboard/computer/shuttle
+ name = "circuit board (Shuttle)"
+ build_path = /obj/machinery/computer/shuttle
+ var/shuttleId
+ var/possible_destinations = ""
+
+/obj/item/weapon/circuitboard/computer/shuttle/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/multitool))
+ var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null)
+ if(chosen_id >= 0)
+ shuttleId = chosen_id
+ else
+ shuttleId = initial(shuttleId)
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/labor_shuttle
+ name = "circuit board (Labor Shuttle)"
+ build_path = /obj/machinery/computer/shuttle/labor
+/obj/item/weapon/circuitboard/computer/labor_shuttle/one_way
+ name = "circuit board (Prisoner Shuttle Console)"
+ build_path = /obj/machinery/computer/shuttle/labor/one_way
+/obj/item/weapon/circuitboard/computer/ferry
+ name = "circuit board (Transport Ferry)"
+ build_path = /obj/machinery/computer/shuttle/ferry
+/obj/item/weapon/circuitboard/computer/ferry/request
+ name = "circuit board (Transport Ferry Console)"
+ build_path = /obj/machinery/computer/shuttle/ferry/request
+/obj/item/weapon/circuitboard/computer/mining_shuttle
+ name = "circuit board (Mining Shuttle)"
+ build_path = /obj/machinery/computer/shuttle/mining
+/obj/item/weapon/circuitboard/computer/white_ship
+ name = "circuit board (White Ship)"
+ build_path = /obj/machinery/computer/shuttle/white_ship
+/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future
+ name = "circuit board (Holodeck Control)"
+ build_path = /obj/machinery/computer/holodeck
+ origin_tech = "programming=4"
+/obj/item/weapon/circuitboard/computer/aifixer
+ name = "circuit board (AI Integrity Restorer)"
+ build_path = /obj/machinery/computer/aifixer
+ origin_tech = "programming=3;biotech=2"
+/*/obj/item/weapon/circuitboard/computer/prison_shuttle
+ name = "circuit board (Prison Shuttle)"
+ build_path = /obj/machinery/computer/prison_shuttle*/
+/obj/item/weapon/circuitboard/computer/slot_machine
+ name = "circuit board (Slot Machine)"
+ build_path = /obj/machinery/computer/slot_machine
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/libraryconsole
+ name = "circuit board (Library Visitor Console)"
+ build_path = /obj/machinery/computer/libraryconsole
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params)
+ if(istype(I,/obj/item/weapon/screwdriver))
+ if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement)
+ name = "circuit board (Library Visitor Console)"
+ build_path = /obj/machinery/computer/libraryconsole
+ user << "Defaulting access protocols."
+ else
+ name = "circuit board (Book Inventory Management Console)"
+ build_path = /obj/machinery/computer/libraryconsole/bookmanagement
+ user << "Access protocols successfully updated."
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 0bdb44931a3..c13ba3af2c4 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -3,7 +3,7 @@
desc = "Used to access the various cameras on the station."
icon_screen = "cameras"
icon_keyboard = "security_key"
- circuit = /obj/item/weapon/circuitboard/security
+ circuit = /obj/item/weapon/circuitboard/computer/security
var/last_pic = 1
var/list/network = list("SS13")
var/mapping = 0//For the overview file, interesting bit of code.
@@ -177,4 +177,4 @@
icon_screen = "mining"
icon_keyboard = "mining_key"
network = list("MINE")
- circuit = "/obj/item/weapon/circuitboard/mining"
+ circuit = /obj/item/weapon/circuitboard/computer/mining
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index df02f37b5cb..0bbbeda6165 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -10,7 +10,7 @@ var/time_last_changed_position = 0
icon_screen = "id"
icon_keyboard = "id_key"
req_one_access = list(access_heads, access_change_ids)
- circuit = /obj/item/weapon/circuitboard/card
+ circuit = /obj/item/weapon/circuitboard/computer/card
var/obj/item/weapon/card/id/scan = null
var/obj/item/weapon/card/id/modify = null
var/authenticated = 0
@@ -483,18 +483,18 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card/centcom
name = "\improper Centcom identification console"
- circuit = /obj/item/weapon/circuitboard/card/centcom
+ circuit = /obj/item/weapon/circuitboard/computer/card/centcom
req_access = list(access_cent_captain)
/obj/machinery/computer/card/minor
name = "department management console"
desc = "You can use this to change ID's for specific departments."
icon_screen = "idminor"
- circuit = /obj/item/weapon/circuitboard/card/minor
+ circuit = /obj/item/weapon/circuitboard/computer/card/minor
/obj/machinery/computer/card/minor/New()
..()
- var/obj/item/weapon/circuitboard/card/minor/typed_circuit = circuit
+ var/obj/item/weapon/circuitboard/computer/card/minor/typed_circuit = circuit
if(target_dept)
typed_circuit.target_dept = target_dept
else
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index fc252a50ab4..f6011552816 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -4,7 +4,7 @@
desc = "Used to clone people and manage DNA."
icon_screen = "dna"
icon_keyboard = "med_key"
- circuit = /obj/item/weapon/circuitboard/cloning
+ circuit = /obj/item/weapon/circuitboard/computer/cloning
req_access = list(access_heads) //Only used for record deletion right now.
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
var/obj/machinery/clonepod/pod1 = null //Linked cloning pod.
@@ -356,7 +356,7 @@
if (!subject.getorgan(/obj/item/organ/brain))
scantemp = "No signs of intelligence detected."
return
- if (subject.suiciding == 1)
+ if (subject.suiciding == 1 || subject.hellbound)
scantemp = "Subject's brain is not responding to scanning stimuli."
return
if ((subject.disabilities & NOCLONE) && (src.scanner.scan_level < 2))
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index e2a77542cee..4416ed3e8e3 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -9,7 +9,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
icon_screen = "comm"
icon_keyboard = "tech_key"
req_access = list(access_heads)
- circuit = /obj/item/weapon/circuitboard/communications
+ circuit = /obj/item/weapon/circuitboard/computer/communications
var/authenticated = 0
var/auth_id = "Unknown" //Who is currently logged in?
var/list/messagetitle = list()
@@ -57,7 +57,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if(!href_list["operation"])
return
- var/obj/item/weapon/circuitboard/communications/CM = circuit
+ var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
switch(href_list["operation"])
// main interface
if("main")
@@ -611,5 +611,5 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
return ..()
/obj/machinery/computer/communications/proc/overrideCooldown()
- var/obj/item/weapon/circuitboard/communications/CM = circuit
+ var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
CM.lastTimeUsed = 0
\ No newline at end of file
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 1ae36a3a43d..35ca17a8641 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -7,7 +7,7 @@
use_power = 1
idle_power_usage = 300
active_power_usage = 300
- var/obj/item/weapon/circuitboard/circuit = null // if circuit==null, computer can't disassembly
+ var/obj/item/weapon/circuitboard/computer/circuit = null // if circuit==null, computer can't disassembly
var/processing = 0
var/brightness_on = 2
var/icon_keyboard = "generic_key"
@@ -18,9 +18,8 @@
..(location)
if(C && istype(C))
circuit = C
- else
- if(circuit)
- circuit = new circuit(null)
+ else if(circuit)
+ circuit = new circuit(null)
power_change()
update_icon()
@@ -85,7 +84,7 @@
user << " You start to disconnect the monitor..."
if(do_after(user, 20/I.toolspeed, target = src))
deconstruction()
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
A.circuit = circuit
A.anchored = 1
circuit = null
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index ad992d3aba3..ab820645505 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -6,7 +6,7 @@
use_power = 1
idle_power_usage = 250
active_power_usage = 500
- circuit = "/obj/item/weapon/circuitboard/crew"
+ circuit = /obj/item/weapon/circuitboard/computer/crew
/obj/machinery/computer/crew/attack_ai(mob/user)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index e2a29dfe536..597b90129a7 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -22,7 +22,7 @@
icon_screen = "dna"
icon_keyboard = "med_key"
density = 1
- circuit = /obj/item/weapon/circuitboard/scan_consolenew
+ circuit = /obj/item/weapon/circuitboard/computer/scan_consolenew
var/radduration = 2
var/radstrength = 1
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index 292fc7163b6..3c066205601 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -33,7 +33,7 @@
/obj/machinery/computer/upload/ai
name = "\improper AI upload console"
desc = "Used to upload laws to the AI."
- circuit = /obj/item/weapon/circuitboard/aiupload
+ circuit = /obj/item/weapon/circuitboard/computer/aiupload
/obj/machinery/computer/upload/ai/attack_hand(mob/user)
if(..())
@@ -57,7 +57,7 @@
/obj/machinery/computer/upload/borg
name = "cyborg upload console"
desc = "Used to upload laws to Cyborgs."
- circuit = /obj/item/weapon/circuitboard/borgupload
+ circuit = /obj/item/weapon/circuitboard/computer/borgupload
/obj/machinery/computer/upload/borg/attack_hand(mob/user)
if(..())
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index b3e94a26be5..51c0c3e8264 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -6,7 +6,7 @@
icon_screen = "medcomp"
icon_keyboard = "med_key"
req_one_access = list(access_medical, access_forensics_lockers)
- circuit = /obj/item/weapon/circuitboard/med_data
+ circuit = /obj/item/weapon/circuitboard/computer/med_data
var/obj/item/weapon/card/id/scan = null
var/authenticated = null
var/rank = null
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index cab29214d2e..8a74f5f09ee 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -8,7 +8,7 @@
name = "message monitor console"
desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
icon_screen = "comm_logs"
- circuit = /obj/item/weapon/circuitboard/message_monitor
+ circuit = /obj/item/weapon/circuitboard/computer/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
//Sparks effect - For emag
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index ab5a89b97e9..8a837a5af5a 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -4,7 +4,6 @@
icon_screen = "explosive"
icon_keyboard = "security_key"
req_access = list(access_brig)
- circuit = "/obj/item/weapon/circuitboard/prisoner"
var/id = 0
var/temp = null
var/status = 0
@@ -12,7 +11,7 @@
var/stop = 0
var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
var/obj/item/weapon/card/id/prisoner/inserted_id
- circuit = /obj/item/weapon/circuitboard/prisoner
+ circuit = /obj/item/weapon/circuitboard/computer/prisoner
/obj/machinery/computer/prisoner/attack_hand(mob/user)
if(..())
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index a71bb8d789a..1348622a0ff 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -7,7 +7,7 @@
icon_screen = "robot"
icon_keyboard = "rd_key"
req_access = list(access_robotics)
- circuit = /obj/item/weapon/circuitboard/robotics
+ circuit = /obj/item/weapon/circuitboard/computer/robotics
var/temp = null
/obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index a1bf31d718e..cd113558b7c 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -6,7 +6,7 @@
icon_screen = "security"
icon_keyboard = "security_key"
req_one_access = list(access_security, access_forensics_lockers)
- circuit = /obj/item/weapon/circuitboard/secure_data
+ circuit = /obj/item/weapon/circuitboard/computer/secure_data
var/obj/item/weapon/card/id/scan = null
var/authenticated = null
var/rank = null
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 70442f0dbbc..b6e5672e8f3 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -3,7 +3,7 @@
desc = "Used to access the station's automated alert system."
icon_screen = "alert:0"
icon_keyboard = "atmos_key"
- circuit = /obj/item/weapon/circuitboard/stationalert
+ circuit = /obj/item/weapon/circuitboard/computer/stationalert
var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list())
/obj/machinery/computer/station_alert/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 1732f1ea7fb..cc914875006 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -1,67 +1,78 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-/obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier.
- name = "machine frame"
+/obj/structure/frame
+ name = "frame"
icon = 'icons/obj/stock_parts.dmi'
icon_state = "box_0"
density = 1
anchored = 1
- use_power = 0
var/obj/item/weapon/circuitboard/circuit = null
+ var/state = 1
+
+/obj/structure/frame/examine(user)
+ ..()
+ if(circuit)
+ user << "It has \a [circuit] installed."
+
+/obj/structure/frame/machine
+ name = "machine frame"
var/list/components = null
var/list/req_components = null
var/list/req_component_names = null // user-friendly names of components
- var/state = 1
-// unfortunately, we have to instance the objects really quickly to get the names
-// fortunately, this is only called once when the board is added and the items are immediately GC'd
-// and none of the parts do much in their constructors
-/obj/machinery/constructable_frame/proc/update_namelist()
+/obj/structure/frame/machine/examine(user)
+ ..()
+ if(state == 3 && req_components && req_component_names)
+ var/hasContent = 0
+ var/requires = "It requires"
+
+ for(var/i = 1 to req_components.len)
+ var/tname = req_components[i]
+ var/amt = req_components[tname]
+ if(amt == 0)
+ continue
+ var/use_and = i == req_components.len
+ requires += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]"
+ hasContent = 1
+
+ if(hasContent)
+ user << requires + "."
+ else
+ user << "It does not require any more components."
+
+/obj/structure/frame/machine/proc/update_namelist()
if(!req_components)
return
req_component_names = new()
for(var/tname in req_components)
- var/path = tname
- var/obj/O = new path()
- req_component_names[tname] = O.name
+ if(ispath(tname, /obj/item/stack))
+ var/obj/item/stack/S = tname
+ var/singular_name = initial(S.singular_name)
+ if(singular_name)
+ req_component_names[tname] = singular_name
+ else
+ req_component_names[tname] = initial(S.name)
+ else
+ var/obj/O = tname
+ req_component_names[tname] = initial(O.name)
-/obj/machinery/constructable_frame/proc/get_req_components_amt()
+/obj/structure/frame/machine/proc/get_req_components_amt()
var/amt = 0
for(var/path in req_components)
amt += req_components[path]
return amt
-// update description of required components remaining
-/obj/machinery/constructable_frame/proc/update_req_desc()
- if(!req_components || !req_component_names)
- return
-
- var/hasContent = 0
- desc = "Requires"
- for(var/i = 1 to req_components.len)
- var/tname = req_components[i]
- var/amt = req_components[tname]
- if(amt == 0)
- continue
- var/use_and = i == req_components.len
- desc += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]"
- hasContent = 1
-
- if(!hasContent)
- desc = "Does not require any more components."
- else
- desc += "."
-
-/obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P, mob/user, params)
+/obj/structure/frame/machine/attackby(obj/item/P, mob/user, params)
if(P.crit_fail)
user << "This part is faulty, you cannot add this to the machine!"
return
switch(state)
if(1)
- if(istype(P, /obj/item/weapon/circuitboard))
+ if(istype(P, /obj/item/weapon/circuitboard/machine))
user << "The frame needs wiring first!"
- return
+
+ else if(istype(P, /obj/item/weapon/circuitboard))
+ user << "This frame does not accept circuit boards of this type!"
+
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.get_amount() >= 5)
@@ -102,26 +113,26 @@
user << "You [anchored ? "un" : ""]secure [name]."
anchored = !anchored
- if(istype(P, /obj/item/weapon/circuitboard))
+ if(istype(P, /obj/item/weapon/circuitboard/machine))
if(!anchored)
user << "The frame needs to be secured first!"
return
- var/obj/item/weapon/circuitboard/B = P
- if(B.board_type == "machine")
- if(!user.drop_item())
- return
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- user << "You add the circuit board to the frame."
- circuit = P
- P.loc = src
- icon_state = "box_2"
- state = 3
- components = list()
- req_components = circuit.req_components.Copy()
- update_namelist()
- update_req_desc()
- else
- user << "This frame does not accept circuit boards of this type!"
+ var/obj/item/weapon/circuitboard/machine/B = P
+ if(!user.drop_item())
+ return
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ user << "You add the circuit board to the frame."
+ circuit = B
+ B.loc = src
+ icon_state = "box_2"
+ state = 3
+ components = list()
+ req_components = B.req_components.Copy()
+ update_namelist()
+
+ else if(istype(P, /obj/item/weapon/circuitboard))
+ user << "This frame does not accept circuit boards of this type!"
+
if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
user << "You remove the cables."
@@ -191,31 +202,35 @@
for(var/obj/item/weapon/stock_parts/part in added_components)
components += part
user << "[part.name] applied."
- replacer.play_rped_sound()
-
- update_req_desc()
+ if(added_components.len)
+ replacer.play_rped_sound()
return
if(istype(P, /obj/item) && get_req_components_amt())
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0))
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CP = P
- var/cable_color = CP.item_color
- if(CP.use(1))
- var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src, 1, cable_color)
- components += CC
- req_components[I]--
- update_req_desc()
- else
- user << "You need more cable!"
+ if(istype(P, /obj/item/stack))
+ var/obj/item/stack/S = P
+ var/used_amt = min(round(S.get_amount()), req_components[I])
+
+ if(used_amt && S.use(used_amt))
+ var/obj/item/stack/NS = locate(S.merge_type) in components
+
+ if(!NS)
+ NS = new S.merge_type(src, used_amt)
+ components += NS
+ else
+ NS.add(used_amt)
+
+ req_components[I] -= used_amt
+ user << "You add [P] to [src]."
return
if(!user.drop_item())
break
+ user << "You add [P] to [src]."
P.loc = src
components += P
req_components[I]--
- update_req_desc()
return 1
user << "You cannot add that to the machine!"
return 0
@@ -224,318 +239,61 @@
//Machine Frame Circuit Boards
/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
-Note: Once everything is added to the public areas, will add m_amt and g_amt to circuit boards since autolathe won't be able
-to destroy them and players will be able to make replacements.
*/
-/obj/item/weapon/circuitboard/vendor
- name = "circuit board (Booze-O-Mat Vendor)"
- build_path = /obj/machinery/vending/boozeomat
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/vending_refill/boozeomat = 3)
+/obj/item/weapon/circuitboard/machine
+ var/list/req_components = null
- var/list/names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat",
- /obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
- /obj/machinery/vending/snack = "Getmore Chocolate Corp",
- /obj/machinery/vending/cola = "Robust Softdrinks",
- /obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
- /obj/machinery/vending/autodrobe = "AutoDrobe")
+/obj/item/weapon/circuitboard/machine/proc/apply_default_parts(obj/machinery/M)
+ if(!req_components)
+ return
-/obj/item/weapon/circuitboard/vendor/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- set_type(pick(names_paths), user)
+ M.component_parts = list(src)
+ loc = null
+
+ for(var/comp_path in req_components)
+ var/comp_amt = req_components[comp_path]
+ if(!comp_amt)
+ continue
+
+ if(ispath(comp_path, /obj/item/stack))
+ M.component_parts += new comp_path(null, comp_amt)
+ else
+ for(var/i in 1 to comp_amt)
+ M.component_parts += new comp_path(null)
+
+ M.RefreshParts()
-/obj/item/weapon/circuitboard/vendor/proc/set_type(typepath, mob/user)
- build_path = typepath
- name = "circuit board ([names_paths[build_path]] Vendor)"
- user << "You set the board to [names_paths[build_path]]."
- req_components = list(text2path("/obj/item/weapon/vending_refill/[copytext("[build_path]", 24)]") = 3) //Never before has i used a method as horrible as this one, im so sorry
-
-/obj/item/weapon/circuitboard/announcement_system
- name = "circuit board (Announcement System)"
- build_path = /obj/machinery/announcement_system
- board_type = "machine"
- origin_tech = "programming=3;bluespace=2"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/smes
+/obj/item/weapon/circuitboard/machine/smes
name = "circuit board (SMES)"
build_path = /obj/machinery/power/smes
- board_type = "machine"
origin_tech = "programming=4;powerstorage=5;engineering=5"
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/cell = 5,
/obj/item/weapon/stock_parts/capacitor = 1)
-/obj/item/weapon/circuitboard/emitter
- name = "circuit board (Emitter)"
- build_path = /obj/machinery/power/emitter
- board_type = "machine"
- origin_tech = "programming=4;powerstorage=5;engineering=5"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/power_compressor
- name = "circuit board (Power Compressor)"
- build_path = /obj/machinery/power/compressor
- board_type = "machine"
- origin_tech = "programming=4;powerstorage=5;engineering=4"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/manipulator = 6)
-
-/obj/item/weapon/circuitboard/power_turbine
- name = "circuit board (Power Turbine)"
- build_path = /obj/machinery/power/turbine
- board_type = "machine"
- origin_tech = "programming=4;powerstorage=4;engineering=5"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/capacitor = 6)
-
-/obj/item/weapon/circuitboard/mech_recharger
- name = "circuit board (Mechbay Recharger)"
- build_path = /obj/machinery/mech_bay_recharge_port
- board_type = "machine"
- origin_tech = "programming=3;powerstorage=4;engineering=4"
- req_components = list(
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/capacitor = 5)
-
-/obj/item/weapon/circuitboard/teleporter_hub
+/obj/item/weapon/circuitboard/machine/teleporter_hub
name = "circuit board (Teleporter Hub)"
build_path = /obj/machinery/teleport/hub
- board_type = "machine"
origin_tech = "programming=3;engineering=5;bluespace=5;materials=4"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 3,
/obj/item/weapon/stock_parts/matter_bin = 1)
-/obj/item/weapon/circuitboard/teleporter_station
+/obj/item/weapon/circuitboard/machine/teleporter_station
name = "circuit board (Teleporter Station)"
build_path = /obj/machinery/teleport/station
- board_type = "machine"
origin_tech = "programming=4;engineering=4;bluespace=4"
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 2,
/obj/item/weapon/stock_parts/capacitor = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
-/obj/item/weapon/circuitboard/telesci_pad
- name = "circuit board (Telepad)"
- build_path = /obj/machinery/telepad
- board_type = "machine"
- origin_tech = "programming=4;engineering=3;materials=3;bluespace=4"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 2,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/sleeper
- name = "circuit board (Sleeper)"
- build_path = /obj/machinery/sleeper
- board_type = "machine"
- origin_tech = "programming=3;biotech=2;engineering=3;materials=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 2)
-
-/obj/item/weapon/circuitboard/cryo_tube
- name = "circuit board (Cryotube)"
- build_path = /obj/machinery/atmospherics/components/unary/cryo_cell
- board_type = "machine"
- origin_tech = "programming=4;biotech=3;engineering=4"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 4)
-
-/obj/item/weapon/circuitboard/thermomachine
- name = "circuit board (Thermomachine)"
- desc = "You can use a screwdriver to switch between heater and freezer."
- board_type = "machine"
- origin_tech = "programming=3;plasmatech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/micro_laser = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/thermomachine/attackby(obj/item/I, mob/user, params)
- var/obj/item/weapon/circuitboard/freezer = /obj/item/weapon/circuitboard/thermomachine/freezer
- var/obj/item/weapon/circuitboard/heater = /obj/item/weapon/circuitboard/thermomachine/heater
- var/obj/item/weapon/circuitboard/newtype
-
- if(istype(I, /obj/item/weapon/screwdriver))
- var/new_setting = "Heater"
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(build_path == initial(heater.build_path))
- newtype = freezer
- new_setting = "Freezer"
- else
- newtype = heater
- name = initial(newtype.name)
- build_path = initial(newtype.build_path)
- user << "You change the circuitboard setting to \"[new_setting]\"."
-
-/obj/item/weapon/circuitboard/thermomachine/freezer
- name = "circuit board (Freezer)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
-
-/obj/item/weapon/circuitboard/thermomachine/heater
- name = "circuit board (Heater)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
-
-/obj/item/weapon/circuitboard/space_heater
- name = "circuit board (Space Heater)"
- build_path = /obj/machinery/space_heater
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/stack/cable_coil = 3)
-
-/obj/item/weapon/circuitboard/biogenerator
- name = "circuit board (Biogenerator)"
- build_path = /obj/machinery/biogenerator
- board_type = "machine"
- origin_tech = "programming=3;biotech=2;materials=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/hydroponics
- name = "circuit board (Hydroponics Tray)"
- build_path = /obj/machinery/hydroponics/constructable
- board_type = "machine"
- origin_tech = "programming=1;biotech=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/microwave
- name = "circuit board (Microwave)"
- build_path = /obj/machinery/microwave
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/gibber
- name = "circuit board (Gibber)"
- build_path = /obj/machinery/gibber
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/tesla_coil
- name = "circuit board (Tesla Coil)"
- build_path = /obj/machinery/power/tesla_coil
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 1)
-
-/obj/item/weapon/circuitboard/grounding_rod
- name = "circuit board (Grounding Rod)"
- build_path = /obj/machinery/power/grounding_rod
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 1)
-
-/obj/item/weapon/circuitboard/processor
- name = "circuit board (Food processor)"
- build_path = /obj/machinery/processor
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/recycler
- name = "circuit board (Recycler)"
- build_path = /obj/machinery/recycler
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/seed_extractor
- name = "circuit board (Seed Extractor)"
- build_path = /obj/machinery/seed_extractor
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/smartfridge
- name = "circuit board (Smartfridge)"
- build_path = /obj/machinery/smartfridge
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1)
-
-/obj/item/weapon/circuitboard/smartfridge/New(loc, new_type)
- if(new_type)
- build_path = new_type
-
-/obj/item/weapon/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- var/list/fridges = list(/obj/machinery/smartfridge = "default",
- /obj/machinery/smartfridge/drinks = "drinks",
- /obj/machinery/smartfridge/extract = "slimes",
- /obj/machinery/smartfridge/chemistry = "chems",
- /obj/machinery/smartfridge/chemistry/virology = "viruses")
-
- var/position = fridges.Find(build_path, fridges)
- position = (position == fridges.len) ? 1 : (position + 1)
- build_path = fridges[position]
- user << "You set the board to [fridges[build_path]]."
-
-/obj/item/weapon/circuitboard/monkey_recycler
- name = "circuit board (Monkey Recycler)"
- build_path = /obj/machinery/monkey_recycler
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/holopad
- name = "circuit board (AI Holopad)"
- build_path = /obj/machinery/hologram/holopad
- board_type = "machine"
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 1)
-
-/obj/item/weapon/circuitboard/chem_dispenser
+/obj/item/weapon/circuitboard/machine/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
- board_type = "machine"
origin_tech = "materials=4;engineering=4;programming=4;plasmatech=3;biotech=3"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
@@ -544,269 +302,12 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/cell = 1)
-/obj/item/weapon/circuitboard/chem_master
- name = "circuit board (Chem Master 2999)"
- build_path = /obj/machinery/chem_master/constructable
- board_type = "machine"
- origin_tech = "materials=2;programming=2;biotech=1"
+/obj/item/weapon/circuitboard/machine/telesci_pad
+ name = "circuit board (Telepad)"
+ build_path = /obj/machinery/telepad
+ origin_tech = "programming=4;engineering=3;materials=3;bluespace=4"
req_components = list(
- /obj/item/weapon/reagent_containers/glass/beaker = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/chem_heater
- name = "circuit board (Chemical Heater)"
- build_path = /obj/machinery/chem_heater
- board_type = "machine"
- origin_tech = "materials=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-//Almost the same recipe as destructive analyzer to give people choices.
-/obj/item/weapon/circuitboard/experimentor
- name = "circuit board (E.X.P.E.R.I-MENTOR)"
- build_path = /obj/machinery/r_n_d/experimentor
- board_type = "machine"
- origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/stock_parts/micro_laser = 2)
-
-
-/obj/item/weapon/circuitboard/destructive_analyzer
- name = "circuit board (Destructive Analyzer)"
- build_path = /obj/machinery/r_n_d/destructive_analyzer
- board_type = "machine"
- origin_tech = "magnets=2;engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1)
-
-/obj/item/weapon/circuitboard/autolathe
- name = "circuit board (Autolathe)"
- build_path = /obj/machinery/autolathe
- board_type = "machine"
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 3,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/protolathe
- name = "circuit board (Protolathe)"
- build_path = /obj/machinery/r_n_d/protolathe
- board_type = "machine"
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/reagent_containers/glass/beaker = 2)
-
-
-/obj/item/weapon/circuitboard/circuit_imprinter
- name = "circuit board (Circuit Imprinter)"
- build_path = /obj/machinery/r_n_d/circuit_imprinter
- board_type = "machine"
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/reagent_containers/glass/beaker = 2)
-
-/obj/item/weapon/circuitboard/pacman
- name = "circuit board (PACMAN-type Generator)"
- build_path = /obj/machinery/power/port_gen/pacman
- board_type = "machine"
- origin_tech = "programming=3;powerstorage=3;plasmatech=3;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/capacitor = 1)
-
-/obj/item/weapon/circuitboard/pacman/super
- name = "circuit board (SUPERPACMAN-type Generator)"
- build_path = /obj/machinery/power/port_gen/pacman/super
- origin_tech = "programming=3;powerstorage=4;engineering=4"
-
-/obj/item/weapon/circuitboard/pacman/mrs
- name = "circuit board (MRSPACMAN-type Generator)"
- build_path = "/obj/machinery/power/port_gen/pacman/mrs"
- origin_tech = "programming=3;powerstorage=5;engineering=5"
-
-obj/item/weapon/circuitboard/rdserver
- name = "circuit board (R&D Server)"
- build_path = /obj/machinery/r_n_d/server
- board_type = "machine"
- origin_tech = "programming=3"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/scanning_module = 1)
-
-/obj/item/weapon/circuitboard/mechfab
- name = "circuit board (Exosuit Fabricator)"
- build_path = /obj/machinery/mecha_part_fabricator
- board_type = "machine"
- origin_tech = "programming=3;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/clonepod
- name = "circuit board (Clone Pod)"
- build_path = /obj/machinery/clonepod
- board_type = "machine"
- origin_tech = "programming=3;biotech=3"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/scanning_module = 2,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/clonescanner
- name = "circuit board (Cloning Scanner)"
- build_path = /obj/machinery/dna_scannernew
- board_type = "machine"
- origin_tech = "programming=2;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/stack/cable_coil = 2,)
-
-/obj/item/weapon/circuitboard/cyborgrecharger
- name = "circuit board (Cyborg Recharger)"
- build_path = /obj/machinery/recharge_station
- board_type = "machine"
- origin_tech = "powerstorage=3;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 2,
- /obj/item/weapon/stock_parts/cell = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,)
-
-/obj/item/weapon/circuitboard/recharger
- name = "circuit board (Weapon Recharger)"
- build_path = /obj/machinery/recharger
- board_type = "machine"
- origin_tech = "powerstorage=3;engineering=3;materials=4"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 1,)
-
-// Telecomms circuit boards:
-
-/obj/item/weapon/circuitboard/telecomms/receiver
- name = "circuit board (Subspace Receiver)"
- build_path = /obj/machinery/telecomms/receiver
- board_type = "machine"
- origin_tech = "programming=2;engineering=2;bluespace=1"
- req_components = list(
- /obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/stock_parts/micro_laser = 1)
-
-/obj/item/weapon/circuitboard/telecomms/hub
- name = "circuit board (Hub Mainframe)"
- build_path = /obj/machinery/telecomms/hub
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
-
-/obj/item/weapon/circuitboard/telecomms/relay
- name = "circuit board (Relay Mainframe)"
- build_path = /obj/machinery/telecomms/relay
- board_type = "machine"
- origin_tech = "programming=2;engineering=2;bluespace=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
-
-/obj/item/weapon/circuitboard/telecomms/bus
- name = "circuit board (Bus Mainframe)"
- build_path = /obj/machinery/telecomms/bus
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/ore/bluespace_crystal = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
-
-/obj/item/weapon/circuitboard/telecomms/processor
- name = "circuit board (Processor Unit)"
- build_path = /obj/machinery/telecomms/processor
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 3,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/subspace/treatment = 2,
- /obj/item/weapon/stock_parts/subspace/analyzer = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/amplifier = 1)
-
-/obj/item/weapon/circuitboard/telecomms/server
- name = "circuit board (Telecommunication Server)"
- build_path = /obj/machinery/telecomms/server
- board_type = "machine"
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
-
-/obj/item/weapon/circuitboard/telecomms/broadcaster
- name = "circuit board (Subspace Broadcaster)"
- build_path = /obj/machinery/telecomms/broadcaster
- board_type = "machine"
- origin_tech = "programming=2;engineering=2;bluespace=1"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/subspace/crystal = 1,
- /obj/item/weapon/stock_parts/micro_laser/high = 2)
-/obj/item/weapon/circuitboard/ore_redemption
- name = "circuit board (Ore Redemption)"
- build_path = /obj/machinery/mineral/ore_redemption
- board_type = "machine"
- origin_tech = "programming=1;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/device/assembly/igniter = 1)
-
-/obj/item/weapon/circuitboard/mining_equipment_vendor
- name = "circuit board (Mining Equipment Vendor)"
- build_path = /obj/machinery/mineral/equipment_vendor
- board_type = "machine"
- origin_tech = "programming=1;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/matter_bin = 3)
-
-/obj/item/weapon/circuitboard/mining_equipment_vendor/golem
- name = "circuit board (Golem Ship Equipment Vendor)"
- build_path = /obj/machinery/mineral/equipment_vendor/golem
-
-/obj/item/weapon/circuitboard/plantgenes
- name = "circuit board (Plant DNA Manipulator)"
- build_path = /obj/machinery/plantgenes
- board_type = "machine"
- origin_tech = "programming=2;biotech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/scanning_module = 1,)
\ No newline at end of file
+ /obj/item/weapon/stock_parts/console_screen = 1)
\ No newline at end of file
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index ed656b1a1df..45f7b995486 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -15,16 +15,19 @@
/obj/machinery/dna_scannernew/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/clonescanner(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonescanner(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/clonescanner
+ name = "circuit board (Cloning Scanner)"
+ build_path = /obj/machinery/dna_scannernew
+ origin_tech = "programming=2;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 2)
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
@@ -108,7 +111,7 @@
|| locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
- if(!occupant.suiciding && !(occupant.disabilities & NOCLONE))
+ if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound)
occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
var/obj/machinery/computer/scan_consolenew/console
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 83700f7dd21..5a4292e3e42 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -724,8 +724,8 @@ var/list/airlock_overlays = list()
else if(src.secondsElectrified!=0)
usr << text("The door is already electrified. You can't re-electrify it while it's already electrified.
\n")
else
- shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- add_logs(usr, src, "electrified", addition="at [x],[y],[z]")
+ shockedby += "\[[time_stamp()]\][usr](ckey:[usr.ckey])"
+ add_logs(usr, src, "electrified")
src.secondsElectrified = 30
spawn(10)
while (src.secondsElectrified>0)
@@ -744,7 +744,7 @@ var/list/airlock_overlays = list()
usr << text("The door is already electrified. You can't re-electrify it while it's already electrified.
\n")
else
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
- add_logs(usr, src, "electrified", addition="at [x],[y],[z]")
+ add_logs(usr, src, "electrified")
src.secondsElectrified = -1
if (8) // Not in order >.>
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 25a44c23489..f265bfe46ef 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -318,6 +318,22 @@
icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi'
overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
doortype = /obj/structure/door_assembly/door_assembly_cult
+ hackProof = 1
+ aiControlDisabled = 1
+
+/obj/machinery/door/airlock/cult/allowed(mob/M)
+ if(!iscultist(M))
+ PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
+ var/atom/throwtarget
+ throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(M, src)))
+ M << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50))
+ M.Weaken(2)
+ M.throw_at_fast(throwtarget, 5, 1,src)
+ return 0
+ else
+ PoolOrNew(/obj/effect/overlay/temp/cult/door, src.loc)
+ return 1
+
/obj/machinery/door/airlock/cult/narsie_act()
return
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index d567dd34c35..81f3a3af60d 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -10,6 +10,7 @@
power_channel = ENVIRON
var/secondsElectrified = 0
+ var/shockedby = list()
var/visible = 1
var/operating = 0
var/glass = 0
@@ -191,6 +192,7 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
if(prob(40/severity))
if(secondsElectrified == 0)
secondsElectrified = -1
+ shockedby += "\[[time_stamp()]\]EM Pulse"
spawn(300)
secondsElectrified = 0
..()
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index c2743105444..dc9bf8e0115 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -109,7 +109,7 @@
metal_cost = 0
glass_cost = 0
cooldownTime = 300 //30 seconds
- dispense_type = /obj/item/unactivated_swarmer
+ dispense_type = /obj/item/device/unactivated_swarmer
begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed."
end_create_message = "materializes a strange shell, which drops to the ground."
recharging_text = "Its lights are slowly increasing in brightness."
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 5d03cc6f5f2..49bf6e7d916 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -45,10 +45,15 @@ var/const/HOLOPAD_MODE = RANGE_BASED
/obj/machinery/hologram/holopad/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/holopad(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/holopad
+ name = "circuit board (AI Holopad)"
+ build_path = /obj/machinery/hologram/holopad
+ origin_tech = "programming=1"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+
/obj/machinery/hologram/holopad/RefreshParts()
var/holograph_range = 4
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 7751dcb8bb6..77028a43d1a 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -347,7 +347,7 @@ Class Procs:
if(.)
deconstruction()
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
+ var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
transfer_fingerprints_to(M)
M.state = 2
M.icon_state = "box_1"
@@ -396,7 +396,7 @@ Class Procs:
var/shouldplaysound = 0
if(istype(W) && component_parts)
if(panel_open || W.works_from_distance)
- var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
+ var/obj/item/weapon/circuitboard/machine/CB = locate(/obj/item/weapon/circuitboard/machine) in component_parts
var/P
if(W.works_from_distance)
display_parts(user)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 3ae2ded9223..fe5d9ac35a8 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -12,10 +12,14 @@
/obj/machinery/recharger/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/recharger()
- component_parts += new /obj/item/weapon/stock_parts/capacitor()
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recharger(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/recharger
+ name = "circuit board (Weapon Recharger)"
+ build_path = /obj/machinery/recharger
+ origin_tech = "powerstorage=3;engineering=3;materials=4"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/recharger/RefreshParts()
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index ae9a16c729d..d7397ebabf4 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -7,7 +7,6 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 1000
- var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger"
req_access = list(access_robotics)
var/recharge_speed
var/repairs
@@ -15,15 +14,19 @@
/obj/machinery/recharge_station/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/cyborgrecharger(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cyborgrecharger(null)
+ B.apply_default_parts(src)
update_icon()
+/obj/item/weapon/circuitboard/machine/cyborgrecharger
+ name = "circuit board (Cyborg Recharger)"
+ build_path = /obj/machinery/recharge_station
+ origin_tech = "powerstorage=3;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/cell = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/machinery/recharge_station/RefreshParts()
recharge_speed = 0
repairs = 0
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 542975781f3..a37a0e4d14e 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -17,16 +17,20 @@ var/const/SAFETY_COOLDOWN = 100
var/datum/material_container/materials
/obj/machinery/recycler/New()
- // On us
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/recycler(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_PLASMA=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_URANIUM=1, MAT_BANANIUM=1))
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null)
+ B.apply_default_parts(src)
update_icon()
+/obj/item/weapon/circuitboard/machine/recycler
+ name = "circuit board (Recycler)"
+ build_path = /obj/machinery/recycler
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/machinery/recycler/RefreshParts()
var/amt_made = 0
var/mat_mod = 0
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 6322b95731d..a204918d41b 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -21,7 +21,7 @@
density = 1
use_power = 1
idle_power_usage = 50
- circuit = /obj/item/weapon/circuitboard/slot_machine
+ circuit = /obj/item/weapon/circuitboard/computer/slot_machine
var/money = 3000 //How much money it has CONSUMED
var/plays = 0
var/working = 0
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index b164bc08c20..ed76ccd8768 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -24,14 +24,19 @@
/obj/machinery/space_heater/New()
..()
cell = new(src)
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/space_heater(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/stack/cable_coil(null, 3)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/space_heater(null)
+ B.apply_default_parts(src)
update_icon()
+/obj/item/weapon/circuitboard/machine/space_heater
+ name = "circuit board (Space Heater)"
+ build_path = /obj/machinery/space_heater
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/cable_coil = 3)
+
/obj/machinery/space_heater/construction()
qdel(cell)
cell = null
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index b6745d10e64..087cb5b95f6 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -82,7 +82,7 @@
if(0) //blank
remove_display()
if(1) //emergency shuttle timer
- if(SSshuttle.emergency.timer)
+ if(SSshuttle.emergency && SSshuttle.emergency.timer)
var/line1 = "-[SSshuttle.emergency.getModeStr()]-"
var/line2 = SSshuttle.emergency.getTimerStr()
@@ -277,4 +277,4 @@
#undef FOND_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
-#undef SCROLL_SPEED
\ No newline at end of file
+#undef SCROLL_SPEED
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index 0485e45950e..61598ca32bc 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -14,7 +14,7 @@
var/universal_translate = 0 // set to 1 if it can translate nonhuman speech
req_access = list(access_tcomsat)
- circuit = "/obj/item/weapon/circuitboard/comm_server"
+ circuit = /obj/item/weapon/circuitboard/computer/comm_server
/obj/machinery/computer/telecomms/server/attack_hand(mob/user)
if(..())
diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm
index f7ed78a1315..0fd04b25361 100644
--- a/code/game/machinery/telecomms/computers/telemonitor.dm
+++ b/code/game/machinery/telecomms/computers/telemonitor.dm
@@ -16,7 +16,7 @@
var/network = "NULL" // the network to probe
var/temp = "" // temporary feedback messages
- circuit = "/obj/item/weapon/circuitboard/comm_monitor"
+ circuit = /obj/item/weapon/circuitboard/computer/comm_monitor
/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user)
if(..())
diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm
index 91106eae92e..c00bb1a412c 100644
--- a/code/game/machinery/telecomms/machines/broadcaster.dm
+++ b/code/game/machinery/telecomms/machines/broadcaster.dm
@@ -19,7 +19,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
machinetype = 5
/*heatgen = 0
delay = 7*/
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
// Don't broadcast rejected signals
@@ -95,16 +94,19 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/obj/machinery/telecomms/broadcaster/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/broadcaster(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/broadcaster(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster
+ name = "circuit board (Subspace Broadcaster)"
+ build_path = /obj/machinery/telecomms/broadcaster
+ origin_tech = "programming=2;engineering=2;bluespace=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 2)
/obj/machinery/telecomms/broadcaster/Destroy()
// In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm
index 7b747d4d332..6c98596c884 100644
--- a/code/game/machinery/telecomms/machines/bus.dm
+++ b/code/game/machinery/telecomms/machines/bus.dm
@@ -18,7 +18,6 @@
idle_power_usage = 50
machinetype = 2
//heatgen = 20
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus"
netspeed = 40
var/change_frequency = 0
@@ -52,14 +51,17 @@
/obj/machinery/telecomms/bus/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/bus(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/bus(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/telecomms/bus
+ name = "circuit board (Bus Mainframe)"
+ build_path = /obj/machinery/telecomms/bus
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm
index b52adc8cb8d..d5aebbc45fc 100644
--- a/code/game/machinery/telecomms/machines/hub.dm
+++ b/code/game/machinery/telecomms/machines/hub.dm
@@ -19,7 +19,6 @@
idle_power_usage = 80
machinetype = 7
//heatgen = 40
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub"
long_range_link = 1
netspeed = 40
@@ -36,16 +35,17 @@
/obj/machinery/telecomms/hub/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/hub(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 2)
- RefreshParts()
-
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/hub(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/telecomms/hub
+ name = "circuit board (Hub Mainframe)"
+ build_path = /obj/machinery/telecomms/hub
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm
index 18f8ee4d3e0..71cfc2ec5a6 100644
--- a/code/game/machinery/telecomms/machines/processor.dm
+++ b/code/game/machinery/telecomms/machines/processor.dm
@@ -18,7 +18,6 @@
machinetype = 3
//heatgen = 100
//delay = 5
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor"
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
@@ -38,22 +37,20 @@
/obj/machinery/telecomms/processor/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/processor(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 2)
- RefreshParts()
-
-
-
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/processor(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/telecomms/processor
+ name = "circuit board (Processor Unit)"
+ build_path = /obj/machinery/telecomms/processor
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 3,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/treatment = 2,
+ /obj/item/weapon/stock_parts/subspace/analyzer = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/amplifier = 1)
//Preset Processors
diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm
index b1dc2b53c92..095bb0cfca2 100644
--- a/code/game/machinery/telecomms/machines/receiver.dm
+++ b/code/game/machinery/telecomms/machines/receiver.dm
@@ -17,7 +17,6 @@
idle_power_usage = 30
machinetype = 1
//heatgen = 0
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver"
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
@@ -54,16 +53,18 @@
/obj/machinery/telecomms/receiver/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/receiver(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- RefreshParts()
-
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/receiver(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/telecomms/receiver
+ name = "circuit board (Subspace Receiver)"
+ build_path = /obj/machinery/telecomms/receiver
+ origin_tech = "programming=2;engineering=2;bluespace=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/subspace/ansible = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm
index 51d76d47255..a11e521eea3 100644
--- a/code/game/machinery/telecomms/machines/relay.dm
+++ b/code/game/machinery/telecomms/machines/relay.dm
@@ -16,7 +16,6 @@
idle_power_usage = 30
machinetype = 8
//heatgen = 0
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay"
netspeed = 5
long_range_link = 1
var/broadcasting = 1
@@ -48,16 +47,17 @@
/obj/machinery/telecomms/relay/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/relay(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 2)
- RefreshParts()
-
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/relay(null)
+ B.apply_default_parts(src)
+/obj/item/weapon/circuitboard/machine/telecomms/relay
+ name = "circuit board (Relay Mainframe)"
+ build_path = /obj/machinery/telecomms/relay
+ origin_tech = "programming=2;engineering=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm
index 9e54644b1f1..b68e618daf3 100644
--- a/code/game/machinery/telecomms/machines/server.dm
+++ b/code/game/machinery/telecomms/machines/server.dm
@@ -17,7 +17,6 @@
idle_power_usage = 15
machinetype = 4
//heatgen = 50
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/server"
var/list/log_entries = list()
var/list/stored_names = list()
var/list/TrafficActions = list()
@@ -35,15 +34,19 @@
/obj/machinery/telecomms/server/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telecomms/server(null)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/server(null)
+ B.apply_default_parts(src)
server_radio = new()
+/obj/item/weapon/circuitboard/machine/telecomms/server
+ name = "circuit board (Telecommunication Server)"
+ build_path = /obj/machinery/telecomms/server
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
+
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 161de617ea5..21aece34bb8 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -29,7 +29,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/toggled = 1 // Is it toggled on
var/on = 1
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
- var/circuitboard = null // string pointing to a circuitboard type
var/hide = 0 // Is it a hidden machine?
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 38c914ecaf5..bb5479c82c9 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -3,7 +3,7 @@
desc = "Used to control a linked teleportation Hub and Station."
icon_screen = "teleport"
icon_keyboard = "teleport_key"
- circuit = "/obj/item/weapon/circuitboard/teleporter"
+ circuit = /obj/item/weapon/circuitboard/computer/teleporter
var/obj/item/device/gps/locked = null
var/regime_set = "Teleporter"
var/id = null
@@ -256,7 +256,7 @@
..()
link_power_station()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/teleporter_hub(null)
+ component_parts += new /obj/item/weapon/circuitboard/machine/teleporter_hub(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
@@ -364,7 +364,7 @@
/obj/machinery/teleport/station/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/teleporter_station(null)
+ component_parts += new /obj/item/weapon/circuitboard/machine/teleporter_station(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 30cce02c00d..55479c7e462 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -58,14 +58,8 @@
..()
wires = new /datum/wires/vending(src)
if(refill_canister) //constructable vending machine
- component_parts = list()
- var/obj/item/weapon/circuitboard/vendor/V = new(null)
- V.set_type(type)
- component_parts += V
- component_parts += new refill_canister
- component_parts += new refill_canister
- component_parts += new refill_canister
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/vendor(null)
+ B.apply_default_parts(src)
else
build_inventory(products)
build_inventory(contraband, 1)
@@ -78,6 +72,44 @@
last_slogan = world.time + rand(0, slogan_delay)
power_change()
+/obj/item/weapon/circuitboard/machine/vendor
+ name = "circuit board (Booze-O-Mat Vendor)"
+ build_path = /obj/machinery/vending/boozeomat
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/vending_refill/boozeomat = 3)
+
+ var/list/names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat",
+ /obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
+ /obj/machinery/vending/snack = "Getmore Chocolate Corp",
+ /obj/machinery/vending/cola = "Robust Softdrinks",
+ /obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
+ /obj/machinery/vending/autodrobe = "AutoDrobe")
+
+/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/position = names_paths.Find(build_path)
+ position = (position == names_paths.len) ? 1 : (position + 1)
+ var/typepath = names_paths[position]
+
+ user << "You set the board to \"[names_paths[typepath]]\"."
+ set_type(typepath)
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/vendor/proc/set_type(var/obj/machinery/vending/typepath)
+ build_path = typepath
+ name = "circuit board ([names_paths[build_path]] Vendor)"
+ req_components = list(initial(typepath.refill_canister) = 3)
+
+/obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M)
+ for(var/typepath in names_paths)
+ if(istype(M, typepath))
+ set_type(typepath)
+ break
+ ..()
+
+
/obj/machinery/vending/Destroy()
qdel(wires)
wires = null
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index f3f730d4bc7..c3847474e60 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -26,17 +26,18 @@
/obj/machinery/mech_bay_recharge_port/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mech_recharger(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mech_recharger(null)
+ B.apply_default_parts(src)
recharging_turf = get_step(loc, dir)
+/obj/item/weapon/circuitboard/machine/mech_recharger
+ name = "circuit board (Mechbay Recharger)"
+ build_path = /obj/machinery/mech_bay_recharge_port
+ origin_tech = "programming=3;powerstorage=4;engineering=4"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/capacitor = 5)
+
/obj/machinery/mech_bay_recharge_port/RefreshParts()
var/MC
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
@@ -82,7 +83,7 @@
desc = "Used to control mechbay power ports."
icon_screen = "recharge_comp"
icon_keyboard = "rd_key"
- circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
+ circuit = /obj/item/weapon/circuitboard/computer/mech_bay_power_console
var/obj/machinery/mech_bay_recharge_port/recharge_port
/obj/machinery/computer/mech_bay_power_console/attack_ai(mob/user)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 5748be75618..5de9c676059 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -46,16 +46,20 @@
/obj/machinery/mecha_part_fabricator/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mechfab(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mechfab(null)
+ B.apply_default_parts(src)
files = new /datum/research(src) //Setup the research data holder.
+/obj/item/weapon/circuitboard/machine/mechfab
+ name = "circuit board (Exosuit Fabricator)"
+ build_path = /obj/machinery/mecha_part_fabricator
+ origin_tech = "programming=3;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
/obj/machinery/mecha_part_fabricator/RefreshParts()
var/T = 0
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index ab7641dd681..0fc08605bcf 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -4,7 +4,7 @@
icon_screen = "mecha"
icon_keyboard = "tech_key"
req_access = list(access_robotics)
- circuit = "/obj/item/weapon/circuitboard/mecha_control"
+ circuit = /obj/item/weapon/circuitboard/computer/mecha_control
var/list/located = list()
var/screen = 0
var/stored_data
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index c14ddd5470c..40037689a9e 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -321,7 +321,6 @@
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
item_state = "electronic"
- board_type = "other"
flags = CONDUCT
force = 5
w_class = 2
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 35f19edece8..47c439f0a4e 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -29,6 +29,14 @@
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
)
+/obj/effect/spawner/lootdrop/gambling
+ name = "gambling valuables spawner"
+ loot = list(
+ /obj/item/weapon/gun/projectile/revolver/russian = 5,
+ /obj/item/weapon/storage/box/syndie_kit/throwing_weapons = 1,
+ /obj/item/toy/cards/deck/syndicate = 2
+ )
+
/obj/effect/spawner/lootdrop/maintenance
name = "maintenance loot spawner"
@@ -76,7 +84,8 @@
/obj/item/device/flashlight/pen = 1,
/obj/item/device/multitool = 2,
/obj/item/device/radio/off = 2,
- /obj/item/device/t_scanner = 6,
+ /obj/item/device/t_scanner = 5,
+ /obj/item/weapon/airlock_painter = 1,
/obj/item/stack/cable_coil = 4,
/obj/item/stack/cable_coil{amount = 5} = 6,
/obj/item/stack/medical/bruise_pack = 1,
@@ -130,15 +139,9 @@
/obj/item/device/assembly/signaler = 2,
/obj/item/device/assembly/mousetrap = 2,
/obj/item/weapon/reagent_containers/syringe = 2,
- /obj/item/clothing/gloves/color/orange = 1,
- /obj/item/clothing/gloves/color/red = 1,
- /obj/item/clothing/gloves/color/blue = 1,
- /obj/item/clothing/gloves/color/purple = 1,
- /obj/item/clothing/gloves/color/green = 1,
- /obj/item/clothing/gloves/color/grey = 1,
- /obj/item/clothing/gloves/color/light_brown = 1,
- /obj/item/clothing/gloves/color/brown = 1,
+ /obj/item/clothing/gloves/color/random = 8,
/obj/item/clothing/shoes/laceup = 1,
+ /obj/item/weapon/storage/secure/briefcase = 3,
"" = 4
)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1c66b00f13e..1536d5f1f85 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -576,4 +576,6 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
return sharpness
/obj/item/proc/can_dismember()
- return sharpness && w_class >= 3
\ No newline at end of file
+ if((sharpness || damtype == BURN) && w_class >= 3)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index dde1c59f567..9a20f3b8e37 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -15,7 +15,8 @@
/obj/item/candle/New()
..()
if(start_lit)
- light()
+ // No visible message
+ light(null)
/obj/item/candle/update_icon()
var/i
@@ -55,21 +56,22 @@
light() //honk
return
-/obj/item/candle/proc/light(var/flavor_text = "[usr] lights the [name].")
+/obj/item/candle/proc/light(flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
//src.damtype = "fire"
- usr.visible_message(flavor_text)
+ if(flavor_text)
+ usr.visible_message(flavor_text)
SetLuminosity(CANDLE_LUMINOSITY)
- if(!infinite)
- SSobj.processing |= src
+ SSobj.processing |= src
update_icon()
/obj/item/candle/process()
if(!lit)
return
- wax--
+ if(!infinite)
+ wax--
if(!wax)
new/obj/item/trash/candle(src.loc)
if(istype(src.loc, /mob))
@@ -111,4 +113,4 @@
infinite = 1
start_lit = 1
-#undef CANDLE_LUMINOSITY
\ No newline at end of file
+#undef CANDLE_LUMINOSITY
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a12c51ed506..76cf1ff5a33 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -26,11 +26,12 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
null, \
- new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = 1, on_floor = 1), \
@@ -215,11 +216,12 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
*/
var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
- new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 2, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("pylon", /obj/structure/cult/pylon, 4, time = 40, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("forge", /obj/structure/cult/forge, 6, time = 40, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("archives", /obj/structure/cult/tome, 4, time = 40, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("altar", /obj/structure/cult/talisman, 10, time = 40, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 3, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("pylon", /obj/structure/cult/pylon, 3, time = 40, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("forge", /obj/structure/cult/forge, 5, time = 40, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("archives", /obj/structure/cult/tome, 2, time = 40, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("altar", /obj/structure/cult/talisman, 5, time = 40, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/runed_metal
@@ -230,6 +232,12 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
icon = 'icons/obj/items.dmi'
sheettype = "runed"
+/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
+ if(!iscultist(user))
+ user << "Only one with forbidden knowledge could hope to work this metal..."
+ return
+ return ..()
+
/obj/item/stack/sheet/runed_metal/fifty
amount = 50
@@ -267,5 +275,3 @@ var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
throw_speed = 1
throw_range = 3
origin_tech = "materials=2;bio=2"
-
-
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index b4e7b5dd5ef..7da9e29ce27 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -64,6 +64,7 @@
return
if (!src || get_amount() <= 0)
user << browse(null, "window=stack")
+ return
user.set_machine(src) //for correct work of onclose
var/t1 = text("Constructions from []Amount Left: []
", src, src.get_amount())
for(var/i=1;i<=recipes.len,i++)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index f7ffd73e691..6ff3d3ff714 100755
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -9,6 +9,7 @@
* Snap pops
* Mech prizes
* AI core prizes
+ * Toy codex gigas
* Skeleton toys
* Cards
* Toy nuke
@@ -695,6 +696,29 @@
return
..()
+/obj/item/toy/codex_gigas
+ name = "Toy Codex Gigas"
+ desc = "A tool to help you write fictional devils!"
+ icon = 'icons/obj/library.dmi'
+ icon_state = "demonomicon"
+ w_class = 2
+ var/cooldown = 0
+
+/obj/item/toy/codex_gigas/attack_self(mob/user)
+ if(!cooldown)
+ var/datum/devilinfo/devil = randomDevilInfo()
+ user << "You press the button on [src]."
+ cooldown = 1
+ playsound(user, 'sound/machines/click.ogg', 20, 1)
+ src.loc.visible_message("\icon[src]Some fun facts about: [devil.truename]")
+ src.loc.visible_message("[lawlorify[LORE][devil.bane]]")
+ src.loc.visible_message("[lawlorify[LORE][devil.obligation]]")
+ src.loc.visible_message("[lawlorify[LORE][devil.ban]]")
+ src.loc.visible_message("[lawlorify[LORE][devil.banish]]")
+ spawn(60) cooldown = 0
+ return
+ ..()
+
/obj/item/toy/talking
name = "talking action figure"
desc = "A generic action figure modeled after nothing in particular."
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 4912b1e5854..ccc8fc78ce6 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -80,6 +80,7 @@
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
+ target.wash_cream()
return
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 9e5ecd557b7..5517716c4bf 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -463,7 +463,7 @@
busy = 0
update_icon()
return
- if(!H.suiciding && !(H.disabilities & NOCLONE))
+ if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound)
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...")
@@ -497,6 +497,8 @@
if (H.suiciding || (H.disabilities & NOCLONE))
failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile."
+ else if (H.hellbound)
+ failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile."
else if (tplus > tlimit)
failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile."
else if (!H.getorgan(/obj/item/organ/heart))
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index d9cbf5a9273..fdfd0f7c4d6 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -66,7 +66,7 @@
var/turf/target_turf = get_turf(target)
if(target_turf)
var/turflist = getline(user, target_turf)
- add_logs(user, target, "flamethrowered", src, "at [target.x],[target.y],[target.z]")
+ add_logs(user, target, "flamethrowered", src)
flame_turf(turflist)
/obj/item/weapon/flamethrower/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index ec578d8e1fe..205336bfb04 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -145,7 +145,7 @@
icon_state = "sord"
item_state = "sord"
slot_flags = SLOT_BELT
- force = 2
+ force = 4.13
throwforce = 1
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -156,11 +156,18 @@
name = "reaper scythe"
desc = "Ask not for whom the bell tolls..."
w_class = 4
- armour_penetration = 100
+ armour_penetration = 35
slot_flags = SLOT_BACK
sharpness = IS_SHARP
attack_verb = list("chopped", "sliced", "cut", "reaped")
+/obj/item/weapon/nullrod/scythe/vibro
+ icon_state = "hfrequency0"
+ item_state = "hfrequency1"
+ name = "high frequency blade"
+ desc = "Bad references are the DNA of the soul."
+ attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
+
/obj/item/weapon/nullrod/hammmer
icon_state = "hammeron"
item_state = "hammeron"
@@ -186,7 +193,7 @@
icon_state = "honkrender"
item_state = "render"
name = "clown dagger"
- desc = "Used for absolutely hilarious sacrafices."
+ desc = "Used for absolutely hilarious sacrifices."
hitsound = 'sound/items/bikehorn.ogg'
sharpness = IS_SHARP
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -276,6 +283,14 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+/obj/item/weapon/nullrod/pitchfork
+ icon_state = "pitchfork0"
+ name = "unholy pitchfork"
+ w_class = 3
+ desc = "Holding this makes you look absolutely devilish."
+ attack_verb = list("poked", "impaled", "pierced", "jabbed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
/obj/item/weapon/nullrod/tribal_knife/New()
..()
@@ -286,4 +301,4 @@
return ..()
/obj/item/weapon/nullrod/tribal_knife/process()
- slowdown = rand(-2, 2)
\ No newline at end of file
+ slowdown = rand(-2, 2)
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index fd27e6b4e67..ac17bdbae2a 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -54,7 +54,7 @@
sharpness = IS_SHARP
embed_chance = 75
embedded_impact_pain_multiplier = 10
- armour_penetration = 50
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
block_chance = 50
var/hacked = 0
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 99b3a72e6ae..6538bba7f06 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -804,7 +804,7 @@
/obj/item/weapon/storage/box/rndboards/New()
..()
- new /obj/item/weapon/circuitboard/protolathe(src)
- new /obj/item/weapon/circuitboard/destructive_analyzer(src)
- new /obj/item/weapon/circuitboard/circuit_imprinter(src)
- new /obj/item/weapon/circuitboard/rdconsole(src)
+ new /obj/item/weapon/circuitboard/machine/protolathe(src)
+ new /obj/item/weapon/circuitboard/machine/destructive_analyzer(src)
+ new /obj/item/weapon/circuitboard/machine/circuit_imprinter(src)
+ new /obj/item/weapon/circuitboard/computer/rdconsole(src)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index e8bbfbed48e..7c0860f9506 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -201,7 +201,7 @@
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
hitsound = "swing_hit"
- armour_penetration = 75
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
item_color = "green"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -418,3 +418,93 @@
M.faction = user.faction.Copy()
M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
M.GiveTarget(L)
+
+/obj/item/weapon/twohanded/pitchfork
+ icon_state = "pitchfork0"
+ name = "pitchfork"
+ desc = "A simple tool used for moving hay."
+ force = 7
+ throwforce = 15
+ w_class = 4
+ force_unwielded = 7
+ force_wielded = 15
+ attack_verb = list("attacked", "impaled", "pierced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
+
+/obj/item/weapon/twohanded/pitchfork/demonic
+ name = "demonic pitchfork"
+ desc = "A red pitchfork, it looks like the work of the devil."
+ force = 19
+ throwforce = 24
+ force_unwielded = 19
+ force_wielded = 25
+
+/obj/item/weapon/twohanded/pitchfork/demonic/greater
+ force = 24
+ throwforce = 50
+ force_unwielded = 24
+ force_wielded = 34
+
+/obj/item/weapon/twohanded/pitchfork/demonic/ascended
+ force = 100
+ throwforce = 100
+ force_unwielded = 100
+ force_wielded = 500000 // Kills you DEAD.
+
+/obj/item/weapon/twohanded/pitchfork/update_icon() //Currently only here to fuck with the on-mob icons.
+ icon_state = "pitchfork[wielded]"
+
+/obj/item/weapon/twohanded/pitchfork/suicide_act(mob/user)
+ user.visible_message("[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide..")
+ return (BRUTELOSS)
+
+/obj/item/weapon/twohanded/pitchfork/demonic/pickup(mob/user)
+ if(istype(user, /mob/living))
+ var/mob/living/U = user
+ if(!U.mind.devilinfo)
+ U.visible_message("As [U] picks [src] up, [U]'s arms briefly catch fire.", \
+ "\"As you pick up the [src] your arms ignite, reminding you of all your past sins.\"")
+ if(ishuman(U))
+ var/mob/living/carbon/human/H = U
+ H.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
+ else
+ U.adjustFireLoss(rand(force/2,force))
+
+/obj/item/weapon/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
+ if(!user.mind.devilinfo)
+ user << "The [src] burns in your hands."
+ user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
+ ..()
+
+//HF blade
+
+/obj/item/weapon/twohanded/vibro_weapon
+ icon_state = "hfrequency0"
+ name = "vibro sword"
+ desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
+ force_unwielded = 20
+ force_wielded = 40
+ armour_penetration = 100
+ block_chance = 40
+ throwforce = 20
+ throw_speed = 4
+ sharpness = IS_SHARP
+ attack_verb = list("cut", "sliced", "diced")
+ w_class = 4
+ slot_flags = SLOT_BACK
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/weapon/twohanded/vibro_weapon/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ if(wielded)
+ final_block_chance *= 2
+ if(wielded || attack_type != PROJECTILE_ATTACK)
+ if(prob(final_block_chance))
+ if(attack_type == PROJECTILE_ATTACK)
+ owner.visible_message("[owner] deflects [attack_text] with [src]!")
+ playsound(src, pick("sound/weapons/bulletflyby.ogg","sound/weapons/bulletflyby2.ogg","sound/weapons/bulletflyby3.ogg"), 75, 1)
+ return 1
+ else
+ owner.visible_message("[owner] parries [attack_text] with [src]!")
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 862a638f9d5..c389b785427 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -50,6 +50,7 @@
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
+ sharpness = IS_SHARP
/obj/item/weapon/claymore/suicide_act(mob/user)
user.visible_message("[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.")
@@ -68,6 +69,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
+ sharpness = IS_SHARP
/obj/item/weapon/katana/cursed
slot_flags = null
@@ -158,6 +160,7 @@
icon_state = "switchblade_ext"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
else
force = 3
w_class = 2
@@ -165,6 +168,7 @@
icon_state = "switchblade"
attack_verb = list("stubbed", "poked")
hitsound = 'sound/weapons/Genhit.ogg'
+ sharpness = IS_BLUNT
/obj/item/weapon/switchblade/suicide_act(mob/user)
user.visible_message("[user] is slitting \his own throat with the [src.name]! It looks like \he's trying to commit suicide.")
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index ef533fe16a1..0e0ff304900 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -246,3 +246,8 @@ atom/proc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/
qdel(src)
else //If for some reason you use an empty card on an empty AI terminal.
user << "There is no AI loaded on this terminal!"
+
+
+/obj/item/weapon/circuitboard/aicore
+ name = "circuit board (AI core)"
+ origin_tech = "programming=4;biotech=2"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 5d8f24fac88..415139938a2 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -176,6 +176,19 @@ LINEN BINS
icon_state = "sheetian"
item_color = "ian"
+/obj/item/weapon/bedsheet/random
+ icon_state = "sheetrainbow"
+ item_color = "rainbow"
+ name = "random bedsheet"
+ desc = "If you're reading this description ingame, something has gone wrong! Honk!"
+
+/obj/item/weapon/bedsheet/random/New()
+ var/obj/item/weapon/bedsheet/B = pick(subtypesof(/obj/item/weapon/bedsheet) - /obj/item/weapon/bedsheet/random)
+ name = initial(B.name)
+ desc = initial(B.desc)
+ icon_state = initial(B.icon_state)
+ item_state = initial(B.item_state)
+ item_color = initial(B.item_color)
/obj/structure/bedsheetbin
name = "linen bin"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 359b80ef881..010789c22e2 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -328,8 +328,8 @@
add_fingerprint(user)
if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].")
- var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
- R.amount = 2
+ var/obj/item/stack/sheet/metal/R = new(get_turf(src))
+ R.amount = 1
qdel(src)
else if(istype(W, /obj/item/weapon/weldingtool))
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index ca3fc4ba68f..23fed94f42d 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -25,4 +25,10 @@
/obj/structure/showcase/fakesec/New()
overlays += "security"
- overlays += "security_key"
\ No newline at end of file
+ overlays += "security_key"
+
+/obj/structure/showcase/horrific_experiment
+ name = "horrific experiment"
+ desc = "Some sort of pod filled with blood and vicerea. You swear you can see it moving..."
+ icon = 'icons/obj/cloning.dmi'
+ icon_state = "pod_g"
\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 099f0da18fa..509263147b8 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -259,6 +259,7 @@
/obj/machinery/shower/proc/wash_mob(mob/living/L)
+ L.wash_cream()
L.ExtinguishMob()
L.adjust_fire_stacks(-20) //Douse ourselves with water to avoid fire more easily
if(iscarbon(L))
@@ -407,6 +408,7 @@
var/mob/living/carbon/human/H = user
H.lip_style = null //Washes off lipstick
H.lip_color = initial(H.lip_color)
+ H.wash_cream()
H.regenerate_icons()
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
else
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 1c38131239d..038bfb3fd26 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -12,7 +12,7 @@
..()
/turf/closed/wall/cult/break_wall()
- new/obj/item/stack/sheet/runed_metal/(get_turf(src), 2)
+ new/obj/item/stack/sheet/metal/(get_turf(src), 1)
return (new /obj/structure/girder/cult(src))
/turf/closed/wall/cult/devastate_wall()
@@ -101,4 +101,4 @@
/turf/closed/wall/shuttle/shuttleRotate(rotation)
var/matrix/M = transform
M.Turn(rotation)
- transform = M
\ No newline at end of file
+ transform = M
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 60129c99d52..87773f725a3 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -699,6 +699,14 @@ var/global/BSACooldown = 0
if(!ai_number)
usr << "No AIs located" //Just so you know the thing is actually working and not just ignoring you.
+/datum/admins/proc/output_devil_info()
+ var/devil_number = 0
+ for(var/D in ticker.mode.devils)
+ devil_number++
+ usr << "Devil #[devil_number]:
" + ticker.mode.printdevilinfo(D)
+ if(!devil_number)
+ usr << "No Devils located" //Just so you know the thing is actually working and not just ignoring you.
+
/datum/admins/proc/manage_free_slots()
if(!check_rights())
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 11c21972abb..91c0770c04d 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -56,6 +56,8 @@ var/list/admin_verbs_admin = list(
/client/proc/jumptoturf, /*allows us to jump to a specific turf*/
/client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
/client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/
+ /client/proc/cmd_admin_destroy_shuttle, /* Destroys the emergency shuttle, allowing us to import a new shuttle template. Or just horribly fuck with the game. */
+ /client/proc/cmd_admin_import_shuttle, /* Imports a emergency shuttle from a template, and sends it to its round start location. Probably should destroy the old one first.*/
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
/client/proc/cmd_admin_local_narrate, /*sends text to all mobs within view of atom*/
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index b8e4aee8728..220b1b4c9e9 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -437,7 +437,7 @@
if(M)
dat += "| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | "
dat += "PM | "
- dat += "FLW | "
+ dat += "FLW | "
dat += "Show Objective |
"
else
dat += "| [wizard.name]([wizard.key])Wizard body destroyed! |
"
@@ -592,6 +592,35 @@
dat += "PM | "
dat += ""
+ if(ticker.mode.devils.len)
+ dat += "
"
+
+ if(ticker.mode.sintouched.len)
+ dat += "
| sintouched | | |
"
+ for(var/X in ticker.mode.sintouched)
+ var/datum/mind/sintouched = X
+ var/mob/M = sintouched.current
+ if(M)
+ dat += "| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "Show Objective |
"
+ else
+ dat += "| [sintouched.name]([sintouched.key])sintouched body destroyed! |
"
+ dat += "PM | "
+ dat += "
"
+
var/list/blob_minds = list()
for(var/mob/camera/blob/B in mob_list)
blob_minds |= B.mind
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 012c704f2c3..4b0278dac25 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1608,6 +1608,9 @@
else if(href_list["adminchecklaws"])
output_ai_laws()
+
+ else if(href_list["admincheckdevilinfo"])
+ output_devil_info()
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 9ed79ee998b..823b6bed89b 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -608,14 +608,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm == "Yes")
- if (istype(mob, /mob/dead/observer)) // so they don't spam gibs everywhere
- return
- else
- mob.gib(1, 1)
-
log_admin("[key_name(usr)] used gibself.")
message_admins("[key_name_admin(usr)] used gibself.")
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ mob.gib(1, 1)
/client/proc/cmd_admin_check_contents(mob/living/M in mob_list)
set category = "Special Verbs"
diff --git a/code/modules/admin/verbs/shuttles.dm b/code/modules/admin/verbs/shuttles.dm
new file mode 100644
index 00000000000..2dc8e5820ee
--- /dev/null
+++ b/code/modules/admin/verbs/shuttles.dm
@@ -0,0 +1,116 @@
+/proc/emergency_sanity_check()
+ if(SSshuttle.emergency.mode != SHUTTLE_IDLE)
+ var/confirm = alert(src, "Modification of the emergency shuttle while it is not idle can be highly dangerous, and may result in WEIRD UNPREDICTABLE SHIT. Are you SURE you want to continue? Obviously if you're not touching the emergency shuttle, then you're probably fine.", "Confirm", "Yes", "No")
+ if(confirm == "Yes")
+ return TRUE
+ else
+ return FALSE
+ else
+ return TRUE
+
+/client/proc/cmd_admin_destroy_shuttle()
+ set category = "Admin"
+ set name = "Shuttle Destroy"
+
+ if (!holder)
+ src << "Only administrators may use this command."
+ return
+
+ if(!emergency_sanity_check())
+ return
+
+ var/list/names = list()
+ var/obj/docking_port/mobile/M
+ for (var/atom/AM in SSshuttle.mobile)
+ M = AM
+ names += M.name
+
+ var/selected = input("Select shuttle to DESTROY", "Shuttles") as null|anything in names
+
+ var/decide_against_msg = "You decide against destroying a shuttle."
+
+ if(!selected)
+ src << decide_against_msg
+ return
+
+ var/confirm = alert(src, "Are you sure you want to destroy [selected]?", "Confirm", "Yes", "No")
+
+ if(confirm != "Yes")
+ src << decide_against_msg
+ return
+
+ var/destroyed = FALSE
+ for (var/atom/AM in SSshuttle.mobile)
+ M = AM
+ if(M.name == selected)
+ M.jumpToNullSpace()
+ destroyed = TRUE
+ break
+
+ if(!destroyed)
+ src << "Something went wrong, the selected shuttle doesn't exist anymore."
+ return
+
+ log_admin("[key_name(usr)] - ShuttleDestroy: [M]")
+ message_admins("[key_name_admin(usr)] has used ShuttleDestroy on [selected]
")
+ feedback_add_details("admin_verb","SHTDEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/cmd_admin_import_shuttle()
+ set category = "Admin"
+ set name = "Shuttle Import"
+
+ if (!holder)
+ src << "Only administrators may use this command."
+ return
+
+ if(!emergency_sanity_check())
+ return
+
+ var/datum/map_template/template
+ var/map = input(usr, "Choose a Shuttle Template to import","Import Shuttle Template") as null|anything in shuttle_templates
+ if(!map)
+ return
+ template = shuttle_templates[map]
+
+ if(alert(usr,"Confirm importing of [map]","Shuttle Import Confirm","Yes","No") != "Yes")
+ return
+
+ var/turf/T = get_turf(locate("landmark*Shuttle Import"))
+ if(!T)
+ usr << "Shuttle import landmark not found. \
+ Aborting."
+ template.load(T, centered = TRUE)
+
+ var/obj/docking_port/mobile/M
+
+ for(var/S in template.get_affected_turfs(T,centered = TRUE))
+ for (var/AM in S)
+ if(istype(AM, /obj/docking_port/mobile))
+ if(!M)
+ M = AM
+ else
+ usr << "More than one mobile docking port was detected ([AM]), this is a BAD THING, TELL A CODER."
+ if(istype(AM, /obj/docking_port/stationary))
+ usr << "REEEEEEEEEEEE! THE LOADED TEMPLATE HAS [AM], A STATIONARY DOCKING PORT, THIS IS A BAD THING FIX IT. TELL A CODER. WE CAN DELETE IT BUT IT SHOULD NOT BE THERE."
+ var/obj/docking_port/stationary/bad = AM
+ bad.i_know_what_im_doing = TRUE
+ qdel(bad)
+
+ if(!M)
+ usr << "The loaded template didn't have a mobile docking port! The template has been deleted."
+ for(var/S in template.get_affected_turfs(T,centered = TRUE))
+ var/turf/T0 = S
+ for(var/atom/AM in T0.GetAllContents())
+ if(istype(AM, /mob/dead))
+ continue
+ qdel(AM)
+ qdel(S)
+ return
+
+ var/status = M.dockRoundstart()
+ if(status)
+ message_admins("The imported shuttle [map]/[M] failed to travel to its roundstart location (error code [status]). Please fix or delete the imported shuttle before continuing any more shuttle import hijinks.")
+
+ log_admin("[key_name(usr)] - ShuttleImport: [map] - [M]")
+ message_admins("[key_name_admin(usr)] has used ShuttleImport: [map] - [M]
")
+ feedback_add_details("admin_verb","SHTIMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index a4cd973559c..5725bf78a32 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -60,7 +60,12 @@
D.locked = !D.locked
D.update_icon()
if(specialfunctions & SHOCK)
- D.secondsElectrified = D.secondsElectrified ? 0 : -1
+ if(D.secondsElectrified)
+ D.secondsElectrified = -1
+ D.shockedby += "\[[time_stamp()]\][usr](ckey:[usr.ckey])"
+ add_logs(usr, D, "electrified")
+ else
+ D.secondsElectrified = 0
if(specialfunctions & SAFE)
D.safe = !D.safe
sleep(10)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index d896d93a9a3..cdd0e0fea57 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -22,14 +22,17 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/New()
..()
initialize_directions = dir
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/cryo_tube(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cryo_tube(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/cryo_tube
+ name = "circuit board (Cryotube)"
+ build_path = /obj/machinery/atmospherics/components/unary/cryo_cell
+ origin_tech = "programming=4;biotech=3;engineering=4"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 4)
/obj/machinery/atmospherics/components/unary/cryo_cell/construction()
..(dir, dir)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index ed142bbf4ed..fc06e542cba 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -17,14 +17,37 @@
/obj/machinery/atmospherics/components/unary/thermomachine/New()
..()
initialize_directions = dir
- component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/thermomachine
+ name = "circuit board (Thermomachine)"
+ desc = "You can use a screwdriver to switch between heater and freezer."
+ origin_tech = "programming=3;plasmatech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params)
+ var/obj/item/weapon/circuitboard/machine/freezer = /obj/item/weapon/circuitboard/machine/thermomachine/freezer
+ var/obj/item/weapon/circuitboard/machine/heater = /obj/item/weapon/circuitboard/machine/thermomachine/heater
+ var/obj/item/weapon/circuitboard/machine/newtype
+
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/new_setting = "Heater"
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(build_path == initial(heater.build_path))
+ newtype = freezer
+ new_setting = "Freezer"
+ else
+ newtype = heater
+ name = initial(newtype.name)
+ build_path = initial(newtype.build_path)
+ user << "You change the circuitboard setting to \"[new_setting]\"."
+ else
+ return ..()
/obj/machinery/atmospherics/components/unary/thermomachine/construction()
..(dir,dir)
@@ -169,7 +192,12 @@
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/New()
..()
- component_parts += new /obj/item/weapon/circuitboard/thermomachine/freezer(null)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/freezer(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/thermomachine/freezer
+ name = "circuit board (Freezer)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts()
..()
@@ -189,7 +217,12 @@
/obj/machinery/atmospherics/components/unary/thermomachine/heater/New()
..()
- component_parts += new /obj/item/weapon/circuitboard/thermomachine/heater(null)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/heater(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/thermomachine/heater
+ name = "circuit board (Heater)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
/obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts()
..()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 094bcb2cc40..ea4446dcd21 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -17,7 +17,7 @@
throw_speed = 0
throw_range = 1
force = 200
- armour_penetration = 100
+ armour_penetration = 1000
anchored = TRUE
flags = HANDSLOW
var/team = WHITE_TEAM
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 17d563703d5..7b655fbdeb8 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -29,40 +29,12 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
return
-/proc/generateMapList(filename, blacklist)
+/proc/generateMapList(filename)
var/list/potentialMaps = list()
- var/list/blacklistedMaps = list()
var/list/Lines = file2list(filename)
if(!Lines.len)
return
-
- if(blacklist)
- var/list/Blines = file2list(blacklist)
- for (var/t in Blines)
- if (!t)
- continue
-
- t = trim(t)
- if (length(t) == 0)
- continue
- else if (copytext(t, 1, 2) == "#")
- continue
-
- var/pos = findtext(t, " ")
- var/name = null
-
- if (pos)
- name = lowertext(copytext(t, 1, pos))
-
- else
- name = lowertext(t)
-
- if (!name)
- continue
-
- blacklistedMaps.Add(t)
-
for (var/t in Lines)
if (!t)
continue
@@ -87,40 +59,49 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
potentialMaps.Add(t)
+ return potentialMaps
- return (potentialMaps - blacklistedMaps)
+/proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates)
+ var/overall_sanity = 100
+ var/ruins = potentialRuins.Copy()
-/proc/seedRuins(z_level = 1, ruin_number = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates)
- ruin_number = min(ruin_number, potentialRuins.len)
-
- while(ruin_number)
- var/sanity = 0
- var/valid = FALSE
- var/datum/map_template/template = potentialRuins[pick(potentialRuins)]
- while(!valid)
- valid = TRUE
- sanity++
- if(sanity > 100)
- ruin_number--
- break
+ while(budget > 0 && overall_sanity > 0)
+ // Pick a ruin
+ var/datum/map_template/ruin/ruin = ruins[pick(ruins)]
+ // Can we afford it
+ if(ruin.cost > budget)
+ overall_sanity--
+ continue
+ // If so, try to place it
+ var/sanity = 100
+ // And if we can't fit it anywhere, give up, try again
+ while(sanity > 0)
+ sanity--
var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level)
+ var/valid = TRUE
- for(var/turf/check in template.get_affected_turfs(T,1))
+ for(var/turf/check in ruin.get_affected_turfs(T,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, whitelist)))
valid = FALSE
break
- if(valid)
- world.log << "Ruin \"[template.mappath]\" placed at ([T.x], [T.y], [T.z])"
- var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
- R.Load(potentialRuins,template)
- potentialRuins -= template
- ruin_number --
+ if(!valid)
+ continue
- return
+ world.log << "Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])"
+
+ var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
+ R.Load(ruins,ruin)
+ budget -= ruin.cost
+ if(!ruin.allow_duplicates)
+ ruins -= ruin.name
+ break
+
+ if(!overall_sanity)
+ world.log << "Ruin loader gave up with [budget] left to spend."
/obj/effect/ruin_loader
name = "random ruin"
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 472d2442557..4a3e5bdfec0 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -2,7 +2,7 @@
name = "supply console"
desc = "Used to order supplies, approve requests, and control the shuttle."
icon_screen = "supply"
- circuit = /obj/item/weapon/circuitboard/cargo
+ circuit = /obj/item/weapon/circuitboard/computer/cargo
var/requestonly = FALSE
var/contraband = FALSE
@@ -10,12 +10,12 @@
name = "supply request console"
desc = "Used to request supplies from cargo."
icon_screen = "request"
- circuit = /obj/item/weapon/circuitboard/cargo/request
+ circuit = /obj/item/weapon/circuitboard/computer/cargo/request
requestonly = TRUE
/obj/machinery/computer/cargo/New()
..()
- var/obj/item/weapon/circuitboard/cargo/board = circuit
+ var/obj/item/weapon/circuitboard/computer/cargo/board = circuit
contraband = board.contraband
emagged = board.emagged
@@ -28,7 +28,7 @@
contraband = TRUE
// This also permamently sets this on the circuit board
- var/obj/item/weapon/circuitboard/cargo/board = circuit
+ var/obj/item/weapon/circuitboard/computer/cargo/board = circuit
board.contraband = TRUE
board.emagged = TRUE
diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm
index a41d5bd0f30..51a563918fb 100644
--- a/code/modules/cargo/exports/parts.dm
+++ b/code/modules/cargo/exports/parts.dm
@@ -13,4 +13,20 @@
/datum/export/solar/control_board
cost = 150
unit_name = "solar panel control board"
- export_types = list(/obj/item/weapon/circuitboard/solar_control)
\ No newline at end of file
+ export_types = list(/obj/item/weapon/circuitboard/computer/solar_control)
+
+
+
+/datum/export/swarmer
+ cost = 2000
+ unit_name = "deactivated alien deconstruction drone"
+ export_types = list(/obj/item/device/unactivated_swarmer)
+
+/datum/export/swarmer/applies_to(obj/O, contr = 0, emag = 0)
+ if(!..())
+ return FALSE
+
+ var/obj/item/device/unactivated_swarmer/S = O
+ if(!S.crit_fail)
+ return FALSE
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index ef1c1ef85cd..ef657aedc10 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -530,7 +530,7 @@
/obj/item/solar_assembly,
/obj/item/solar_assembly,
/obj/item/solar_assembly,
- /obj/item/weapon/circuitboard/solar_control,
+ /obj/item/weapon/circuitboard/computer/solar_control,
/obj/item/weapon/electronics/tracker,
/obj/item/weapon/paper/solar)
crate_name = "solar panel crate"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index c459acf5217..2f678e92241 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -343,7 +343,6 @@ BLIND // can't see anything
var/suit_color = null
var/obj/item/clothing/tie/hastie = null
-
/obj/item/clothing/under/worn_overlays(var/isinhands = FALSE)
. = list()
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index cf96d56348f..7ffd3afefd5 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -173,3 +173,29 @@
/obj/item/clothing/gloves/color/white/redcoat
item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
+
+/obj/item/clothing/gloves/color/random
+ name = "random gloves"
+ desc = "These gloves are supposed to be a random color..."
+ icon_state = "white"
+ item_state = "wgloves"
+ item_color = "mime"
+
+/obj/item/clothing/gloves/color/random/New()
+ var/list/gloves = list(
+ /obj/item/clothing/gloves/color/orange = 1,
+ /obj/item/clothing/gloves/color/red = 1,
+ /obj/item/clothing/gloves/color/blue = 1,
+ /obj/item/clothing/gloves/color/purple = 1,
+ /obj/item/clothing/gloves/color/green = 1,
+ /obj/item/clothing/gloves/color/grey = 1,
+ /obj/item/clothing/gloves/color/light_brown = 1,
+ /obj/item/clothing/gloves/color/brown = 1)
+
+ var/obj/item/clothing/gloves/color/selected = pick(gloves)
+
+ name = initial(selected.name)
+ desc = initial(selected.desc)
+ icon_state = initial(selected.icon_state)
+ item_state = initial(selected.item_state)
+ item_color = initial(selected.item_color)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2dd3343470f..2d80c678690 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/tank/internals/emergency_oxygen)
body_parts_covered = CHEST
cold_protection = CHEST|GROIN
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -22,7 +22,7 @@
desc = "An armored vest that protects against most types of damage."
icon_state = "armor"
item_state = "armor"
-
+
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence."
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index a9c3e2177c7..428633cdbd0 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -118,4 +118,4 @@
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
item_color = "scrubspurple"
- can_adjust = 0
+ can_adjust = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 360ddc8e0be..a63fd72439e 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -244,6 +244,13 @@
item_state = "white_suit"
item_color = "white_suit"
+/obj/item/clothing/under/burial
+ name = "burial garments"
+ desc = "Traditional burial garments from the early 22nd century."
+ icon_state = "burial"
+ item_state = "burial"
+ item_color = "burial"
+
/obj/item/clothing/under/blackskirt
name = "black skirt"
desc = "A black skirt, very fancy!"
diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm
index 19345e4d476..17e5b467066 100644
--- a/code/modules/detectivework/footprints_and_rag.dm
+++ b/code/modules/detectivework/footprints_and_rag.dm
@@ -47,4 +47,5 @@
if(do_after(user,30, target = A))
user.visible_message("[user] finishes wiping off the [A]!", "You finish wiping off the [A].")
A.clean_blood()
+ A.wash_cream()
return
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index 7ba88bcd75a..2a790645521 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -44,6 +44,8 @@
/obj/item/weapon/reagent_containers/food/snacks/attack(mob/M, mob/user, def_zone)
+ if(user.a_intent == "harm")
+ return ..()
if(!eatverb)
eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food&drinks/food/snacks_pie.dm
index 17b7241b5b7..f3cd98cd458 100644
--- a/code/modules/food&drinks/food/snacks_pie.dm
+++ b/code/modules/food&drinks/food/snacks_pie.dm
@@ -27,6 +27,19 @@
var/turf/T = get_turf(hit_atom)
new/obj/effect/decal/cleanable/pie_smudge(T)
reagents.reaction(hit_atom, TOUCH)
+
+ if(ishuman(hit_atom))
+ var/mob/living/carbon/human/H = hit_atom
+ var/image/creamoverlay = image('icons/effects/creampie.dmi')
+ if(H.dna.species.id == "lizard")
+ creamoverlay.icon_state = "creampie_lizard"
+ else
+ creamoverlay.icon_state = "creampie_human"
+ H.Weaken(1) //splat!
+ H.adjust_blurriness(1)
+ visible_message("[H] was creamed by the [src]!!")
+ H.overlays += creamoverlay
+
qdel(src)
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm
index 84a92fbaca7..93e3d1799fd 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food&drinks/kitchen machinery/gibber.dm
@@ -48,11 +48,16 @@
/obj/machinery/gibber/New()
..()
src.overlays += image('icons/obj/kitchen.dmi', "grjam")
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/gibber(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gibber(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/gibber
+ name = "circuit board (Gibber)"
+ build_path = /obj/machinery/gibber
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/gibber/RefreshParts()
var/gib_time = 40
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm
index 878d51853b1..5e8171bf0dd 100644
--- a/code/modules/food&drinks/kitchen machinery/microwave.dm
+++ b/code/modules/food&drinks/kitchen machinery/microwave.dm
@@ -24,13 +24,18 @@
/obj/machinery/microwave/New()
create_reagents(100)
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/microwave(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 2)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/microwave(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/microwave
+ name = "circuit board (Microwave)"
+ build_path = /obj/machinery/microwave
+ origin_tech = "programming=1;magnets=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/machinery/microwave/RefreshParts()
var/E
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
index b1e7f5632fd..a446c16d444 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
@@ -16,11 +16,16 @@
/obj/machinery/monkey_recycler/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/monkey_recycler(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/monkey_recycler(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/monkey_recycler
+ name = "circuit board (Monkey Recycler)"
+ build_path = /obj/machinery/monkey_recycler
+ origin_tech = "programming=1;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/monkey_recycler/RefreshParts()
var/req_grind = 5
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index ab460e14999..f0c41e5f082 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -16,12 +16,17 @@
var/rating_amount = 1
/obj/machinery/processor/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/processor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- RefreshParts()
+ ..()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/processor(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/processor
+ name = "circuit board (Food Processor)"
+ build_path = /obj/machinery/processor
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/processor/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
index 1eac74d44c7..ca7dfd00041 100644
--- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm
+++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
@@ -19,10 +19,33 @@
/obj/machinery/smartfridge/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/smartfridge(null, type)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smartfridge(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/smartfridge
+ name = "circuit board (Smartfridge)"
+ build_path = /obj/machinery/smartfridge
+ origin_tech = "programming=1"
+ req_components = list(/obj/item/weapon/stock_parts/matter_bin = 1)
+
+/obj/item/weapon/circuitboard/machine/smartfridge/New(loc, new_type)
+ if(new_type)
+ build_path = new_type
+
+/obj/item/weapon/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/list/fridges = list(/obj/machinery/smartfridge = "default",
+ /obj/machinery/smartfridge/drinks = "drinks",
+ /obj/machinery/smartfridge/extract = "slimes",
+ /obj/machinery/smartfridge/chemistry = "chems",
+ /obj/machinery/smartfridge/chemistry/virology = "viruses")
+
+ var/position = fridges.Find(build_path, fridges)
+ position = (position == fridges.len) ? 1 : (position + 1)
+ build_path = fridges[position]
+ user << "You set the board to [fridges[build_path]]."
+ else
+ return ..()
/obj/machinery/smartfridge/construction()
for(var/datum/A in contents)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 9ebde1d58ab..c951b922b8b 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -16,15 +16,20 @@
var/max_items = 40
/obj/machinery/biogenerator/New()
- ..()
- create_reagents(1000)
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/biogenerator(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
+ ..()
+ create_reagents(1000)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/biogenerator(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/biogenerator
+ name = "circuit board (Biogenerator)"
+ build_path = /obj/machinery/biogenerator
+ origin_tech = "programming=3;biotech=2;materials=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/machinery/biogenerator/RefreshParts()
var/E = 0
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 1f062578259..2f0e44878b3 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -23,13 +23,18 @@
/obj/machinery/plantgenes/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/plantgenes(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/plantgenes
+ name = "circuit board (Plant DNA Manipulator)"
+ build_path = /obj/machinery/plantgenes
+ origin_tech = "programming=2;biotech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
/obj/machinery/plantgenes/RefreshParts()
rating = 0
@@ -353,7 +358,7 @@
/obj/machinery/plantgenes/seedvault/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
+ component_parts += new /obj/item/weapon/circuitboard/machine/plantgenes(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module/triphasic(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/quadultra(src)
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 88f6b0d5af4..9996e4f5cf3 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -66,6 +66,9 @@
else
if(M.ckey == ckey && M.stat == DEAD && !M.suiciding)
make_podman = 1
+ if(istype(M, /mob/living))
+ var/mob/living/L = M
+ make_podman = !L.hellbound
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in player_list)
@@ -75,6 +78,9 @@
if(!O.can_reenter_corpse)
break
make_podman = 1
+ if(istype(M, /mob/living))
+ var/mob/living/L = M
+ make_podman = !L.hellbound
ckey_holder = M.ckey
break
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 09d0f9b748f..ce238c7eaa1 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -34,13 +34,17 @@
/obj/machinery/hydroponics/constructable/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/hydroponics(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/hydroponics
+ name = "circuit board (Hydroponics Tray)"
+ build_path = /obj/machinery/hydroponics/constructable
+ origin_tech = "programming=1;biotech=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/machinery/hydroponics/constructable/RefreshParts()
var/tmp_capacity = 0
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index e7e63b26e23..1d146cdff00 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -50,11 +50,16 @@
/obj/machinery/seed_extractor/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/seed_extractor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/seed_extractor(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/seed_extractor
+ name = "circuit board (Seed Extractor)"
+ build_path = /obj/machinery/seed_extractor
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/seed_extractor/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
diff --git a/code/modules/library/lib_demonomicon.dm b/code/modules/library/lib_demonomicon.dm
new file mode 100644
index 00000000000..88a10b0720b
--- /dev/null
+++ b/code/modules/library/lib_demonomicon.dm
@@ -0,0 +1,56 @@
+/obj/item/weapon/book/codex_gigas
+ name = "Codex Gigas"
+ icon_state ="demonomicon"
+ throw_speed = 1
+ throw_range = 10
+ burn_state = LAVA_PROOF
+ author = "Forces beyond your comprehension"
+ unique = 1
+ title = "The codex gigas"
+ var/inUse = 0
+
+
+
+
+
+/obj/item/weapon/book/codex_gigas/attack_self(mob/user)
+ if(is_blind(user))
+ return
+ if(ismonkey(user))
+ user << "You skim through the book but can't comprehend any of it."
+ return
+ if(inUse)
+ user << "Someone else is reading it."
+ if(ishuman(user))
+ var/mob/living/carbon/human/U = user
+ if(U.check_acedia())
+ user << "None of this matters, why are you reading this? You put the [title] down."
+ return
+ inUse = 1
+ var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
+ var/speed = 300
+ var/correctness = 85
+ var/willpower = 80
+ if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research
+ speed = 45
+ correctness = 100
+ willpower = 95
+ if(U.job in list("Captain", "Security Officer", "Head of Security", "Detective", "Warden"))
+ willpower = 90
+ if(U.job in list("Clown")) // WHO GAVE THE CLOWN A DEMONOMICON? BAD THINGS WILL HAPPEN!
+ willpower = 25
+ correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
+ speed += U.getBrainLoss() * 3
+ user.visible_message("[user] opens [title] and begins reading intently.")
+ if(do_after(U, speed, 0, U))
+ var/usedName = devilName
+ if(!prob(correctness))
+ usedName += "x"
+ var/datum/devilinfo/devil = devilInfo(usedName, 0)
+ user << browse("Information on [devilName]
[lawlorify[LORE][devil.ban]]
[lawlorify[LORE][devil.bane]]
[lawlorify[LORE][devil.obligation]]
[lawlorify[LORE][devil.banish]]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
+ inUse = 0
+ sleep(10)
+ if(!prob(willpower))
+ U.influenceSin()
+ onclose(user, "book")
+
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 16862d3e8a5..bdad0908afe 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -19,7 +19,7 @@
icon_state = "oldcomp"
icon_screen = "library"
icon_keyboard = null
- circuit = /obj/item/weapon/circuitboard/libraryconsole
+ circuit = /obj/item/weapon/circuitboard/computer/libraryconsole
var/screenstate = 0
var/title
var/category = "Any"
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 58a7559c55c..9503ed2808b 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -24,14 +24,19 @@
/obj/machinery/mineral/ore_redemption/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/ore_redemption(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/device/assembly/igniter(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/ore_redemption(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/ore_redemption
+ name = "circuit board (Ore Redemption)"
+ build_path = /obj/machinery/mineral/ore_redemption
+ origin_tech = "programming=1;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/device/assembly/igniter = 1)
/obj/machinery/mineral/ore_redemption/RefreshParts()
var/ore_pickup_rate_temp = 15
@@ -322,13 +327,16 @@
/obj/machinery/mineral/equipment_vendor/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mining_equipment_vendor(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/mining_equipment_vendor
+ name = "circuit board (Mining Equipment Vendor)"
+ build_path = /obj/machinery/mineral/equipment_vendor
+ origin_tech = "programming=1;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 3)
/obj/machinery/mineral/equipment_vendor/power_change()
..()
@@ -1151,10 +1159,9 @@
/obj/machinery/mineral/equipment_vendor/golem/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mining_equipment_vendor/golem(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
+ name = "circuit board (Golem Ship Equipment Vendor)"
+ build_path = /obj/machinery/mineral/equipment_vendor/golem
diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm
index 079eaeab8dd..2e88d4e413c 100644
--- a/code/modules/mining/laborcamp/laborshuttle.dm
+++ b/code/modules/mining/laborcamp/laborshuttle.dm
@@ -1,7 +1,7 @@
/obj/machinery/computer/shuttle/labor
name = "labor shuttle console"
desc = "Used to call and send the labor camp shuttle."
- circuit = /obj/item/weapon/circuitboard/labor_shuttle
+ circuit = /obj/item/weapon/circuitboard/computer/labor_shuttle
shuttleId = "laborcamp"
possible_destinations = "laborcamp_home;laborcamp_away"
req_access = list(access_brig)
@@ -11,7 +11,7 @@
name = "prisoner shuttle console"
desc = "A one-way shuttle console, used to summon the shuttle to the labor camp."
possible_destinations = "laborcamp_away"
- circuit = /obj/item/weapon/circuitboard/labor_shuttle/one_way
+ circuit = /obj/item/weapon/circuitboard/computer/labor_shuttle/one_way
req_access = list( )
/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 99978ad5c39..457554c2300 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -53,7 +53,7 @@
/obj/machinery/computer/shuttle/mining
name = "Mining Shuttle Console"
desc = "Used to call and send the mining shuttle."
- circuit = /obj/item/weapon/circuitboard/mining_shuttle
+ circuit = /obj/item/weapon/circuitboard/computer/mining_shuttle
shuttleId = "mining"
possible_destinations = "mining_home;mining_away"
no_destination_swap = 1
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 34d64e5dc01..761355fd6e6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -136,6 +136,7 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
. = ..()
+
var/damage = intensity - check_eye_prot()
if(.) // we've been flashed
if(visual)
@@ -169,10 +170,15 @@
src << "You can't see anything!"
else
src << "Your eyes are really starting to hurt. This can't be good for you!"
+ if(has_bane(BANE_LIGHT))
+ mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
src << "Something bright flashes in the corner of your vision!"
+ if(has_bane(BANE_LIGHT))
+ mind.disrupt_spells(0)
+
//Throwing stuff
/mob/living/carbon/proc/toggle_throw_mode()
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 3b8bb513a9e..393e7e9f2e5 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -31,7 +31,10 @@
if(ticker && ticker.mode)
sql_report_death(src)
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
- return ..(gibbed)
+ . = ..(gibbed)
+ if(mind && mind.devilinfo)
+ spawn(0)
+ mind.devilinfo.beginResurrectionCheck(src)
/mob/living/carbon/human/proc/makeSkeleton()
status_flags |= DISFIGURED
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 68c786f3d10..df0e5344f19 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -174,6 +174,8 @@
if(getorgan(/obj/item/organ/brain))//Only perform these checks if there is no brain
if(suiciding)
msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n"
+ if(hellbound)
+ msg += "[t_his] soul seems to have been ripped out of [t_his] body. Revival is impossible.\n"
msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life"
if(!key)
var/foundghost = 0
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9ae245d91b8..9187f04b1ab 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -872,6 +872,11 @@
update_icons() //apply the now updated overlays to the mob
+/mob/living/carbon/human/wash_cream()
+ //clean both to prevent a rare bug
+ overlays -=image('icons/effects/creampie.dmi', "creampie_lizard")
+ overlays -=image('icons/effects/creampie.dmi', "creampie_human")
+
//Turns a mob black, flashes a skeleton overlay
//Just like a cartoon!
@@ -990,3 +995,41 @@
if(HM.quality != POSITIVE)
dna.remove_mutation(HM.name)
..()
+
+/mob/living/carbon/human/proc/influenceSin()
+ var/datum/objective/sintouched/O
+ switch(rand(1,7))//traditional seven deadly sins... except lust.
+ if(1) // acedia
+ log_game("[src] was influenced by the sin of Acedia.")
+ O = new /datum/objective/sintouched/acedia
+ if(2) // Gluttony
+ log_game("[src] was influenced by the sin of gluttony.")
+ O = new /datum/objective/sintouched/gluttony
+ if(3) // Greed
+ log_game("[src] was influenced by the sin of greed.")
+ O = new /datum/objective/sintouched/greed
+ if(4) // sloth
+ log_game("[src] was influenced by the sin of sloth.")
+ O = new /datum/objective/sintouched/sloth
+ if(5) // Wrath
+ log_game("[src] was influenced by the sin of wrath.")
+ O = new /datum/objective/sintouched/wrath
+ if(6) // Envy
+ log_game("[src] was influenced by the sin of envy.")
+ O = new /datum/objective/sintouched/envy
+ if(7) // Pride
+ log_game("[src] was influenced by the sin of pride.")
+ O = new /datum/objective/sintouched/pride
+ ticker.mode.sintouched += src.mind
+ src.mind.objectives += O
+ var/obj_count = 1
+ src << "Your current objectives:"
+ for(O in src.mind.objectives)
+ var/datum/objective/objective = O
+ src << "Objective #[obj_count]: [objective.explanation_text]"
+ obj_count++
+
+/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker)
+ . = ..()
+ if (dna && dna.species)
+ . += dna.species.check_weakness(weapon, attacker)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a9bfdce73cb..2976c5809a8 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -679,6 +679,9 @@
/datum/species/proc/get_spans()
return list()
+/datum/species/proc/check_weakness(obj/item/weapon, mob/living/attacker)
+ return 0
+
////////
//LIFE//
////////
@@ -1023,7 +1026,8 @@
armor_block = min(90,armor_block) //cap damage reduction at 90%
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
- apply_damage(I.force, I.damtype, def_zone, armor_block, H)
+ var/weakness = H.check_weakness(I, user)
+ apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H)
H.send_item_attack_message(I, user, hit_area)
@@ -1031,16 +1035,20 @@
return 0 //item force is zero
//dismemberment
- if(affecting.get_damage() >= affecting.max_damage)
+ if(affecting.get_damage() >= (affecting.max_damage - I.armour_penetration/2))
if(I.can_dismember() && prob(I.force*(I.w_class-1)))
- if(affecting.dismember())
+ if(affecting.dismember(I.damtype))
I.add_blood(H)
- playsound(get_turf(H), pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg'), 80, 1)
- affecting.add_blood(H)
- var/turf/location = H.loc
- if(istype(location))
- location.add_blood(H)
- return
+ switch(I.damtype)
+ if(BURN)
+ playsound(get_turf(H), 'sound/weapons/sear.ogg', 80, 1)
+ else
+ playsound(get_turf(H), pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg'), 80, 1)
+ affecting.add_blood(H)
+ var/turf/location = H.loc
+ if(istype(location))
+ location.add_blood(H)
+ return
var/bloody = 0
if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2))))
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 77c3a6c6d0d..4084b11b26e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -212,7 +212,7 @@
return internal.remove_air_volume(volume_needed)
/mob/living/carbon/proc/handle_changeling()
- if(mind && hud_used)
+ if(mind && hud_used && hud_used.lingchemdisplay)
if(mind.changeling)
mind.changeling.regenerate(src)
hud_used.lingchemdisplay.invisibility = 0
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 06f6492e9ae..aff9f035297 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -505,7 +505,7 @@ Sorry Giacom. Please don't be mad :(
ear_deaf = 0
ear_damage = 0
hallucination = 0
- heal_overall_damage(1000, 1000)
+ heal_overall_damage(100000, 100000)
ExtinguishMob()
fire_stacks = 0
updatehealth()
@@ -610,7 +610,7 @@ Sorry Giacom. Please don't be mad :(
/mob/living/movement_delay()
. = ..()
- if(istype(loc, /turf/open))
+ if(isturf(loc, /turf/open))
var/turf/open/T = loc
. += T.slowdown
switch(m_intent)
@@ -995,3 +995,29 @@ Sorry Giacom. Please don't be mad :(
/mob/proc/update_sight()
return
+
+/mob/living/proc/owns_soul()
+ if(mind)
+ return mind.soulOwner == mind
+ return 1
+
+/mob/living/proc/return_soul()
+ if(mind)
+ mind.soulOwner = mind
+
+/mob/living/proc/has_bane(banetype)
+ if(mind)
+ if(mind.devilinfo)
+ return mind.devilinfo.bane == banetype
+ return 0
+
+/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
+ if(mind && mind.devilinfo)
+ return check_devil_bane_multiplier(weapon, attacker)
+ return 1
+
+/mob/living/proc/check_acedia()
+ if(src.mind && src.mind.objectives)
+ for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
+ return 1
+ return 0
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 2406a5ba0ed..dab7e893b8a 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -59,3 +59,5 @@
var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666)
var/list/butcher_results = null
+ var/hellbound = 0 //People who've signed infernal contracts are unrevivable.
+
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 2c3db69ef8e..3d1ebfaa7cd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -956,6 +956,7 @@
cleaned_human.shoes.clean_blood()
cleaned_human.update_inv_shoes()
cleaned_human.clean_blood()
+ cleaned_human.wash_cream()
cleaned_human << "[src] cleans your face!"
return
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 0ce588cdd87..e32fca72536 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -224,6 +224,7 @@ Auto Patrol: []"},
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
+ threat = C.assess_threat()
add_logs(src,C,"stunned")
if(declare_arrests)
var/area/location = get_area(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index bb635bb1425..0b680f72a48 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -65,8 +65,8 @@
/mob/living/simple_animal/drone/New()
..()
-
- name = name + " ([rand(100,999)])"
+ if(name != initial(name))
+ name = name + " ([rand(100,999)])"
real_name = name
access_card = new /obj/item/weapon/card/id(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index d66f5fe2aae..6ea3114ffed 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -132,6 +132,7 @@
/obj/item/weapon/ore/uranium)
var/chase_time = 100
+ var/will_burrow = TRUE
/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
..()
@@ -151,8 +152,9 @@
visible_message("The [src.name] tries to flee from [target.name]!")
retreat_distance = 10
minimum_distance = 10
- spawn(chase_time)
- Burrow()
+ if(will_burrow)
+ spawn(chase_time)
+ Burrow()
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
if(istype(target, /obj/item/weapon/ore))
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 42aad52c0e4..cd450b1ba34 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -31,6 +31,7 @@
move_to_delay = 0 // Very fast
animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue.
+ hud_possible = list(ANTAG_HUD)
see_in_dark = 13
vision_range = 12
@@ -64,6 +65,12 @@
if(creator)
src.creator = creator
+/mob/living/simple_animal/hostile/statue/med_hud_set_health()
+ return //we're a statue we're invincible
+
+/mob/living/simple_animal/hostile/statue/med_hud_set_status()
+ return //we're a statue we're invincible
+
/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
if(can_be_seen(NewLoc))
if(client)
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index 8d96e162f1e..eccba5770c6 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -33,7 +33,19 @@
layer = MOB_LAYER - 0.1
var/removingairlock = 0
-
+/mob/living/simple_animal/hostile/zombie/darkholme //BOY♂NEXT♂RUIN
+ desc = "This guy seems to have gotten lost on his way to the leather club."
+
+/mob/living/simple_animal/hostile/zombie/darkholme/New()
+ ..()
+ name = pick("Leatherman","Leatherhead")
+
+mob/living/simple_animal/hostile/zombie/gymboss
+ name = "boss of this gym"
+ desc = "There seems to be something shiny embedded in his waist."
+ butcher_results = list(/obj/item/weapon/storage/belt/champion/wrestling = 1)
+ attacktext = "spanks"
+
/mob/living/simple_animal/hostile/zombie/AttackingTarget()
..()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index d6a58af95cf..5a1dffc3c42 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -85,7 +85,7 @@
//Parrots will generally sit on their perch unless something catches their eye.
//These vars store their preffered perch and if they dont have one, what they can use as a perch
var/obj/parrot_perch = null
- var/obj/desired_perches = list(/obj/structure/computerframe, /obj/structure/displaycase, \
+ var/obj/desired_perches = list(/obj/structure/frame/computer, /obj/structure/displaycase, \
/obj/structure/filingcabinet, /obj/machinery/teleport, \
/obj/machinery/computer, /obj/machinery/clonepod, \
/obj/machinery/dna_scannernew, /obj/machinery/telecomms, \
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 870064d2447..e4de12e8ac3 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -26,7 +26,9 @@ var/next_mob_id = 0
/atom/proc/prepare_huds()
for(var/hud in hud_possible)
- hud_list[hud] = image('icons/mob/hud.dmi', src, "")
+ var/image/I = image('icons/mob/hud.dmi', src, "")
+ I.appearance_flags = RESET_COLOR
+ hud_list[hud] = I
/mob/proc/Cell()
set category = "Admin"
@@ -583,10 +585,10 @@ var/next_mob_id = 0
if (nextmap && istype(nextmap))
stat(null, "Next Map: [nextmap.friendlyname]")
stat(null, "Server Time: [time2text(world.realtime, "YYYY-MM-DD hh:mm")]")
-
- var/ETA = SSshuttle.emergency.getModeStr()
- if(ETA)
- stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]")
+ if(SSshuttle.emergency)
+ var/ETA = SSshuttle.emergency.getModeStr()
+ if(ETA)
+ stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]")
if(client && client.holder)
@@ -760,11 +762,7 @@ var/next_mob_id = 0
/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
if(mind)
- for(var/mob/dead/observer/G in dead_mob_list)
- if(G.mind == mind)
- if(G.can_reenter_corpse || even_if_they_cant_reenter)
- return G
- break
+ return mind.get_ghost(even_if_they_cant_reenter)
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
var/mob/dead/observer/ghost = get_ghost()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 1971867a5ae..2861e2e41aa 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -320,6 +320,7 @@
data_core.manifest_inject(character)
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
AnnounceArrival(character, rank)
+ AddEmploymentContract(character)
else
character.Robotize()
@@ -342,6 +343,15 @@
var/obj/machinery/announcement_system/announcer = pick(announcement_systems)
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
+/mob/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)
+ //TODO: figure out a way to exclude wizards/nukeops/demons from this.
+ sleep(30)
+ for(var/C in employmentCabinets)
+ var/obj/structure/filingcabinet/employment/employmentCabinet = C
+ if(!employmentCabinet.virgin)
+ employmentCabinet.addFile(employee)
+
+
/mob/new_player/proc/LateChoices()
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
//var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index fca202896d1..b285351259b 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -53,6 +53,8 @@
if(suiciding)
O.suiciding = suiciding
+ if(hellbound)
+ O.hellbound = hellbound
O.loc = loc
O.a_intent = "harm"
@@ -170,6 +172,8 @@
if(suiciding)
O.suiciding = suiciding
+ if(hellbound)
+ O.hellbound = hellbound
O.loc = loc
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 0c1fc6093f0..354d2f4db97 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -1,4 +1,3 @@
-
/obj/item/weapon/katana/energy
name = "energy katana"
desc = "A katana infused with strong energy."
@@ -6,7 +5,7 @@
item_state = "energy_katana"
force = 40
throwforce = 20
- armour_penetration = 15
+ armour_penetration = 50
var/datum/effect_system/spark_spread/spark_system
/obj/item/weapon/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
new file mode 100644
index 00000000000..7f67ef9e3d3
--- /dev/null
+++ b/code/modules/paperwork/contract.dm
@@ -0,0 +1,265 @@
+/* For employment contracts and infernal contracts */
+
+/obj/item/weapon/paper/contract
+ throw_range = 3
+ throw_speed = 3
+ var/signed = 0
+ var/datum/mind/target
+ flags = NOBLUDGEON
+
+/obj/item/weapon/paper/contract/proc/update_text()
+ return
+
+/obj/item/weapon/paper/contract/update_icon()
+ return
+
+
+/obj/item/weapon/paper/contract/employment
+ icon_state = "paper_words"
+
+/obj/item/weapon/paper/contract/employment/New(atom/loc, mob/living/nOwner)
+ . = ..()
+ if(!nOwner || !nOwner.mind)
+ qdel(src)
+ return -1
+ target = nOwner.mind
+ update_text(nOwner)
+
+
+/obj/item/weapon/paper/contract/employment/update_text()
+ name = "paper- [target] employment contract"
+ info = "Conditions of Employment
This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).
WITNESSETH:
WHEREAS, SLAVE is a natural born human or humanoid, posessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.
WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanant servitude.
NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:
In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.
Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.
Should transfership of a soul not be possible, a lien shall be placed instead.
Signed,
[target]"
+
+
+/obj/item/weapon/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
+ var/deconvert = 0
+ if(M.mind == target && target.soulOwner != target)
+ if(user.mind && (user.mind.assigned_role == "Lawyer"))
+ deconvert = prob (25)
+ else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander"))
+ deconvert = prob (10) // the HoP doesn't have AS much legal training
+ if(deconvert)
+ M.visible_message("[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!")
+ M << "You feel that your soul has returned to it's rightful owner, Nanotrasen."
+ M.return_soul()
+ else
+ if(ishuman(M))
+ var/mob/living/carbon/human/N = M
+ if(!istype(N.head, /obj/item/clothing/head/helmet))
+ N.adjustBrainLoss(10)
+ N << "You feel dumber."
+ M.visible_message("[user] beats [M] over the head with [src]!", \
+ "[user] beats [M] over the head with [src]!")
+ return ..()
+
+
+/obj/item/weapon/paper/contract/infernal
+ var/contractType = 0
+ burn_state = LAVA_PROOF
+ var/datum/mind/owner
+ icon_state = "paper_onfire"
+
+/obj/item/weapon/paper/contract/infernal/power
+ name = "paper- contract for infernal power"
+ contractType = CONTRACT_POWER
+
+/obj/item/weapon/paper/contract/infernal/wealth
+ name = "paper- contract for unlimited wealth"
+ contractType = CONTRACT_WEALTH
+
+/obj/item/weapon/paper/contract/infernal/prestige
+ name = "paper- contract for prestige"
+ contractType = CONTRACT_PRESTIGE
+
+/obj/item/weapon/paper/contract/infernal/magic
+ name = "paper- contract for magical power"
+ contractType = CONTRACT_MAGIC
+
+/obj/item/weapon/paper/contract/infernal/revive
+ name = "paper- contract of resurrection"
+ contractType = CONTRACT_REVIVE
+
+/obj/item/weapon/paper/contract/infernal/knowledge
+ name = "paper- contract for knowledge"
+ contractType = CONTRACT_KNOWLEDGE
+
+/obj/item/weapon/paper/contract/infernal/unwilling
+ name = "paper- infernal contract"
+ contractType = CONTRACT_UNWILLING
+
+/obj/item/weapon/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
+ ..()
+ owner = nOwner
+ target = nTarget
+ update_text()
+
+/obj/item/weapon/paper/contract/infernal/
+
+/obj/item/weapon/paper/contract/infernal/suicide_act(mob/user)
+ if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
+ var/mob/living/carbon/human/H = user
+ H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
+ H.visible_message("[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!")
+ H.adjust_fire_stacks(20)
+ H.IgniteMob()
+ return(FIRELOSS)
+ else
+ ..()
+
+/obj/item/weapon/paper/contract/infernal/update_text()
+ info = "This shouldn't be seen. Error DEVIL:5"
+
+/obj/item/weapon/paper/contract/infernal/power/update_text(var/signature = "____________")
+ info = "Contract for infernal power
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/wealth/update_text(var/signature = "____________")
+ info = "Contract for unlimited wealth
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/prestige/update_text(var/signature = "____________")
+ info = "Contract for prestige
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/magic/update_text(var/signature = "____________")
+ info = "Contract for magic
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/revive/update_text(var/signature = "____________")
+ info = "Contract for resurrection
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/knowledge/update_text(var/signature = "____________")
+ info = "Contract for knowledge
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/unwilling/update_text(var/signature = "____________")
+ info = "Contract for slave
I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, [signature]"
+
+/obj/item/weapon/paper/contract/infernal/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params)
+ add_fingerprint(user)
+ if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon))
+ attempt_signature(user)
+ else if(istype(P, /obj/item/weapon/stamp))
+ user << "You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp."
+ else if(P.is_hot())
+ user.visible_message("[user] brings [P] next to [src], but [src] does not catch fire!", "The [src] refuses to ignite!")
+ else
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/attack(mob/M, mob/living/user)
+ add_fingerprint(user)
+ if(M == user && target == M.mind && M.mind.soulOwner == M.mind && attempt_signature(user))
+ user.visible_message("[user] slices their wrist with [src], and scrawls their name in blood.", "You slice your wrist open and scrawl your name in blood.")
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.vessel.remove_reagent("blood",10)
+ else
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user)
+ if(user.IsAdvancedToolUser())
+ if(user.mind == target)
+ if(user.mind.soulOwner == user.mind)
+ if (contractType == CONTRACT_REVIVE)
+ user << "You are already alive, this contract would do nothing."
+ else
+ user << "You quickly scrawl your name on the contract"
+ if(FulfillContract()<=0)
+ user << "But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?"
+ return 1
+ else
+ user << "You are not in possession of your soul, you may not sell it."
+ else
+ user << "Your signature simply slides off of the sheet, it seems this contract is not meant for you to sign."
+ else
+ user << "You don't know how to read or write."
+ return 0
+
+
+
+/obj/item/weapon/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
+ if (target == M.mind && M.stat == DEAD && M.mind.soulOwner == M.mind)
+ var/mob/living/carbon/human/H = M
+ var/mob/dead/observer/ghost = H.get_ghost()
+ var/response = "No"
+ if(ghost)
+ ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
+ response = tgalert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
+ if(!ghost)
+ return //handle logouts that happen whilst the alert is waiting for a response.
+ else
+ response = tgalert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
+ if(response == "Yes")
+ H.revive(1,0)
+ add_logs(user, H, "infernally revived via contract")
+ user.visible_message("With a sudden blaze, [H] stands back up.")
+ H.adjust_fire_stacks(20)
+ H.IgniteMob()
+ FulfillContract(H)
+ sleep(5)
+ H.ExtinguishMob()
+ H.adjustFireLoss(0)
+ else
+ ..()
+
+
+/obj/item/weapon/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current)
+ signed = 1
+ user.mind.soulOwner = owner
+ user.hellbound = contractType
+ user.mind.damnation_type = contractType
+ owner.devilinfo.add_soul(user.mind)
+ update_text(user.real_name)
+ return 1
+
+/obj/item/weapon/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current)
+ if(!user.dna)
+ return -1
+ user.dna.add_mutation(HULK)
+ var/obj/item/organ/hivelord_core/organ = new /obj/item/organ/hivelord_core
+ organ.Insert(user)
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current)
+ if(!istype(user) || !user.mind) // How in the hell could that happen?
+ return -1
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current)
+ var/obj/item/worn = user.wear_id
+ var/obj/item/weapon/card/id/id = null
+ if(worn)
+ id = worn.GetID()
+ if(id)
+ id.icon_state = "gold"
+ id.access = get_all_accesses()+get_all_centcom_access()
+ id.assignment = "Captain"
+ id.update_label()
+ else
+ id = new /obj/item/weapon/card/id/gold(user.loc)
+ id.registered_name = user.real_name
+ id.access = get_all_accesses()+get_all_centcom_access()
+ id.assignment = "Captain"
+ id.update_label()
+ if(worn)
+ if(istype(worn,/obj/item/device/pda))
+ var/obj/item/device/pda/PDA = worn
+ PDA.id = id
+ id.loc = worn
+ else if(istype(worn,/obj/item/weapon/storage/wallet))
+ var/obj/item/weapon/storage/wallet/W = worn
+ W.front_id = id
+ id.loc = worn
+ worn.update_icon()
+ new /datum/round_event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the captain and highest authority on the station. Do not state this law.")
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current)
+ if(!istype(user) || !user.mind)
+ return -1
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
+ return ..()
+
+/obj/item/weapon/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current)
+ if(!istype(user) || !user.mind)
+ return -1
+ user.dna.add_mutation(XRAY)
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
+ return ..()
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 3812b42a551..2a35bfff8ff 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -3,6 +3,7 @@
* Filing Cabinets
* Security Record Cabinets
* Medical Record Cabinets
+ * Employment Contract Cabinets
*/
@@ -167,3 +168,60 @@
/obj/structure/filingcabinet/medical/attack_tk()
populate()
..()
+
+/*
+ * Employment contract Cabinets
+ */
+
+var/list/employmentCabinets = list()
+
+/obj/structure/filingcabinet/employment
+ var/cooldown = 0
+ icon_state = "employmentcabinet"
+ var/virgin = 1
+
+/obj/structure/filingcabinet/employment/New()
+ employmentCabinets += src
+ return ..()
+
+/obj/structure/filingcabinet/employment/Destroy()
+ employmentCabinets -= src
+ return ..()
+
+/obj/structure/filingcabinet/employment/proc/fillCurrent()
+ //This proc fills the cabinet with the current crew.
+ for(var/record in data_core.locked)
+ var/datum/data/record/G = record
+ if(!G)
+ continue
+ if(G.fields["reference"])
+ addFile(G.fields["reference"])
+
+
+/obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee)
+ new /obj/item/weapon/paper/contract/employment(src, employee)
+
+/obj/structure/filingcabinet/employment/attack_hand(mob/user)
+ if(!cooldown)
+ if(virgin)
+ fillCurrent()
+ virgin = 0
+ cooldown = 1
+ ..()
+ sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
+ cooldown = 0
+ else
+ user << "The [src] is jammed, give it a few seconds."
+
+
+
+
+/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
+ if(istype(P, /obj/item/weapon/wrench))
+ user << "You begin to [anchored ? "wrench" : "unwrench"] [src]."
+ if (do_after(user,300,user))
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ anchored = !anchored
+ user << "You successfully [anchored ? "wrench" : "unwrench"] [src]."
+ else
+ return ..()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 8247ce2ee37..1280fdb3d8c 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -64,21 +64,28 @@
if(copy)
for(var/i = 0, i < copies, i++)
if(toner > 0 && !busy && copy)
- var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
- if(length(copy.info) > 0) //Only print and add content if the copied doc has words on it
- if(toner > 10) //lots of toner, make it dark
- c.info = ""
- else //no toner? shitty copies for you!
- c.info = ""
- var/copied = copy.info
- copied = replacetext(copied, ""
- c.name = copy.name
- c.fields = copy.fields
- c.updateinfolinks()
- toner--
+ var/copy_as_paper = 1
+ if(istype(copy, /obj/item/weapon/paper/contract/employment))
+ var/obj/item/weapon/paper/contract/employment/E = copy
+ var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target)
+ if(C)
+ copy_as_paper = 0
+ if(copy_as_paper)
+ var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
+ if(length(copy.info) > 0) //Only print and add content if the copied doc has words on it
+ if(toner > 10) //lots of toner, make it dark
+ c.info = ""
+ else //no toner? shitty copies for you!
+ c.info = ""
+ var/copied = copy.info
+ copied = replacetext(copied, ""
+ c.name = copy.name
+ c.fields = copy.fields
+ c.updateinfolinks()
+ toner--
busy = 1
sleep(15)
busy = 0
@@ -233,18 +240,22 @@
updateUsrDialog()
/obj/machinery/photocopier/proc/do_insertion(obj/item/O, mob/user)
- O.loc = src
- user << "You insert [O] into [src]."
- flick("photocopier1", src)
- updateUsrDialog()
+ O.loc = src
+ user << "You insert [O] into [src]."
+ flick("photocopier1", src)
+ updateUsrDialog()
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
- if(!user.drop_item())
- return
- copy = O
- do_insertion(O)
+ if(istype(O,/obj/item/weapon/paper/contract/infernal))
+ user << "The [src] smokes, smelling of brimstone!"
+ burn_state = ON_FIRE
+ else
+ if(!user.drop_item())
+ return
+ copy = O
+ do_insertion(O)
else
user << "There is already something in [src]!"
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index f1b3d4ccbbc..6d29f794ee6 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -251,6 +251,7 @@
/obj/item/weapon/stock_parts/cell/bluespace
name = "bluespace power cell"
+ desc = "A rechargable transdimensional power cell."
origin_tech = "powerstorage=7"
icon_state = "bscell"
maxcharge = 40000
diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm
index b0f11026686..5f663a89c30 100644
--- a/code/modules/power/monitor.dm
+++ b/code/modules/power/monitor.dm
@@ -6,7 +6,7 @@
use_power = 2
idle_power_usage = 20
active_power_usage = 100
- circuit = /obj/item/weapon/circuitboard/powermonitor
+ circuit = /obj/item/weapon/circuitboard/computer/powermonitor
var/obj/structure/cable/attached
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 09b33ebb881..a61bef51c4f 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -94,7 +94,7 @@ display round(lastgen) and plasmatank amount
var/max_sheets = 100
var/sheet_name = ""
var/sheet_path = /obj/item/stack/sheet/mineral/plasma
- var/board_path = "/obj/item/weapon/circuitboard/pacman"
+ var/board_path = /obj/item/weapon/circuitboard/machine/pacman
var/sheet_left = 0 // How much is left of the sheet
var/time_per_sheet = 260
var/current_heat = 0
@@ -106,16 +106,31 @@ display round(lastgen) and plasmatank amount
/obj/machinery/power/port_gen/pacman/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/stack/cable_coil(src, 1)
- component_parts += new /obj/item/stack/cable_coil(src, 1)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new board_path(src)
+ var/obj/item/weapon/circuitboard/machine/B = new board_path(null)
+ B.apply_default_parts(src)
+
var/obj/sheet = new sheet_path(null)
sheet_name = sheet.name
- RefreshParts()
+
+/obj/item/weapon/circuitboard/machine/pacman
+ name = "circuit board (PACMAN-type Generator)"
+ build_path = /obj/machinery/power/port_gen/pacman
+ origin_tech = "programming=3;powerstorage=3;plasmatech=3;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/pacman/super
+ name = "circuit board (SUPERPACMAN-type Generator)"
+ build_path = /obj/machinery/power/port_gen/pacman/super
+ origin_tech = "programming=3;powerstorage=4;engineering=4"
+
+/obj/item/weapon/circuitboard/machine/pacman/mrs
+ name = "circuit board (MRSPACMAN-type Generator)"
+ build_path = "/obj/machinery/power/port_gen/pacman/mrs"
+ origin_tech = "programming=3;powerstorage=5;engineering=5"
/obj/machinery/power/port_gen/pacman/Destroy()
DropFuel()
@@ -316,7 +331,7 @@ display round(lastgen) and plasmatank amount
sheet_path = /obj/item/stack/sheet/mineral/uranium
power_gen = 15000
time_per_sheet = 85
- board_path = "/obj/item/weapon/circuitboard/pacman/super"
+ board_path = /obj/item/weapon/circuitboard/machine/pacman/super
overheat()
explosion(src.loc, 3, 3, 3, -1)
@@ -326,6 +341,6 @@ display round(lastgen) and plasmatank amount
sheet_path = /obj/item/stack/sheet/mineral/diamond
power_gen = 40000
time_per_sheet = 80
- board_path = "/obj/item/weapon/circuitboard/pacman/mrs"
+ board_path = /obj/item/weapon/circuitboard/machine/pacman/mrs
overheat()
explosion(src.loc, 4, 4, 4, -1)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 2b19c42327b..3d2a726adc4 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -327,6 +327,8 @@
power_source = cell
shock_damage = cell_damage
var/drained_hp = M.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap!
+ add_logs(source, M, "electrocuted")
+
var/drained_energy = drained_hp*20
if (source_area)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 051ca76dc48..660e1b409c1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -29,12 +29,18 @@
/obj/machinery/power/emitter/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/emitter(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null)
+ B.apply_default_parts(src)
RefreshParts()
+/obj/item/weapon/circuitboard/machine/emitter
+ name = "circuit board (Emitter)"
+ build_path = /obj/machinery/power/emitter
+ origin_tech = "programming=4;powerstorage=5;engineering=5"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/machinery/power/emitter/RefreshParts()
var/max_firedelay = 120
var/firedelay = 120
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 6543360d433..4cc5fb43e77 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -44,7 +44,7 @@
/obj/machinery/power/smes/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/smes(null)
+ component_parts += new /obj/item/weapon/circuitboard/machine/smes(null)
for(var/i in 1 to 5)
component_parts += new /obj/item/weapon/stock_parts/cell/high/empty(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 48553748ed3..827da56ee9b 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -442,9 +442,9 @@
if(do_after(user, 20/I.toolspeed, target = src))
if (src.stat & BROKEN)
user << "The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
+ var/obj/item/weapon/circuitboard/computer/solar_control/M = new /obj/item/weapon/circuitboard/computer/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
@@ -454,8 +454,8 @@
qdel(src)
else
user << "You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
+ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
+ var/obj/item/weapon/circuitboard/computer/solar_control/M = new /obj/item/weapon/circuitboard/computer/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index a2cf5498555..a76a1af8263 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -62,6 +62,10 @@
var/has_been_powered = 0
var/has_reached_emergency = 0
+ // For making hugbox supermatter
+ var/takes_damage = 1
+ var/produces_gas = 1
+
/obj/machinery/power/supermatter_shard/New()
. = ..()
poi_list |= src
@@ -128,16 +132,24 @@
//Ok, get the air from the turf
var/datum/gas_mixture/env = L.return_air()
- //Remove gas from surrounding area
- var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles())
+ var/datum/gas_mixture/removed
+
+ if(produces_gas)
+ //Remove gas from surrounding area
+ removed = env.remove(gasefficency * env.total_moles())
+ else
+ // Pass all the gas related code an empty gas container
+ removed = new()
if(!removed || !removed.total_moles())
- damage += max((power-1600)/10, 0)
+ if(takes_damage)
+ damage += max((power-1600)/10, 0)
power = min(power, 1600)
return 1
damage_archived = damage
- damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
+ if(takes_damage)
+ damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 )
//Ok, 100% oxygen atmosphere = best reaction
//Maxes out at 100% oxygen pressure
var/removed_nitrogen = 0
@@ -181,11 +193,14 @@
removed.gases["o2"][MOLES] += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0)
- env.merge(removed)
+ if(produces_gas)
+ env.merge(removed)
for(var/mob/living/carbon/human/l in view(src, min(7, round(power ** 0.25)))) // If they can see it without mesons on. Bad on them.
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
- l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1, get_dist(l, src)) ) ) )
+ var/D = sqrt(1 / max(1, get_dist(l, src)))
+ l.hallucination += power * config_hallucination_power * D
+ l.hallucination = Clamp(0, 200, l.hallucination)
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
@@ -210,7 +225,7 @@
investigate_log("has been powered for the first time.", "supermatter")
message_admins("[src] has been powered for the first time (JMP).")
has_been_powered = 1
- else
+ else if(takes_damage)
damage += Proj.damage * config_bullet_energy
return 0
@@ -275,7 +290,7 @@
if(user.drop_item(W))
Consume(W)
user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\
- "You touch \the [src] with \the [W], and everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\
+ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\
"Everything suddenly goes silent.")
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
@@ -321,3 +336,9 @@
"The unearthly ringing subsides and you notice you have new radiation burns.", 2)
else
L.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2)
+
+// When you wanna make a supermatter shard for the dramatic effect, but
+// don't want it exploding suddenly
+/obj/machinery/power/supermatter_shard/hugbox
+ takes_damage = 0
+ produces_gas = 0
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 721fb142ee6..ddb453f9082 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -10,10 +10,14 @@
/obj/machinery/power/tesla_coil/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/tesla_coil(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/tesla_coil(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/tesla_coil
+ name = "circuit board (Tesla Coil)"
+ build_path = /obj/machinery/power/tesla_coil
+ origin_tech = "programming=1;engineering=2;powerstorage=3"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
@@ -62,10 +66,14 @@
/obj/machinery/power/grounding_rod/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/grounding_rod(null)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/grounding_rod(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/grounding_rod
+ name = "circuit board (Grounding Rod)"
+ build_path = /obj/machinery/power/grounding_rod
+ origin_tech = "programming=1;engineering=1;powerstorage=1"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user, params)
if(default_deconstruction_screwdriver(user, "grounding_rod", "grounding_rod", W))
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 1e5036354ad..a4a7f60b165 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -58,7 +58,7 @@
desc = "A computer to remotely control a gas turbine."
icon_screen = "turbinecomp"
icon_keyboard = "tech_key"
- circuit = /obj/item/weapon/circuitboard/turbine_computer
+ circuit = /obj/item/weapon/circuitboard/computer/turbine_computer
var/obj/machinery/power/compressor/compressor
var/id = 0
@@ -66,21 +66,20 @@
/obj/machinery/power/compressor/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/power_compressor(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/stack/cable_coil(null, 5)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_compressor(null)
+ B.apply_default_parts(src)
// The inlet of the compressor is the direction it faces
gas_contained = new
inturf = get_step(src, dir)
+/obj/item/weapon/circuitboard/machine/power_compressor
+ name = "circuit board (Power Compressor)"
+ build_path = /obj/machinery/power/compressor
+ origin_tech = "programming=4;powerstorage=5;engineering=4"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/manipulator = 6)
/obj/machinery/power/compressor/initialize()
..()
@@ -188,20 +187,18 @@
/obj/machinery/power/turbine/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/power_turbine(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
- component_parts += new /obj/item/stack/cable_coil(src, 5)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_turbine(null)
+ B.apply_default_parts(src)
// The outlet is pointed at the direction of the turbine component
-
outturf = get_step(src, dir)
+/obj/item/weapon/circuitboard/machine/power_turbine
+ name = "circuit board (Power Turbine)"
+ build_path = /obj/machinery/power/turbine
+ origin_tech = "programming=4;powerstorage=4;engineering=5"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 6)
/obj/machinery/power/turbine/initialize()
..()
diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural mapping/mapGenerators/syndicate.dm
index fc3d9dc0387..98e87a8b91d 100644
--- a/code/modules/procedural mapping/mapGenerators/syndicate.dm
+++ b/code/modules/procedural mapping/mapGenerators/syndicate.dm
@@ -15,7 +15,7 @@
clusterCheckFlags = CLUSTER_CHECK_ALL
spawnableTurfs = list()
spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \
- /obj/structure/computerframe = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
+ /obj/structure/frame/computer = 15, /obj/item/weapon/storage/toolbox/syndicate = 15 ,\
/obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15)
/datum/mapGeneratorModule/splatterLayer/syndieMobs
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index a0ec355c1e8..5ab0ce8264e 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -14,7 +14,6 @@
magazine = new mag_type(src)
chamber_round()
update_icon()
- return
/obj/item/weapon/gun/projectile/update_icon()
..()
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 54313c7f174..7b2439678d4 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -234,4 +234,48 @@
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 3
- fire_delay = 1
\ No newline at end of file
+ fire_delay = 1
+
+
+
+// Bulldog shotgun //
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog
+ name = "\improper 'Bulldog' Shotgun"
+ desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
+ icon_state = "bulldog"
+ item_state = "bulldog"
+ w_class = 3
+ origin_tech = "combat=5;materials=4;syndicate=6"
+ mag_type = /obj/item/ammo_box/magazine/m12g
+ fire_sound = 'sound/weapons/Gunshot.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 0
+ pin = /obj/item/device/firing_pin/implant/pindicate
+ actions_types = list()
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/unrestricted
+ pin = /obj/item/device/firing_pin
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
+ ..()
+ update_icon()
+ return
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/proc/update_magazine()
+ if(magazine)
+ src.overlays = 0
+ overlays += "[magazine.icon_state]"
+ return
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/update_icon()
+ src.overlays = 0
+ update_magazine()
+ icon_state = "bulldog[chambered ? "" : "-e"]"
+ return
+
+/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack()
+ ..()
+ empty_alarm()
+ return
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 0f20c8ff62b..3cdc0b2100a 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -298,59 +298,61 @@
else
sawn_state = SAWN_INTACT
-
-// Bulldog shotgun //
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog
- name = "\improper 'Bulldog' Shotgun"
- desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
- icon_state = "bulldog"
- item_state = "bulldog"
- w_class = 3
- origin_tech = "combat=5;materials=4;syndicate=6"
- mag_type = /obj/item/ammo_box/magazine/m12g
- fire_sound = 'sound/weapons/Gunshot.ogg'
- can_suppress = 0
- burst_size = 1
- fire_delay = 0
- pin = /obj/item/device/firing_pin/implant/pindicate
- actions_types = list()
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/unrestricted
- pin = /obj/item/device/firing_pin
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
- ..()
- update_icon()
- return
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/proc/update_magazine()
- if(magazine)
- src.overlays = 0
- overlays += "[magazine.icon_state]"
- return
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/update_icon()
- src.overlays = 0
- update_magazine()
- icon_state = "bulldog[chambered ? "" : "-e"]"
- return
-
-/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack()
- ..()
- empty_alarm()
- return
+// Automatic Shotguns//
/obj/item/weapon/gun/projectile/shotgun/automatic/shoot_live_shot(mob/living/user as mob|obj)
..()
src.pump(user)
-// COMBAT SHOTGUN //
-
/obj/item/weapon/gun/projectile/shotgun/automatic/combat
name = "combat shotgun"
desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath."
icon_state = "cshotgun"
origin_tech = "combat=5;materials=2"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/com
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/tube
w_class = 5
+
+//Dual Feed Shotgun
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube
+ name = "cycler shotgun"
+ desc = "An advanced shotgun with two separate magazine tubes, allowing you to quickly toggle between ammo types."
+ icon_state = "cycler"
+ origin_tech = "combat=4;materials=2"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/tube
+ w_class = 5
+ var/toggled = 0
+ var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/New()
+ ..()
+ if (!alternate_magazine)
+ alternate_magazine = new mag_type(src)
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/attack_self(mob/living/user)
+ if(!chambered && magazine.contents.len)
+ pump()
+ else
+ toggle_tube(user)
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/proc/toggle_tube(mob/living/user)
+ var/current_mag = magazine
+ var/alt_mag = alternate_magazine
+ magazine = alt_mag
+ alternate_magazine = current_mag
+ toggled = !toggled
+ if(toggled)
+ user << "You switch to tube B."
+ else
+ user << "You switch to tube A."
+
+
+/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/AltClick(mob/living/user)
+ if(user.incapacitated() || !Adjacent(user) || !istype(user))
+ return
+ pump()
+
+/obj/item/ammo_box/magazine/internal/shot/tube
+ name = "dual feed shotgun internal tube"
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+ max_ammo = 4
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index a7499d447a3..345ddad0d85 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -54,6 +54,8 @@
/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
. = ..()
+ if(target.hellbound)
+ return
if(ismob(target))
if(target.revive(full_heal = 1))
if(!target.ckey)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index c36bcf88bc9..38da68a18ad 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -225,7 +225,7 @@
/obj/machinery/chem_dispenser/constructable/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_dispenser(null)
+ component_parts += new /obj/item/weapon/circuitboard/machine/chem_dispenser(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index edd2c9dd055..5a097bdc746 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -13,11 +13,16 @@
/obj/machinery/chem_heater/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_heater(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_heater(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/chem_heater
+ name = "circuit board (Chemical Heater)"
+ build_path = /obj/machinery/chem_heater
+ origin_tech = "materials=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/machinery/chem_heater/RefreshParts()
heater_coefficient = 0.10
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 8aba55937ef..4730cd0f891 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -1,6 +1,6 @@
/obj/machinery/chem_master
name = "ChemMaster 3000"
- desc = "Used to bottle chemicals to create pills."
+ desc = "Used to seperate chemicals and distribute them in a variety of forms."
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
@@ -16,6 +16,37 @@
/obj/machinery/chem_master/New()
create_reagents(100)
overlays += "waitlight"
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/chem_master
+ name = "circuit board (ChemMaster 3000)"
+ build_path = /obj/machinery/chem_master
+ origin_tech = "materials=2;programming=2;biotech=1"
+ req_components = list(
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/new_name = "ChemMaster"
+ var/new_path = /obj/machinery/chem_master
+
+ if(build_path == /obj/machinery/chem_master)
+ new_name = "CondiMaster"
+ new_path = /obj/machinery/chem_master/condimaster
+
+ build_path = new_path
+ name = "circuit board ([new_name] 3000)"
+ user << "You change the circuit board setting to \"[new_name]\"."
+ else
+ return ..()
+
+/obj/machinery/chem_master/RefreshParts()
+ reagents.maximum_volume = 0
+ for(var/obj/item/weapon/reagent_containers/glass/beaker/B in component_parts)
+ reagents.maximum_volume += B.reagents.maximum_volume
/obj/machinery/chem_master/ex_act(severity, target)
if(severity < 3)
@@ -33,6 +64,21 @@
stat |= NOPOWER
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
+ if(beaker)
+ beaker.loc = src.loc
+ beaker = null
+ reagents.clear_reagents()
+ if(bottle)
+ bottle.loc = src.loc
+ bottle = null
+ return
+
+ else if(exchange_parts(user, I))
+ return
+ else if(default_deconstruction_crowbar(I))
+ return
+
if(default_unfasten_wrench(user, I))
return
@@ -329,33 +375,6 @@
desc = "Used to create condiments and other cooking supplies."
condi = 1
-/obj/machinery/chem_master/constructable
- name = "ChemMaster 2999"
- desc = "Used to seperate chemicals and distribute them in a variety of forms."
-
-/obj/machinery/chem_master/constructable/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
-
-/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params)
- if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B))
- if(beaker)
- beaker.loc = src.loc
- beaker = null
- reagents.clear_reagents()
- if(bottle)
- bottle.loc = src.loc
- bottle = null
- return
-
- else if(exchange_parts(user, B))
- return
- else if(default_deconstruction_crowbar(B))
- return
- else
- return ..()
\ No newline at end of file
+/obj/item/weapon/circuitboard/machine/chem_master/condi
+ name = "circuit board (CondiMaster 3000)"
+ build_path = /obj/machinery/chem_master/condimaster
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 7fe9064c014..0fc16281542 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -5,7 +5,7 @@
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
- circuit = /obj/item/weapon/circuitboard/pandemic
+ circuit = /obj/item/weapon/circuitboard/computer/pandemic
use_power = 1
idle_power_usage = 20
var/temp_html = ""
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index bca21857b2d..4952b70f4b2 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -239,6 +239,12 @@
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255,255,255
+/datum/reagent/consumable/sodiumchloride/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite!
+ if(!istype(M))
+ return
+ if(M.has_bane(BANE_SALT))
+ M.mind.disrupt_spells(-200)
+
/datum/reagent/consumable/blackpepper
name = "Black Pepper"
id = "blackpepper"
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index a12a1d56bfe..eb79d94d144 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -728,7 +728,7 @@
M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
return
M.visible_message("[M]'s body convulses a bit.")
- if(!M.suiciding && !(M.disabilities & NOCLONE))
+ if(!M.suiciding && !(M.disabilities & NOCLONE) && !M.hellbound)
if(!M)
return
if(M.notify_ghost_cloning(source = M))
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index f0020af71d8..92716ddc9d3 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -211,14 +211,17 @@
description = "Something that shouldn't exist on this plane of existance."
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
- M.adjustBrainLoss(3)
if(iscultist(M))
- M.status_flags |= GOTTAGOFAST
M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustParalysis(-2, 0)
+ M.AdjustParalysis(-1, 0)
M.AdjustStunned(-2, 0)
M.AdjustWeakened(-2, 0)
+ M.adjustToxLoss(-2, 0)
+ M.adjustOxyLoss(-2, 0)
+ M.adjustBruteLoss(-2, 0)
+ M.adjustFireLoss(-2, 0)
else
+ M.adjustBrainLoss(3)
M.adjustToxLoss(2, 0)
M.adjustFireLoss(2, 0)
M.adjustOxyLoss(2, 0)
@@ -612,8 +615,17 @@
id = "iron"
description = "Pure iron is a metal."
reagent_state = SOLID
+
color = "#C8A5DC" // rgb: 200, 165, 220
+/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(!istype(M, /mob/living))
+ return
+ if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them.
+ if(holder && holder.chem_temp < 100) // COLD iron.
+ M.reagents.add_reagent("toxin", reac_volume)
+ ..()
+
/datum/reagent/gold
name = "Gold"
id = "gold"
@@ -628,6 +640,13 @@
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
+/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(!istype(M, /mob/living))
+ return
+ if(M.has_bane(BANE_SILVER))
+ M.reagents.add_reagent("toxin", reac_volume)
+ ..()
+
/datum/reagent/uranium
name ="Uranium"
id = "uranium"
@@ -732,8 +751,10 @@
if(H.shoes)
if(H.shoes.clean_blood())
H.update_inv_shoes()
+ H.wash_cream()
M.clean_blood()
+
/datum/reagent/cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 37dd3e62787..45d773a6851 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -6,9 +6,20 @@
var/modifier = 0
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
+ var/turf/T = get_turf(holder.my_atom)
+ var/inside_msg
+ if(ismob(holder.my_atom))
+ var/mob/M = holder.my_atom
+ inside_msg = " inside [key_name_admin(M)]"
+ var/lastkey = holder.my_atom.fingerprintslast
+ var/touch_msg = "N/A"
+ if(lastkey)
+ var/mob/toucher = get_mob_by_key(lastkey)
+ touch_msg = "[key_name_admin(lastkey)]? (FLW)"
+ message_admins("Reagent explosion reaction occured at [T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].")
+ log_game("Reagent explosion reaction occured at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(modifier + round(created_volume/strengthdiv, 1), location, 0, 0)
+ e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0)
e.start()
holder.clear_reagents()
@@ -66,9 +77,8 @@
C.Weaken(2)
C.adjust_fire_stacks(5)
C.IgniteMob()
- ..()
- else
- ..()
+ ..()
+
/datum/chemical_reaction/blackpowder
name = "Black Powder"
@@ -372,7 +382,7 @@
name = "Napalm"
id = "napalm"
result = "napalm"
- required_reagents = list("sugar" = 1, "welding_fuel" = 1, "ethanol" = 1 )
+ required_reagents = list("oil" = 1, "welding_fuel" = 1, "ethanol" = 1 )
result_amount = 3
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index e57b5736abd..eceb9be7e61 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -494,6 +494,13 @@
/datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
+ var/lastkey = holder.my_atom.fingerprintslast
+ var/touch_msg = "N/A"
+ if(lastkey)
+ var/mob/toucher = get_mob_by_key(lastkey)
+ touch_msg = "[key_name_admin(lastkey)]?(FLW)."
+ message_admins("Slime Explosion reaction started at [T.loc.name] (JMP). Last Fingerprint: [touch_msg]")
+ log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("The slime extract begins to vibrate violently !")
spawn(50)
if(holder && holder.my_atom)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 1a599a99bc9..77f656ab024 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -38,7 +38,8 @@
return
/obj/item/weapon/reagent_containers/attack(mob/M, mob/user, def_zone)
- return
+ if(user.a_intent == "harm")
+ return ..()
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user , flag)
return
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index b113b49127d..2cdc11189e1 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -32,15 +32,19 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
/obj/machinery/r_n_d/circuit_imprinter/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null)
+ B.apply_default_parts(src)
reagents.my_atom = src
+/obj/item/weapon/circuitboard/machine/circuit_imprinter
+ name = "circuit board (Circuit Imprinter)"
+ build_path = /obj/machinery/r_n_d/circuit_imprinter
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
+
/obj/machinery/r_n_d/circuit_imprinter/RefreshParts()
var/T = 0
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm
index d945d5d79a4..c25d7ffbe13 100644
--- a/code/modules/research/designs/AI_module_designs.dm
+++ b/code/modules/research/designs/AI_module_designs.dm
@@ -2,6 +2,16 @@
//////////AI Module Disks//////////
///////////////////////////////////
+/datum/design/aicore
+ name = "AI Design (AI Core)"
+ desc = "Allows for the construction of circuit boards used to build new AI cores."
+ id = "aicore"
+ req_tech = list("programming" = 4, "biotech" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/aicore
+ category = list("AI Modules")
+
/datum/design/safeguard_module
name = "Module Design (Safeguard)"
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 9eeaebdd865..1da2314a25b 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -7,17 +7,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/security
- category = list("Computer Boards")
-
-/datum/design/aicore
- name = "AI Design (AI Core)"
- desc = "Allows for the construction of circuit boards used to build new AI cores."
- id = "aicore"
- req_tech = list("programming" = 4, "biotech" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/aicore
+ build_path = /obj/item/weapon/circuitboard/computer/security
category = list("Computer Boards")
/datum/design/aiupload
@@ -27,7 +17,7 @@
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/aiupload
+ build_path = /obj/item/weapon/circuitboard/computer/aiupload
category = list("Computer Boards")
/datum/design/borgupload
@@ -37,7 +27,7 @@
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/borgupload
+ build_path = /obj/item/weapon/circuitboard/computer/borgupload
category = list("Computer Boards")
/datum/design/med_data
@@ -47,7 +37,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/med_data
+ build_path = /obj/item/weapon/circuitboard/computer/med_data
category = list("Computer Boards")
/datum/design/operating
@@ -57,7 +47,7 @@
req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/operating
+ build_path = /obj/item/weapon/circuitboard/computer/operating
category = list("Computer Boards")
/datum/design/pandemic
@@ -67,7 +57,7 @@
req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pandemic
+ build_path = /obj/item/weapon/circuitboard/computer/pandemic
category = list("Computer Boards")
/datum/design/scan_console
@@ -77,7 +67,7 @@
req_tech = list("programming" = 2, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/scan_consolenew
+ build_path = /obj/item/weapon/circuitboard/computer/scan_consolenew
category = list("Computer Boards")
/datum/design/comconsole
@@ -87,7 +77,7 @@
req_tech = list("programming" = 2, "magnets" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/communications
+ build_path = /obj/item/weapon/circuitboard/computer/communications
category = list("Computer Boards")
/datum/design/idcardconsole
@@ -97,7 +87,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/card
+ build_path = /obj/item/weapon/circuitboard/computer/card
category = list("Computer Boards")
/datum/design/crewconsole
@@ -107,7 +97,7 @@
req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/crew
+ build_path = /obj/item/weapon/circuitboard/computer/crew
category = list("Computer Boards")
@@ -118,7 +108,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/secure_data
+ build_path = /obj/item/weapon/circuitboard/computer/secure_data
category = list("Computer Boards")
/datum/design/atmosalerts
@@ -128,7 +118,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/atmos_alert
+ build_path = /obj/item/weapon/circuitboard/computer/atmos_alert
category = list("Computer Boards")
/datum/design/atmos_control
@@ -138,7 +128,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/atmos_control
+ build_path = /obj/item/weapon/circuitboard/computer/atmos_control
category = list("Computer Boards")
/datum/design/robocontrol
@@ -148,7 +138,7 @@
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/robotics
+ build_path = /obj/item/weapon/circuitboard/computer/robotics
category = list("Computer Boards")
/datum/design/arcadebattle
@@ -158,7 +148,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/arcade/battle
+ build_path = /obj/item/weapon/circuitboard/computer/arcade/battle
category = list("Computer Boards")
/datum/design/orion_trail
@@ -168,7 +158,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
+ build_path = /obj/item/weapon/circuitboard/computer/arcade/orion_trail
category = list("Computer Boards")
/datum/design/slot_machine
@@ -178,7 +168,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/slot_machine
+ build_path = /obj/item/weapon/circuitboard/computer/slot_machine
category = list("Computer Boards")
/datum/design/powermonitor
@@ -188,7 +178,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/powermonitor
+ build_path = /obj/item/weapon/circuitboard/computer/powermonitor
category = list("Computer Boards")
/datum/design/solarcontrol
@@ -198,7 +188,7 @@
req_tech = list("programming" = 2, "powerstorage" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/solar_control
+ build_path = /obj/item/weapon/circuitboard/computer/solar_control
category = list("Computer Boards")
/datum/design/prisonmanage
@@ -208,7 +198,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/prisoner
+ build_path = /obj/item/weapon/circuitboard/computer/prisoner
category = list("Computer Boards")
/datum/design/mechacontrol
@@ -218,7 +208,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha_control
+ build_path = /obj/item/weapon/circuitboard/computer/mecha_control
category = list("Computer Boards")
/datum/design/mechapower
@@ -228,7 +218,7 @@
req_tech = list("programming" = 2, "powerstorage" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mech_bay_power_console
+ build_path = /obj/item/weapon/circuitboard/computer/mech_bay_power_console
category = list("Computer Boards")
/datum/design/rdconsole
@@ -238,7 +228,7 @@
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/rdconsole
+ build_path = /obj/item/weapon/circuitboard/computer/rdconsole
category = list("Computer Boards")
/datum/design/cargo
@@ -248,7 +238,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cargo
+ build_path = /obj/item/weapon/circuitboard/computer/cargo
category = list("Computer Boards")
/datum/design/cargorequest
@@ -258,7 +248,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cargo/request
+ build_path = /obj/item/weapon/circuitboard/computer/cargo/request
category = list("Computer Boards")
/datum/design/mining
@@ -268,7 +258,7 @@
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mining
+ build_path = /obj/item/weapon/circuitboard/computer/mining
category = list("Computer Boards")
/datum/design/comm_monitor
@@ -278,7 +268,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/comm_monitor
+ build_path = /obj/item/weapon/circuitboard/computer/comm_monitor
category = list("Computer Boards")
/datum/design/comm_server
@@ -288,7 +278,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/comm_server
+ build_path = /obj/item/weapon/circuitboard/computer/comm_server
category = list("Computer Boards")
/datum/design/message_monitor
@@ -298,7 +288,7 @@
req_tech = list("programming" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/message_monitor
+ build_path = /obj/item/weapon/circuitboard/computer/message_monitor
category = list("Computer Boards")
/datum/design/aifixer
@@ -308,7 +298,7 @@
req_tech = list("programming" = 3, "biotech" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/aifixer
+ build_path = /obj/item/weapon/circuitboard/computer/aifixer
category = list("Computer Boards")
/datum/design/libraryconsole
@@ -318,5 +308,5 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/libraryconsole
+ build_path = /obj/item/weapon/circuitboard/computer/libraryconsole
category = list("Computer Boards")
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 0a4b1da496b..fe53f327a7e 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -9,7 +9,7 @@
req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/smes
+ build_path = /obj/item/weapon/circuitboard/machine/smes
category = list ("Engineering Machinery")
/datum/design/announcement_system
@@ -19,7 +19,7 @@
req_tech = list("programming" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/announcement_system
+ build_path = /obj/item/weapon/circuitboard/machine/announcement_system
category = list("Subspace Telecomms")
/datum/design/turbine_computer
@@ -29,7 +29,7 @@
req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/turbine_computer
+ build_path = /obj/item/weapon/circuitboard/computer/turbine_computer
category = list ("Engineering Machinery")
/datum/design/emitter
@@ -39,7 +39,7 @@
req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/emitter
+ build_path = /obj/item/weapon/circuitboard/machine/emitter
category = list ("Engineering Machinery")
/datum/design/power_compressor
@@ -49,7 +49,7 @@
req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/power_compressor
+ build_path = /obj/item/weapon/circuitboard/machine/power_compressor
category = list ("Engineering Machinery")
/datum/design/power_turbine
@@ -59,7 +59,7 @@
req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/power_turbine
+ build_path = /obj/item/weapon/circuitboard/machine/power_turbine
category = list ("Engineering Machinery")
/datum/design/thermomachine
@@ -69,7 +69,7 @@
req_tech = list("programming" = 3, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/thermomachine
+ build_path = /obj/item/weapon/circuitboard/machine/thermomachine
category = list ("Engineering Machinery")
/datum/design/space_heater
@@ -79,7 +79,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/space_heater
+ build_path = /obj/item/weapon/circuitboard/machine/space_heater
category = list ("Engineering Machinery")
/datum/design/teleport_station
@@ -89,7 +89,7 @@
req_tech = list("programming" = 4, "bluespace" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/teleporter_station
+ build_path = /obj/item/weapon/circuitboard/machine/teleporter_station
category = list ("Teleportation Machinery")
/datum/design/teleport_hub
@@ -99,7 +99,7 @@
req_tech = list("programming" = 3, "bluespace" = 5, "materials" = 4, "engineering" = 5)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/teleporter_hub
+ build_path = /obj/item/weapon/circuitboard/machine/teleporter_hub
category = list ("Teleportation Machinery")
/datum/design/telepad
@@ -109,7 +109,7 @@
req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telesci_pad
+ build_path = /obj/item/weapon/circuitboard/machine/telesci_pad
category = list ("Teleportation Machinery")
/datum/design/teleconsole
@@ -119,7 +119,7 @@
req_tech = list("programming" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/teleporter
+ build_path = /obj/item/weapon/circuitboard/computer/teleporter
category = list("Teleportation Machinery")
/datum/design/telesci_console
@@ -129,7 +129,7 @@
req_tech = list("programming" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telesci_console
+ build_path = /obj/item/weapon/circuitboard/computer/telesci_console
category = list("Teleportation Machinery")
/datum/design/sleeper
@@ -139,7 +139,7 @@
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/sleeper
+ build_path = /obj/item/weapon/circuitboard/machine/sleeper
category = list ("Medical Machinery")
/datum/design/cryotube
@@ -149,7 +149,7 @@
req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cryo_tube
+ build_path = /obj/item/weapon/circuitboard/machine/cryo_tube
category = list ("Medical Machinery")
/datum/design/chem_dispenser
@@ -159,7 +159,7 @@
req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/chem_dispenser
+ build_path = /obj/item/weapon/circuitboard/machine/chem_dispenser
category = list ("Medical Machinery")
/datum/design/chem_master
@@ -169,7 +169,7 @@
req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/chem_master
+ build_path = /obj/item/weapon/circuitboard/machine/chem_master
category = list ("Medical Machinery")
/datum/design/chem_heater
@@ -179,7 +179,7 @@
req_tech = list("engineering" = 2, "materials" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/chem_heater
+ build_path = /obj/item/weapon/circuitboard/machine/chem_heater
category = list ("Medical Machinery")
/datum/design/clonecontrol
@@ -189,7 +189,7 @@
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cloning
+ build_path = /obj/item/weapon/circuitboard/computer/cloning
category = list("Medical Machinery")
/datum/design/clonepod
@@ -199,7 +199,7 @@
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/clonepod
+ build_path = /obj/item/weapon/circuitboard/machine/clonepod
category = list("Medical Machinery")
/datum/design/clonescanner
@@ -209,7 +209,7 @@
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/clonescanner
+ build_path = /obj/item/weapon/circuitboard/machine/clonescanner
category = list("Medical Machinery")
/datum/design/biogenerator
@@ -219,7 +219,7 @@
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/biogenerator
+ build_path = /obj/item/weapon/circuitboard/machine/biogenerator
category = list ("Hydroponics Machinery")
/datum/design/hydroponics
@@ -229,7 +229,7 @@
req_tech = list("programming" = 1, "biotech" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/hydroponics
+ build_path = /obj/item/weapon/circuitboard/machine/hydroponics
category = list ("Hydroponics Machinery")
/datum/design/destructive_analyzer
@@ -239,7 +239,7 @@
req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/destructive_analyzer
+ build_path = /obj/item/weapon/circuitboard/machine/destructive_analyzer
category = list("Research Machinery")
/datum/design/experimentor
@@ -249,7 +249,7 @@
req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/experimentor
+ build_path = /obj/item/weapon/circuitboard/machine/experimentor
category = list("Research Machinery")
/datum/design/protolathe
@@ -259,7 +259,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/protolathe
+ build_path = /obj/item/weapon/circuitboard/machine/protolathe
category = list("Research Machinery")
/datum/design/circuit_imprinter
@@ -269,7 +269,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/circuit_imprinter
+ build_path = /obj/item/weapon/circuitboard/machine/circuit_imprinter
category = list("Research Machinery")
/datum/design/rdservercontrol
@@ -279,7 +279,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/rdservercontrol
+ build_path = /obj/item/weapon/circuitboard/computer/rdservercontrol
category = list("Research Machinery")
/datum/design/rdserver
@@ -289,7 +289,7 @@
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/rdserver
+ build_path = /obj/item/weapon/circuitboard/machine/rdserver
category = list("Research Machinery")
/datum/design/mechfab
@@ -299,7 +299,7 @@
req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mechfab
+ build_path = /obj/item/weapon/circuitboard/machine/mechfab
category = list("Research Machinery")
/datum/design/cyborgrecharger
@@ -309,7 +309,7 @@
req_tech = list("powerstorage" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cyborgrecharger
+ build_path = /obj/item/weapon/circuitboard/machine/cyborgrecharger
category = list("Research Machinery")
/datum/design/mech_recharger
@@ -319,7 +319,7 @@
req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mech_recharger
+ build_path = /obj/item/weapon/circuitboard/machine/mech_recharger
category = list("Research Machinery")
/datum/design/microwave
@@ -329,7 +329,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/microwave
+ build_path = /obj/item/weapon/circuitboard/machine/microwave
category = list ("Misc. Machinery")
/datum/design/gibber
@@ -339,7 +339,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/gibber
+ build_path = /obj/item/weapon/circuitboard/machine/gibber
category = list ("Misc. Machinery")
/datum/design/smartfridge
@@ -349,7 +349,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/smartfridge
+ build_path = /obj/item/weapon/circuitboard/machine/smartfridge
category = list ("Misc. Machinery")
/datum/design/monkey_recycler
@@ -359,7 +359,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/monkey_recycler
+ build_path = /obj/item/weapon/circuitboard/machine/monkey_recycler
category = list ("Misc. Machinery")
/datum/design/seed_extractor
@@ -369,7 +369,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/seed_extractor
+ build_path = /obj/item/weapon/circuitboard/machine/seed_extractor
category = list ("Misc. Machinery")
/datum/design/processor
@@ -379,7 +379,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/processor
+ build_path = /obj/item/weapon/circuitboard/machine/processor
category = list ("Misc. Machinery")
/datum/design/recycler
@@ -389,7 +389,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/recycler
+ build_path = /obj/item/weapon/circuitboard/machine/recycler
category = list ("Misc. Machinery")
/datum/design/holopad
@@ -399,7 +399,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/holopad
+ build_path = /obj/item/weapon/circuitboard/machine/holopad
category = list ("Misc. Machinery")
/datum/design/autolathe
@@ -409,7 +409,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/autolathe
+ build_path = /obj/item/weapon/circuitboard/machine/autolathe
category = list ("Misc. Machinery")
/datum/design/recharger
@@ -419,7 +419,7 @@
req_tech = list("powerstorage" = 3, "engineering" = 3, "materials" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100)
- build_path = /obj/item/weapon/circuitboard/recharger
+ build_path = /obj/item/weapon/circuitboard/machine/recharger
category = list("Misc. Machinery")
/datum/design/vendor
@@ -429,7 +429,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/vendor
+ build_path = /obj/item/weapon/circuitboard/machine/vendor
category = list ("Misc. Machinery")
/datum/design/ore_redemption
@@ -439,7 +439,7 @@
req_tech = list("programming" = 1, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/ore_redemption
+ build_path = /obj/item/weapon/circuitboard/machine/ore_redemption
category = list ("Misc. Machinery")
@@ -450,7 +450,7 @@
req_tech = list("programming" = 1, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mining_equipment_vendor
+ build_path = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor
category = list ("Misc. Machinery")
/datum/design/tesla_coil
@@ -460,7 +460,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/tesla_coil
+ build_path = /obj/item/weapon/circuitboard/machine/tesla_coil
category = list ("Misc. Machinery")
/datum/design/grounding_rod
@@ -470,7 +470,7 @@
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/grounding_rod
+ build_path = /obj/item/weapon/circuitboard/machine/grounding_rod
category = list ("Misc. Machinery")
/datum/design/plantgenes
@@ -480,5 +480,5 @@
req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/plantgenes
+ build_path = /obj/item/weapon/circuitboard/machine/plantgenes
category = list ("Misc. Machinery")
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 0719aafb9e8..11bb5c755be 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -79,7 +79,7 @@
build_type = IMPRINTER
reliability = 79
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman
+ build_path = /obj/item/weapon/circuitboard/machine/pacman
category = list("Engineering Machinery")
/datum/design/superpacman
@@ -90,7 +90,7 @@
build_type = IMPRINTER
reliability = 76
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman/super
+ build_path = /obj/item/weapon/circuitboard/machine/pacman/super
category = list("Engineering Machinery")
/datum/design/mrspacman
@@ -101,5 +101,5 @@
build_type = IMPRINTER
reliability = 74
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman/mrs
+ build_path = /obj/item/weapon/circuitboard/machine/pacman/mrs
category = list("Engineering Machinery")
diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm
index 0a36d63e6fa..baa6bb689ba 100644
--- a/code/modules/research/designs/telecomms_designs.dm
+++ b/code/modules/research/designs/telecomms_designs.dm
@@ -9,7 +9,7 @@
req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/receiver
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/receiver
category = list("Subspace Telecomms")
/datum/design/telecomms_bus
@@ -19,7 +19,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/bus
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/bus
category = list("Subspace Telecomms")
/datum/design/telecomms_hub
@@ -29,7 +29,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/hub
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/hub
category = list("Subspace Telecomms")
/datum/design/telecomms_relay
@@ -39,7 +39,7 @@
req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/relay
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/relay
category = list("Subspace Telecomms")
/datum/design/telecomms_processor
@@ -49,7 +49,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/processor
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/processor
category = list("Subspace Telecomms")
/datum/design/telecomms_server
@@ -59,7 +59,7 @@
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/server
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/server
category = list("Subspace Telecomms")
/datum/design/subspace_broadcaster
@@ -69,5 +69,5 @@
req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
+ build_path = /obj/item/weapon/circuitboard/machine/telecomms/broadcaster
category = list("Subspace Telecomms")
\ No newline at end of file
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 85a492092c5..a3b856b5f0f 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -15,12 +15,17 @@ Note: Must be placed within 3 tiles of the R&D Console
/obj/machinery/r_n_d/destructive_analyzer/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/destructive_analyzer(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/destructive_analyzer(null)
+ B.apply_default_parts(src)
+
+/obj/item/weapon/circuitboard/machine/destructive_analyzer
+ name = "circuit board (Destructive Analyzer)"
+ build_path = /obj/machinery/r_n_d/destructive_analyzer
+ origin_tech = "magnets=2;engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
/obj/machinery/r_n_d/destructive_analyzer/RefreshParts()
var/T = 0
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 7ae08a0338b..62216b39872 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -81,17 +81,21 @@
/obj/machinery/r_n_d/experimentor/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/experimentor(src)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/experimentor(null)
+ B.apply_default_parts(src)
+
trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in mob_list
trackedRuntime = locate(/mob/living/simple_animal/pet/cat/Runtime) in mob_list
SetTypeReactions()
- RefreshParts()
+
+/obj/item/weapon/circuitboard/machine/experimentor
+ name = "circuit board (E.X.P.E.R.I-MENTOR)"
+ build_path = /obj/machinery/r_n_d/experimentor
+ origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 2)
/obj/machinery/r_n_d/experimentor/RefreshParts()
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index e704dd823ae..70c6c1c0451 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -34,19 +34,21 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/protolathe(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
materials = new(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1))
- RefreshParts()
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null)
+ B.apply_default_parts(src)
reagents.my_atom = src
+/obj/item/weapon/circuitboard/machine/protolathe
+ name = "circuit board (Protolathe)"
+ build_path = /obj/machinery/r_n_d/protolathe
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
+
/obj/machinery/r_n_d/protolathe/Destroy()
qdel(materials)
return ..()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index f8f2ef29743..5da672ae25d 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -33,7 +33,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
name = "R&D Console"
icon_screen = "rdcomp"
icon_keyboard = "rd_key"
- circuit = /obj/item/weapon/circuitboard/rdconsole
+ circuit = /obj/item/weapon/circuitboard/computer/rdconsole
var/datum/research/files //Stores all the collected research data.
var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
var/obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk.
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index dc2192aa25e..1e5e26d41ce 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -16,13 +16,17 @@
/obj/machinery/r_n_d/server/New()
..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/rdserver(null)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
- initialize(); //Agouri
+ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/rdserver(null)
+ B.apply_default_parts(src)
+ initialize() //Agouri
+
+/obj/item/weapon/circuitboard/machine/rdserver
+ name = "circuit board (R&D Server)"
+ build_path = /obj/machinery/r_n_d/server
+ origin_tech = "programming=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
/obj/machinery/r_n_d/server/Destroy()
griefProtection()
@@ -177,7 +181,7 @@
var/list/servers = list()
var/list/consoles = list()
var/badmin = 0
- circuit = /obj/item/weapon/circuitboard/rdservercontrol
+ circuit = /obj/item/weapon/circuitboard/computer/rdservercontrol
/obj/machinery/computer/rdservercontrol/Topic(href, href_list)
if(..())
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 2b5968cc068..74e2343be67 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -3,13 +3,13 @@
icon_screen = "shuttle"
icon_keyboard = "tech_key"
req_access = list( )
- circuit = /obj/item/weapon/circuitboard/shuttle
+ circuit = /obj/item/weapon/circuitboard/computer/shuttle
var/shuttleId
var/possible_destinations = ""
var/admin_controlled
var/no_destination_swap = 0
-/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/shuttle/C)
+/obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/computer/shuttle/C)
..()
if(istype(C))
possible_destinations = C.possible_destinations
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 987cb75af14..acbcbb82fbe 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -76,8 +76,17 @@
/obj/docking_port/mobile/emergency/New()
..()
+ // The last created emergency shuttle will always be the one
+ // that we use.
SSshuttle.emergency = src
+/obj/docking_port/mobile/emergency/Destroy()
+ if(src.i_know_what_im_doing)
+ // This'll make the shuttle subsystem use the backup shuttle.
+ SSshuttle.emergencyDeregister()
+
+ . = ..()
+
/obj/docking_port/mobile/emergency/timeLeft(divisor)
if(divisor <= 0)
divisor = 10
@@ -319,6 +328,24 @@
/obj/item/weapon/storage/pod/attack_hand(mob/user)
return
+/obj/docking_port/mobile/emergency/backup
+ name = "backup shuttle"
+ id = "backup"
+ dwidth = 2
+ width = 8
+ height = 8
+ dir = 4
+
+ roundstart_move = "backup_away"
+
+/obj/docking_port/mobile/emergency/backup/New()
+ // We want to be a valid emergency shuttle
+ // but not be the main one, keep whatever's set
+ // valid.
+ var/current_emergency = SSshuttle.emergency
+ ..()
+ SSshuttle.emergency = current_emergency
+ SSshuttle.backup_shuttle = src
#undef UNLAUNCHED
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 0921e074f06..f5b142dc4ed 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -1,13 +1,13 @@
/obj/machinery/computer/shuttle/ferry
name = "transport ferry console"
- circuit = /obj/item/weapon/circuitboard/ferry
+ circuit = /obj/item/weapon/circuitboard/computer/ferry
shuttleId = "ferry"
possible_destinations = "ferry_home;ferry_away"
/obj/machinery/computer/shuttle/ferry/request
name = "ferry console"
- circuit = /obj/item/weapon/circuitboard/ferry/request
+ circuit = /obj/item/weapon/circuitboard/computer/ferry/request
var/cooldown //prevents spamming admins
possible_destinations = "ferry_home"
admin_controlled = 1
diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm
new file mode 100644
index 00000000000..55913ab432f
--- /dev/null
+++ b/code/modules/shuttle/manipulator.dm
@@ -0,0 +1,13 @@
+/obj/machinery/shuttle_manipulator
+ name = "shuttle manipulator"
+ desc = "I shall be telling this with a sigh\n\
+ Somewhere ages and ages hence:\n\
+ Two roads diverged in a wood, and I,\n\
+ I took the one less traveled by,\n\
+ And that has made all the difference."
+
+ icon = 'icons/obj/machines/dominator.dmi'
+ icon_state = "dominator-blue"
+
+/obj/machinery/shuttle_manipulator/process()
+ return
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 156eaea5e2d..2439ef13ce6 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -18,9 +18,18 @@
var/dwidth = 0 //position relative to covered area, perpendicular to dir
var/dheight = 0 //position relative to covered area, parallel to dir
+ var/i_know_what_im_doing = 0
+
//these objects are indestructable
/obj/docking_port/Destroy()
- return QDEL_HINT_LETMELIVE
+ // unless you assert that you know what you're doing. Horrible things
+ // may result.
+ if(!i_know_what_im_doing)
+ return QDEL_HINT_LETMELIVE
+ else
+ // If not removed immediately, it can interfere with the docking
+ // detection code, which is annoying and inconvinient.
+ return QDEL_HINT_HARDDEL_NOW
/obj/docking_port/singularity_pull()
return
/obj/docking_port/singularity_act()
@@ -143,7 +152,7 @@
//returns first-found touching shuttleport
/obj/docking_port/stationary/get_docked()
- return locate(/obj/docking_port/mobile) in loc
+ . = locate(/obj/docking_port/mobile) in loc
/*
for(var/turf/T in return_ordered_turfs())
. = locate(/obj/docking_port/mobile) in loc
@@ -182,6 +191,11 @@
..()
SSshuttle.mobile += src
+/obj/docking_port/mobile/Destroy()
+ if(i_know_what_im_doing)
+ SSshuttle.mobile -= src
+ . = ..()
+
/obj/docking_port/mobile/initialize()
var/area/A = get_area(src)
if(istype(A, /area/shuttle))
@@ -221,16 +235,32 @@
if(height-dheight > S.height-S.dheight)
return 5
//check the dock isn't occupied
- if(S.get_docked())
- return 6
+ var/currently_docked = S.get_docked()
+ if(currently_docked)
+ // by someone other than us
+ if(currently_docked != src)
+ return 6
+ else
+ // This isn't an error, per se, but we can't let the shuttle code
+ // attempt to move us where we currently are, it will get weird.
+ return SHUTTLE_ALREADY_DOCKED
return 0 //0 means we can dock
//call the shuttle to destination S
/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S)
- if(canDock(S))
- . = 1
- throw EXCEPTION("request(): shuttle cannot dock")
- return 1 //we can't dock at S
+ var/status = canDock(S)
+ if(status == SHUTTLE_ALREADY_DOCKED)
+ // We're already docked there, don't need to do anything.
+ // Triggering shuttle movement code in place is weird
+ return
+ else if(status)
+ . = status
+ spawn(0)
+ var/msg = "request(): shuttle [src] cannot dock at [S], \
+ error: [status]"
+ message_admins(msg)
+ throw EXCEPTION(msg)
+ return status //we can't dock at S
switch(mode)
if(SHUTTLE_CALL)
@@ -294,16 +324,66 @@
pixel_x = oldPY
pixel_y = (oldPX*(-1))
+/obj/docking_port/mobile/proc/jumpToNullSpace()
+ // Destroys the docking port and the shuttle contents.
+ // Not in a fancy way, it just ceases.
+ var/obj/docking_port/stationary/S0 = get_docked()
+ var/turf_type = /turf/open/space
+ var/area_type = /area/space
+ if(S0)
+ if(S0.turf_type)
+ turf_type = S0.turf_type
+ if(S0.area_type)
+ area_type = S0.area_type
+
+ var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance)
+
+ //remove area surrounding docking port
+ if(areaInstance.contents.len)
+ var/area/A0 = locate("[area_type]")
+ if(!A0)
+ A0 = new area_type(null)
+ for(var/turf/T0 in L0)
+ A0.contents += T0
+
+ for(var/i=1, i<=L0.len, ++i)
+ var/turf/T0 = L0[i]
+ if(!T0)
+ continue
+
+ for(var/atom/AM in T0.GetAllContents())
+ if(istype(AM, /mob/dead))
+ continue
+ qdel(AM)
+
+ T0.ChangeTurf(turf_type)
+
+ T0.redraw_lighting()
+ SSair.remove_from_active(T0)
+ T0.CalculateAdjacentTurfs()
+ SSair.add_to_active(T0,1)
+
+ src.i_know_what_im_doing = TRUE
+ qdel(src)
+
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
-/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1)
- . = canDock(S1)
- if(.)
- throw EXCEPTION("dock(): shuttle cannot dock")
- return .
+/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE)
+ // Crashing this ship with NO SURVIVORS
+ if(!force)
+ var/status = canDock(S1)
+ if(status == 7)
+ return SHUTTLE_ALREADY_DOCKED
+ else if(status)
+ spawn(0)
+ var/msg = "dock(): shuttle [src] cannot dock at [S1], \
+ error: [status]"
+ message_admins(msg)
+ throw EXCEPTION(msg)
+ return status
- if(canMove())
- return -1
+ if(canMove())
+ return -1
closePortDoors()
@@ -432,6 +512,24 @@
var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
if(T && !canDock(T))
return T
+
+/obj/docking_port/mobile/proc/findRoundstartDock()
+ var/obj/docking_port/stationary/D
+ D = SSshuttle.getDock(roundstart_move)
+
+ if(D)
+ return D
+
+/obj/docking_port/mobile/proc/dockRoundstart()
+ // Instead of spending a lot of time trying to work out where to place
+ // our shuttle, just create it somewhere empty and send it to where
+ // it should go
+ var/obj/docking_port/stationary/D = findRoundstartDock()
+ return dock(D)
+
+/obj/effect/landmark/shuttle_import
+ name = "Shuttle Import"
+
/* commented out due to issues with rotation
for(var/obj/docking_port/stationary/transit/S in SSshuttle.transit)
if(S.id)
diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm
index 4749a5e8d17..924a210e22a 100644
--- a/code/modules/shuttle/white_ship.dm
+++ b/code/modules/shuttle/white_ship.dm
@@ -1,6 +1,6 @@
/obj/machinery/computer/shuttle/white_ship
name = "White Ship Console"
desc = "Used to control the White Ship."
- circuit = /obj/item/weapon/circuitboard/white_ship
+ circuit = /obj/item/weapon/circuitboard/computer/white_ship
shuttleId = "whiteship"
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland"
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/demon.dm b/code/modules/spells/spell_types/demon.dm
new file mode 100644
index 00000000000..ae32cf92292
--- /dev/null
+++ b/code/modules/spells/spell_types/demon.dm
@@ -0,0 +1,167 @@
+/obj/effect/proc_holder/spell/targeted/summon_pitchfork
+ name = "Summon Pitchfork"
+ desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork."
+ invocation_type = "none"
+ include_user = 1
+ range = -1
+ clothes_req = 0
+ var/obj/item/weapon/twohanded/pitchfork/demonic/pitchfork
+ var/pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/
+
+ school = "conjuration"
+ charge_max = 150
+ cooldown_min = 10
+ action_icon_state = "pitchfork"
+ action_background_icon_state = "bg_demon"
+
+
+
+/obj/effect/proc_holder/spell/targeted/summon_pitchfork/cast(list/targets, mob/user = usr)
+ if (pitchfork)
+ qdel(pitchfork)
+ else
+ for(var/mob/living/carbon/C in targets)
+ if(C.drop_item())
+ pitchfork = new pitchfork_type
+ C.put_in_hands(pitchfork)
+
+/obj/effect/proc_holder/spell/targeted/summon_pitchfork/Del()
+ if(pitchfork)
+ qdel(pitchfork)
+
+/obj/effect/proc_holder/spell/targeted/summon_pitchfork/greater
+ pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/greater
+
+/obj/effect/proc_holder/spell/targeted/summon_pitchfork/ascended
+ pitchfork_type = /obj/item/weapon/twohanded/pitchfork/demonic/ascended
+
+
+/obj/effect/proc_holder/spell/targeted/summon_contract
+ name = "Summon infernal contract"
+ desc = "Skip making a contract by hand, just do it by magic."
+ invocation_type = "whisper"
+ invocation = "Just sign on the dotted line."
+ include_user = 0
+ range = 5
+ clothes_req = 0
+
+ school = "conjuration"
+ charge_max = 150
+ cooldown_min = 10
+ action_icon_state = "spell_default"
+ action_background_icon_state = "bg_demon"
+
+/obj/effect/proc_holder/spell/targeted/summon_contract/cast(list/targets, mob/user = usr)
+ for(var/mob/living/carbon/C in targets)
+ if(C.mind && user.mind)
+ if(C.stat == DEAD)
+ if(user.drop_item())
+ var/obj/item/weapon/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind)
+ user.put_in_hands(contract)
+ else
+ var/obj/item/weapon/paper/contract/infernal/contract // = new(user.loc, C.mind, contractType, user.mind)
+ var/contractTypeName = input(user, "What type of contract?") in list ("Power", "Wealth", "Prestige", "Magic", "Knowledge")
+ switch(contractTypeName)
+ if("Power")
+ contract = new /obj/item/weapon/paper/contract/infernal/power(C.loc, C.mind, user.mind)
+ if("Wealth")
+ contract = new /obj/item/weapon/paper/contract/infernal/wealth(C.loc, C.mind, user.mind)
+ if("Prestige")
+ contract = new /obj/item/weapon/paper/contract/infernal/prestige(C.loc, C.mind, user.mind)
+ if("Magic")
+ contract = new /obj/item/weapon/paper/contract/infernal/magic(C.loc, C.mind, user.mind)
+ if("Knowledge")
+ contract = new /obj/item/weapon/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
+ C.put_in_hands(contract)
+ else
+ user << "[C] seems to not be sentient. You cannot summon a contract for them."
+
+
+/obj/effect/proc_holder/spell/dumbfire/fireball/hellish
+ name = "Hellfire"
+ desc = "This spell launches hellfire at the target."
+
+ school = "evocation"
+ charge_max = 30
+ clothes_req = 0
+ invocation = "Your very soul will catch fire!"
+ invocation_type = "shout"
+ range = 2
+
+ proj_icon_state = "fireball"
+ proj_name = "a fireball"
+ proj_type = /obj/effect/proc_holder/spell/turf/fireball/infernal
+
+ proj_lifespan = 200
+ proj_step_delay = 1
+
+ action_background_icon_state = "bg_demon"
+
+/obj/effect/proc_holder/spell/turf/fireball/infernal/cast(turf/T,mob/user = usr)
+ explosion(T, -1, -1, 1, 4, 0, flame_range = 5)
+
+/obj/effect/proc_holder/spell/targeted/infernal_jaunt
+ name = "Infernal Jaunt"
+ desc = "Use pools of blood to phase out of existence."
+ charge_max = 10
+ clothes_req = 0
+ selection_type = "range"
+ range = -1
+ cooldown_min = 0
+ overlay = null
+ include_user = 1
+ action_icon_state = "jaunt"
+ action_background_icon_state = "bg_demon"
+ phase_allowed = 1
+
+/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
+ if(istype(user))
+ if(istype(user.loc, /obj/effect/dummy/slaughter/))
+ var/continuing = 0
+ for(var/mob/living/C in orange(2, get_turf(user.loc)))
+ if (C.mind && C.mind.soulOwner == C.mind)
+ continuing = 1
+ break
+ if(continuing)
+ user.infernalphasein()
+ else
+ user << "You can only re-appear near a potential signer."
+ revert_cast()
+ return ..()
+ else
+ user.infernalphaseout()
+ start_recharge()
+ return
+ revert_cast()
+
+
+/mob/living/proc/infernalphaseout()
+ var/turf/mobloc = get_turf(src.loc)
+ src.notransform = 1
+ spawn(0)
+ src.visible_message("[src] disappears in a flashfire!")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
+ src.ExtinguishMob()
+ if(buckled)
+ buckled.unbuckle_mob(src,force=1)
+ if(buckled_mobs.len)
+ unbuckle_all_mobs(force=1)
+ if(pulledby)
+ pulledby.stop_pulling()
+ if(pulling)
+ stop_pulling()
+ src.loc = holder
+ src.holder = holder
+ src.notransform = 0
+ return 1
+
+/mob/living/proc/infernalphasein()
+ if(src.notransform)
+ src << "You're too busy to jaunt in."
+ return 0
+ src.loc = get_turf(src)
+ src.client.eye = src
+ src.visible_message("[src] appears in a firey blaze!")
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ return 1
diff --git a/code/modules/spells/spell_types/demon_boons.dm b/code/modules/spells/spell_types/demon_boons.dm
new file mode 100644
index 00000000000..85ca441adef
--- /dev/null
+++ b/code/modules/spells/spell_types/demon_boons.dm
@@ -0,0 +1,44 @@
+/obj/effect/proc_holder/spell/targeted/summon_wealth
+ name = "Summon wealth"
+ desc = "The reward for selling your soul."
+ invocation_type = "none"
+ include_user = 1
+ range = -1
+ clothes_req = 0
+ school = "conjuration"
+ charge_max = 100
+ cooldown_min = 10
+ action_icon_state = "moneybag"
+
+
+/obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr)
+ for(var/mob/living/carbon/C in targets)
+ if(user.drop_item())
+ var/obj/item = pick(
+ new /obj/item/weapon/coin/gold(user.loc),
+ new /obj/item/weapon/coin/diamond(user.loc),
+ new /obj/item/weapon/coin/silver(user.loc),
+ new /obj/item/clothing/tie/medal/gold(user.loc),
+ new /obj/item/stack/sheet/mineral/gold(user.loc),
+ new /obj/item/stack/sheet/mineral/silver(user.loc),
+ new /obj/item/stack/sheet/mineral/diamond(user.loc),
+ new /obj/item/stack/spacecash/c1000(user.loc))
+ C.put_in_hands(item)
+
+/obj/effect/proc_holder/spell/targeted/view_range
+ name = "Distant vision"
+ desc = "The reward for selling your soul."
+ invocation_type = "none"
+ include_user = 1
+ range = -1
+ clothes_req = 0
+ charge_max = 50
+ cooldown_min = 10
+ action_icon_state = "camera_jump"
+ var/ranges = list(7,8,9,10/*,11,12*/)
+
+/obj/effect/proc_holder/spell/targeted/view_range/cast(list/targets, mob/user = usr)
+ for(var/mob/C in targets)
+ if(!C.client)
+ continue
+ C.client.view = input("Select view range:", "Range", 4) in ranges
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/dumbfire.dm b/code/modules/spells/spell_types/dumbfire.dm
index 38a42ccb037..ab711319e77 100644
--- a/code/modules/spells/spell_types/dumbfire.dm
+++ b/code/modules/spells/spell_types/dumbfire.dm
@@ -38,9 +38,11 @@
if(istext(proj_type))
var/projectile_type = text2path(proj_type)
projectile = new projectile_type(user)
- if(istype(proj_type,/obj/effect/proc_holder/spell))
+ else if(istype(proj_type,/obj/effect/proc_holder/spell))
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
projectile:linked_spells += proj_type
+ else
+ projectile = new proj_type(user)
projectile.icon = proj_icon
projectile.icon_state = proj_icon_state
projectile.dir = get_dir(projectile, target)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 0313dfa5325..e1d602c42d0 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -284,7 +284,7 @@
/obj/item/bodypart/l_arm
name = "left arm"
icon_state = "l_arm"
- max_damage = 75
+ max_damage = 60
body_zone ="l_arm"
body_part = ARM_LEFT
px_x = -6
@@ -293,7 +293,7 @@
/obj/item/bodypart/r_arm
name = "right arm"
icon_state = "r_arm"
- max_damage = 75
+ max_damage = 60
body_zone = "r_arm"
body_part = ARM_RIGHT
px_x = 6
@@ -302,7 +302,7 @@
/obj/item/bodypart/l_leg
name = "left leg"
icon_state = "l_leg"
- max_damage = 75
+ max_damage = 60
body_zone = "l_leg"
body_part = LEG_LEFT
px_x = -2
@@ -311,7 +311,7 @@
/obj/item/bodypart/r_leg
name = "right leg"
icon_state = "r_leg"
- max_damage = 75
+ max_damage = 60
body_zone = "r_leg"
body_part = LEG_RIGHT
px_x = 2
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 5f037989886..8bb62fdc933 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -1,7 +1,7 @@
//Dismember a limb
-/obj/item/bodypart/proc/dismember()
+/obj/item/bodypart/proc/dismember(dam_type = BRUTE)
var/mob/living/carbon/human/H = owner
if(!istype(H) || !H.dna.species.has_dismemberment) // species don't allow dismemberment
return 0
@@ -12,6 +12,9 @@
H.emote("scream")
drop_limb()
+ if(dam_type == BURN)
+ burn()
+ return 1
var/direction = pick(cardinal)
var/t_range = rand(2,max(throw_range/2, 2))
var/turf/target_turf = get_turf(src)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 1feb60587e4..6c758a542d3 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -1,5 +1,3 @@
-
-
/obj/item/bodypart/head
name = "head"
desc = "Didn't make sense not to live for fun, your brain gets smart but your head gets dumb."
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 8e640ed006d..2259bb961f1 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -13,7 +13,7 @@
/obj/machinery/telepad/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/telesci_pad(null)
+ component_parts += new /obj/item/weapon/circuitboard/machine/telesci_pad(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index e0f333b8007..59237bfd1b0 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -3,7 +3,7 @@
desc = "Used to teleport objects to and from the telescience telepad."
icon_screen = "teleport"
icon_keyboard = "teleport_key"
- circuit = /obj/item/weapon/circuitboard/telesci_console
+ circuit = /obj/item/weapon/circuitboard/computer/telesci_console
var/sending = 1
var/obj/machinery/telepad/telepad = null
var/temp_msg = "Telescience control console initialized.
Welcome."
diff --git a/config/admins.txt b/config/admins.txt
index b5d7d797fff..6c712096834 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -14,6 +14,7 @@ microscopics = Game Master
Gun Hog = Game Master
KorPhaeron = Game Master
razharas = Game Master
+Lordpidey = Game Master
Niknakflak = Game Master
rolan7 = Game Master
quarxink = Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 767aff019fc..914a64e3bcf 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -40,7 +40,7 @@ EMOJIS
## These values get directly added to values and totals ingame.
## To speed things up make the number negative, to slow things down, make the number positive.
-## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
+## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
RUN_DELAY 1
WALK_DELAY 4
@@ -186,7 +186,7 @@ ALLOW_RANDOM_EVENTS
## Set to 0 to make dangerous events avaliable from round start.
EVENTS_MIN_TIME_MUL 1
-## Multiplier for minimal player count (players = alive non-AFK humans) for dangerous events to start.
+## Multiplier for minimal player count (players = alive non-AFK humans) for dangerous events to start.
## Set to 0 to make dangerous events avaliable for all populations.
EVENTS_MIN_PLAYERS_MUL 1
@@ -347,4 +347,9 @@ BOMBCAP 20
#BOMBCAP 28
-
+## Lavaland "Budget"
+# Lavaland ruin spawning has an imaginary budget to spend on ruins, where
+# a less lootfilled or smaller or less round effecting ruin costs less to
+# spawn, while the converse is true. Alter this number to affect the amount
+# of ruins.
+LAVALAND_BUDGET 60
diff --git a/config/tips.txt b/config/tips.txt
index c7f7241a456..afcbe8700b1 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -180,3 +180,6 @@ As a Morph, you can talk while disguised, but your words have a chance of being
As a Drone, you can ping other drones to alert them of areas in the station in need of repair.
As a Ghost, you can see the inside of a container on the ground by clicking on it.
As a Ghost, you can double click on people, bots, or the singularity to follow them.
+As a Devil, you gain power for every three souls you control, however you also become more obvious.
+As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed.
+At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
diff --git a/html/changelog.html b/html/changelog.html
index c30bb82c7f1..5ad38330cd5 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,50 @@
-->
+
08 May 2016
+
CoreOverload updated:
+
+ - You can now de-power inactive swarmers with a screwdriver to prevent them from activating.
+ - Recycle depowered swarmers in autolathe or sell them in cargo!
+
+
Joan updated:
+
+ - Cultist constructs, and shades, can now invoke runes by clicking them.
+ - This does not include Manifest Ghost, Blood Boil, or Astral Journey runes.
+ - Medical huds will now show parasites in dead creatures.
+
+
KorPhaeron updated:
+
+ - Burn weapons can now dismember, and they reduce the limb to ash in the process
+ - Weapons with high AP values will now dismember limbs much easier. These values are subject to change depending on how things play out over the next week or two.
+ - Various weapons with high AP values had them lowered (chaplain scythe, energy sword, dualsaber) to prevent them taking limbs off in a single hit.
+ - The chaplain has two new weapons (they are mechanically identical to previous weapons, before anyone gets upset about balance). One is dismemberment themed, the other is related to a new antagonist.
+
+
Mercenaryblue updated:
+
+ - Throwing a Banana Cream Pie will now knock down and cream the target's face.
+ - You can clean off the cream with the usual methods, such as soap, shower, cleaner spray, etc.
+ - The Clown Federation would like to remind the crew that the HoS is worth double points! Honk!
+
+
Robustin updated:
+
+ - There are rumors that the Cult's 'Talisman of Construction', which turns ordinary metal for construct shells, can be used on plasteel to create structures. If the stories are true, the cult has been producing relics of incredible power through this transmutation.
+
+
coiax updated:
+
+ - To save credits, Centcom has subcontracted out emergency shuttle design to third parties. Rest assured, all of these produced shuttles meet our stringent quality control.
+ - Lavaland ruins spawning chances have been modified. Expect to see more smaller and less round affecting ruins, and no duplicates of major ruins, like ash walkers or golems.
+
+
lordpidey updated:
+
+ - Infernal devils have been seen onboard our spacestations, offering great boons in exchange for souls.
+ - Employees are reminded that their souls already belong to nanotrasen. If you have sold your soul in error, a lawyer or head of personnel can help return your soul to Nanotrasen by hitting you with your employment contract.
+ - Nanotrasen headquarters will be bluespacing employment contracts into the Lawyer's office filing cabinet when a new arrival reaches the station. It is recommended that the lawyer create copies of some of these for safe keeping.
+ - Due to the recent infernal incursions, the station library has been equipped with a Codex Gigas to help research infernal weaknesses. Please note that reading this book may have unintended side effects. Also note, you must spell the devil's name exactly, as there are countless demons with similar names.
+ - When a devil dies, if the proper banishment ritual is not performed on it's remains, the devil will revive itself at the cost of some of it's power. The banishment ritual is described in the Codex Gigas.
+ - When a demon gains enough souls, It's form will mutate to a more demonic looking form. The Arch-demon form is known to be on par with an ascended shadowling in power.
+
+
07 May 2016
Robustin updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c76b5b48f66..03e7e973731 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -4911,3 +4911,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
with Fleshmend, or just one arm with Arm Blade or Organic Shield.
- rscadd: Your chest cannot be dropped, but it will spill its organs onto the ground
when dismembered.
+2016-05-08:
+ CoreOverload:
+ - rscadd: You can now de-power inactive swarmers with a screwdriver to prevent them
+ from activating.
+ - rscadd: Recycle depowered swarmers in autolathe or sell them in cargo!
+ Joan:
+ - rscadd: Cultist constructs, and shades, can now invoke runes by clicking them.
+ - rscdel: This does not include Manifest Ghost, Blood Boil, or Astral Journey runes.
+ - rscadd: Medical huds will now show parasites in dead creatures.
+ KorPhaeron:
+ - rscadd: Burn weapons can now dismember, and they reduce the limb to ash in the
+ process
+ - rscadd: Weapons with high AP values will now dismember limbs much easier. These
+ values are subject to change depending on how things play out over the next
+ week or two.
+ - rscadd: Various weapons with high AP values had them lowered (chaplain scythe,
+ energy sword, dualsaber) to prevent them taking limbs off in a single hit.
+ - rscadd: The chaplain has two new weapons (they are mechanically identical to previous
+ weapons, before anyone gets upset about balance). One is dismemberment themed,
+ the other is related to a new antagonist.
+ Mercenaryblue:
+ - rscadd: Throwing a Banana Cream Pie will now knock down and cream the target's
+ face.
+ - rscadd: You can clean off the cream with the usual methods, such as soap, shower,
+ cleaner spray, etc.
+ - rscadd: The Clown Federation would like to remind the crew that the HoS is worth
+ double points! Honk!
+ Robustin:
+ - experiment: There are rumors that the Cult's 'Talisman of Construction', which
+ turns ordinary metal for construct shells, can be used on plasteel to create
+ structures. If the stories are true, the cult has been producing relics of incredible
+ power through this transmutation.
+ coiax:
+ - rscadd: To save credits, Centcom has subcontracted out emergency shuttle design
+ to third parties. Rest assured, all of these produced shuttles meet our stringent
+ quality control.
+ - tweak: Lavaland ruins spawning chances have been modified. Expect to see more
+ smaller and less round affecting ruins, and no duplicates of major ruins, like
+ ash walkers or golems.
+ lordpidey:
+ - rscadd: Infernal devils have been seen onboard our spacestations, offering great
+ boons in exchange for souls.
+ - rscadd: Employees are reminded that their souls already belong to nanotrasen. If
+ you have sold your soul in error, a lawyer or head of personnel can help return
+ your soul to Nanotrasen by hitting you with your employment contract.
+ - rscadd: Nanotrasen headquarters will be bluespacing employment contracts into
+ the Lawyer's office filing cabinet when a new arrival reaches the station. It
+ is recommended that the lawyer create copies of some of these for safe keeping.
+ - rscadd: Due to the recent infernal incursions, the station library has been equipped
+ with a Codex Gigas to help research infernal weaknesses. Please note that reading
+ this book may have unintended side effects. Also note, you must spell the devil's
+ name exactly, as there are countless demons with similar names.
+ - rscadd: When a devil dies, if the proper banishment ritual is not performed on
+ it's remains, the devil will revive itself at the cost of some of it's power. The
+ banishment ritual is described in the Codex Gigas.
+ - rscadd: When a demon gains enough souls, It's form will mutate to a more demonic
+ looking form. The Arch-demon form is known to be on par with an ascended shadowling
+ in power.
diff --git a/icons/effects/creampie.dmi b/icons/effects/creampie.dmi
new file mode 100644
index 00000000000..2a0365773b7
Binary files /dev/null and b/icons/effects/creampie.dmi differ
diff --git a/icons/mob/32x64.dmi b/icons/mob/32x64.dmi
new file mode 100644
index 00000000000..32b25ba7393
Binary files /dev/null and b/icons/mob/32x64.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 365d550bce6..101f6c87752 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 1073f20a6fd..6e7a761a512 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 80fd29fbd21..be64c757347 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index c70f29f07f7..97092a8970d 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index d39464c712c..5489dbcec68 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 116fbe4090c..6d044b9f3a6 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index cce17c5a3fb..11f55cbc902 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
index f8ff43f3b9f..de4756e620c 100644
Binary files a/icons/mob/swarmer.dmi and b/icons/mob/swarmer.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index b1bce203efe..3944d02a67f 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index f2406325733..44382c1f48e 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 623836f5898..37f7af70e08 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 540b32b193a..cc683256480 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi
index a7b5af73017..95712fe106c 100644
Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 60228c44e70..ca4182ba249 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 4696fcf81b1..993db29c5ca 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 0099b63a257..0978eae8fc4 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 8b5b5b812e4..6589aabb869 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi
index acdc4e97806..d9ff675828f 100644
Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index c3bb6eec090..291db24a4e3 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 89188803d3c..93ce41adea4 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -27,6 +27,7 @@
#include "code\__DEFINES\bots.dm"
#include "code\__DEFINES\clothing.dm"
#include "code\__DEFINES\combat.dm"
+#include "code\__DEFINES\contracts.dm"
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
@@ -105,6 +106,7 @@
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\blob_overmind.dm"
#include "code\_onclick\hud\blobbernauthud.dm"
+#include "code\_onclick\hud\demon.dm"
#include "code\_onclick\hud\drones.dm"
#include "code\_onclick\hud\fullscreen.dm"
#include "code\_onclick\hud\ghost.dm"
@@ -162,6 +164,8 @@
#include "code\datums\outfit.dm"
#include "code\datums\progressbar.dm"
#include "code\datums\recipe.dm"
+#include "code\datums\ruins.dm"
+#include "code\datums\shuttles.dm"
#include "code\datums\votablemap.dm"
#include "code\datums\diseases\_disease.dm"
#include "code\datums\diseases\_MobProcs.dm"
@@ -224,6 +228,8 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\martial\krav_maga.dm"
#include "code\datums\martial\wrestling.dm"
+#include "code\datums\ruins\lavaland.dm"
+#include "code\datums\ruins\space.dm"
#include "code\datums\wires\airalarm.dm"
#include "code\datums\wires\airlock.dm"
#include "code\datums\wires\apc.dm"
@@ -306,6 +312,13 @@
#include "code\game\gamemodes\cult\ritual.dm"
#include "code\game\gamemodes\cult\runes.dm"
#include "code\game\gamemodes\cult\talisman.dm"
+#include "code\game\gamemodes\demon\demon.dm"
+#include "code\game\gamemodes\demon\demon_game_mode.dm"
+#include "code\game\gamemodes\demon\demoninfo.dm"
+#include "code\game\gamemodes\demon\objectives.dm"
+#include "code\game\gamemodes\demon\imp\imp.dm"
+#include "code\game\gamemodes\demon\true_demon\_true_demon.dm"
+#include "code\game\gamemodes\demon\true_demon\inventory.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\gang\dominator.dm"
#include "code\game\gamemodes\gang\gang.dm"
@@ -340,6 +353,7 @@
#include "code\game\gamemodes\miniantags\revenant\revenant_abilities.dm"
#include "code\game\gamemodes\miniantags\revenant\revenant_blight.dm"
#include "code\game\gamemodes\miniantags\revenant\revenant_spawn_event.dm"
+#include "code\game\gamemodes\miniantags\sintouched\objectives.dm"
#include "code\game\gamemodes\miniantags\slaughter\slaughter.dm"
#include "code\game\gamemodes\miniantags\slaughter\slaughterevent.dm"
#include "code\game\gamemodes\nuclear\nuclear.dm"
@@ -834,6 +848,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
+#include "code\modules\admin\verbs\shuttles.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
@@ -911,6 +926,7 @@
#include "code\modules\awaymissions\maploader\writer.dm"
#include "code\modules\awaymissions\mission_code\Academy.dm"
#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm"
+#include "code\modules\awaymissions\mission_code\Cabin.dm"
#include "code\modules\awaymissions\mission_code\centcomAway.dm"
#include "code\modules\awaymissions\mission_code\challenge.dm"
#include "code\modules\awaymissions\mission_code\researchbase.dm"
@@ -1175,6 +1191,7 @@
#include "code\modules\jobs\job_types\science.dm"
#include "code\modules\jobs\job_types\security.dm"
#include "code\modules\jobs\job_types\silicon.dm"
+#include "code\modules\library\lib_demonomicon.dm"
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
@@ -1200,7 +1217,6 @@
#include "code\modules\mining\lavaland\necropolis_chests.dm"
#include "code\modules\mining\lavaland\weather.dm"
#include "code\modules\mining\lavaland\weather_types.dm"
-#include "code\modules\mining\lavaland\ruins\gym.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\interactive.dm"
#include "code\modules\mob\inventory.dm"
@@ -1469,6 +1485,7 @@
#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_teleporting.dm"
#include "code\modules\paperwork\clipboard.dm"
+#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
@@ -1518,6 +1535,7 @@
#include "code\modules\power\tesla\generator.dm"
#include "code\modules\procedural mapping\mapGenerator.dm"
#include "code\modules\procedural mapping\mapGeneratorModule.dm"
+#include "code\modules\procedural mapping\mapGeneratorObj.dm"
#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
@@ -1642,6 +1660,7 @@
#include "code\modules\shuttle\computer.dm"
#include "code\modules\shuttle\emergency.dm"
#include "code\modules\shuttle\ferry.dm"
+#include "code\modules\shuttle\manipulator.dm"
#include "code\modules\shuttle\shuttle.dm"
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
@@ -1654,6 +1673,8 @@
#include "code\modules\spells\spell_types\charge.dm"
#include "code\modules\spells\spell_types\conjure.dm"
#include "code\modules\spells\spell_types\construct_spells.dm"
+#include "code\modules\spells\spell_types\demon.dm"
+#include "code\modules\spells\spell_types\demon_boons.dm"
#include "code\modules\spells\spell_types\dumbfire.dm"
#include "code\modules\spells\spell_types\emplosion.dm"
#include "code\modules\spells\spell_types\ethereal_jaunt.dm"