From 1fd04852062ea2277094db30039073ea4636c85b Mon Sep 17 00:00:00 2001
From: tralezab <40974010+tralezab@users.noreply.github.com>
Date: Tue, 5 Jan 2021 00:49:53 -0800
Subject: [PATCH] [READY] Hark! The Medieval Reality Simulation Dome Emergency
Shuttle! (+speech mutation, NOTELEPORT fixes and teambuilder improvements)
(#55424)
* HARK! THERE ARE SOME MAIDENS THAT NEED SAVING!
* claymores, chairs
* mapmerge, price increase, no losing the flag, no teleporting in, other small stuff
* oldworld language, medieval mutation, reviews
* see desc for full changelog
huge improvements to how medieval speech feels, CTF now fully lit, json beautified, bugs squashed and more NOTELEPORT exploits also quashed. (I NEED TO UNDO THIS FOR ATOMIZATION)
* removes my fixes? also bugfixes and CTF separation
* dumb json mistake, starting work on reality simulators
* BOWS ARE BROOOOOOOOOOOOOOOOOKEN
* br
* getting closer to working
* well, mostly everything now.
* finally ready
* removes languages stuff as it is buggy and does not work, fixes more bugs, fixes more bugs, fixes more bugs
* conflict fix
* linting
* more lint
* bow buff, speech fix, TON of ctf fixes
* oh fuck year
* NO MORE INSTA DELETING CREW
* whoops
* review handled
* pooosh
* conflict fix
---
_maps/shuttles/emergency_medisim.dmm | 2401 +++++++++++++++++
code/__DEFINES/DNA.dm | 1 +
code/__DEFINES/language.dm | 2 +
code/__DEFINES/shuttles.dm | 1 +
code/datums/helper_datums/teleport.dm | 1 +
code/datums/mutations/speech.dm | 40 +
code/datums/shuttles.dm | 10 +
code/game/area/areas/shuttles.dm | 6 +
code/game/machinery/teambuilder.dm | 14 +-
code/game/objects/items.dm | 4 +
code/game/turfs/closed/_closed.dm | 12 +-
code/game/turfs/open/floor/misc_floor.dm | 10 +
code/modules/admin/topic.dm | 2 +-
code/modules/admin/verbs/secrets.dm | 2 +-
code/modules/awaymissions/capture_the_flag.dm | 174 +-
code/modules/clothing/suits/armor.dm | 6 +
code/modules/holodeck/computer.dm | 3 +
code/modules/hydroponics/grown/towercap.dm | 4 +
code/modules/projectiles/guns/misc/bow.dm | 125 +
code/modules/shuttle/medisim.dm | 144 +
icons/mob/clothing/suit.dmi | Bin 399370 -> 397643 bytes
icons/obj/clothing/suits.dmi | Bin 139238 -> 139484 bytes
icons/obj/guns/projectile.dmi | Bin 31024 -> 31024 bytes
icons/obj/hydroponics/equipment.dmi | Bin 28176 -> 28706 bytes
icons/turf/areas.dmi | Bin 41066 -> 41453 bytes
icons/turf/floors.dmi | Bin 370735 -> 370803 bytes
strings/medieval_replacement.json | 323 +++
tgstation.dme | 2 +
28 files changed, 3223 insertions(+), 64 deletions(-)
create mode 100644 _maps/shuttles/emergency_medisim.dmm
create mode 100644 code/modules/projectiles/guns/misc/bow.dm
create mode 100644 code/modules/shuttle/medisim.dm
create mode 100644 strings/medieval_replacement.json
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 651277aa5fdab0d2fb8fc1c16c12364dff4309ee..27e1cdd6681f0da96c8ea366416c2ffc448a50b7 100644
GIT binary patch
literal 397643
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