diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency_medisim.dmm
new file mode 100644
index 00000000000..2bab1c11380
--- /dev/null
+++ b/_maps/shuttles/emergency_medisim.dmm
@@ -0,0 +1,2401 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aB" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"aG" = (
+/turf/closed/indestructible/fakeglass,
+/area/shuttle/escape/simulation)
+"aS" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/structure/closet/emcloset,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"cc" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"cL" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"dg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"eb" = (
+/obj/effect/turf_decal/stripes{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"eu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 9
+ },
+/obj/structure/railing/corner,
+/turf/template_noop,
+/area/shuttle/escape)
+"eX" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/railing,
+/turf/template_noop,
+/area/shuttle/escape)
+"fa" = (
+/obj/machinery/door/airlock/external{
+ name = "Engine Maintenance Access"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"ft" = (
+/obj/machinery/computer/med_data,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"fL" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"fW" = (
+/obj/item/reagent_containers/glass/bottle/epinephrine{
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/glass/bottle/multiver{
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/glass/bottle/epinephrine{
+ pixel_x = -3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/glass/bottle/multiver{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 3;
+ pixel_y = -2
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 4;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/syringe/epinephrine{
+ pixel_x = 2;
+ pixel_y = 8
+ },
+/obj/structure/table/reinforced,
+/obj/item/binoculars,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"gb" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"gj" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/shuttle/escape)
+"gt" = (
+/obj/item/candle/infinite{
+ anchored = 1;
+ pixel_y = 8
+ },
+/obj/structure/table/wood/fancy/blue,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"gP" = (
+/obj/structure/rack,
+/obj/item/toy/crayon/blue,
+/obj/item/toy/crayon/blue{
+ pixel_x = 8
+ },
+/obj/item/toy/crayon/blue{
+ pixel_x = 4
+ },
+/obj/item/toy/crayon/blue{
+ pixel_x = -4
+ },
+/turf/open/floor/plasteel/chapel{
+ dir = 1
+ },
+/area/shuttle/escape/simulation)
+"he" = (
+/obj/structure/rack,
+/obj/item/reagent_containers/food/drinks/soda_cans/tonic,
+/obj/item/reagent_containers/food/drinks/soda_cans/tonic,
+/obj/item/reagent_containers/food/drinks/soda_cans/tonic,
+/obj/item/reagent_containers/food/drinks/soda_cans/tonic,
+/turf/open/floor/plasteel/chapel{
+ dir = 4
+ },
+/area/shuttle/escape/simulation)
+"ho" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"hr" = (
+/obj/structure/table/optable,
+/obj/item/surgical_drapes,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"ht" = (
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"hw" = (
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"hV" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 9
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"il" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"in" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger{
+ active_power_usage = 0;
+ idle_power_usage = 0;
+ use_power = 0
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"ir" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"iQ" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"jf" = (
+/turf/open/floor/plasteel/chapel{
+ dir = 8
+ },
+/area/shuttle/escape/simulation)
+"jQ" = (
+/obj/structure/rack,
+/obj/item/toy/crayon/red{
+ pixel_x = -4
+ },
+/obj/item/toy/crayon/red{
+ pixel_x = 4
+ },
+/obj/item/toy/crayon/red,
+/obj/item/toy/crayon/red,
+/obj/item/toy/crayon/red{
+ pixel_x = 8
+ },
+/turf/open/floor/plasteel/chapel{
+ dir = 8
+ },
+/area/shuttle/escape/simulation)
+"jV" = (
+/obj/structure/railing/corner,
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"jY" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"km" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/rack,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"ku" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 10
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"kB" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing,
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"kO" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"kS" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"lg" = (
+/obj/structure/fluff/big_chain{
+ pixel_y = 9
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/chasm,
+/area/shuttle/escape/simulation)
+"ll" = (
+/obj/item/scalpel{
+ pixel_y = 12
+ },
+/obj/item/circular_saw,
+/obj/item/retractor{
+ pixel_x = 4
+ },
+/obj/item/hemostat{
+ pixel_x = -4
+ },
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/mask/surgical,
+/obj/structure/table/reinforced,
+/obj/item/surgicaldrill,
+/obj/item/cautery,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"ls" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"mq" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"np" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"nA" = (
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"nD" = (
+/obj/machinery/stasis,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"oK" = (
+/obj/machinery/teambuilder/blue,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"oY" = (
+/obj/effect/gibspawner/human,
+/turf/open/floor/plating,
+/area/shuttle/escape/simulation)
+"pD" = (
+/obj/structure/trap/ctf/blue{
+ name = "historically accurate magical runes"
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"pF" = (
+/turf/closed/indestructible/iron,
+/area/shuttle/escape/simulation)
+"pL" = (
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"qm" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"qC" = (
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -3;
+ pixel_y = 1
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = -1
+ },
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 3;
+ pixel_y = -5
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"qM" = (
+/obj/item/defibrillator/loaded,
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"qS" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"qY" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"rE" = (
+/obj/item/storage/firstaid/toxin,
+/obj/item/storage/firstaid/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"rG" = (
+/obj/machinery/capture_the_flag/medisim/blue,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"rK" = (
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"rQ" = (
+/obj/item/ctf/blue/medisim,
+/turf/open/floor/mineral/diamond,
+/area/shuttle/escape/simulation)
+"rT" = (
+/obj/structure/mineral_door/iron,
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"rU" = (
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"rX" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"sk" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"so" = (
+/obj/structure/table/reinforced,
+/obj/item/binoculars,
+/obj/item/binoculars,
+/obj/item/binoculars,
+/obj/item/instrument/musicalmoth,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"sy" = (
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"sH" = (
+/obj/effect/turf_decal/siding/wood/end,
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"sS" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/escape)
+"tP" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"un" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"uo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"uG" = (
+/obj/structure/bed/pod{
+ desc = "An old medical bed, just waiting for replacement with something up to date.";
+ name = "medical bed"
+ },
+/obj/structure/curtain,
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"uM" = (
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 11
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"uW" = (
+/obj/structure/rack,
+/obj/item/documents/syndicate/blue,
+/turf/open/floor/plasteel/chapel{
+ dir = 8
+ },
+/area/shuttle/escape/simulation)
+"vl" = (
+/obj/item/food/egg/blue,
+/obj/structure/rack,
+/turf/open/floor/plasteel/chapel,
+/area/shuttle/escape/simulation)
+"wc" = (
+/obj/structure/flora/ausbushes/brflowers,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"wf" = (
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"wX" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/shuttle/escape)
+"xi" = (
+/obj/structure/flora/ausbushes/genericbush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"xy" = (
+/obj/machinery/shower{
+ dir = 8;
+ name = "emergency shower"
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"xP" = (
+/obj/structure/grille/indestructable,
+/turf/open/floor/plating,
+/area/shuttle/escape/simulation)
+"yw" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"yx" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"zJ" = (
+/obj/structure/flora/ausbushes/grassybush,
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"Aa" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"Al" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/structure/rack,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/obj/item/flashlight/flare/torch,
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"Aw" = (
+/obj/machinery/door/airlock/external{
+ name = "Engine Maintenance Access";
+ req_access_txt = "19"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Be" = (
+/obj/structure/sign/departments/medbay/alt,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"BO" = (
+/obj/structure/closet/crate{
+ name = "emergency supplies crate"
+ },
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/emergency,
+/obj/item/flashlight/flare{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/flashlight/flare{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Ck" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Cv" = (
+/obj/machinery/drone_dispenser{
+ desc = "A hefty machine that periodically creates a pair of binoculars. Really, Nanotrasen? We're getting this lazy?";
+ dispense_type = /obj/item/binoculars;
+ end_create_message = "dispenses a pair of binoculars.";
+ glass_cost = 0;
+ maximum_idle = 1;
+ metal_cost = 0;
+ name = "binoculars fabricator";
+ power_used = 0;
+ starting_amount = 25000
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Cy" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"CM" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"CT" = (
+/obj/item/kirbyplants{
+ icon_state = "plant-21";
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"CY" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Do" = (
+/obj/structure/flora/ausbushes/stalkybush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"DO" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/crowbar,
+/obj/item/storage/firstaid/fire,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = 32
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Eo" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"Et" = (
+/obj/structure/railing,
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"EN" = (
+/turf/template_noop,
+/area/template_noop)
+"EV" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"EZ" = (
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Fd" = (
+/obj/structure/closet/emcloset,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Fs" = (
+/obj/item/candle/infinite{
+ anchored = 1;
+ pixel_y = 8
+ },
+/obj/structure/table/wood/fancy/red,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"FK" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"FT" = (
+/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/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ 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/machinery/door/morgue{
+ name = "Emergency Supplies"
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Gv" = (
+/obj/machinery/computer{
+ desc = "A computer calculating the medieval times. Uh, wow. Is this bad boy quantum?";
+ dir = 8;
+ name = "Reality Simulation Computer"
+ },
+/turf/open/floor/circuit/green/anim,
+/area/shuttle/escape)
+"GQ" = (
+/obj/structure/punji_sticks/spikes,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"Ho" = (
+/turf/open/floor/plasteel/chapel{
+ dir = 1
+ },
+/area/shuttle/escape/simulation)
+"HE" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/tiled/blue,
+/area/shuttle/escape)
+"HR" = (
+/obj/structure/flora/ausbushes/lavendergrass,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"Io" = (
+/obj/item/banner/blue{
+ anchored = 1
+ },
+/turf/closed/indestructible/iron,
+/area/shuttle/escape/simulation)
+"Is" = (
+/obj/structure/flora/ausbushes/fernybush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"JC" = (
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"JD" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/glass,
+/area/shuttle/escape)
+"JU" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"Kb" = (
+/obj/structure/railing/corner,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Ki" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Kq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"Kw" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"KF" = (
+/obj/structure/table,
+/obj/item/toy/katana{
+ desc = "Complementary from NT for all those medieval simulation watchers.";
+ icon_state = "claymore";
+ inhand_icon_state = "claymore";
+ name = "replica claymore";
+ worn_icon_state = "claymore"
+ },
+/obj/item/food/popcorn,
+/obj/item/binoculars,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"LA" = (
+/obj/item/banner/red{
+ anchored = 1
+ },
+/turf/closed/indestructible/iron,
+/area/shuttle/escape/simulation)
+"Mf" = (
+/obj/structure/flora/ausbushes/ppflowers,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"Mt" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Escape Shuttle Infirmary"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"MN" = (
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"MP" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Ng" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Nm" = (
+/turf/open/floor/plasteel/chapel{
+ dir = 4
+ },
+/area/shuttle/escape/simulation)
+"NN" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Cockpit";
+ req_access_txt = "19"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"NS" = (
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"NX" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Cargo Bay Airlock"
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Ob" = (
+/obj/structure/table/reinforced,
+/obj/item/folder/red{
+ pixel_x = 3
+ },
+/obj/item/folder/white{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/obj/item/book/manual/wiki/security_space_law{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Ov" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"OA" = (
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"OZ" = (
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Pb" = (
+/obj/machinery/computer/atmos_alert{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Pi" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Pr" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"Pv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/punji_sticks/spikes,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"QC" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"QH" = (
+/obj/structure/rack,
+/obj/item/food/egg/red,
+/turf/open/floor/plasteel/chapel{
+ dir = 4
+ },
+/area/shuttle/escape/simulation)
+"QR" = (
+/obj/structure/flora/ausbushes/reedbush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"QS" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ dir = 1;
+ dwidth = 6;
+ height = 26;
+ name = "Medisim emergency shuttle";
+ width = 25
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"Rj" = (
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating,
+/area/shuttle/escape/simulation)
+"Rl" = (
+/turf/open/floor/glass,
+/area/shuttle/escape)
+"Ry" = (
+/obj/structure/flora/ausbushes/sunnybush,
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"RB" = (
+/obj/structure/sign/departments/security,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"RJ" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"RK" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"RV" = (
+/obj/structure/rack,
+/obj/item/tank/internals/oxygen/red,
+/obj/item/clothing/suit/fire/firefighter,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/hardhat/red,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Sf" = (
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -3;
+ pixel_y = 1
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = -1
+ },
+/obj/item/storage/toolbox/emergency{
+ pixel_x = 3;
+ pixel_y = -5
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Si" = (
+/obj/structure/rack,
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/weldingtool,
+/obj/item/wirecutters,
+/obj/item/stack/cable_coil,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"Su" = (
+/turf/open/floor/plasteel/chapel,
+/area/shuttle/escape/simulation)
+"SA" = (
+/obj/structure/flora/ausbushes/palebush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"SC" = (
+/obj/structure/rack,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/turf/open/floor/plasteel/chapel,
+/area/shuttle/escape/simulation)
+"SF" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/sand,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"ST" = (
+/obj/structure/flora/ausbushes/ywflowers,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"SV" = (
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"To" = (
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/o2{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/storage/firstaid/toxin{
+ pixel_x = -4;
+ pixel_y = 3
+ },
+/obj/item/healthanalyzer{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/lazarus_injector,
+/mob/living/simple_animal/bot/medbot{
+ name = "\improper emergency medibot";
+ pixel_x = -3;
+ pixel_y = 2
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"TE" = (
+/turf/open/chasm,
+/area/shuttle/escape/simulation)
+"TI" = (
+/obj/item/binoculars,
+/obj/structure/table/reinforced,
+/obj/item/binoculars,
+/obj/item/binoculars,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"TZ" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood/corner,
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"Ua" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 10
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"UH" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"Va" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing,
+/turf/template_noop,
+/area/shuttle/escape)
+"Vn" = (
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_x = -32
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Vv" = (
+/obj/structure/rack,
+/obj/item/documents/syndicate/red,
+/turf/open/floor/plasteel/chapel{
+ dir = 1
+ },
+/area/shuttle/escape/simulation)
+"VF" = (
+/obj/structure/flora/ausbushes/pointybush,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"VG" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"Wb" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/fluff/big_chain{
+ pixel_y = 9
+ },
+/turf/open/chasm,
+/area/shuttle/escape/simulation)
+"Wx" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"WA" = (
+/obj/structure/closet/crate/large,
+/obj/item/clothing/suit/armor/vest/cuirass,
+/obj/item/clothing/suit/armor/vest/cuirass,
+/obj/item/clothing/suit/armor/vest/cuirass,
+/obj/item/paper/crumpled/retired_designs,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"WN" = (
+/obj/machinery/light,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"WQ" = (
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/siding/wood/corner,
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Xk" = (
+/obj/structure/closet/crate/critter,
+/mob/living/simple_animal/hostile/lizard/space{
+ name = "Stows-Away"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Xq" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"Xv" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"Xw" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/sandy_dirt,
+/area/shuttle/escape/simulation)
+"XQ" = (
+/obj/structure/flora/ausbushes,
+/turf/open/floor/plating/grass,
+/area/shuttle/escape/simulation)
+"XR" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"XX" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Ya" = (
+/obj/structure/table/reinforced,
+/obj/item/restraints/handcuffs{
+ pixel_y = 3
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Ye" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/box/handcuffs{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/storage/lockbox/loyalty,
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Yj" = (
+/turf/open/floor/carpet/blue,
+/area/shuttle/escape/simulation)
+"Yk" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"Yp" = (
+/obj/machinery/teambuilder/red,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"Yu" = (
+/obj/structure/trap/ctf/red{
+ name = "historically accurate magical runes"
+ },
+/turf/open/floor/stone,
+/area/shuttle/escape/simulation)
+"YB" = (
+/obj/structure/table,
+/obj/machinery/recharger,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = -32
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"YC" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"YT" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"YU" = (
+/turf/open/floor/carpet/red,
+/area/shuttle/escape/simulation)
+"Zf" = (
+/obj/structure/rack,
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/weldingtool,
+/obj/item/wirecutters,
+/obj/item/stack/cable_coil,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Zk" = (
+/obj/machinery/capture_the_flag/medisim/red,
+/turf/open/indestructible/binary,
+/area/shuttle/escape/simulation)
+"Zv" = (
+/obj/item/ctf/red/medisim,
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape/simulation)
+"Zx" = (
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"ZB" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ZI" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape/simulation)
+"ZM" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+gj
+gj
+Xv
+ZB
+ZB
+ZB
+Xv
+gj
+gj
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+"}
+(2,1,1) = {"
+EN
+EN
+EN
+wX
+gj
+Ck
+Ck
+Ck
+gj
+wX
+ZB
+ZB
+JC
+qS
+Pb
+ZB
+ZB
+wX
+gj
+Ck
+Ck
+Ck
+gj
+wX
+EN
+EN
+EN
+"}
+(3,1,1) = {"
+EN
+EN
+eu
+ho
+ku
+CY
+CY
+CY
+hV
+wX
+Aw
+Rl
+JD
+JD
+JD
+Rl
+Aw
+wX
+Ua
+CY
+CY
+CY
+eu
+ho
+ku
+EN
+EN
+"}
+(4,1,1) = {"
+EN
+gj
+eX
+gj
+eX
+Xk
+fL
+eb
+tP
+Xv
+Xv
+DO
+Ki
+Zx
+Pi
+YB
+Xv
+Xv
+Va
+eb
+Ov
+WA
+eX
+gj
+eX
+gj
+EN
+"}
+(5,1,1) = {"
+Xv
+Xv
+fa
+Xv
+kB
+qC
+wX
+EN
+tP
+Xv
+Xv
+Xv
+Xv
+NN
+Xv
+Xv
+Xv
+Xv
+Va
+EN
+wX
+Zf
+ZM
+Xv
+fa
+Xv
+Xv
+"}
+(6,1,1) = {"
+Xv
+aS
+Zx
+Xv
+kO
+YC
+JU
+YC
+uo
+Xv
+CT
+Zx
+Zx
+cc
+Zx
+Zx
+CT
+Xv
+kO
+YC
+wX
+YC
+uo
+Xv
+Zx
+aS
+Xv
+"}
+(7,1,1) = {"
+aB
+EZ
+EZ
+Xv
+Xv
+Xv
+ZB
+Xv
+Xv
+Xv
+Zx
+Zx
+Kw
+Xv
+Pr
+Zx
+Zx
+Xv
+Xv
+Xv
+ZB
+Xv
+Xv
+Xv
+EZ
+EZ
+QS
+"}
+(8,1,1) = {"
+Xv
+Zx
+EZ
+EZ
+kS
+Zx
+Zx
+Zx
+kS
+Zx
+Zx
+EZ
+Kw
+ZB
+Pr
+EZ
+Zx
+EZ
+kS
+Zx
+Zx
+Zx
+kS
+EZ
+EZ
+Zx
+Xv
+"}
+(9,1,1) = {"
+aB
+cc
+EZ
+Xv
+Xv
+ZB
+ZB
+ZB
+Xv
+Xv
+Zx
+Zx
+Kw
+ZB
+Pr
+Zx
+Zx
+Xv
+Xv
+ZB
+ZB
+ZB
+Xv
+Xv
+EZ
+cc
+aB
+"}
+(10,1,1) = {"
+sS
+Xv
+Xv
+Xv
+EN
+EN
+EN
+EN
+EN
+Xv
+Xv
+Zx
+Kw
+Xv
+Pr
+Zx
+Xv
+Xv
+EN
+EN
+EN
+EN
+EN
+Xv
+Xv
+Xv
+sS
+"}
+(11,1,1) = {"
+EN
+EN
+Xv
+Xv
+Xv
+ZB
+ZB
+ZB
+Xv
+Xv
+FT
+Zx
+Zx
+kS
+Zx
+Zx
+FT
+Xv
+Xv
+ZB
+ZB
+ZB
+Xv
+Xv
+Xv
+EN
+EN
+"}
+(12,1,1) = {"
+EN
+Xv
+sS
+hr
+ll
+qM
+so
+un
+HE
+Xv
+sS
+Zx
+Rl
+Rl
+Rl
+Zx
+sS
+Xv
+Vn
+XX
+XX
+XX
+Cy
+in
+sS
+Xv
+EN
+"}
+(13,1,1) = {"
+EN
+Xv
+ft
+il
+nA
+nA
+nA
+nA
+nA
+nA
+Mt
+nA
+Rl
+Rl
+Rl
+ls
+RK
+ls
+ls
+ls
+ls
+ls
+ls
+Ya
+Ob
+Xv
+EN
+"}
+(14,1,1) = {"
+EN
+Xv
+fW
+ir
+nD
+rE
+sy
+uG
+nA
+nA
+Be
+EV
+Rl
+Rl
+Rl
+WN
+RB
+ls
+ls
+Yk
+Yk
+Yk
+ls
+ls
+Ye
+Xv
+EN
+"}
+(15,1,1) = {"
+EN
+Xv
+Xv
+pF
+aG
+aG
+aG
+pF
+uM
+xy
+ZB
+Zx
+Zx
+hw
+Zx
+Zx
+ZB
+TI
+TI
+pF
+aG
+aG
+aG
+pF
+Xv
+Xv
+EN
+"}
+(16,1,1) = {"
+EN
+Xv
+pF
+pF
+oK
+rG
+oK
+pF
+pF
+Xv
+Xv
+ZB
+ZB
+NX
+ZB
+ZB
+Xv
+Xv
+pF
+pF
+Yp
+Zk
+Yp
+pF
+pF
+Xv
+EN
+"}
+(17,1,1) = {"
+EN
+aG
+aG
+NS
+pD
+oK
+pD
+NS
+aG
+aG
+Xv
+Fd
+hw
+hw
+hw
+Fd
+Xv
+aG
+aG
+NS
+Yu
+Yp
+Yu
+NS
+aG
+aG
+EN
+"}
+(18,1,1) = {"
+EN
+aG
+gt
+Su
+NS
+pD
+NS
+Nm
+gt
+aG
+To
+hw
+hw
+hw
+hw
+hw
+RV
+aG
+Fs
+Su
+NS
+Yu
+NS
+Nm
+Fs
+aG
+EN
+"}
+(19,1,1) = {"
+EN
+aG
+gP
+jf
+Yj
+Yj
+Yj
+Ho
+uW
+aG
+BO
+FK
+KF
+FK
+KF
+FK
+Sf
+aG
+Vv
+jf
+YU
+YU
+YU
+Ho
+jQ
+aG
+EN
+"}
+(20,1,1) = {"
+EN
+aG
+he
+Su
+Yj
+rQ
+Yj
+Nm
+vl
+aG
+Cv
+hw
+hw
+hw
+hw
+hw
+Si
+aG
+QH
+Su
+YU
+Zv
+YU
+Nm
+SC
+aG
+EN
+"}
+(21,1,1) = {"
+EN
+pF
+gt
+jf
+Yj
+Yj
+Yj
+Ho
+gt
+pF
+hw
+FK
+FK
+FK
+FK
+FK
+hw
+pF
+Fs
+jf
+YU
+YU
+YU
+Ho
+Fs
+pF
+EN
+"}
+(22,1,1) = {"
+EN
+pF
+Nm
+Su
+Nm
+NS
+Su
+Nm
+Su
+pF
+iQ
+Gv
+Gv
+Gv
+Gv
+Gv
+np
+pF
+Nm
+Su
+Nm
+NS
+Su
+Nm
+Su
+pF
+EN
+"}
+(23,1,1) = {"
+EN
+pF
+pF
+pF
+aG
+rT
+aG
+pF
+pF
+pF
+aG
+aG
+aG
+aG
+aG
+aG
+aG
+pF
+pF
+pF
+aG
+rT
+aG
+pF
+pF
+pF
+EN
+"}
+(24,1,1) = {"
+EN
+EN
+pF
+NS
+NS
+NS
+NS
+pF
+wc
+MN
+GQ
+Pv
+GQ
+GQ
+GQ
+GQ
+GQ
+MN
+VF
+pF
+NS
+NS
+NS
+NS
+pF
+EN
+EN
+"}
+(25,1,1) = {"
+pF
+pF
+pF
+jV
+pF
+TZ
+pF
+pF
+MN
+MN
+Do
+MN
+Mf
+MN
+MN
+Ry
+SA
+dg
+MN
+pF
+pF
+TZ
+pF
+rK
+pF
+pF
+pF
+"}
+(26,1,1) = {"
+pF
+Rj
+xP
+Et
+TE
+rX
+lg
+Io
+ht
+MN
+MN
+MN
+MN
+MN
+dg
+MN
+MN
+MN
+Kb
+LA
+Wb
+rX
+TE
+VG
+xP
+oY
+pF
+"}
+(27,1,1) = {"
+pF
+pF
+pF
+Et
+TE
+rX
+TE
+TE
+qY
+yw
+MN
+HR
+MN
+MP
+gb
+gb
+MN
+yw
+Wx
+TE
+TE
+rX
+TE
+VG
+pF
+pF
+pF
+"}
+(28,1,1) = {"
+EN
+EN
+pF
+Et
+TE
+RJ
+Aa
+Aa
+wf
+yx
+gb
+gb
+MP
+OA
+OZ
+gb
+SF
+yx
+WQ
+Aa
+Aa
+ZI
+TE
+VG
+pF
+EN
+EN
+"}
+(29,1,1) = {"
+pF
+pF
+pF
+Et
+lg
+TE
+TE
+TE
+qY
+yx
+MN
+gb
+Ng
+OZ
+QC
+MN
+MN
+yx
+Xq
+TE
+TE
+TE
+lg
+VG
+pF
+pF
+pF
+"}
+(30,1,1) = {"
+pF
+Rj
+xP
+Eo
+TE
+TE
+TE
+Io
+SV
+MN
+MN
+MN
+MN
+MN
+MN
+MN
+MN
+MN
+Xw
+LA
+TE
+TE
+TE
+mq
+xP
+oY
+pF
+"}
+(31,1,1) = {"
+pF
+pF
+pF
+jY
+pF
+sk
+pF
+pF
+MN
+zJ
+MN
+Is
+MN
+dg
+QR
+MN
+ST
+dg
+MN
+pF
+pF
+sk
+pF
+rU
+pF
+pF
+pF
+"}
+(32,1,1) = {"
+EN
+EN
+pF
+Kq
+pL
+UH
+sH
+pF
+xi
+MN
+GQ
+GQ
+GQ
+GQ
+GQ
+GQ
+Pv
+MN
+XQ
+pF
+YT
+UH
+XR
+CM
+pF
+EN
+EN
+"}
+(33,1,1) = {"
+EN
+EN
+pF
+km
+qm
+pF
+pF
+pF
+pF
+pF
+aG
+aG
+aG
+aG
+aG
+aG
+aG
+pF
+pF
+pF
+pF
+pF
+cL
+Al
+pF
+EN
+EN
+"}
+(34,1,1) = {"
+EN
+EN
+pF
+pF
+pF
+pF
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+EN
+pF
+pF
+pF
+pF
+EN
+EN
+"}
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index a8104a98f8a..8e7d053366f 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -28,6 +28,7 @@
#define SWEDISH /datum/mutation/human/swedish
#define CHAV /datum/mutation/human/chav
#define ELVIS /datum/mutation/human/elvis
+#define MEDIEVAL /datum/mutation/human/medieval
#define RADIOACTIVE /datum/mutation/human/radioactive
#define GLOWY /datum/mutation/human/glow
#define ANTIGLOWY /datum/mutation/human/glow/anti
diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
index 175304e2337..e1cb5cd3fc4 100644
--- a/code/__DEFINES/language.dm
+++ b/code/__DEFINES/language.dm
@@ -10,6 +10,7 @@
#define LANGUAGE_ABSORB "absorb"
#define LANGUAGE_APHASIA "aphasia"
+#define LANGUAGE_CTF "ctf"
#define LANGUAGE_CULTIST "cultist"
#define LANGUAGE_CURATOR "curator"
#define LANGUAGE_GLAND "gland"
@@ -20,3 +21,4 @@
#define LANGUAGE_SOFTWARE "software"
#define LANGUAGE_STONER "stoner"
#define LANGUAGE_VOICECHANGE "voicechange"
+
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index d69994a3f7c..b4eb66f3c51 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -89,4 +89,5 @@
//Shuttle unlocks
#define SHUTTLE_UNLOCK_ALIENTECH "abductor"
#define SHUTTLE_UNLOCK_BUBBLEGUM "bubblegum"
+#define SHUTTLE_UNLOCK_MEDISIM "holodeck"
#define SHUTTLE_UNLOCK_NARNAR "narnar"
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index f550005b8c7..bfced97bb00 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -110,6 +110,7 @@
if(!isfloorturf(random_location))
continue
var/turf/open/floor/F = random_location
+
if(!F.air)
continue
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index d0b8ad14498..696efea36a7 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -208,3 +208,43 @@
..()
owner.remove_language(/datum/language/beachbum, TRUE, TRUE, LANGUAGE_STONER)
owner.remove_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER)
+
+/datum/mutation/human/medieval
+ name = "Medieval"
+ desc = "A horrible mutation originating from the distant past, thought to have once been a common gene in all of old world Europe."
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel like seeking the holy grail!"
+ text_lose_indication = "You no longer feel like seeking anything."
+
+/datum/mutation/human/medieval/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ RegisterSignal(owner, COMSIG_MOB_SAY, .proc/handle_speech)
+
+/datum/mutation/human/medieval/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ UnregisterSignal(owner, COMSIG_MOB_SAY)
+
+/datum/mutation/human/medieval/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ message = " [message] "
+ var/list/medieval_words = strings("medieval_replacement.json", "medieval")
+ var/list/startings = strings("medieval_replacement.json", "startings")
+ for(var/key in medieval_words)
+ var/value = medieval_words[key]
+ if(islist(value))
+ value = pick(value)
+ if(uppertext(key) == key)
+ value = uppertext(value)
+ if(capitalize(key) == key)
+ value = capitalize(value)
+ message = replacetextEx(message,regex("\b[REGEX_QUOTE(key)]\b","ig"), value)
+ message = trim(message)
+ var/chosen_starting = pick(startings)
+ message = "[chosen_starting] [message]"
+
+ speech_args[SPEECH_MESSAGE] = message
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index d667b88c7c5..3337420eccd 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -235,6 +235,16 @@
admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot."
credit_cost = CARGO_CRATE_VALUE * 20
+/datum/map_template/shuttle/emergency/medisim
+ suffix = "medisim"
+ name = "Medieval Reality Simulation Dome"
+ description = "A state of the art simulation dome, loaded onto your shuttle! Watch and laugh at how petty humanity used to be before it reached the stars. Guaranteed to be at least 40% historically accurate."
+ admin_notes = "Ghosts can spawn in and fight as knights or archers. The CTF auto restarts, so no admin intervention necessary."
+ credit_cost = 20000
+
+/datum/map_template/shuttle/emergency/medisim/prerequisites_met()
+ return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM]
+
/datum/map_template/shuttle/emergency/discoinferno
suffix = "discoinferno"
name = "Disco Inferno"
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index c9237f1629d..ee041b25509 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -144,6 +144,12 @@
name = "Luxurious Emergency Shuttle"
area_flags = NOTELEPORT
+/area/shuttle/escape/simulation
+ name = "Medieval Reality Simulation Dome"
+ icon_state = "shuttlectf"
+ area_flags = NOTELEPORT
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+
/area/shuttle/escape/arena
name = "The Arena"
area_flags = NOTELEPORT
diff --git a/code/game/machinery/teambuilder.dm b/code/game/machinery/teambuilder.dm
index 621d8a33509..daa2a6a9379 100644
--- a/code/game/machinery/teambuilder.dm
+++ b/code/game/machinery/teambuilder.dm
@@ -14,16 +14,20 @@
///What radio station is your radio set to when crossed (And human)?
var/team_radio = FREQ_COMMON
+/obj/machinery/teambuilder/Initialize()
+ . = ..()
+ add_filter("teambuilder", 2, list("type" = "outline", "color" = team_color, "size" = 2))
+
/obj/machinery/teambuilder/examine_more(mob/user)
. = ..()
. += "You see a hastily written note on the side, it says '1215-1217, PICK A SIDE'."
/obj/machinery/teambuilder/Crossed(atom/movable/AM, oldloc)
. = ..()
- if(AM.color)
+ if(AM.get_filter("teambuilder"))
return
if(isliving(AM) && team_color)
- AM.color = team_color
+ AM.add_filter("teambuilder", 2, list("type" = "outline", "color" = team_color, "size" = 2))
if(ishuman(AM) && team_radio)
var/mob/living/carbon/human/human = AM
var/obj/item/radio/Radio = human.ears
@@ -34,13 +38,11 @@
/obj/machinery/teambuilder/red
name = "Teambuilding Machine (Red)"
desc = "A machine that, when passed, colors you based on the color of your team. Go red team!"
- color = "#ff0000"
- team_color = "#ff0000"
+ team_color = COLOR_RED
team_radio = FREQ_CTF_RED
/obj/machinery/teambuilder/blue
name = "Teambuilding Machine (Blue)"
desc = "A machine that, when passed, colors you based on the color of your team. Go blue team!"
- color = "#0000ff"
- team_color = "#0000ff"
+ team_color = COLOR_BLUE
team_radio = FREQ_CTF_BLUE
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e3bb252f26b..b702d9bdd1d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -349,6 +349,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(anchored)
return
+ . = TRUE
+
if(resistance_flags & ON_FIRE)
var/mob/living/carbon/C = user
var/can_handle_hot = FALSE
@@ -392,10 +394,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
return
+ . = FALSE
pickup(user)
add_fingerprint(user)
if(!user.put_in_active_hand(src, FALSE, FALSE))
user.dropItemToGround(src)
+ return TRUE
/obj/item/proc/allow_attack_hand_drop(mob/user)
return TRUE
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index e0e5c382200..49079e6bf88 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -169,7 +169,6 @@
underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay
underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille
-
/turf/closed/indestructible/opsglass
name = "window"
icon = 'icons/obj/smooth_structures/plastitanium_window.dmi'
@@ -240,6 +239,17 @@
underlay_appearance.icon_state = "necro1"
return TRUE
+/turf/closed/indestructible/iron
+ name = "impervious metal wall"
+ desc = "A wall with tough metal plating."
+ icon = 'icons/turf/walls/iron_wall.dmi'
+ icon_state = "iron_wall-0"
+ base_icon_state = "iron_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS)
+ opacity = FALSE
+
/turf/closed/indestructible/riveted/boss
name = "necropolis wall"
desc = "A thick, seemingly indestructible stone wall."
diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm
index a1ea9605903..4de85a513e9 100644
--- a/code/game/turfs/open/floor/misc_floor.dm
+++ b/code/game/turfs/open/floor/misc_floor.dm
@@ -188,3 +188,13 @@
/turf/open/floor/plating/rust/rust_heretic_act()
return
+
+/turf/open/floor/stone
+ name = "stone brick floor"
+ desc = "Odd, really, how it looks exactly like the iron walls yet is stone instead of iron. Now, if that's really more of a complaint about\
+ the ironness of walls or the stoneness of the floors, that's really up to you. But have you really ever seen iron that dull? I mean, it\
+ makes sense for the station to have dull metal walls but we're talking how a rudimentary iron wall would be. Medieval ages didn't even\
+ use iron walls, iron walls are actually not even something that exists because iron is an expensive and not-so-great thing to build walls\
+ out of. It only makes sense in the context of space because you're trying to keep a freezing vacuum out. Is anyone following me on this? \
+ The idea of a \"rudimentary\" iron wall makes no sense at all! Is anything i'm even saying here true? Someone's gotta fact check this!"
+ icon_state = "stone_floor"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index a776b2eefa6..571f7225bb3 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2126,7 +2126,7 @@
else if(href_list["ctf_toggle"])
if(!check_rights(R_ADMIN))
return
- toggle_all_ctf(usr)
+ toggle_id_ctf(usr, "centcom")
else if(href_list["rebootworld"])
if(!check_rights(R_ADMIN))
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
index 8c319f145b3..0014e440d49 100644
--- a/code/modules/admin/verbs/secrets.dm
+++ b/code/modules/admin/verbs/secrets.dm
@@ -152,7 +152,7 @@
dat += ""
holder << browse(dat, "window=fingerprints;size=440x410")
if("ctfbutton")
- toggle_all_ctf(holder)
+ toggle_id_ctf(holder, "centcom")
if("tdomereset")
var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
if(delete_mobs == "Cancel")
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index e6fdcbd6437..49ddbc67fa8 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -7,8 +7,6 @@
#define AMMO_DROP_LIFETIME 300
#define CTF_REQUIRED_PLAYERS 4
-
-
/obj/item/ctf
name = "banner"
icon = 'icons/obj/banner.dmi'
@@ -30,6 +28,8 @@
var/anyonecanpickup = TRUE
var/obj/effect/ctf/flag_reset/reset
var/reset_path = /obj/effect/ctf/flag_reset
+ /// Which area we announce updates on the flag to. Should just generally be the area of the arena.
+ var/game_area = /area/ctf
/obj/item/ctf/Destroy()
QDEL_NULL(reset)
@@ -39,24 +39,33 @@
. = ..()
if(!reset)
reset = new reset_path(get_turf(src))
+ RegisterSignal(src, COMSIG_PARENT_PREQDELETED, .proc/reset_flag) //just in case CTF has some map hazards (read: chasms).
/obj/item/ctf/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/two_handed)
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
/obj/item/ctf/process()
- if(is_ctf_target(loc)) //don't reset from someone's hands.
+ if(is_ctf_target(loc)) //pickup code calls temporary drops to test things out, we need to make sure the flag doesn't reset from
return PROCESS_KILL
if(world.time > reset_cooldown)
- forceMove(get_turf(src.reset))
- for(var/mob/M in GLOB.player_list)
- var/area/mob_area = get_area(M)
- if(istype(mob_area, /area/ctf))
- to_chat(M, "\The [src] has been returned to base!")
- STOP_PROCESSING(SSobj, src)
+ reset_flag()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
+/obj/item/ctf/proc/reset_flag(capture = FALSE)
+ SIGNAL_HANDLER
+
+ forceMove(get_turf(src.reset))
+ for(var/mob/M in GLOB.player_list)
+ var/area/mob_area = get_area(M)
+ if(istype(mob_area, game_area))
+ if(!capture)
+ to_chat(M, "[src] has been returned to the base!")
+ STOP_PROCESSING(SSobj, src)
+ return TRUE //so if called by a signal, it doesn't delete
+
+//working with attack hand feels like taking my brain and putting it through an industrial pill press so i'm gonna be a bit liberal with the comments
/obj/item/ctf/attack_hand(mob/living/user)
+ //pre normal check item stuff, this is for our special flag checks
if(!is_ctf_target(user) && !anyonecanpickup)
to_chat(user, "Non-players shouldn't be moving the flag!")
return
@@ -66,30 +75,30 @@
if(loc == user)
if(!user.dropItemToGround(src))
return
- anchored = FALSE
- pickup(user)
- if(!user.put_in_active_hand(src))
- dropped(user)
- return
- user.set_anchored(TRUE)
- user.status_flags &= ~CANPUSH
for(var/mob/M in GLOB.player_list)
var/area/mob_area = get_area(M)
- if(istype(mob_area, /area/ctf))
- to_chat(M, "\The [src] has been taken!")
+ if(istype(mob_area, game_area))
+ to_chat(M, "\The [initial(src.name)] has been taken!")
STOP_PROCESSING(SSobj, src)
- ..()
+ anchored = FALSE //normal checks need this to be FALSE to pass
+ . = ..() //this is the actual normal item checks
+ if(.) //only apply these flag passives
+ anchored = TRUE
+ return
+ //passing means the user picked up the flag so we can now apply this
+ user.set_anchored(TRUE)
+ user.status_flags &= ~CANPUSH
/obj/item/ctf/dropped(mob/user)
..()
user.set_anchored(FALSE)
user.status_flags |= CANPUSH
- reset_cooldown = world.time + 200 //20 seconds
+ reset_cooldown = world.time + 20 SECONDS
START_PROCESSING(SSobj, src)
for(var/mob/M in GLOB.player_list)
var/area/mob_area = get_area(M)
- if(istype(mob_area, /area/ctf))
- to_chat(M, "\The [src] has been dropped!")
+ if(istype(mob_area, game_area))
+ to_chat(M, "\The [initial(name)] has been dropped!")
anchored = TRUE
@@ -129,16 +138,25 @@
desc = "This is where a blue banner used to play capture the flag \
would go."
-/proc/toggle_all_ctf(mob/user)
+/proc/toggle_id_ctf(user, activated_id, automated = FALSE)
var/ctf_enabled = FALSE
var/area/A
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(activated_id != CTF.game_id)
+ continue
ctf_enabled = CTF.toggle_ctf()
A = get_area(CTF)
for(var/obj/machinery/power/emitter/E in A)
E.active = ctf_enabled
- message_admins("[key_name_admin(user)] has [ctf_enabled? "enabled" : "disabled"] CTF!")
- notify_ghosts("CTF has been [ctf_enabled? "enabled" : "disabled"]!",'sound/effects/ghost2.ogg')
+ if(user)
+ message_admins("[key_name_admin(user)] has [ctf_enabled ? "enabled" : "disabled"] CTF!")
+ else if(automated)
+ message_admins("CTF has finished a round and automatically restarted.")
+ notify_ghosts("CTF has automatically restarted after a round finished in [A]!",'sound/effects/ghost2.ogg')
+ else
+ message_admins("The players have spoken! Voting has enabled CTF!")
+ if(!automated)
+ notify_ghosts("CTF has been [ctf_enabled? "enabled" : "disabled"] in [A]!",'sound/effects/ghost2.ogg')
/obj/machinery/capture_the_flag
name = "CTF Controller"
@@ -146,6 +164,9 @@
icon = 'icons/obj/device.dmi'
icon_state = "syndbeacon"
resistance_flags = INDESTRUCTIBLE
+ var/game_id = "centcom"
+
+ var/victory_rejoin_text = "Teams have been cleared. Click on the machines to vote to begin another round."
var/team = WHITE_TEAM
var/team_span = ""
//Capture the Flag scoring
@@ -156,16 +177,20 @@
var/control_points = 0
var/control_points_to_win = 180
var/list/team_members = list()
+ ///assoc list: mob = outfit datum (class)
var/list/spawned_mobs = list()
var/list/recently_dead_ckeys = list()
var/ctf_enabled = FALSE
- var/ctf_gear = /datum/outfit/ctf
+ ///assoc list for classes. If there's only one, it'll just equip. Otherwise, it lets you pick which outfit!
+ var/list/ctf_gear = list("white" = /datum/outfit/ctf)
var/instagib_gear = /datum/outfit/ctf/instagib
+ var/ammo_type = /obj/effect/ctf/ammo
var/list/dead_barricades = list()
var/static/arena_reset = FALSE
var/static/list/people_who_want_to_play = list()
+ var/game_area = /area/ctf
/obj/machinery/capture_the_flag/Initialize()
. = ..()
@@ -191,7 +216,7 @@
icon_state = "syndbeacon"
team = RED_TEAM
team_span = "redteamradio"
- ctf_gear = /datum/outfit/ctf/red
+ ctf_gear = list("red" = /datum/outfit/ctf/red)
instagib_gear = /datum/outfit/ctf/red/instagib
/obj/machinery/capture_the_flag/blue
@@ -199,28 +224,32 @@
icon_state = "bluebeacon"
team = BLUE_TEAM
team_span = "blueteamradio"
- ctf_gear = /datum/outfit/ctf/blue
+ ctf_gear = list("blue" = /datum/outfit/ctf/blue)
instagib_gear = /datum/outfit/ctf/blue/instagib
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/machinery/capture_the_flag/attack_ghost(mob/user)
if(ctf_enabled == FALSE)
if(user.client && user.client.holder)
- var/response = alert("Enable CTF?", "CTF", "Yes", "No")
+ var/response = alert("Enable this CTF game?", "CTF", "Yes", "No")
if(response == "Yes")
- toggle_all_ctf(user)
+ toggle_id_ctf(user, game_id)
return
if(!(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME))
to_chat(user, "CTF has been temporarily disabled by admins.")
return
+ for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(CTF.game_id != game_id && CTF.ctf_enabled)
+ to_chat(user, "There is already an ongoing game in the [get_area(CTF)]!")
+ return
people_who_want_to_play |= user.ckey
var/num = people_who_want_to_play.len
var/remaining = CTF_REQUIRED_PLAYERS - num
if(remaining <= 0)
people_who_want_to_play.Cut()
- toggle_all_ctf()
+ toggle_id_ctf(null, game_id)
else
to_chat(user, "CTF has been requested. [num]/[CTF_REQUIRED_PLAYERS] have readied up.")
@@ -239,7 +268,7 @@
return
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
- if(CTF == src || CTF.ctf_enabled == FALSE)
+ if(CTF.game_id != game_id || CTF == src || CTF.ctf_enabled == FALSE)
continue
if(user.ckey in CTF.team_members)
to_chat(user, "No switching teams while the round is going!")
@@ -247,31 +276,55 @@
if(CTF.team_members.len < src.team_members.len)
to_chat(user, "[src.team] has more team members than [CTF.team]! Try joining [CTF.team] team to even things up.")
return
- team_members |= user.ckey
var/client/new_team_member = user.client
if(user.mind && user.mind.current)
ctf_dust_old(user.mind.current)
spawn_team_member(new_team_member)
+//does not add to recently dead, because it dusts and that triggers ctf_qdelled_player
/obj/machinery/capture_the_flag/proc/ctf_dust_old(mob/living/body)
if(isliving(body) && (team in body.faction))
var/turf/T = get_turf(body)
- new /obj/effect/ctf/ammo(T)
- recently_dead_ckeys += body.ckey
- addtimer(CALLBACK(src, .proc/clear_cooldown, body.ckey), respawn_cooldown, TIMER_UNIQUE)
+ if(ammo_type)
+ new ammo_type(T)
body.dust()
+/obj/machinery/capture_the_flag/proc/ctf_qdelled_player(mob/living/body)
+ SIGNAL_HANDLER
+
+ recently_dead_ckeys += body.ckey
+ addtimer(CALLBACK(src, .proc/clear_cooldown, body.ckey), respawn_cooldown, TIMER_UNIQUE)
+
/obj/machinery/capture_the_flag/proc/clear_cooldown(ckey)
recently_dead_ckeys -= ckey
/obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member)
- var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src))
+ var/datum/outfit/chosen_class
+ if(ctf_gear.len == 1) //no choices to make
+ for(var/key in ctf_gear)
+ chosen_class = ctf_gear[key]
+ else if(ctf_gear.len > 3) //a lot of choices, so much that we can't use a basic alert
+ var/result = input(new_team_member, "Select a class.", "CTF") as null|anything in sortList(ctf_gear)
+ if(!result || !(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME) || (new_team_member.ckey in recently_dead_ckeys) || !isobserver(new_team_member.mob))
+ return //picked nothing, admin disabled it, cheating to respawn faster, cheating to respawn... while in game?
+ chosen_class = ctf_gear[result]
+ else //2-3 choices
+ var/list/names_only = assoc_list_strip_value(ctf_gear)
+ names_only.len += 1 //create a new null entry so if it's a 2-sized list, names_only[3] is null instead of out of bounds
+ var/result = alert(new_team_member, "Select a class.", "CTF", names_only[1], names_only[2], names_only[3])
+ if(!result || !(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME) || (new_team_member.ckey in recently_dead_ckeys) || !isobserver(new_team_member.mob))
+ return //picked nothing, admin disabled it, cheating to respawn faster, cheating to respawn... while in game?
+ chosen_class = ctf_gear[result]
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_turf(src))
new_team_member.prefs.copy_to(M)
M.set_species(/datum/species/synth)
M.key = new_team_member.key
M.faction += team
- M.equipOutfit(ctf_gear)
- spawned_mobs += M
+ M.equipOutfit(chosen_class)
+ RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/ctf_qdelled_player) //just in case CTF has some map hazards (read: chasms). bit shorter than dust
+ spawned_mobs[M] = chosen_class
+ team_members |= new_team_member.ckey
+ return M //used in medisim.dm
/obj/machinery/capture_the_flag/Topic(href, href_list)
if(href_list["join"])
@@ -283,22 +336,22 @@
if(istype(I, /obj/item/ctf))
var/obj/item/ctf/flag = I
if(flag.team != src.team)
- user.transferItemToLoc(flag, get_turf(flag.reset), TRUE)
points++
- for(var/mob/M in GLOB.player_list)
- var/area/mob_area = get_area(M)
- if(istype(mob_area, /area/ctf))
- to_chat(M, "[user.real_name] has captured \the [flag], scoring a point for [team] team! They now have [points]/[points_to_win] points!")
- if(points >= points_to_win)
- victory()
+ flag.reset_flag(capture = TRUE)
+ for(var/mob/ctf_player in GLOB.player_list)
+ var/area/mob_area = get_area(ctf_player)
+ if(istype(mob_area, game_area))
+ to_chat(ctf_player, "[user.real_name] has captured \the [flag], scoring a point for [team] team! They now have [points]/[points_to_win] points!")
+ if(points >= points_to_win)
+ victory()
/obj/machinery/capture_the_flag/proc/victory()
for(var/mob/_competitor in GLOB.mob_living_list)
var/mob/living/competitor = _competitor
var/area/mob_area = get_area(competitor)
- if(istype(mob_area, /area/ctf))
+ if(istype(mob_area, game_area))
to_chat(competitor, "[team] team wins!")
- to_chat(competitor, "Teams have been cleared. Click on the machines to vote to begin another round.")
+ to_chat(competitor, victory_rejoin_text)
for(var/obj/item/ctf/W in competitor)
competitor.dropItemToGround(W)
competitor.dust()
@@ -306,6 +359,8 @@
control.icon_state = "dominator"
control.controlling = null
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(CTF.game_id != game_id)
+ continue
if(CTF.ctf_enabled == TRUE)
CTF.points = 0
CTF.control_points = 0
@@ -366,12 +421,16 @@
/obj/machinery/capture_the_flag/proc/instagib_mode()
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(CTF.game_id != game_id)
+ continue
if(CTF.ctf_enabled == TRUE)
CTF.ctf_gear = CTF.instagib_gear
CTF.respawn_cooldown = INSTAGIB_RESPAWN
/obj/machinery/capture_the_flag/proc/normal_mode()
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(CTF.game_id != game_id)
+ continue
if(CTF.ctf_enabled == TRUE)
CTF.ctf_gear = initial(ctf_gear)
CTF.respawn_cooldown = DEFAULT_RESPAWN
@@ -447,8 +506,10 @@
. = TRUE
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if(istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/shielded/ctf))
- . = TRUE
+ for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(H in CTF.spawned_mobs)
+ . = TRUE
+ break
// RED TEAM GUNS
@@ -633,7 +694,7 @@
return
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
if(M in CTF.spawned_mobs)
- var/outfit = CTF.ctf_gear
+ var/outfit = CTF.spawned_mobs[M]
var/datum/outfit/O = new outfit
for(var/obj/item/gun/G in M)
qdel(G)
@@ -648,10 +709,13 @@
desc = "It provided cover in fire fights. And now it's gone."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
+ var/game_id = "centcom"
/obj/effect/ctf/dead_barricade/Initialize(mapload)
. = ..()
for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines)
+ if(CTF.game_id != game_id)
+ continue
CTF.dead_barricades += src
/obj/effect/ctf/dead_barricade/proc/respawn()
@@ -659,7 +723,6 @@
new /obj/structure/barricade/security/ctf(get_turf(src))
qdel(src)
-
//Control Point
/obj/machinery/control_point
@@ -671,6 +734,7 @@
var/obj/machinery/capture_the_flag/controlling
var/team = "none"
var/point_rate = 0.5
+ var/game_area = /area/ctf
/obj/machinery/control_point/process(delta_time)
if(controlling)
@@ -695,7 +759,7 @@
icon_state = "dominator-[CTF.team]"
for(var/mob/M in GLOB.player_list)
var/area/mob_area = get_area(M)
- if(istype(mob_area, /area/ctf))
+ if(istype(mob_area, game_area))
to_chat(M, "[user.real_name] has captured \the [src], claiming it for [CTF.team]! Go take it back!")
break
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 21d228dc6b8..09e7d4cec7a 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -43,6 +43,12 @@
inhand_icon_state = "blueshift"
custom_premium_price = PAYCHECK_HARD
+/obj/item/clothing/suit/armor/vest/cuirass
+ name = "cuirass"
+ desc = "A lighter plate armor used to still keep out those pesky arrows, while retaining the ability to move."
+ icon_state = "cuirass"
+ inhand_icon_state = "armor"
+
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 273d859203f..9cede55cb09 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -288,6 +288,9 @@
M.flags_1 |= NODECONSTRUCT_1
for(var/obj/structure/S in added)
S.flags_1 |= NODECONSTRUCT_1
+ if(istype(program, /area/holodeck/rec_center/thunderdome1218) && !SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM])
+ say("Special note from \"1218 AD\" developer: I see you too are interested in the REAL dark ages of humanity! I've made this program also unlock some interesting shuttle designs on any communication console around. Have fun!")
+ SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] = TRUE
/obj/machinery/computer/holodeck/proc/derez(obj/O, silent = TRUE, forced = FALSE)
// Emagging a machine creates an anomaly in the derez systems.
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 787dfd7700b..49d79ee3fe9 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -145,6 +145,10 @@
. = ..()
AddComponent(/datum/component/caltrop, 20, 30, 100, CALTROP_BYPASS_SHOES)
+/obj/structure/punji_sticks/spikes
+ name = "wooden spikes"
+ icon_state = "woodspike"
+
/////////BONFIRES//////////
/obj/structure/bonfire
diff --git a/code/modules/projectiles/guns/misc/bow.dm b/code/modules/projectiles/guns/misc/bow.dm
new file mode 100644
index 00000000000..c84a1c613b7
--- /dev/null
+++ b/code/modules/projectiles/guns/misc/bow.dm
@@ -0,0 +1,125 @@
+
+/obj/item/gun/ballistic/bow
+ name = "longbow"
+ desc = "While pretty finely crafted, surely you can find something better to use in the current year."
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "bow"
+ inhand_icon_state = "bow"
+ load_sound = null
+ fire_sound = null
+ mag_type = /obj/item/ammo_box/magazine/internal/bow
+ force = 15
+ attack_verb_continuous = list("whipped", "cracked")
+ attack_verb_simple = list("whip", "crack")
+ weapon_weight = WEAPON_HEAVY
+ w_class = WEIGHT_CLASS_BULKY
+ internal_magazine = TRUE
+ bolt_type = BOLT_TYPE_NO_BOLT
+ var/drawn = FALSE
+
+/obj/item/gun/ballistic/bow/update_icon()
+ . = ..()
+ if(!chambered)
+ icon_state = "bow"
+ else
+ icon_state = "bow_[drawn]"
+
+/obj/item/gun/ballistic/bow/proc/drop_arrow()
+ drawn = FALSE
+ if(!chambered)
+ chambered = magazine.get_round(keep = FALSE)
+ return
+ if(!chambered)
+ return
+ chambered.forceMove(drop_location())
+ update_icon()
+
+/obj/item/gun/ballistic/bow/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round)
+ if(chambered || !magazine)
+ return
+ if(magazine.ammo_count())
+ chambered = magazine.get_round(TRUE)
+ chambered.forceMove(src)
+
+/obj/item/gun/ballistic/bow/attack_self(mob/user)
+ if(chambered)
+ to_chat(user, "You [drawn ? "release the tension on" : "draw the string on"] [src].")
+ drawn = !drawn
+ update_icon()
+
+/obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
+ if(!chambered)
+ return
+ if(!drawn)
+ to_chat(user, "Without drawing the bow, the arrow uselessly falls to the ground.")
+ drop_arrow()
+ update_icon()
+ return
+ drawn = FALSE
+ . = ..() //fires, removing the arrow
+ update_icon()
+
+/obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user)
+ return //so clicking sounds please
+
+/obj/item/ammo_box/magazine/internal/bow
+ name = "bowstring"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ max_ammo = 1
+ start_empty = TRUE
+ caliber = "arrow"
+
+/obj/item/ammo_casing/caseless/arrow
+ name = "arrow"
+ desc = "Stabby Stabman!"
+ icon_state = "arrow"
+ flags_1 = NONE
+ throwforce = 1
+ projectile_type = /obj/projectile/bullet/reusable/arrow
+ firing_effect_type = null
+ caliber = "arrow"
+ heavy_metal = FALSE
+
+/obj/item/ammo_casing/caseless/arrow/despawning/dropped()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/floor_vanish), 5 SECONDS)
+
+/obj/item/ammo_casing/caseless/arrow/despawning/proc/floor_vanish()
+ if(isturf(loc))
+ qdel(src)
+
+/obj/projectile/bullet/reusable/arrow
+ name = "arrow"
+ desc = "Ow! Get it out of me!"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ damage = 50
+ speed = 1
+ range = 25
+
+
+
+/obj/item/storage/bag/quiver
+ name = "quiver"
+ desc = "Holds arrows for your bow. Good, because while pocketing arrows is possible, it surely can't be pleasant."
+ icon_state = "quiver"
+ inhand_icon_state = "quiver"
+ worn_icon_state = "harpoon_quiver"
+ var/arrow_path = /obj/item/ammo_casing/caseless/arrow
+
+/obj/item/storage/bag/quiver/Initialize(mapload)
+ . = ..()
+ var/datum/component/storage/storage = GetComponent(/datum/component/storage)
+ storage.max_w_class = WEIGHT_CLASS_TINY
+ storage.max_items = 40
+ storage.max_combined_w_class = 100
+ storage.set_holdable(list(
+ /obj/item/ammo_casing/caseless/arrow
+ ))
+
+/obj/item/storage/bag/quiver/PopulateContents()
+ . = ..()
+ for(var/i in 1 to 10)
+ new arrow_path(src)
+
+/obj/item/storage/bag/quiver/despawning
+ arrow_path = /obj/item/ammo_casing/caseless/arrow/despawning
diff --git a/code/modules/shuttle/medisim.dm b/code/modules/shuttle/medisim.dm
new file mode 100644
index 00000000000..67008825a9e
--- /dev/null
+++ b/code/modules/shuttle/medisim.dm
@@ -0,0 +1,144 @@
+///These are for the medisim shuttle
+
+#define REDFIELD_TEAM "Red"
+#define BLUESWORTH_TEAM "Blue"
+
+/obj/machinery/capture_the_flag/medisim
+ game_id = "medieval"
+ game_area = /area/shuttle/escape/simulation
+ ammo_type = null //no guns, no need
+ victory_rejoin_text = "Teams have been cleared. The next game is starting automatically. Rejoin a team if you wish!"
+
+/obj/machinery/capture_the_flag/medisim/Initialize(mapload)
+ . = ..()
+ start_ctf() //both machines initialize, so both will call start_ctf instead of toggle_id_ctf calling it for both, twice.
+
+/obj/machinery/capture_the_flag/medisim/victory()
+ . = ..()
+ toggle_id_ctf(null, game_id, automated = TRUE)//only one machine runs the victory proc, start_ctf proc would break the other machine
+
+/obj/machinery/capture_the_flag/medisim/spawn_team_member(client/new_team_member)
+ . = ..()
+ if(!.)
+ return
+ var/mob/living/carbon/human/human_knight = .
+ randomize_human(human_knight)
+ human_knight.dna.add_mutation(MEDIEVAL, MUT_OTHER)
+ var/oldname = human_knight.name
+ var/title = "error"
+ switch (human_knight.gender)
+ if (MALE)
+ title = pick(list("Sir", "Lord"))
+ if (FEMALE)
+ title = pick(list("Dame", "Lady"))
+ else
+ title = "Noble"
+ human_knight.real_name = "[title] [oldname]"
+ human_knight.name = human_knight.real_name
+
+/obj/machinery/capture_the_flag/medisim/red
+ name = "\improper Redfield Data Realizer"
+ icon_state = "syndbeacon"
+ team = REDFIELD_TEAM
+ team_span = "redteamradio"
+ ctf_gear = list("knight" = /datum/outfit/medisim/red_knight, "archer" = /datum/outfit/medisim/red_archer)
+
+/obj/machinery/capture_the_flag/medisim/blue
+ name = "\improper Bluesworth Data Realizer"
+ icon_state = "bluebeacon"
+ team = BLUESWORTH_TEAM
+ team_span = "blueteamradio"
+ ctf_gear = list("knight" = /datum/outfit/medisim/blue_knight, "archer" = /datum/outfit/medisim/blue_archer)
+
+/obj/item/ctf/red/medisim
+ name = "\improper Redfield Castle Fair Maiden"
+ desc = "Protect your maiden, and capture theirs!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "plushie_nuke"
+ game_area = /area/shuttle/escape
+ movement_type = FLOATING //there are chasms, and resetting when they fall in is really lame so lets minimize that
+
+/obj/item/ctf/blue/medisim
+ name = "\improper Bluesworth Hold Fair Maiden"
+ desc = "Protect your maiden, and capture theirs!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "plushie_slime"
+ game_area = /area/shuttle/escape
+ movement_type = FLOATING //there are chasms, and resetting when they fall in is really lame so lets minimize that
+
+//everything except arrows
+/datum/outfit/medisim/post_equip(mob/living/carbon/human/H, visualsOnly)
+ var/list/no_drops = list()
+ no_drops += H.get_item_by_slot(ITEM_SLOT_FEET)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_BELT)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_HANDS)
+ no_drops += H.get_item_by_slot(ITEM_SLOT_GLOVES)
+ listclearnulls(no_drops) //any slots we didn't have
+ for(var/_outfit_item in no_drops)
+ var/obj/item/outfit_item = _outfit_item
+ outfit_item.item_flags |= DROPDEL//so this all stays clean :)
+
+/datum/outfit/medisim/red_knight
+ name = "Redfield Castle Knight"
+
+ uniform = /obj/item/clothing/under/color/red
+ shoes = /obj/item/clothing/shoes/plate/red
+ suit = /obj/item/clothing/suit/armor/riot/knight/red
+ gloves = /obj/item/clothing/gloves/plate/red
+ head = /obj/item/clothing/head/helmet/knight/red
+ r_hand = /obj/item/claymore
+
+/datum/outfit/medisim/blue_knight
+ name = "Bluesworth Hold Knight"
+
+ uniform = /obj/item/clothing/under/color/blue
+ shoes = /obj/item/clothing/shoes/plate/blue
+ suit = /obj/item/clothing/suit/armor/riot/knight/blue
+ gloves = /obj/item/clothing/gloves/plate/blue
+ head = /obj/item/clothing/head/helmet/knight/blue
+ r_hand = /obj/item/claymore
+
+/datum/outfit/medisim/red_archer
+ name = "Redfield Castle Archer"
+
+ uniform = /obj/item/clothing/under/color/red
+ belt = /obj/item/storage/bag/quiver
+ shoes = /obj/item/clothing/shoes/plate/red
+ suit = /obj/item/clothing/suit/armor/vest/cuirass
+ gloves = /obj/item/clothing/gloves/plate/red
+ head = /obj/item/clothing/head/helmet/knight/red
+ r_hand = /obj/item/gun/ballistic/bow
+
+/datum/outfit/medisim/blue_archer
+ name = "Bluesworth Hold Archer"
+
+ uniform = /obj/item/clothing/under/color/blue
+ belt = /obj/item/storage/bag/quiver
+ shoes = /obj/item/clothing/shoes/plate/blue
+ suit = /obj/item/clothing/suit/armor/vest/cuirass
+ gloves = /obj/item/clothing/gloves/plate/blue
+ head = /obj/item/clothing/head/helmet/knight/blue
+ r_hand = /obj/item/gun/ballistic/bow
+
+/obj/machinery/computer/reality_simulation
+ name = "reality simulation computer"
+ desc = "A computer calculating the medieval times. Uh, wow. Is this bad boy quantum?"
+
+/obj/item/paper/crumpled/retired_designs
+ name = "crumpled notes on cuirass design"
+ info = {"Yeah, you may as well just melt this crap back down into metal.
+
+
+ What else am I supposed to say? Nanotrasen thinks these authentic cuirass models are too expensive for the simulation watchers.
+ That's bullshit, but my hands are tied. But you know. If one of you cargo folk up at central command take a cuirass for yourself
+ instead of throwing the damn thing out, like, I'm sure nobody would notice or care. OK, but I'm sitting here on an official
+ NT shuttle encouraging you to break spacelaw. Damn, I'm bored as fuck. I was kidding. Melt em. See you guys soon.
+
+
+ the rest of the page is filled with various doodles of people fighting with swords."}
+
+#undef REDFIELD_TEAM
+#undef BLUESWORTH_TEAM
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index 651277aa5fd..27e1cdd6681 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 0f264c2736f..07c20cdbc03 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index abec870988c..a9764fee944 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 343c88a0dff..1826c43085c 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index fccfe9da0c7..2d9f2013752 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index c5b182b81a3..88d3ef3b6a9 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/strings/medieval_replacement.json b/strings/medieval_replacement.json
new file mode 100644
index 00000000000..15442a46efc
--- /dev/null
+++ b/strings/medieval_replacement.json
@@ -0,0 +1,323 @@
+{
+ "startings": [
+ "Forsooth,",
+ "I say,",
+ "I sayeth,",
+ "Forsooth, I say,",
+ "Forsooth, say I,",
+ "Forsooth, sayeth I,",
+ "Hark,",
+ "Harketh,",
+ "Avast,",
+ "Zounds,",
+ "Perchance,",
+ "Pray tell,",
+ "Prithee,",
+ "What hey,",
+ "What ho,",
+ "Pray,",
+ "Surely",
+ "Pray pardon,",
+ "Alas,",
+ "In short,",
+ "By my faith,",
+ "If it pleases you,",
+ "I pray you,",
+ "In truth,",
+ "By my trowth,",
+ "In sooth,",
+ "By my word,",
+ "S'wounds,",
+ "Z'wounds,",
+ "Heigh-ho,",
+ "Ah,",
+ "Quoth I,",
+ "Listen,",
+ "Listen thee,",
+ "Hear me,",
+ "Now hear me,",
+ "I warrant",
+ "Come,",
+ "Kind sire,",
+ "Sire,",
+ "There is much in what you say, and yet,"
+ ],
+ "medieval": {
+ "it is": "'tis",
+ "it's": "'tis",
+ "it was": "'twas",
+ "it will": "'twould",
+ "it were": "'twere",
+ "there": "thither",
+ "shall not": "shan't",
+ "will not": "shan't",
+ "over there": "yonder",
+ "in the": "i' the",
+ "thank you": [
+ "many good thanks to you",
+ "thankee",
+ "kindly thanks to you",
+ "grammercy to you"
+ ],
+ "thanks": [
+ "many good thanks to you",
+ "thankee",
+ "kindly thanks to you",
+ "grammercy to you"
+ ],
+ "you": [
+ "thou",
+ "thee",
+ "ye"
+ ],
+ "your": [
+ "thine",
+ "thy",
+ "thyne"
+ ],
+ "are": "art",
+ "killed": [
+ "slain",
+ "vanquished",
+ "brung low",
+ "conquered",
+ "fleeced",
+ "humbled",
+ "subjugated",
+ "bested",
+ "foiled"
+ ],
+ "kill": [
+ "slay",
+ "vanquish",
+ "bring low",
+ "conquer",
+ "fleece",
+ "humble",
+ "subjugate",
+ "best",
+ "foil"
+ ],
+ "goodbye": [
+ "farewell",
+ "fare thee well",
+ "good morrow",
+ "godspeed",
+ "begone",
+ "by your leave",
+ "good day",
+ "adieu",
+ "cheerio",
+ "pleasant journey",
+ "I bid thee good day",
+ "I bid thee farewell"
+ ],
+ "bye": [
+ "farewell",
+ "fare thee well",
+ "good morrow",
+ "godspeed",
+ "begone",
+ "by your leave",
+ "good day",
+ "adieu",
+ "cheerio",
+ "pleasant journey",
+ "I bid thee good day",
+ "I bid thee farewell"
+ ],
+ "yes": [
+ "aye",
+ "yea",
+ "yea verily"
+ ],
+ "no": [
+ "nay",
+ "nayeth"
+ ],
+ "hello": [
+ "hail",
+ "good day",
+ "well met",
+ "well meteth",
+ "tally ho",
+ "ave"
+ ],
+ "hi": [
+ "hail",
+ "good day",
+ "well met",
+ "well meteth",
+ "tally ho",
+ "ave"
+ ],
+ "does": [
+ "doeseth",
+ "dost",
+ "doth"
+ ],
+ "my": "mine",
+ "in": "within",
+ "nuke disk": "plate of holy fire",
+ "captain": "king",
+ "cap": "king",
+ "food": [
+ "bellytimber",
+ "game",
+ "cake"
+ ],
+ "going": "a-walkin'",
+ "go": "a-walk",
+ "bet": "warrant",
+ "the": "yon",
+ "kidding": [
+ "but pulling a jest",
+ "but pulling a jape"
+ ],
+ "joke": [
+ "jest",
+ "jape"
+ ],
+ "station": "castle",
+ "please": [
+ "I pray you",
+ "prithee",
+ "pray"
+ ],
+ "ok": [
+ "as you will",
+ "agreed",
+ "well said",
+ "just so"
+ ],
+ "is": "be",
+ "never": "ne'er",
+ "haha": [
+ "guffaw!",
+ "cackle!",
+ "oh, 'tis to laugh!",
+ "zounds!",
+ "chuckle!",
+ "snigger!",
+ "snicker!",
+ "snort!",
+ "cachinnate!",
+ "titter!",
+ "and there was much tittering!",
+ "and there was much guffawing!",
+ "and there was much chuckling!",
+ "and there was much snorting!",
+ "and there was much snickering!",
+ "and there was much mirth!"
+ ],
+ "hehe": [
+ "guffaw!",
+ "cackle!",
+ "oh, 'tis to laugh!",
+ "zounds!",
+ "chuckle!",
+ "snigger!",
+ "snicker!",
+ "snort!",
+ "cachinnate!",
+ "titter!",
+ "and there was much tittering!",
+ "and there was much guffawing!",
+ "and there was much chuckling!",
+ "and there was much snorting!",
+ "and there was much snickering!",
+ "and there was much mirth!"
+ ],
+ "hah": [
+ "guffaw!",
+ "cackle!",
+ "oh, 'tis to laugh!",
+ "zounds!",
+ "chuckle!",
+ "snigger!",
+ "snicker!",
+ "snort!",
+ "cachinnate!",
+ "titter!",
+ "and there was much tittering!",
+ "and there was much guffawing!",
+ "and there was much chuckling!",
+ "and there was much snorting!",
+ "and there was much snickering!",
+ "and there was much mirth!"
+ ],
+ "heh": [
+ "guffaw!",
+ "cackle!",
+ "oh, 'tis to laugh!",
+ "zounds!",
+ "chuckle!",
+ "snigger!",
+ "snicker!",
+ "snort!",
+ "cachinnate!",
+ "titter!",
+ "and there was much tittering!",
+ "and there was much guffawing!",
+ "and there was much chuckling!",
+ "and there was much snorting!",
+ "and there was much snickering!",
+ "and there was much mirth!"
+ ],
+ "help": [
+ "aid",
+ "aideth",
+ "saveth",
+ "assistance",
+ "succor"
+ ],
+ "could": "couldst",
+ "would": "wouldst",
+ "sure": "shore",
+ "maybe": [
+ "mayhaps",
+ "perchance"
+ ],
+ "probably": [
+ "mayhaps",
+ "perchance"
+ ],
+ "girl": [
+ "madame",
+ "waif",
+ "mistress",
+ "lass",
+ "lady",
+ "maid",
+ "maiden"
+ ],
+ "felinid": "catbeast",
+ "cat": "beast",
+ "moth": "gnat",
+ "mothperson": "gnat critter",
+ "plasmaman": "fire spirit",
+ "plasmamen": "fire spirits",
+ "lizard": "beast",
+ "lizardperson": "moat creature",
+ "soon": "anon",
+ "later": "anon",
+ "often": "oft",
+ "really": [
+ "indeed",
+ "in truth"
+ ],
+ "those": "yon",
+ "here": "hither",
+ "enough": "ynogh",
+ "why": "wherefore",
+ "away": "aroint",
+ "being": "bein",
+ "of": "o'",
+ "shit": "nightsoil",
+ "fuck": "flummery",
+ "based": [
+ "joly",
+ "jolyf"
+ ]
+ }
+ }
diff --git a/tgstation.dme b/tgstation.dme
index 899649111cd..711153be153 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2815,6 +2815,7 @@
#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
+#include "code\modules\projectiles\guns\misc\bow.dm"
#include "code\modules\projectiles\guns\misc\chem_gun.dm"
#include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
#include "code\modules\projectiles\guns\misc\medbeam.dm"
@@ -3051,6 +3052,7 @@
#include "code\modules\shuttle\emergency.dm"
#include "code\modules\shuttle\ferry.dm"
#include "code\modules\shuttle\manipulator.dm"
+#include "code\modules\shuttle\medisim.dm"
#include "code\modules\shuttle\monastery.dm"
#include "code\modules\shuttle\navigation_computer.dm"
#include "code\modules\shuttle\on_move.dm"