diff --git a/code/__DEFINES/~skyrat_defines/faction.dm b/code/__DEFINES/~skyrat_defines/faction.dm
new file mode 100644
index 00000000000..b1d32d35443
--- /dev/null
+++ b/code/__DEFINES/~skyrat_defines/faction.dm
@@ -0,0 +1,9 @@
+#define ACCESS_FACTION_PUBLIC 401
+#define ACCESS_FACTION_CREW 402
+#define ACCESS_FACTION_COMMAND 403
+
+#define RADIO_CHANNEL_FACTION "Faction"
+#define RADIO_KEY_FACTION "f"
+#define RADIO_TOKEN_FACTION ":f"
+
+#define FREQ_FACTION 1335
diff --git a/code/game/communications.dm b/code/game/communications.dm
index fe47979c888..8cbf31c09a0 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -98,6 +98,7 @@ GLOBAL_LIST_INIT(radiochannels, list(
RADIO_CHANNEL_ENGINEERING = FREQ_ENGINEERING,
RADIO_CHANNEL_SECURITY = FREQ_SECURITY,
RADIO_CHANNEL_CENTCOM = FREQ_CENTCOM,
+ RADIO_CHANNEL_FACTION = FREQ_FACTION, //SKYRAT EDIT ADDITION - FACTION
RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE,
RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY,
RADIO_CHANNEL_SERVICE = FREQ_SERVICE,
@@ -114,6 +115,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"[FREQ_ENGINEERING]" = RADIO_CHANNEL_ENGINEERING,
"[FREQ_SECURITY]" = RADIO_CHANNEL_SECURITY,
"[FREQ_CENTCOM]" = RADIO_CHANNEL_CENTCOM,
+ "[FREQ_FACTION]" = RADIO_CHANNEL_FACTION, //SKYRAT EDIT ADDITION - FACTION
"[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE,
"[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY,
"[FREQ_SERVICE]" = RADIO_CHANNEL_SERVICE,
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index a106b4a8775..28a196dc415 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -263,7 +263,8 @@
var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans, message_mods)
// Independent radios, on the CentCom frequency, reach all independent radios
- if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE))
+ //if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE)) //ORIGINAL
+ if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_FACTION)) //SKYRAT EDIT CHANGE - FACTION
signal.data["compression"] = 0
signal.transmission_method = TRANSMISSION_SUPERSPACE
signal.levels = list(0) // reaches all Z-levels
diff --git a/code/game/say.dm b/code/game/say.dm
index a3a1f9b7e72..7028cb7177c 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
"[FREQ_AI_PRIVATE]" = "aiprivradio",
"[FREQ_SYNDICATE]" = "syndradio",
"[FREQ_CENTCOM]" = "centcomradio",
+ "[FREQ_FACTION]" = "suppradio", //SKYRAT EDIT ADDITIION - FACTION
"[FREQ_CTF_RED]" = "redteamradio",
"[FREQ_CTF_BLUE]" = "blueteamradio"
))
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 25df1301eee..854e0f5e80b 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -80,6 +80,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/resetasaycolor,
/client/proc/toggleadminhelpsound,
/client/proc/respawn_character,
+ /client/proc/admin_open_event_spawners_menu, //SKYRAT EDIT ADDITION - EVENTS
/datum/admins/proc/toggleaooc, //SKYRAT EDIT ADDITION - ADMIN
/datum/admins/proc/togglesooc, //SKYRAT EDIT ADDITION - ADMIN
/datum/admins/proc/open_borgopanel
@@ -261,6 +262,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/toggle_nuke,
/client/proc/cmd_display_del_log,
/client/proc/toggle_combo_hud,
+ /client/proc/admin_open_event_spawners_menu, //SKYRAT EDIT ADDITION - EVENTS
/client/proc/debug_huds
))
GLOBAL_PROTECT(admin_verbs_hideable)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 72e9fb636db..cbd347845cd 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -65,7 +65,8 @@
return
if (!sender)
- sender = input("Who is the message from?", "Sender") as null|anything in list(RADIO_CHANNEL_CENTCOM,RADIO_CHANNEL_SYNDICATE)
+ //sender = input("Who is the message from?", "Sender") as null|anything in list(RADIO_CHANNEL_CENTCOM,RADIO_CHANNEL_SYNDICATE) //ORIGINAL
+ sender = input("Who is the message from?", "Sender") as null|anything in list(RADIO_CHANNEL_CENTCOM,RADIO_CHANNEL_SYNDICATE,RADIO_CHANNEL_FACTION) //SKYRAT EDIT CHANGE
if(!sender)
return
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index dbdc55ea16e..2d0a097b262 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -19,6 +19,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Faction
RADIO_KEY_SYNDICATE = RADIO_CHANNEL_SYNDICATE,
RADIO_KEY_CENTCOM = RADIO_CHANNEL_CENTCOM,
+ RADIO_KEY_FACTION = RADIO_CHANNEL_FACTION, //SKYRAT EDIT ADDITION - FACTION
// Admin
MODE_KEY_ADMIN = MODE_ADMIN,
@@ -49,6 +50,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Faction
"å" = RADIO_CHANNEL_SYNDICATE,
"í" = RADIO_CHANNEL_CENTCOM,
+ //"a" = RADIO_CHANNEL_FACTION, //SKYRAT EDIT ADDITION - FACTION
// Admin
"ç" = MODE_ADMIN,
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
index 966d8e6ca65..fe163ec2e10 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
@@ -187,12 +187,14 @@
return items_to_pack
//This needs to be a seperate proc because the character could not have the proper backpack during the moment of loadout equip
-/datum/preferences/proc/add_packed_items(mob/living/carbon/human/H, list/packed_items)
+/datum/preferences/proc/add_packed_items(mob/living/carbon/human/H, list/packed_items, del_on_fail = TRUE)
//Here we stick loadout items that couldn't be equipped into a bag.
var/obj/item/back_item = H.back
for(var/item in packed_items)
var/obj/item/ITEM = item
if(back_item)
ITEM.forceMove(back_item)
- else
+ else if (del_on_fail)
qdel(ITEM)
+ else
+ ITEM.forceMove(get_turf(H))
diff --git a/modular_skyrat/modules/events/code/__event_defines.dm b/modular_skyrat/modules/events/code/__event_defines.dm
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/modular_skyrat/modules/events/code/__event_defines.dm
@@ -0,0 +1 @@
+
diff --git a/modular_skyrat/modules/events/code/_event_globalvars.dm b/modular_skyrat/modules/events/code/_event_globalvars.dm
new file mode 100644
index 00000000000..2695008446e
--- /dev/null
+++ b/modular_skyrat/modules/events/code/_event_globalvars.dm
@@ -0,0 +1,4 @@
+GLOBAL_VAR_INIT(event_spawner_manager, InitializeEventSpawnManager())
+
+/proc/InitializeEventSpawnManager()
+ return new /datum/event_spawner_manager()
diff --git a/modular_skyrat/modules/events/code/event_spawner.dm b/modular_skyrat/modules/events/code/event_spawner.dm
new file mode 100644
index 00000000000..6f626fb35b8
--- /dev/null
+++ b/modular_skyrat/modules/events/code/event_spawner.dm
@@ -0,0 +1,169 @@
+/obj/character_event_spawner
+ icon = 'modular_skyrat/modules/cryosleep/icons/cryogenics.dmi'
+ icon_state = "cryopod"
+
+ var/list/species_whitelist
+ var/list/gender_whitelist
+ var/list/ckey_whitelist
+ var/used_outfit = /datum/outfit/centcom/ert/engineer
+ var/job_name
+ var/gets_loadout = TRUE
+ var/access_override
+ var/headset_override
+ var/flavor_text = ""
+ var/list/additional_equipment
+ var/disappear_after_spawn
+
+ var/used = FALSE
+
+/obj/character_event_spawner/attack_ghost(mob/user)
+ TrySpawn(user)
+
+/obj/character_event_spawner/proc/TrySpawn(mob/dead/observer/user)
+ if(!user || !user.client)
+ return
+ if(used)
+ return
+ if(ckey_whitelist && !(lowertext(user.ckey) in ckey_whitelist))
+ alert(user, "Sorry, This spawner is not for you!", "", "Ok")
+ return
+ var/species_string
+ if(species_whitelist)
+ species_string = ""
+ var/first = TRUE
+ for(var/spec_key in species_whitelist)
+ if(!first)
+ species_string += ", "
+ species_string += "[spec_key]"
+ first = FALSE
+ var/gender_string
+ if(gender_whitelist)
+ gender_string = ""
+ var/first = TRUE
+ for(var/spec_key in gender_whitelist)
+ if(!first)
+ gender_string += ", "
+ gender_string += "[spec_key]"
+ first = FALSE
+ var/warning_string = "WARNING: This spawner will use your currently selected character in prefs ([user.client.prefs.real_name])\nMake sure that the character is not used as a station crew, or would have a good reason to be this role.\nDo you wanna proceed?"
+ if(species_string)
+ warning_string += "\nThis role is restricted to those species: [species_string]"
+ if(gender_string)
+ warning_string += "\nThis role is restricted to those genders: [gender_string]"
+ var/action = alert(user, warning_string, "", "Yes", "Yes with Alias", "No")
+ if(!action || action == "No")
+ return
+ var/alias
+ if(action == "Yes with Alias")
+ var/msg = reject_bad_name(input(usr, "Set your character's alias for this role", "Alias") as text|null)
+ if(!msg)
+ return
+ alias = msg
+ if(!user || !user.client)
+ return
+ if(species_whitelist && !(user.client.prefs.pref_species.id in species_whitelist))
+ alert(user, "Sorry, This spawner is limited to those species: [species_string]. Please switch your character.", "", "Ok")
+ return
+ if(gender_whitelist && !(user.client.prefs.gender in gender_whitelist))
+ alert(user, "Sorry, This spawner is limited to those genders: [gender_string]. Please switch your character.", "", "Ok")
+ return
+ if(used)
+ return
+ SpawnPerson(user, alias)
+
+/obj/character_event_spawner/proc/SpawnPerson(mob/dead/observer/user, alias)
+ if(!user || !user.client)
+ return
+ message_admins("[ADMIN_LOOKUPFLW(user)] spawned as a [job_name] by using a spawner.")
+ used = TRUE
+ icon_state = "cryopod-open"
+ name = "opened cryogenic sleeper"
+ //Spawn and copify prefs
+ var/mob/living/carbon/human/H = new(src)
+ user.client.prefs.copy_to(H)
+ H.dna.update_dna_identity()
+
+ if(alias)
+ H.name = alias
+ H.real_name = alias
+
+ H.forceMove(get_turf(src))
+ //Pre-job equips so Voxes dont die
+ H.dna.species.before_equip_job(null, H)
+
+ if(used_outfit && used_outfit != "Naked")
+ H.equipOutfit(used_outfit)
+
+ //Override headset here
+ if(headset_override)
+ var/obj/item/headset_slot = H.get_item_by_slot(ITEM_SLOT_EARS)
+ if(headset_slot)
+ qdel(headset_slot)
+ var/obj/item/new_headset = new headset_override()
+ if(new_headset)
+ if(!H.equip_to_slot_if_possible(new_headset, ITEM_SLOT_EARS, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
+ new_headset.forceMove(get_turf(H))
+
+ var/obj/item/back_item
+ if(H.back && SEND_SIGNAL(H.back, COMSIG_CONTAINS_STORAGE))
+ back_item = H.back
+ //Spawn our character a backpack if they dont have any
+ if(!back_item)
+ var/obj/item/new_bp = new /obj/item/storage/backpack()
+ if(H.equip_to_appropriate_slot(new_bp))
+ back_item = new_bp
+ else
+ new_bp.forceMove(get_turf(H))
+ if(additional_equipment)
+ for(var/eq_path in additional_equipment)
+ var/obj/item/equipped = new eq_path()
+ if(!H.equip_to_appropriate_slot(equipped))
+ if(back_item)
+ equipped.forceMove(back_item)
+ else
+ equipped.forceMove(get_turf(H))
+
+ var/list/packed_items
+ if(gets_loadout)
+ packed_items = user.client.prefs.equip_preference_loadout(H, FALSE, null)
+
+ if(packed_items)
+ user.client.prefs.add_packed_items(H, packed_items, FALSE)
+
+ //Override access of the ID card here
+ var/obj/item/card/id/ID
+ if(length(access_override))
+ var/obj/item/id_slot = H.get_item_by_slot(ITEM_SLOT_ID)
+ if(!id_slot)
+ var/obj/item/temp_id = new /obj/item/card/id()
+ if(!H.equip_to_slot_if_possible(temp_id, ITEM_SLOT_ID, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
+ qdel(temp_id)
+ else
+ id_slot = temp_id
+
+ if(id_slot)
+ ID = id_slot.GetID()
+ if(ID)
+ ID.access = access_override
+ //Override name and job of the ID card here
+ if(!ID)
+ var/obj/item/id_slot = H.get_item_by_slot(ITEM_SLOT_ID)
+ if(id_slot)
+ ID = id_slot.GetID()
+ if(ID)
+ ID.registered_name = H.real_name
+ ID.assignment = job_name
+ ID.update_label()
+
+ H.regenerate_icons()
+ //Give control
+ if(user.mind)
+ user.mind.transfer_to(H, TRUE)
+ else
+ H.ckey = user.ckey
+
+ //Greet!
+ to_chat(H, "You are the [job_name]")
+ to_chat(H, "[flavor_text]")
+ if(disappear_after_spawn)
+ qdel(src)
diff --git a/modular_skyrat/modules/events/code/event_spawner_menu.dm b/modular_skyrat/modules/events/code/event_spawner_menu.dm
new file mode 100644
index 00000000000..63ad0def4a5
--- /dev/null
+++ b/modular_skyrat/modules/events/code/event_spawner_menu.dm
@@ -0,0 +1,380 @@
+/datum/event_spawner_instance
+ var/id
+ var/list/species_whitelist = list()
+ var/list/gender_whitelist = list()
+ var/list/ckey_whitelist = list()
+ var/used_outfit
+ var/job_name = "Job Name"
+ var/gets_loadout = TRUE
+ var/list/access_override = list()
+ var/headset_override
+ var/flavor_text = "Flavor Text to be displayed"
+ var/list/additional_equipment = list()
+ var/disappear_after_spawn = FALSE
+ var/prompt_players = FALSE
+
+ var/show_outfit_equipment = FALSE
+
+/datum/event_spawner_instance/New(_id, template_id)
+ id = _id
+
+/datum/event_spawner_instance/proc/CreateSpawner(turf/spawn_loc)
+ var/obj/character_event_spawner/CES = new(spawn_loc)
+ if(length(species_whitelist))
+ CES.species_whitelist = species_whitelist.Copy()
+ if(length(gender_whitelist))
+ CES.gender_whitelist = gender_whitelist.Copy()
+ if(length(ckey_whitelist))
+ CES.ckey_whitelist = ckey_whitelist.Copy()
+ if(length(access_override))
+ CES.access_override = access_override.Copy()
+ if(length(additional_equipment))
+ CES.additional_equipment = additional_equipment.Copy()
+ CES.used_outfit = used_outfit
+ CES.job_name = job_name
+ CES.gets_loadout = gets_loadout
+ CES.headset_override = headset_override
+ CES.flavor_text = flavor_text
+ CES.disappear_after_spawn = disappear_after_spawn
+ CES.name = "[job_name] cryogenic sleeper"
+ if(prompt_players)
+ for(var/mob/dead/observer/ghost in GLOB.player_list)
+ if(length(ckey_whitelist) && !(lowertext(ghost.ckey) in ckey_whitelist))
+ continue
+ ghost.playsound_local(ghost, 'sound/effects/ghost2.ogg', 75, FALSE)
+ var/turf_link = TURF_LINK(ghost, spawn_loc)
+ to_chat(ghost, "[turf_link] Event spawner that you can enter has been created. The role is [CES.job_name]. [turf_link]")
+
+/datum/event_spawner_instance/proc/GetExport()
+ var/list/blocks = list()
+ blocks["job_name"] = job_name
+ blocks["flavor_text"] = flavor_text
+ blocks["gets_loadout"] = gets_loadout
+ blocks["used_outfit"] = used_outfit
+ blocks["access_override"] = access_override.Copy()
+ blocks["headset_override"] = headset_override
+ blocks["additional_equipment"] = additional_equipment.Copy()
+ blocks["species_whitelist"] = species_whitelist.Copy()
+ blocks["gender_whitelist"] = gender_whitelist.Copy()
+ blocks["ckey_whitelist"] = ckey_whitelist.Copy()
+ blocks["disappear_after_spawn"] = disappear_after_spawn
+ blocks["prompt_players"] = prompt_players
+ return json_encode(blocks)
+
+/datum/event_spawner_instance/proc/DoImport(input)
+ var/list/blocks = json_decode(input)
+ job_name = blocks["job_name"]
+ flavor_text = blocks["flavor_text"]
+ gets_loadout = blocks["gets_loadout"]
+ used_outfit = text2path(blocks["used_outfit"])
+ access_override = blocks["access_override"]
+ headset_override = text2path(blocks["headset_override"])
+ var/list/temp_additional_equipment = blocks["additional_equipment"]
+ var/list/to_equipment = list()
+ for(var/string in temp_additional_equipment)
+ to_equipment += text2path(string)
+ additional_equipment = to_equipment
+ species_whitelist = blocks["species_whitelist"]
+ gender_whitelist = blocks["gender_whitelist"]
+ ckey_whitelist = blocks["ckey_whitelist"]
+ disappear_after_spawn = blocks["disappear_after_spawn"]
+ prompt_players = blocks["prompt_players"]
+
+/datum/event_spawner_manager
+ var/next_id = 0
+ var/list/managed_instances = list()
+ var/radio_typecache
+
+/datum/event_spawner_manager/New()
+ radio_typecache = typecacheof(/obj/item/radio/headset)
+
+/datum/event_spawner_manager/proc/ShowPanel(mob/user, panel_id)
+ if(!user || !user.client)
+ return
+ var/list/dat = list("")
+ if(panel_id)
+ var/datum/event_spawner_instance/ESI = managed_instances["[panel_id]"]
+ if(!ESI)
+ return
+ dat += "Return ----- Export Import
"
+ dat += "Job Name: [ESI.job_name]"
+ dat += "
This will appear on the person's ID"
+ dat += "
Flavor Text: [ESI.flavor_text]"
+ dat += "
The player will be greeted with the flavor text. Tell him who his supervisors are, if any."
+ var/outfit_name
+ var/datum/outfit/OU
+ if(ESI.used_outfit)
+ if(ESI.used_outfit == "Naked")
+ outfit_name = "Naked"
+ else
+ OU = ESI.used_outfit
+ outfit_name = initial(OU.name)
+ dat += "
Allow Loadout: [ESI.gets_loadout ? "Yes" : "No"]"
+ dat += "
Whether loadout from prefs is allowed."
+ dat += "
Used Outfit: [outfit_name]"
+ dat += "
Which outfit is used for the spawned player. Below you can preview contents of the selected one."
+ if(ESI.used_outfit)
+ dat += "
[ESI.show_outfit_equipment ? "Hide outfit equipment" : "Show outfit equipment"]"
+ if(OU && ESI.show_outfit_equipment)
+ dat += "
Outfit equipment:"
+ var/obj/item/display = initial(OU.uniform)
+ if(display)
+ dat += "
Uniform: [initial(display.name)] - ([display])"
+ display = initial(OU.suit)
+ if(display)
+ dat += "
Suit: [initial(display.name)] - ([display])"
+ display = initial(OU.suit_store)
+ if(display)
+ dat += "
Suit Storage: [initial(display.name)] - ([display])"
+ display = initial(OU.belt)
+ if(display)
+ dat += "
Belt: [initial(display.name)] - ([display])"
+ display = initial(OU.gloves)
+ if(display)
+ dat += "
Gloves: [initial(display.name)] - ([display])"
+ display = initial(OU.head)
+ if(display)
+ dat += "
Head: [initial(display.name)] - ([display])"
+ display = initial(OU.mask)
+ if(display)
+ dat += "
Mask: [initial(display.name)] - ([display])"
+ display = initial(OU.neck)
+ if(display)
+ dat += "
Neck: [initial(display.name)] - ([display])"
+ display = initial(OU.ears)
+ if(display)
+ dat += "
Ears: [initial(display.name)] - ([display])"
+ display = initial(OU.glasses)
+ if(display)
+ dat += "
Glasses: [initial(display.name)] - ([display])"
+ display = initial(OU.id)
+ if(display)
+ dat += "
Id: [initial(display.name)] - ([display])"
+ display = initial(OU.l_pocket)
+ if(display)
+ dat += "
Left pocket: [initial(display.name)] - ([display])"
+ display = initial(OU.r_pocket)
+ if(display)
+ dat += "
Right pocket: [initial(display.name)] - ([display])"
+ display = initial(OU.back)
+ if(display)
+ dat += "
Back: [initial(display.name)] - ([display])"
+ var/list/backpack_cont = initial(OU.backpack_contents)
+ if(backpack_cont)
+ dat += "
+Things in the backpack (due to coding limitations, those cant be established. See the code for the outfit to know more.)"
+ display = initial(OU.l_hand)
+ if(display)
+ dat += "
Left hand: [initial(display.name)] - ([display])"
+ display = initial(OU.r_hand)
+ if(display)
+ dat += "
Right hand: [initial(display.name)] - ([display])"
+
+ dat += "
"
+ dat += "Here you can add extra equipment on top of loadout, if possible those will be auto equipped."
+ dat += "
You HAVE to add them as typed paths(/obj/item/gun/energy/e_gun). Search in Game Panel to find desired paths."
+ dat += "
Additional equipment: Add"
+ for(var/eq in ESI.additional_equipment)
+ var/obj/item/equip = eq
+ dat += "
[initial(equip.name)] - ([eq])"
+ dat += "
"
+ dat += "Outfits limit on what airlocks can someone access, or what headset and frequences they have. Here you can edit those things"
+ dat += "
Access overrides: "
+ for(var/access_key in ESI.access_override)
+ dat += "[access_key]"
+ dat += " <- Add"
+ dat += "
Add access in NUMBERS. If no numbers are in the list, then the access will not be overriden. If you want to remove all access, add only a 0"
+ dat += "
See '/code/__DEFINES/access.dm' for an access list. (401-Faction Public, 402-Faction Crew, 403-Faction Command)"
+ dat += "
Headset override: "
+ if(ESI.headset_override)
+ var/obj/item/headset = ESI.headset_override
+ dat += "[initial(headset.name)] - ([ESI.headset_override])"
+ dat += " <- Set"
+ dat += "
Here you can override the headset, make sure to pick one which has the proper key with radio frequences for your role"
+ dat += "
"
+ dat += "Allowed Species:"
+ for(var/spec in ESI.species_whitelist)
+ dat += "[spec]"
+ dat += " <- Add"
+ dat += "
If no species are in the list, then any species can join as this role."
+ dat += "
Allowed Genders:"
+ for(var/gend in ESI.gender_whitelist)
+ dat += "[gend]"
+ dat += " <- Add"
+ dat += "
If no genders are in the list, then any gender can join as this role."
+ dat += "
Allowed CKEYs:"
+ for(var/ckey in ESI.ckey_whitelist)
+ dat += "[ckey]"
+ dat += " <- Add"
+ dat += "
If no ckeys are in the list, then any ckey can join as this role."
+ dat += "
Spawner disappears after spawn: [ESI.disappear_after_spawn ? "Yes" : "No"]"
+ dat += "
Prompt players when spawner created: [ESI.prompt_players ? "Yes" : "No"] This will only prompt ckeys which can access the spawner."
+ dat += "
Create spawner on current location"
+ //Buttons for easy override for the faction stuff (for access and headset keys)
+
+ else
+ dat += "Here you add and configure spawners. People will be able to join to them using their pre-made character in preferences."
+ dat += ""
+ dat += " | | | | |
"
+ var/even = FALSE
+ for(var/key in managed_instances)
+ even = !even
+ var/bc_col = even ? "#13171C" : "#23272C"
+ var/datum/event_spawner_instance/ESI = managed_instances[key]
+ var/desc = ESI.flavor_text
+ if(length(desc) > 40)
+ desc = "[copytext_char(desc, 1, 57)]..."
+ dat += "| #[key] | [ESI.job_name] | [desc] | Configure | Clone |
"
+ dat += "| * | Create new | | | |
"
+ dat += "
"
+
+ winshow(usr, "event_spawn_window", TRUE)
+ var/datum/browser/popup = new(usr, "event_spawn_window", "Event Spawners
", 800, 700)
+ popup.set_content(dat.Join())
+ popup.open(FALSE)
+ onclose(usr, "event_spawn_window", src)
+
+/datum/event_spawner_manager/Topic(href, href_list)
+ if(href_list["inst_pref"])
+ var/numb = text2num(href_list["id"])
+ var/datum/event_spawner_instance/ESI = managed_instances["[numb]"]
+ if(!ESI)
+ ShowPanel(usr, null)
+ return
+ switch(href_list["inst_pref"])
+ if("return")
+ ShowPanel(usr, null)
+ return
+ if("job_name")
+ var/msg = input(usr, "Set the job name of this spawner.", "Job name", ESI.job_name) as text|null
+ if(msg)
+ ESI.job_name = msg
+ if("flavor_text")
+ var/msg = input(usr, "Set the flavor text of this spawner.", "Flavor Text", ESI.flavor_text) as message|null
+ if(msg)
+ ESI.flavor_text = msg
+ if("used_outfit")
+ var/dresscode = usr.client.robust_dress_shop()
+ if(dresscode)
+ ESI.used_outfit = dresscode
+ if("show_outfit_equipment")
+ ESI.show_outfit_equipment = !ESI.show_outfit_equipment
+ if("loadout")
+ ESI.gets_loadout = !ESI.gets_loadout
+ if("disappear_after_spawn")
+ ESI.disappear_after_spawn = !ESI.disappear_after_spawn
+ if("prompt_players")
+ ESI.prompt_players = !ESI.prompt_players
+ if("add_ckey")
+ var/msg = input(usr, "Add allowed CKEY to the spawner.", "Add CKEY", "") as text|null
+ if(msg)
+ ESI.ckey_whitelist += lowertext(msg)
+ if("add_species")
+ var/result = input(usr, "Select a species", "Add species") as null|anything in GLOB.roundstart_races
+ if(result)
+ ESI.species_whitelist += result
+ if("add_gender")
+ var/result = input(usr, "Select a gender", "Add Gender") as null|anything in list("male", "female", "plural")
+ if(result)
+ ESI.gender_whitelist += result
+ if("add_access")
+ var/msg = input(usr, "Add access type to the spawner(as number)", "Add Access", "") as num|null
+ if(msg != null)
+ if(!(msg in ESI.access_override))
+ ESI.access_override += msg
+ if("add_equip")
+ var/msg = input(usr, "Add an equipment piece, as typed path (ex. /obj/item/gun/energy/e_gun).", "Add equipment", "") as text|null
+ if(!isnull(msg))
+ var/typed = text2path(msg)
+ if(!isnull(typed))
+ ESI.additional_equipment += typed
+ if("set_headset")
+ var/result = input(usr, "Select a headset", "Set Headset") as null|anything in radio_typecache
+ if(result)
+ ESI.headset_override = result
+ if("remove_ckey")
+ var/ckey_to_rem = href_list["ckey"]
+ ESI.ckey_whitelist -= ckey_to_rem
+ if("remove_species")
+ var/spec_to_rem = href_list["species"]
+ ESI.species_whitelist -= spec_to_rem
+ if("remove_gender")
+ var/gend_to_rem = href_list["gender"]
+ ESI.gender_whitelist -= gend_to_rem
+ if("remove_access")
+ var/access_to_rem = text2num(href_list["access"])
+ ESI.access_override -= access_to_rem
+ if("remove_headset")
+ ESI.headset_override = null
+ if("remove_equip")
+ var/type_to_rem = text2path(href_list["equip"])
+ ESI.additional_equipment -= type_to_rem
+ if("make_spawner")
+ var/turfed = get_turf(usr)
+ ESI.CreateSpawner(turfed)
+ message_admins("[ADMIN_LOOKUPFLW(usr)] created an event character spawner for [ESI.job_name].")
+ if("export")
+ var/output = ESI.GetExport()
+ usr << browse("[output]", "window=export_spawner;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1")
+ return
+ if("import")
+ var/input = input(usr, "Input the spawner savefile here.", "Import Spawner") as message|null
+ if(input)
+ ESI.DoImport(input)
+ ShowPanel(usr, numb)
+ if(href_list["pref"])
+ switch(href_list["pref"])
+ if("create_new_instance")
+ var/action = alert(usr, "Create a new instance, or import?", "", "New", "Import")
+ if(!action)
+ return
+ var/import_input
+ if(action == "Import")
+ import_input = input(usr, "Input the spawner savefile here.", "Import Spawner") as message|null
+ if(!import_input)
+ return
+ next_id++
+ var/datum/event_spawner_instance/ESI = new(next_id)
+ managed_instances["[next_id]"] = ESI
+ if(import_input)
+ ESI.DoImport(import_input)
+ if("configure_instance")
+ var/numb = text2num(href_list["id"])
+ var/datum/event_spawner_instance/ESI = managed_instances["[numb]"]
+ if(ESI)
+ ShowPanel(usr, numb)
+ return
+ if("clone_instance")
+ var/numb = text2num(href_list["id"])
+ var/datum/event_spawner_instance/ESI = managed_instances["[numb]"]
+ next_id++
+ var/datum/event_spawner_instance/ESI2 = new(next_id)
+ managed_instances["[next_id]"] = ESI2
+ //Copypasta everything
+ ESI2.species_whitelist = ESI.species_whitelist.Copy()
+ ESI2.gender_whitelist = ESI.gender_whitelist.Copy()
+ ESI2.ckey_whitelist = ESI.ckey_whitelist.Copy()
+ ESI2.access_override = ESI.access_override.Copy()
+ ESI2.additional_equipment = ESI.additional_equipment.Copy()
+ ESI2.used_outfit = ESI.used_outfit
+ ESI2.job_name = ESI.job_name
+ ESI2.gets_loadout = ESI.gets_loadout
+ ESI2.headset_override = ESI.headset_override
+ ESI2.flavor_text = ESI.flavor_text
+ ESI2.disappear_after_spawn = ESI.disappear_after_spawn
+ ESI2.prompt_players = ESI.prompt_players
+
+ ShowPanel(usr, null)
+ return
+
+/client/proc/admin_open_event_spawners_menu()
+ set category = "Admin.Events"
+ set name = "Event Spawners Menu"
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/datum/event_spawner_manager/ESM = GLOB.event_spawner_manager
+ ESM.ShowPanel(usr, null)
+
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Event Spawner Menu") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ return
diff --git a/modular_skyrat/modules/events/code/event_spawner_templates.dm b/modular_skyrat/modules/events/code/event_spawner_templates.dm
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/modular_skyrat/modules/events/code/event_spawner_templates.dm
@@ -0,0 +1 @@
+
diff --git a/modular_skyrat/modules/faction/code/clothes.dm b/modular_skyrat/modules/faction/code/clothes.dm
new file mode 100644
index 00000000000..ac86b7c1792
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/clothes.dm
@@ -0,0 +1,3 @@
+/obj/item/clothing/head/hos/beret/faction
+ name = "faction beret"
+ desc = "A black beret with thick armor padding inside. Stylish and robust. There's an unknown insignia emblazoned on it."
diff --git a/modular_skyrat/modules/faction/code/id.dm b/modular_skyrat/modules/faction/code/id.dm
new file mode 100644
index 00000000000..e75520632b5
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/id.dm
@@ -0,0 +1,59 @@
+/obj/item/card/id/faction_guest
+ name = "guest card"
+ access = list(ACCESS_FACTION_PUBLIC)
+
+/obj/item/card/id/faction_crew
+ name = "crew card"
+ access = list(ACCESS_FACTION_PUBLIC, ACCESS_FACTION_CREW)
+
+/obj/item/card/id/faction_command
+ name = "command card"
+ access = list(ACCESS_FACTION_PUBLIC, ACCESS_FACTION_CREW, ACCESS_FACTION_COMMAND)
+ icon_state = "silver"
+ inhand_icon_state = "silver_id"
+
+/obj/item/card/faction_access
+ name = "faction access card"
+ desc = "A small card, that when used on any ID, will add faction access. This one is empty."
+ icon_state = "data_1"
+ var/list/extra_access
+
+/obj/item/card/faction_access/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(istype(AM, /obj/item/card/id) && proximity)
+ var/obj/item/card/id/I = AM
+ if(extra_access)
+ for(var/acs in extra_access)
+ I.access |= acs
+ to_chat(user, "You upgrade [I] with extra access.")
+ qdel(src)
+
+/obj/item/card/faction_access/guest
+ name = "faction guest access card"
+ desc = "A small card, that when used on any ID, will add guest access, which allows entering halls, living areas, kitchens and bars."
+ extra_access = list(ACCESS_FACTION_PUBLIC)
+
+/obj/item/card/faction_access/crew
+ name = "faction crew access card"
+ desc = "A small card, that when used on any ID, will add crew access, which allows entering most areas, barring command."
+ extra_access = list(ACCESS_FACTION_PUBLIC, ACCESS_FACTION_CREW)
+ color = "#BA7"
+
+/obj/item/card/faction_access/command
+ name = "faction command access card"
+ desc = "A small card, that when used on any ID, will add all faction access."
+ extra_access = list(ACCESS_FACTION_PUBLIC, ACCESS_FACTION_CREW, ACCESS_FACTION_COMMAND)
+ color = "#DDF"
+
+/obj/item/storage/box/faction_access_cards
+ name = "box of access chips"
+ desc = "In case you'd want to recruit people. Keep this safe."
+
+/obj/item/storage/box/faction_access_cards/PopulateContents()
+ for(var/i in 1 to 3)
+ new /obj/item/card/faction_access/guest(src)
+ for(var/i in 1 to 3)
+ new /obj/item/card/faction_access/crew(src)
+ new /obj/item/card/faction_access/command(src)
+ for(var/i in 1 to 4)
+ new /obj/item/encryptionkey/headset_faction(src)
diff --git a/modular_skyrat/modules/faction/code/mapping/areas.dm b/modular_skyrat/modules/faction/code/mapping/areas.dm
new file mode 100644
index 00000000000..033ce9a2a27
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/mapping/areas.dm
@@ -0,0 +1,14 @@
+/area/shuttle/trader/bridge
+ name = "Trader Ship Bridge"
+
+/area/shuttle/trader/engine
+ name = "Trader Ship Engine"
+
+/area/shuttle/trader/bar
+ name = "Trader Ship Bar"
+
+/area/shuttle/trader/crew
+ name = "Trader Ship Crew Quarters"
+
+/area/shuttle/trader/cargo
+ name = "Trader Ship Cargo Bay"
diff --git a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm
new file mode 100644
index 00000000000..277ac9a574d
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm
@@ -0,0 +1,213 @@
+/obj/machinery/computer/shuttle/trader
+ name = "trader shuttle console"
+ shuttleId = "tradership"
+ icon_screen = "syndishuttle"
+ icon_keyboard = "syndie_key"
+ light_color = COLOR_SOFT_RED
+ possible_destinations = "tradership;tradership_custom;tradership_away;pirateship_away;pirateship_home;whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland"
+ circuit = /obj/item/circuitboard/computer/trader_ship
+
+/obj/machinery/computer/camera_advanced/shuttle_docker/trader
+ name = "trader shuttle navigation computer"
+ desc = "Used to designate a precise transit location for the trade shuttle."
+ shuttleId = "tradership"
+ shuttlePortId = "tradership_custom"
+ view_range = 8
+ x_offset = -6
+ y_offset = -10
+ see_hidden = FALSE
+ icon_screen = "syndishuttle"
+ icon_keyboard = "syndie_key"
+ jumpto_ports = list("tradership" = 1, "tradership_away" = 1, "tradership_custom" = 1,"whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1, "whiteship_lavaland" = 1)
+ whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava, /turf/closed/mineral)
+ lock_override = NONE
+
+/obj/item/circuitboard/computer/trader_ship
+ build_path = /obj/machinery/computer/shuttle/trader
+
+/obj/docking_port/mobile/tradership
+ name = "trade shuttle"
+ id = "tradership"
+ rechargeTime = 2 MINUTES
+
+/obj/docking_port/stationary/picked/tradership
+ name = "Deep Space"
+ id = "tradership_away"
+ dheight = 0
+ dir = 2
+ dwidth = 11
+ height = 22
+ width = 35
+ shuttlekeys = list("tradership")
+
+/obj/structure/closet/crate/tradership_cargo
+ var/used_preset
+
+//Generic inventory
+/obj/structure/closet/crate/tradership_cargo/PopulateContents()
+ . = ..()
+ var/random = used_preset || rand(1,5)
+ switch(random)
+ if(1)
+ for(var/i in 1 to 10)
+ new /obj/item/food/canned/beans(src)
+ for(var/i in 1 to 10)
+ new /obj/item/reagent_containers/food/drinks/waterbottle(src)
+ if(2)
+ new /obj/item/stack/sheet/metal/fifty(src)
+ new /obj/item/stack/rods/fifty(src)
+ new /obj/item/stack/sheet/glass/fifty(src)
+ new /obj/item/stack/sheet/mineral/wood/fifty(src)
+ new /obj/item/stack/cable_coil(src)
+ if(3)
+ for(var/i in 1 to 5)
+ new /obj/item/tank/internals/emergency_oxygen/engi(src)
+ new /obj/item/tank/internals/oxygen(src)
+ new /obj/item/tank/internals/nitrogen(src)
+ new /obj/item/tank/internals/nitrogen/belt/full(src)
+ new /obj/item/tank/internals/plasma(src)
+ new /obj/item/tank/internals/plasmaman/belt/full(src)
+ for(var/i in 1 to 7)
+ new /obj/item/clothing/mask/breath()
+ desc = "An internals crate."
+ name = "internals crate"
+ icon_state = "o2crate"
+ if(4)
+ new /obj/item/storage/firstaid/regular(src)
+ new /obj/item/storage/firstaid/o2(src)
+ new /obj/item/storage/firstaid/toxin(src)
+ new /obj/item/reagent_containers/hypospray/medipen(src)
+ new /obj/item/reagent_containers/hypospray/medipen/ekit(src)
+ desc = "A medical crate."
+ name = "medical crate"
+ icon_state = "medicalcrate"
+ if(5)
+ new /obj/item/storage/toolbox/artistic(src)
+ new /obj/item/storage/toolbox/electrical(src)
+ new /obj/item/storage/toolbox/electrical(src)
+ new /obj/item/storage/toolbox/mechanical(src)
+ new /obj/item/storage/toolbox/mechanical(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
+ name = "engineering crate"
+ icon_state = "engi_crate"
+
+/obj/structure/closet/crate/freezer/tradership_cargo_freezer
+ var/used_preset
+
+/obj/structure/closet/crate/freezer/tradership_cargo_freezer/PopulateContents()
+ . = ..()
+ var/random = used_preset || rand(1,4)
+ switch(random)
+ if(1)
+ new /obj/item/reagent_containers/blood(src)
+ new /obj/item/reagent_containers/blood(src)
+ new /obj/item/reagent_containers/blood/a_minus(src)
+ new /obj/item/reagent_containers/blood/b_minus(src)
+ new /obj/item/reagent_containers/blood/b_plus(src)
+ new /obj/item/reagent_containers/blood/o_minus(src)
+ new /obj/item/reagent_containers/blood/o_plus(src)
+ new /obj/item/reagent_containers/blood/lizard(src)
+ new /obj/item/reagent_containers/blood/ethereal(src)
+ for(var/i in 1 to 3)
+ new /obj/item/reagent_containers/blood/random(src)
+ if(2)
+ new /obj/item/bodypart/l_arm/robot(src)
+ new /obj/item/bodypart/l_arm/robot(src)
+ new /obj/item/bodypart/r_arm/robot(src)
+ new /obj/item/bodypart/r_arm/robot(src)
+ new /obj/item/bodypart/l_leg/robot(src)
+ new /obj/item/bodypart/l_leg/robot(src)
+ new /obj/item/bodypart/r_leg/robot(src)
+ new /obj/item/bodypart/r_leg/robot(src)
+ if(3)
+ for(var/i in 1 to 6)
+ new /obj/item/storage/box/ingredients/wildcard(src)
+ if(4)
+ new /obj/item/food/meat/slab/human/mutant/slime(src)
+ new /obj/item/food/meat/slab/killertomato(src)
+ new /obj/item/food/meat/slab/bear(src)
+ new /obj/item/food/meat/slab/xeno(src)
+ new /obj/item/food/meat/slab/spider(src)
+ new /obj/item/food/meat/rawbacon(src)
+ new /obj/item/food/meat/slab/penguin(src)
+ new /obj/item/food/spiderleg(src)
+ new /obj/item/food/carpmeat(src)
+ new /obj/item/food/meat/slab/human(src)
+
+/obj/structure/closet/crate/secure/tradership_cargo_valuable
+ req_access = ACCESS_FACTION_CREW
+ var/used_preset
+
+/obj/structure/closet/crate/secure/tradership_cargo_valuable/PopulateContents()
+ . = ..()
+ var/random = used_preset || rand(1,5)
+ switch(random)
+ if(1) //Random traitor items
+ new /obj/item/storage/box/syndie_kit/chameleon(src)
+ new /obj/item/storage/backpack/duffelbag/syndie/c4(src)
+ new /obj/item/camera_bug(src)
+ new /obj/item/gun/chem(src)
+ new /obj/item/card/emag(src)
+ new /obj/item/card/emag/doorjack(src)
+ new /obj/item/gun/medbeam(src)
+ new /obj/item/healthanalyzer/rad_laser(src)
+ new /obj/item/pen/sleepy(src)
+ new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src)
+ if(2) //Energy weapons + energy knives
+ new /obj/item/gun/energy/e_gun(src)
+ new /obj/item/gun/energy/e_gun(src)
+ new /obj/item/gun/energy/e_gun/mini(src)
+ new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
+ new /obj/item/gun/energy/e_gun/nuclear(src)
+ new /obj/item/melee/transforming/energy/sword(src)
+ new /obj/item/melee/transforming/energy/sword(src)
+ if(3) //Ballistics + knives
+ new /obj/item/kitchen/knife/combat(src)
+ new /obj/item/kitchen/knife/combat(src)
+ new /obj/item/switchblade(src)
+ new /obj/item/switchblade(src)
+ new /obj/item/gun/ballistic/automatic/cfa_wildcat(src)
+ new /obj/item/gun/ballistic/automatic/cfa_wildcat(src)
+ for(var/i in 1 to 2)
+ new /obj/item/ammo_box/magazine/smg32(src)
+ new /obj/item/ammo_box/magazine/smg32/rubber(src)
+ new /obj/item/gun/ballistic/automatic/assault_rifle/akm(src)
+ for(var/i in 1 to 2)
+ new /obj/item/ammo_box/magazine/akm(src)
+ new /obj/item/gun/ballistic/automatic/submachine_gun/ppsh(src)
+ for(var/i in 1 to 2)
+ new /obj/item/ammo_box/magazine/ppsh(src)
+ new /obj/item/gun/ballistic/automatic/assault_rifle/stg(src)
+ for(var/i in 1 to 2)
+ new /obj/item/ammo_box/magazine/stg(src)
+
+ if(4) //Hardsuits
+ new /obj/item/clothing/suit/space/hardsuit/mining(src)
+ new /obj/item/clothing/suit/space/hardsuit/engine(src)
+ new /obj/item/clothing/suit/space/hardsuit/engine/atmos(src)
+ new /obj/item/clothing/suit/space/hardsuit/rd(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/swat(src)
+ if(5) //Implants
+ new /obj/item/storage/box/cyber_implants(src)
+ new /obj/item/organ/cyberimp/arm/combat(src)
+ new /obj/item/organ/cyberimp/arm/surgery(src)
+ new /obj/item/organ/cyberimp/arm/baton(src)
+ new /obj/item/organ/cyberimp/arm/toolset(src)
+ new /obj/item/organ/cyberimp/arm/gun/taser(src)
+
+/obj/structure/closet/crate/secure/tradership_cargo_very_valuable
+ req_access = ACCESS_FACTION_COMMAND
+ icon_state = "weaponcrate"
+ var/used_preset
+
+/obj/structure/closet/crate/secure/tradership_cargo_very_valuable/PopulateContents()
+ . = ..()
+ var/random = used_preset || rand(1,1)
+ switch(random)
+ if(1) //45 TC, but no uplink. Better find a cantor
+ new /obj/item/stack/telecrystal/twenty(src)
+ new /obj/item/stack/telecrystal/twenty(src)
+ new /obj/item/stack/telecrystal/five(src)
diff --git a/modular_skyrat/modules/faction/code/mapping/ruins.dm b/modular_skyrat/modules/faction/code/mapping/ruins.dm
new file mode 100644
index 00000000000..8436445a98c
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/mapping/ruins.dm
@@ -0,0 +1,6 @@
+/datum/map_template/shuttle/tradership
+ prefix = "modular_skyrat/modules/faction/maps/shuttles/"
+ suffix = "faction"
+ can_be_bought = FALSE
+ name = "Faction Trader Ship"
+ port_id = "tradership"
diff --git a/modular_skyrat/modules/faction/code/outfit.dm b/modular_skyrat/modules/faction/code/outfit.dm
new file mode 100644
index 00000000000..c00fdccab98
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/outfit.dm
@@ -0,0 +1,76 @@
+/datum/outfit/faction_captain
+ name = "Faction - Captain"
+ head = /obj/item/clothing/head/hos/beret/faction
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/hos/trenchcoat
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/headset_faction/bowman/captain
+ glasses = /obj/item/clothing/glasses/sunglasses
+ belt = /obj/item/gun/energy/e_gun
+ back = /obj/item/storage/backpack
+ id = /obj/item/card/id/faction_command
+ l_pocket = /obj/item/melee/transforming/energy/sword
+ backpack_contents = list(/obj/item/storage/box/survival/engineer=1,/obj/item/storage/box/faction_access_cards=1, /obj/item/storage/box/zipties,/obj/item/melee/classic_baton/telescopic=1, /obj/item/ammo_box/magazine/m45=2, /obj/item/gun/ballistic/automatic/pistol/m1911=1, /obj/item/stack/spacecash/c10000=1)
+
+/datum/outfit/faction_goon
+ name = "Faction - Goon"
+ mask = /obj/item/clothing/mask/gas/sechailer/swat
+ head = /obj/item/clothing/head/helmet/swat
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/hos/trenchcoat
+ suit_store = /obj/item/gun/ballistic/automatic/wt550
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/headset_faction/bowman
+ glasses = /obj/item/clothing/glasses/sunglasses
+ belt = /obj/item/gun/energy/e_gun
+ back = /obj/item/storage/backpack
+ id = /obj/item/card/id/faction_crew
+ l_pocket = /obj/item/melee/transforming/energy/sword
+ backpack_contents = list(/obj/item/storage/box/survival/engineer=1,/obj/item/ammo_box/magazine/wt550m9=2, /obj/item/ammo_box/magazine/m45=2, /obj/item/melee/classic_baton=1, /obj/item/gun/ballistic/automatic/pistol/m1911=1,/obj/item/stack/spacecash/c1000=1)
+
+/datum/outfit/faction_medic
+ name = "Faction - Medic"
+ head = /obj/item/clothing/head/hos/beret/faction
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/hos/trenchcoat
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/headset_faction/bowman
+ glasses = /obj/item/clothing/glasses/hud/health
+ belt = /obj/item/gun/energy/e_gun
+ back = /obj/item/storage/backpack
+ id = /obj/item/card/id/faction_crew
+ l_pocket = /obj/item/melee/transforming/energy/sword
+ l_hand = /obj/item/storage/backpack/duffelbag/med/surgery
+ backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/storage/firstaid/tactical=1,/obj/item/storage/firstaid/regular=1,/obj/item/storage/firstaid/toxin=1, /obj/item/ammo_box/magazine/m45=2, /obj/item/gun/ballistic/automatic/pistol/m1911=1,/obj/item/healthanalyzer=1,/obj/item/stack/spacecash/c1000=1)
+
+/datum/outfit/faction_tech
+ name = "Faction - Tech"
+ head = /obj/item/clothing/head/hos/beret/faction
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/hos/trenchcoat
+ suit_store = /obj/item/gun/energy/e_gun
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/headset_faction/bowman
+ glasses = /obj/item/clothing/glasses/meson/engine
+ belt = /obj/item/storage/belt/utility/syndicate
+ back = /obj/item/storage/backpack
+ id = /obj/item/card/id/faction_crew
+ l_pocket = /obj/item/melee/transforming/energy/sword
+ l_hand = /obj/item/storage/part_replacer/bluespace/tier2
+ backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/stack/sheet/metal/fifty=1, /obj/item/stack/sheet/glass/fifty=1, /obj/item/construction/rcd/combat, /obj/item/ammo_box/magazine/m45=2, /obj/item/gun/ballistic/automatic/pistol/m1911=1,/obj/item/stack/spacecash/c1000=1)
+
+/datum/outfit/faction_crew
+ name = "Faction - Crew"
+ uniform = /obj/item/clothing/under/syndicate
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/headset_faction
+ belt = /obj/item/gun/ballistic/automatic/pistol
+ back = /obj/item/storage/backpack
+ id = /obj/item/card/id/faction_crew
+ l_pocket = /obj/item/melee/transforming/energy/sword
+ backpack_contents = list(/obj/item/storage/box/survival/engineer=1,/obj/item/ammo_box/magazine/m9mm=2,/obj/item/stack/spacecash/c500=1)
diff --git a/modular_skyrat/modules/faction/code/radio.dm b/modular_skyrat/modules/faction/code/radio.dm
new file mode 100644
index 00000000000..04faac14b16
--- /dev/null
+++ b/modular_skyrat/modules/faction/code/radio.dm
@@ -0,0 +1,26 @@
+/obj/item/encryptionkey/headset_faction
+ name = "faction radio encryption key"
+ icon_state = "cargo_cypherkey"
+ channels = list(RADIO_CHANNEL_FACTION = 1)
+ independent = TRUE
+
+/obj/item/radio/headset/headset_faction
+ name = "faction radio headset"
+ desc = "Headset used by the faction."
+ icon_state = "cargo_headset"
+ keyslot = new /obj/item/encryptionkey/headset_faction
+
+/obj/item/radio/headset/headset_faction/bowman
+ name = "faction bowman headset"
+ desc = "Headset used by the faction. Protects ears from flashbangs."
+ icon_state = "com_headset_alt"
+ inhand_icon_state = "com_headset_alt"
+
+/obj/item/radio/headset/headset_faction/bowman/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS))
+
+/obj/item/radio/headset/headset_faction/bowman/captain
+ name = "faction captain bowman headset"
+ desc = "The headset of the boss. Protects ears from flashbangs."
+ command = TRUE
diff --git a/modular_skyrat/modules/faction/maps/shuttles/tradership_faction.dmm b/modular_skyrat/modules/faction/maps/shuttles/tradership_faction.dmm
new file mode 100644
index 00000000000..de829b6dfdc
--- /dev/null
+++ b/modular_skyrat/modules/faction/maps/shuttles/tradership_faction.dmm
@@ -0,0 +1,3425 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/engine)
+"ac" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/engine)
+"ad" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/cargo)
+"ae" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/door/poddoor{
+ id = "whiteship_port"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/cargo)
+"af" = (
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/door/poddoor{
+ id = "whiteship_port"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/cargo)
+"ag" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/crew)
+"ah" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "401"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/docking_port/mobile{
+ callTime = 250;
+ can_move_docking_ports = 1;
+ dir = 2;
+ dwidth = 11;
+ height = 17;
+ id = "tradership";
+ launch_status = 0;
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "Trader Ship";
+ port_direction = 8;
+ preferred_direction = 4;
+ width = 33
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/crew)
+"ai" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/crew)
+"aj" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/poddoor{
+ id = "whiteship_windows"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/crew)
+"ak" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"al" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/space_heater,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"am" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/poddoor{
+ id = "whiteship_windows"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"an" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/cargo)
+"ao" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ id = "whiteship_port";
+ name = "Port Blast Door Control";
+ pixel_x = -24;
+ pixel_y = 5;
+ req_access_txt = "403"
+ },
+/obj/structure/closet/crate/secure/tradership_cargo_valuable{
+ used_preset = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"ap" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aq" = (
+/obj/item/food/canned/beans{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/item/food/canned/beans{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/food/canned/beans{
+ pixel_x = -2
+ },
+/obj/item/food/canned/beans{
+ pixel_x = 5
+ },
+/obj/item/food/canned/beans{
+ pixel_x = 1;
+ pixel_y = -3
+ },
+/obj/item/food/canned/beans{
+ pixel_x = 8;
+ pixel_y = -3
+ },
+/obj/structure/closet/crate{
+ name = "food crate"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"ar" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate{
+ name = "food crate"
+ },
+/obj/item/vending_refill/cigarette{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/vending_refill/cigarette,
+/obj/item/vending_refill/coffee{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"as" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ id = "whiteship_port";
+ name = "Port Blast Door Control";
+ pixel_x = 24;
+ pixel_y = 5;
+ req_access_txt = "403"
+ },
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"at" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/crew)
+"au" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"av" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/bed,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/item/bedsheet/brown,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "CabinT1";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aw" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"ax" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/trader/engine)
+"ay" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/trader/engine)
+"az" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/closet/crate/secure/tradership_cargo_valuable{
+ used_preset = 5
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aB" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/firecloset/full{
+ anchored = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aC" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aD" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aE" = (
+/obj/structure/closet/crate{
+ name = "food crate"
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = -2
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 5
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 1;
+ pixel_y = -3
+ },
+/obj/item/reagent_containers/food/drinks/waterbottle/large{
+ pixel_x = 8;
+ pixel_y = -3
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aF" = (
+/obj/effect/turf_decal/box/white/corners,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aG" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/firecloset/full{
+ anchored = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery/white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aI" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "401"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/trader/crew)
+"aJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock{
+ id_tag = "CabinT1";
+ name = "Cabin 1"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock{
+ id_tag = "CabinT2";
+ name = "Cabin 2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aL" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/trader/engine)
+"aM" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aP" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"aR" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aU" = (
+/obj/effect/turf_decal/arrows/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"aV" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aX" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"aZ" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/glass{
+ name = "Crew Quarters";
+ req_access_txt = "402"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"ba" = (
+/obj/machinery/light/small,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/crew)
+"bb" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/crew)
+"bc" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/crew)
+"be" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/crew)
+"bf" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/obj/structure/closet/wardrobe/black,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/crew)
+"bg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bh" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = 4
+ },
+/obj/item/flashlight{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bi" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/machinery/light/small,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bk" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/storage/belt/utility,
+/obj/item/weldingtool,
+/obj/item/clothing/head/welding,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bm" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bn" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bo" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bp" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/storage/box/lights/bulbs,
+/obj/item/stack/cable_coil{
+ pixel_x = 2
+ },
+/obj/item/stock_parts/cell/high/plus,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bq" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/rack,
+/obj/item/storage/belt/utility,
+/obj/item/radio/off{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/radio/off,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"br" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"bs" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"bt" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock{
+ id_tag = "RestroomT";
+ name = "Restroom"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/trader/crew)
+"bu" = (
+/obj/structure/sign/departments/restroom,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/crew)
+"bv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/structure/bedsheetbin,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc{
+ name = "Salvage Ship Crew Quarters APC";
+ pixel_y = -23
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/crew)
+"bw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/washing_machine,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/crew)
+"bx" = (
+/obj/machinery/porta_turret/centcom_shuttle/weak{
+ dir = 4
+ },
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/crew)
+"by" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/engineering{
+ name = "Engineering";
+ req_access_txt = "402"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bz" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -26
+ },
+/obj/structure/closet/crate/internals,
+/obj/item/tank/internals/oxygen{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/mask/breath,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bB" = (
+/obj/effect/turf_decal/arrows/white{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bC" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/structure/closet/crate/secure/tradership_cargo_valuable{
+ used_preset = 3
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bD" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/bar)
+"bE" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/public/glass{
+ name = "Bar"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"bF" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small,
+/obj/structure/curtain,
+/obj/machinery/shower{
+ pixel_y = 15
+ },
+/obj/item/soap,
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/trader/crew)
+"bG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 11
+ },
+/obj/structure/toilet{
+ dir = 1
+ },
+/obj/structure/mirror{
+ pixel_x = 28
+ },
+/obj/machinery/button/door{
+ id = "RestroomT";
+ name = "Restroom Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_y = -25;
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/shuttle/trader/crew)
+"bH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"bI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"bJ" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/storage/belt/utility,
+/obj/item/radio/off{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/radio/off,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"bK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bL" = (
+/obj/effect/turf_decal/arrows/white{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bM" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/machinery/microwave,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = 32
+ },
+/obj/item/storage/box/donkpockets,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"bN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/trash/plate{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/obj/item/trash/plate{
+ pixel_x = -6
+ },
+/obj/item/trash/plate{
+ pixel_x = -6;
+ pixel_y = 2
+ },
+/obj/item/trash/plate{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/trash/plate{
+ pixel_x = -6;
+ pixel_y = 6
+ },
+/obj/item/kitchen/fork{
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/obj/item/kitchen/fork{
+ pixel_x = 6;
+ pixel_y = 3
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Salvage Ship Bar APC";
+ pixel_y = 23
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"bO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"bP" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/coffee{
+ onstation = 0
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"bQ" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/bridge)
+"bR" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/poddoor{
+ id = "whiteship_bridge"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/bridge)
+"bS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -26
+ },
+/obj/effect/turf_decal/stripes/white/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"bT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/stack/sheet/metal/twenty,
+/obj/item/stack/sheet/glass{
+ amount = 10
+ },
+/obj/item/stack/rods/twentyfive,
+/obj/item/wrench,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"bU" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"bV" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bX" = (
+/obj/effect/turf_decal/box/white/corners,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"bY" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plating,
+/area/shuttle/trader/bar)
+"bZ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"ca" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cb" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cc" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cd" = (
+/obj/structure/table,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/paper_bin{
+ pixel_x = -4
+ },
+/obj/item/pen{
+ pixel_x = -4
+ },
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Salvage Ship Bridge APC";
+ pixel_y = 23
+ },
+/obj/item/camera{
+ pixel_x = 12;
+ pixel_y = 6
+ },
+/obj/item/storage/photo_album{
+ pixel_x = 14
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"ce" = (
+/obj/structure/table,
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/folder/blue{
+ pixel_x = 6;
+ pixel_y = 9
+ },
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cf" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/turretid{
+ icon_state = "control_kill";
+ lethal = 1;
+ locked = 0;
+ pixel_y = 28;
+ req_access = null;
+ req_access_txt = "402"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"ch" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"ci" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = 32
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"cj" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"ck" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cl" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/machinery/space_heater,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cm" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cn" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -8;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_x = 1;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/food/drinks/soda_cans/cola{
+ pixel_x = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"co" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/storage/fancy/donut_box{
+ pixel_x = -11;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_x = 6;
+ pixel_y = 14
+ },
+/obj/item/food/chocolatebar{
+ pixel_x = 5;
+ pixel_y = -3
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cq" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cr" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/command{
+ name = "Bridge";
+ req_access_txt = "403""
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cs" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"ct" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cu" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/computer/shuttle/trader{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/obj/effect/turf_decal/stripes/white/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cx" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stack/cable_coil{
+ pixel_x = 2;
+ pixel_y = 6
+ },
+/obj/item/stock_parts/cell/high/plus,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cy" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cz" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cC" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cD" = (
+/obj/structure/table,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/radio/off{
+ pixel_x = 6;
+ pixel_y = 7
+ },
+/obj/item/megaphone{
+ pixel_x = -2;
+ pixel_y = -4
+ },
+/obj/machinery/vending/boozeomat{
+ pixel_y = -32;
+ req_access = null;
+ req_access_txt = "403"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cE" = (
+/obj/structure/table,
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/obj/item/storage/toolbox/emergency{
+ pixel_x = -12
+ },
+/obj/item/wrench{
+ pixel_x = -12
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ id = "whiteship_bridge";
+ name = "Bridge Blast Door Control";
+ pixel_x = 5;
+ pixel_y = -24;
+ req_access_txt = "402"
+ },
+/obj/machinery/button/door{
+ id = "whiteship_windows";
+ name = "Windows Blast Door Control";
+ pixel_x = -5;
+ pixel_y = -24;
+ req_access_txt = "402"
+ },
+/obj/effect/turf_decal/tile/blue,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/computer/camera_advanced/shuttle_docker/trader{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bridge)
+"cH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cI" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 6
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/clothing/head/welding{
+ pixel_x = -2;
+ pixel_y = 1
+ },
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/engine)
+"cJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Salvage Ship Cargo APC";
+ pixel_x = -25
+ },
+/obj/structure/cable,
+/obj/structure/closet/crate/secure/tradership_cargo_very_valuable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cL" = (
+/obj/structure/table,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/item/reagent_containers/food/drinks/bottle/vodka{
+ pixel_y = 12
+ },
+/obj/item/reagent_containers/food/drinks/bottle/whiskey{
+ pixel_x = 16;
+ pixel_y = 12
+ },
+/obj/item/reagent_containers/food/drinks/bottle/gin{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/drinks/bottle/cognac{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_y = -32
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cM" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/reagent_containers/food/drinks/bottle/wine{
+ pixel_y = 12
+ },
+/obj/item/reagent_containers/food/drinks/bottle/vermouth{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/drinks/bottle/tequila{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cO" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/cigarette{
+ onstation = 0
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"cP" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/secure/weapon,
+/obj/item/gun/energy/laser/retro,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cR" = (
+/obj/effect/turf_decal/arrows/white{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cS" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"cT" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/public/glass{
+ name = "Bar"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"cU" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/processor,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/deepfryer,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"cW" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/bar)
+"cX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/smes/engineering{
+ charge = 1e+006
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"cY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stack/cable_coil,
+/obj/item/stock_parts/cell/high,
+/obj/item/multitool,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"cZ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"da" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/mop,
+/obj/item/storage/bag/trash{
+ pixel_x = 6
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"db" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dc" = (
+/obj/effect/turf_decal/box/white/corners,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dd" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"de" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"df" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/analyzer,
+/obj/item/wrench,
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/mask/breath,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/rack,
+/obj/item/clothing/head/welding{
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/obj/item/storage/toolbox/mechanical,
+/obj/item/multitool{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dh" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"di" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dj" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/secure_closet/freezer/fridge/open,
+/obj/item/reagent_containers/food/condiment/flour{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/food/condiment/flour,
+/obj/item/food/meat/slab/synthmeat{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/food/meat/slab/synthmeat,
+/obj/item/food/meat/slab/synthmeat{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dk" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dl" = (
+/obj/structure/sign/departments/botany,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/bar)
+"dm" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dn" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/spawner/lootdrop/space/rareseed,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"do" = (
+/obj/machinery/porta_turret/centcom_shuttle/weak{
+ dir = 4
+ },
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/trader/bar)
+"dp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dq" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"ds" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dt" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402""
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dv" = (
+/obj/effect/turf_decal/arrows/white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dw" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/external{
+ req_access_txt = "402"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dx" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dy" = (
+/obj/machinery/light/small,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dz" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dA" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/glass{
+ name = "Kitchen"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dB" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dC" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dD" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/glass{
+ name = "Hydroponics"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dE" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dF" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/obj/machinery/vending/hydroseeds{
+ use_power = 0
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dH" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc{
+ name = "Salvage Ship Engineering APC";
+ pixel_y = -23
+ },
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/metal/twenty,
+/obj/item/stack/sheet/glass{
+ amount = 10
+ },
+/obj/item/stack/sheet/mineral/plasma{
+ amount = 10
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dK" = (
+/obj/machinery/computer/monitor{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dL" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dM" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dN" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/tank_dispenser/oxygen,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/delivery/white,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/bar)
+"dP" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "401"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/trader/bar)
+"dQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -8;
+ pixel_y = 10
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/storage/box/drinkingglasses{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dR" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 11
+ },
+/obj/effect/decal/cleanable/food/flour,
+/turf/open/floor/plasteel/cafeteria,
+/area/shuttle/trader/bar)
+"dS" = (
+/obj/machinery/smartfridge,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/trader/bar)
+"dT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = -12;
+ pixel_y = 2
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dU" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/green,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/storage/bag/plants/portaseeder,
+/obj/item/shovel/spade,
+/obj/item/cultivator,
+/obj/item/plant_analyzer,
+/obj/item/reagent_containers/glass/bucket,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"dW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/port_gen/pacman{
+ anchored = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot,
+/obj/item/wrench,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate,
+/obj/item/shovel,
+/obj/item/pickaxe,
+/obj/item/storage/box/lights/mixed,
+/obj/item/mining_scanner,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"dY" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ id = "whiteship_starboard";
+ name = "Starboard Blast Door Control";
+ pixel_x = -24;
+ pixel_y = -5;
+ req_access_txt = "403""
+ },
+/obj/structure/closet/crate/secure/tradership_cargo_valuable{
+ used_preset = 2
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"dZ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/fire,
+/obj/item/reagent_containers/glass/bottle/morphine,
+/obj/item/reagent_containers/syringe,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"ea" = (
+/obj/effect/turf_decal/box/white/corners,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ id = "whiteship_starboard";
+ name = "Starboard Blast Door Control";
+ pixel_x = 24;
+ pixel_y = -5;
+ req_access_txt = "403"
+ },
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"eb" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/machinery/door/poddoor{
+ id = "whiteship_windows"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/bar)
+"ec" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/bar)
+"ed" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -26
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/machinery/reagentgrinder{
+ pixel_y = 6
+ },
+/obj/item/kitchen/rollingpin{
+ pixel_x = 8
+ },
+/obj/item/kitchen/knife{
+ pixel_x = 16
+ },
+/obj/item/reagent_containers/food/condiment/sugar{
+ pixel_x = -9;
+ pixel_y = 14
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ layer = 5;
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"ee" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"ef" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/hydroponics/constructable,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"eg" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 26
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/space/rareseed,
+/turf/open/floor/plasteel,
+/area/shuttle/trader/bar)
+"eh" = (
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/door/poddoor{
+ id = "whiteship_starboard"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/cargo)
+"ei" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/door/poddoor{
+ id = "whiteship_starboard"
+ },
+/turf/open/floor/plating,
+/area/shuttle/trader/cargo)
+"ej" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "401"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/shuttle/trader/bar)
+"el" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plating,
+/area/shuttle/trader/engine)
+"em" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"fa" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood,
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"hv" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"ki" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"kO" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/tradership_cargo,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"nT" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"qY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/obj/structure/closet/secure_closet/personal,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "CabinT2";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/crew)
+"wM" = (
+/obj/effect/turf_decal/arrows/white{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/blood,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"zJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/secure/tradership_cargo_valuable{
+ used_preset = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"Fb" = (
+/obj/effect/turf_decal/box/white/corners{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/freezer/tradership_cargo_freezer,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+"Gb" = (
+/obj/effect/turf_decal/box/white/corners,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/freezer/tradership_cargo_freezer,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/trader/cargo)
+
+(1,1,1) = {"
+aa
+ab
+ax
+aL
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ax
+aL
+ab
+aa
+"}
+(2,1,1) = {"
+ab
+ac
+ay
+ay
+ac
+ab
+aa
+aa
+aa
+aa
+aa
+ab
+ac
+ay
+ay
+ac
+ab
+"}
+(3,1,1) = {"
+ac
+ak
+az
+aM
+bg
+ac
+aa
+ab
+ch
+ab
+aa
+ac
+cX
+dp
+dH
+dW
+ac
+"}
+(4,1,1) = {"
+ac
+al
+aA
+aN
+bh
+ac
+am
+ac
+ci
+ac
+am
+ac
+cY
+el
+dI
+dX
+ac
+"}
+(5,1,1) = {"
+ab
+ac
+aB
+aO
+bi
+ac
+bH
+ac
+cj
+ac
+cH
+ac
+cZ
+dr
+dJ
+ac
+ab
+"}
+(6,1,1) = {"
+aa
+am
+aC
+aP
+bj
+by
+bI
+bS
+ck
+cw
+bI
+by
+bj
+ds
+dK
+am
+aa
+"}
+(7,1,1) = {"
+aa
+ac
+ac
+aQ
+ac
+ac
+bJ
+bT
+cl
+cx
+cI
+ac
+ac
+dt
+ac
+ac
+aa
+"}
+(8,1,1) = {"
+ad
+an
+aD
+aR
+bk
+ac
+ac
+bU
+bU
+bU
+ac
+ac
+da
+aR
+dL
+an
+ad
+"}
+(9,1,1) = {"
+ae
+ao
+aE
+aR
+fa
+bz
+bK
+Fb
+bW
+cy
+cJ
+cP
+db
+aT
+bV
+dY
+eh
+"}
+(10,1,1) = {"
+ae
+ap
+ap
+aT
+bo
+bA
+ap
+aF
+bW
+bo
+ap
+cQ
+dc
+aR
+em
+bA
+ei
+"}
+(11,1,1) = {"
+af
+aq
+ap
+aU
+bn
+bB
+bL
+bW
+bW
+nT
+wM
+cR
+dd
+dv
+ap
+zJ
+ei
+"}
+(12,1,1) = {"
+ae
+ar
+ap
+aR
+de
+ap
+ap
+dq
+bW
+hv
+ap
+ki
+bm
+aT
+ap
+dZ
+eh
+"}
+(13,1,1) = {"
+af
+as
+aF
+aR
+bo
+bC
+ap
+bX
+nT
+kO
+cK
+cS
+Gb
+aR
+dM
+ea
+ei
+"}
+(14,1,1) = {"
+ad
+an
+aG
+aR
+bp
+bD
+bD
+bY
+bY
+bY
+bD
+bD
+df
+aT
+dN
+an
+ad
+"}
+(15,1,1) = {"
+aa
+ai
+ai
+aV
+ai
+bD
+bM
+bZ
+cn
+cz
+cL
+bD
+bD
+dw
+bD
+bD
+aa
+"}
+(16,1,1) = {"
+aa
+aj
+aH
+aW
+bq
+bD
+bN
+ca
+co
+cA
+cM
+bD
+dg
+dx
+dO
+eb
+aa
+"}
+(17,1,1) = {"
+ag
+ai
+ai
+aX
+br
+bE
+bO
+cb
+cb
+bO
+cN
+cT
+dh
+dy
+bD
+bD
+cW
+"}
+(18,1,1) = {"
+ah
+at
+aI
+aY
+bs
+bD
+bP
+cc
+cq
+cC
+cO
+bD
+di
+dz
+dP
+ec
+ej
+"}
+(19,1,1) = {"
+ai
+ai
+ai
+aZ
+ai
+ai
+bQ
+bQ
+cr
+bQ
+bQ
+bD
+bD
+dA
+bD
+bD
+bD
+"}
+(20,1,1) = {"
+ai
+au
+ai
+ba
+ai
+bF
+bQ
+cd
+cs
+cD
+bQ
+cU
+dj
+dB
+dQ
+ed
+bD
+"}
+(21,1,1) = {"
+aj
+av
+aJ
+bb
+bt
+bG
+bQ
+ce
+ct
+cE
+bQ
+cV
+dk
+dC
+dR
+ee
+eb
+"}
+(22,1,1) = {"
+ai
+ai
+ai
+bc
+bu
+ai
+bQ
+cf
+cu
+cF
+bQ
+bD
+dl
+dD
+dS
+bD
+bD
+"}
+(23,1,1) = {"
+aj
+aw
+aK
+bb
+bv
+ai
+bR
+cg
+cv
+cG
+bR
+bD
+dm
+dE
+dT
+ef
+eb
+"}
+(24,1,1) = {"
+ai
+qY
+ai
+be
+bw
+ai
+bR
+bR
+bR
+bR
+bR
+bD
+dn
+dF
+dU
+eg
+bD
+"}
+(25,1,1) = {"
+ag
+ai
+ai
+bf
+ai
+ag
+aa
+aa
+aa
+aa
+aa
+cW
+bD
+dG
+dV
+bD
+cW
+"}
+(26,1,1) = {"
+aa
+ag
+ai
+ai
+bx
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+do
+bD
+bD
+cW
+aa
+"}
diff --git a/modular_skyrat/modules/faction/readme.md b/modular_skyrat/modules/faction/readme.md
new file mode 100644
index 00000000000..475f995654b
--- /dev/null
+++ b/modular_skyrat/modules/faction/readme.md
@@ -0,0 +1,27 @@
+## Title: Faction.
+
+MODULE ID: FACTION
+
+### Description:
+
+This adds a set of content introducing a new faction, including their own access, radio frequency, outfits and map prefabs. This is to be used with the Event Spawners Menu for easy event organisation.
+
+### TG Proc Changes:
+
+- Please see changed files on PR. Skyrat tags applied.
+
+### Defines:
+
+- N/A
+
+### Master file additions
+
+- N/A
+
+### Included files that are not contained in this module:
+
+- N/A
+
+
+### Credits:
+Azarak
diff --git a/tgstation.dme b/tgstation.dme
index c5d370577fa..bdef56d2cdd 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -136,6 +136,7 @@
#include "code\__DEFINES\~skyrat_defines\ambitions.dm"
#include "code\__DEFINES\~skyrat_defines\blueshield.dm"
#include "code\__DEFINES\~skyrat_defines\DNA.dm"
+#include "code\__DEFINES\~skyrat_defines\faction.dm"
#include "code\__DEFINES\~skyrat_defines\jobs.dm"
#include "code\__DEFINES\~skyrat_defines\keybindings.dm"
#include "code\__DEFINES\~skyrat_defines\logging.dm"
@@ -3557,7 +3558,19 @@
#include "modular_skyrat\modules\emotes\code\dna_screams.dm"
#include "modular_skyrat\modules\emotes\code\emotes.dm"
#include "modular_skyrat\modules\emotes\code\silicon_emotes.dm"
+#include "modular_skyrat\modules\events\code\__event_defines.dm"
+#include "modular_skyrat\modules\events\code\_event_globalvars.dm"
+#include "modular_skyrat\modules\events\code\event_spawner.dm"
+#include "modular_skyrat\modules\events\code\event_spawner_menu.dm"
+#include "modular_skyrat\modules\events\code\event_spawner_templates.dm"
#include "modular_skyrat\modules\events\code\modules\events\meteor_wave.dm"
+#include "modular_skyrat\modules\faction\code\clothes.dm"
+#include "modular_skyrat\modules\faction\code\id.dm"
+#include "modular_skyrat\modules\faction\code\outfit.dm"
+#include "modular_skyrat\modules\faction\code\radio.dm"
+#include "modular_skyrat\modules\faction\code\mapping\areas.dm"
+#include "modular_skyrat\modules\faction\code\mapping\mapping_helpers.dm"
+#include "modular_skyrat\modules\faction\code\mapping\ruins.dm"
#include "modular_skyrat\modules\gunpoint\code\datum\gunpoint\gunpoint.dm"
#include "modular_skyrat\modules\gunpoint\code\datum\gunpoint\gunpoint_datum.dm"
#include "modular_skyrat\modules\gunpoint\code\datum\gunpoint\gunpoint_radial.dm"