From bd87d46ce61b8f5b37198814172fd3974baf7f77 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 29 Feb 2020 15:07:44 +0100
Subject: [PATCH 001/102] Deletes the preferences_vore datum and migrates its
contents to preferences.
---
code/__DEFINES/say.dm | 3 +-
code/__HELPERS/_cit_helpers.dm | 4 +-
code/game/machinery/cloning.dm | 10 +-
code/modules/client/client_procs.dm | 8 -
code/modules/client/preferences.dm | 14 +-
code/modules/client/preferences_savefile.dm | 68 ++++++--
code/modules/mob/living/login.dm | 2 +-
code/modules/vore/eating/belly_obj.dm | 8 +
code/modules/vore/eating/living.dm | 80 ++++-----
code/modules/vore/eating/vore.dm | 174 --------------------
code/modules/vore/eating/vorepanel.dm | 54 +++---
tgstation.dme | 3 +-
12 files changed, 136 insertions(+), 292 deletions(-)
delete mode 100644 code/modules/vore/eating/vore.dm
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 49cfba8cd2..5775e128f8 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -81,7 +81,8 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
-#define MAX_FAVOR_LEN 4096 //double the maximum message length.
+#define MAX_FLAVOR_LEN 4096 //double the maximum message length.
+#define MAX_TASTE_LEN 40 //lick... vore... ew...
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index a26b9285d4..7dfd8ffa77 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -113,7 +113,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
set desc = "Sets an extended description of your character's features."
set category = "IC"
- var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FAVOR_LEN, TRUE)
+ var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FLAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text = new_flavor
to_chat(src, "Your flavor text has been updated.")
@@ -124,7 +124,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
set desc = "Sets a description of your character's current appearance. Use this for emotions, poses etc."
set category = "IC"
- var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FAVOR_LEN, TRUE)
+ var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FLAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text_2 = new_flavor
to_chat(src, "Your temporary flavor text has been updated.")
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 62304112b2..5ea17d0498 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -216,7 +216,7 @@
if(!is_operational()) //Autoeject if power is lost
if(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
connected_message("Clone Ejected: Loss of power.")
else if(mob_occupant && (mob_occupant.loc == src))
@@ -226,7 +226,7 @@
SPEAK("The cloning has been \
aborted due to unrecoverable tissue failure.")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if(mob_occupant.cloneloss > (100 - heal_level))
mob_occupant.Unconscious(80)
@@ -272,7 +272,7 @@
BP.attach_limb(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if (!mob_occupant || mob_occupant.loc != src)
occupant = null
@@ -320,7 +320,7 @@
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
to_chat(user, "You force an emergency ejection. ")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else
return ..()
@@ -418,7 +418,7 @@
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
go_out()
/obj/machinery/clonepod/ex_act(severity, target)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index dc550179f8..84096b1367 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -223,7 +223,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
new /datum/admins(localhost_rank, ckey, 1, 1)
//preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum)
prefs = GLOB.preferences_datums[ckey]
- prefs_vr = GLOB.vore_preferences_datums[ckey] //CITADEL EDIT bypassing a failing hook
if(prefs)
prefs.parent = src
@@ -231,13 +230,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
prefs = new /datum/preferences(src)
GLOB.preferences_datums[ckey] = prefs
- if(prefs_vr) //CITADEL EDIT bypassing a failing hook START
- prefs_vr.client = src
- else
- prefs_vr = new/datum/vore_preferences(src)
- GLOB.vore_preferences_datums[ckey] = prefs_vr
- //CITADEL EDIT bypassing a failing hook END
-
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
fps = prefs.clientfps
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 793a72c1f7..ca7e982214 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -205,6 +205,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
+ //bad stuff
+ var/digestable = FALSE
+ var/devourable = FALSE
+ var/feeding = FALSE
+ var/lickable = FALSE
+ var/list/belly_prefs = list()
+ var/vore_taste = "nothing in particular"
+
//backgrounds
var/mutable_appearance/character_background
var/icon/bgstate = "steel"
@@ -1473,7 +1481,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
- var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FAVOR_LEN, TRUE)
+ var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE)
if(msg)
features["flavor_text"] = msg
@@ -2262,16 +2270,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("load")
load_preferences()
load_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("changeslot")
if(!load_character(text2num(href_list["num"])))
random_character()
real_name = random_unique_name(gender)
save_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("tab")
if (href_list["tab"])
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 03c6051c5d..4ee8f37d63 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 25
+#define SAVEFILE_VERSION_MAX 26
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -115,6 +115,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(digi == "Digitigrade Legs")
WRITE_FILE(S["feature_lizard_legs"], "Digitigrade")
+ if(current_version < 26)
+ var/vr_path = "data/player_saves/[parent.ckey[1]]/[parent.ckey]/vore/character[default_slot].json"
+ if(fexists(vr_path))
+ var/list/json_from_file = json_decode(file2text(vr_path))
+ if(json_from_file)
+ digestable = json_from_file["digestable"]
+ devourable = json_from_file["devourable"]
+ feeding = json_from_file["feeding"]
+ lickable = json_from_file["lickable"]
+ belly_prefs = json_from_file["belly_prefs"]
+ vore_taste = json_from_file["vore_taste"]
+
+ for(var/V in all_quirks) // quirk migration
+ switch(V)
+ if("Acute hepatic pharmacokinesis")
+ DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
+ DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
+ ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
+ ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
+ all_quirks -= V
+ if("Crocin Immunity")
+ ENABLE_BITFIELD(cit_toggles,NO_APHRO)
+ all_quirks -= V
+ if("Buns of Steel")
+ ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
+ all_quirks -= V
+
+ if(features["meat_type"] == "Inesct")
+ features["meat_type"] = "Insect"
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -226,6 +256,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
+ belly_prefs = SANITIZE_LIST(belly_prefs)
+
return 1
/datum/preferences/proc/save_preferences()
@@ -446,6 +478,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"]
+ S["digestable"] >> digestable
+ S["devourable"] >> devourable
+ S["feeding"] >> feeding
+ S["vore_taste"] >> vore_taste
+ S["lickable"] >> lickable
+ S["belly_prefs"] >> belly_prefs
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -509,6 +547,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+ features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
@@ -518,23 +557,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
- for(var/V in all_quirks) // quirk migration
- switch(V)
- if("Acute hepatic pharmacokinesis")
- DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
- DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
- ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
- ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
- all_quirks -= V
- if("Crocin Immunity")
- ENABLE_BITFIELD(cit_toggles,NO_APHRO)
- all_quirks -= V
- if("Buns of Steel")
- ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
- all_quirks -= V
+ lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
+ devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
+ digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
+ vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
- if(features["meat_type"] == "Inesct")
- features["meat_type"] = "Insect"
cit_character_pref_load(S)
return 1
@@ -613,6 +640,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
+ WRITE_FILE(S["digestable"] , digestable)
+ WRITE_FILE(S["devourable"] , devourable)
+ WRITE_FILE(S["feeding"] , feeding)
+ WRITE_FILE(S["vore_taste"] , vore_taste)
+ WRITE_FILE(S["lickable"] , lickable)
+ WRITE_FILE(S["belly_prefs"] , belly_prefs)
+
cit_character_pref_save(S)
return 1
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index f2e6fdce03..e0bd8a16b3 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -24,4 +24,4 @@
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
- apply_vore_prefs()
+ copy_from_prefs_vr()
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index e33f748292..7d034e97d8 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -732,3 +732,11 @@
for(var/I in emote_lists[K])
dupe.emote_lists[K] += I
return dupe
+
+//
+// Belly searching for simplifying other procs
+// Mostly redundant now with belly-objects and isbelly(loc)
+//
+/proc/check_belly(atom/movable/A)
+ return isbelly(A.loc)
+
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 5f280fb04d..62ba420b15 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -41,7 +41,7 @@
return TRUE
//We'll load our client's organs if we have one
- if(client && client.prefs_vr)
+ if(client?.prefs)
if(!copy_from_prefs_vr())
to_chat(src,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.")
return FALSE
@@ -262,47 +262,22 @@
else
to_chat(src,"You aren't inside anyone, though, is the thing.")
-//
-// Verb for saving vore preferences to save file
-//
-/mob/living/proc/save_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!copy_to_prefs_vr())
- return FALSE
- if(!client.prefs_vr.save_vore())
- return FALSE
-
- return TRUE
-
-/mob/living/proc/apply_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!client.prefs_vr.load_vore())
- return FALSE
- if(!copy_from_prefs_vr())
- return FALSE
-
- return TRUE
-
/mob/living/proc/copy_to_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- var/datum/vore_preferences/P = client.prefs_vr
-
- P.digestable = src.digestable
- P.devourable = src.devourable
- P.feeding = src.feeding
- P.vore_taste = src.vore_taste
+ client.prefs.digestable = digestable
+ client.prefs.devourable = devourable
+ client.prefs.feeding = feeding
+ client.prefs.vore_taste = vore_taste
var/list/serialized = list()
- for(var/belly in src.vore_organs)
+ for(var/belly in vore_organs)
var/obj/belly/B = belly
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
- P.belly_prefs = serialized
+ client.prefs.belly_prefs = serialized
return TRUE
@@ -310,21 +285,20 @@
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/copy_from_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
vorepref_init = TRUE
- var/datum/vore_preferences/P = client.prefs_vr
- digestable = P.digestable
- devourable = P.devourable
- feeding = P.feeding
- vore_taste = P.vore_taste
+ digestable = client.prefs.digestable
+ devourable = client.prefs.devourable
+ feeding = client.prefs.feeding
+ vore_taste = client.prefs.vore_taste
release_vore_contents(silent = TRUE)
- vore_organs.Cut()
- for(var/entry in P.belly_prefs)
+ QDEL_LIST(vore_organs)
+ for(var/entry in client.prefs.belly_prefs)
list_to_object(entry,src)
return TRUE
@@ -381,18 +355,12 @@
set category = "Vore"
set desc = "Lick someone nearby!"
- if(!istype(tasted))
+ if(!istype(tasted) || !(tasted.client?.prefs.lickable))
return
- if(!tasted.client?.prefs_vr.lickable)
- return
+ setClickCooldown(100)
- if(src == stat)
- return
-
- src.setClickCooldown(100)
-
- src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
+ visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
@@ -408,3 +376,11 @@
else
taste_message += "a plain old normal [src]"
return taste_message
+// Check if an object is capable of eating things, based on vore_organs
+//
+/proc/is_vore_predator(var/mob/living/O)
+ if(istype(O))
+ if(O.vore_organs.len > 0)
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/vore/eating/vore.dm b/code/modules/vore/eating/vore.dm
deleted file mode 100644
index abb5bbb988..0000000000
--- a/code/modules/vore/eating/vore.dm
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/*
-VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
-V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
-V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
-V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
- V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
- V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
- V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
- V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
-
--Aro <3 */
-
-//
-// Overrides/additions to stock defines go here, as well as hooks. Sort them by
-// the object they are overriding. So all /mob/living together, etc.
-//
-
-//
-// The datum type bolted onto normal preferences datums for storing Vore stuff
-//
-
-#define VORE_VERSION 4
-
-GLOBAL_LIST_EMPTY(vore_preferences_datums)
-
-/client
- var/datum/vore_preferences/prefs_vr
-
-/datum/vore_preferences
- //Actual preferences
- var/digestable = FALSE
- var/devourable = FALSE
- var/feeding = FALSE
- var/lickable = FALSE
-// var/allowmobvore = TRUE
- var/list/belly_prefs = list()
- var/vore_taste = "nothing in particular"
-// var/can_be_drop_prey = FALSE
-// var/can_be_drop_pred = FALSE
-
- //Mechanically required
- var/path
- var/slot
- var/client/client
- var/client_ckey
-
-/datum/vore_preferences/New(client/C)
- if(istype(C))
- client = C
- client_ckey = C.ckey
- load_vore()
-
-//
-// Check if an object is capable of eating things, based on vore_organs
-//
-/proc/is_vore_predator(var/mob/living/O)
- if(istype(O,/mob/living))
- if(O.vore_organs.len > 0)
- return TRUE
-
- return FALSE
-
-//
-// Belly searching for simplifying other procs
-// Mostly redundant now with belly-objects and isbelly(loc)
-//
-/proc/check_belly(atom/movable/A)
- return isbelly(A.loc)
-
-//
-// Save/Load Vore Preferences
-//
-/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json")
- if(!ckey || !slot) return
- path = "data/player_saves/[ckey[1]]/[ckey]/vore/[filename][slot].[ext]"
-
-/datum/vore_preferences/proc/load_vore()
- if(!client || !client_ckey)
- return FALSE //No client, how can we save?
- if(!client.prefs || !client.prefs.default_slot)
- return FALSE //Need to know what character to load!
-
- slot = client.prefs.default_slot
-
- load_path(client_ckey,slot)
-
- if(!path) return FALSE //Path couldn't be set?
- if(!fexists(path)) //Never saved before
- save_vore() //Make the file first
- return TRUE
-
- var/list/json_from_file = json_decode(file2text(path))
- if(!json_from_file)
- return FALSE //My concern grows
-
- var/version = json_from_file["version"]
- json_from_file = patch_version(json_from_file,version)
-
- digestable = json_from_file["digestable"]
- devourable = json_from_file["devourable"]
- feeding = json_from_file["feeding"]
- lickable = json_from_file["lickable"]
- vore_taste = json_from_file["vore_taste"]
- belly_prefs = json_from_file["belly_prefs"]
-
- //Quick sanitize
- if(isnull(digestable))
- digestable = FALSE
- if(isnull(devourable))
- devourable = FALSE
- if(isnull(feeding))
- feeding = FALSE
- if(isnull(lickable))
- lickable = FALSE
- if(isnull(belly_prefs))
- belly_prefs = list()
-
- return TRUE
-
-/datum/vore_preferences/proc/save_vore()
- if(!path)
- return FALSE
-
- var/version = VORE_VERSION //For "good times" use in the future
- var/list/settings_list = list(
- "version" = version,
- "digestable" = digestable,
- "devourable" = devourable,
- "feeding" = feeding,
- "lickable" = lickable,
- "vore_taste" = vore_taste,
- "belly_prefs" = belly_prefs,
- )
-
- //List to JSON
- var/json_to_file = json_encode(settings_list)
- if(!json_to_file)
- testing("Saving: [path] failed jsonencode")
- return FALSE
-
- //Write it out
-//#ifdef RUST_G
-// call(RUST_G, "file_write")(json_to_file, path)
-//#else
- // Fall back to using old format if we are not using rust-g
- if(fexists(path))
- fdel(path) //Byond only supports APPENDING to files, not replacing.
- text2file(json_to_file, path)
-//#endif
- if(!fexists(path))
- testing("Saving: [path] failed file write")
- return FALSE
-
- return TRUE
-
-/* commented out list things
- "allowmobvore" = allowmobvore,
- "can_be_drop_prey" = can_be_drop_prey,
- "can_be_drop_pred" = can_be_drop_pred, */
-
-//Can do conversions here
-datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version)
- return json_from_file
-
-#undef VORE_VERSION
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index a2746f35e8..59ef8661c6 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -6,7 +6,6 @@
#define BELLIES_NAME_MIN 2
#define BELLIES_NAME_MAX 12
#define BELLIES_DESC_MAX 1024
-#define FLAVOR_MAX 40
/mob/living/proc/insidePanel()
set name = "Vore Panel"
@@ -247,8 +246,8 @@
dat += "
Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])"
dat += "
Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])"
dat += "
Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])"
- if(user.client.prefs_vr)
- dat += "
Toggle Licking (Currently: [user.client.prefs_vr.lickable ? "ON" : "OFF"])"
+ if(user.client.prefs)
+ dat += "
Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])"
//Returns the dat html to the vore_look
return dat
@@ -659,18 +658,19 @@
user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
- if(!user.save_vore_prefs())
+ if(!(user.client?.prefs))
+ return FALSE
+ if(!user.client.prefs.save_character())
to_chat(user, "Belly Preferences not saved!")
-
+ log_admin("Could not save vore prefs on USER: [user].")
else
to_chat(user, "Belly Preferences were saved!")
- log_admin("Could not save vore prefs on USER: [user].")
if(href_list["applyprefs"])
- var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
+ var/alert = alert("Are you sure you want to reload the current slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
if(!alert == "Reload")
return FALSE
- if(!user.apply_vore_prefs())
+ if(!user.copy_from_prefs_vr())
alert("ERROR: Vore preferences failed to apply!","Error")
else
to_chat(user,"Vore preferences applied from active slot!")
@@ -681,13 +681,15 @@
return FALSE
new_flavor = readd_quotes(new_flavor)
- if(length(new_flavor) > FLAVOR_MAX)
- alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
+ if(length(new_flavor) > MAX_TASTE_LEN)
+ alert("Entered flavor/taste text too long. [MAX_TASTE_LEN] character limit.","Error!")
return FALSE
user.vore_taste = new_flavor
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -696,11 +698,12 @@
if("Prevent Digestion")
user.digestable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.digestable = user.digestable
+ user.client.prefs.digestable = user.digestable
if(href_list["toggledvor"])
var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -709,11 +712,12 @@
if("Prevent Devourment")
user.devourable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.devourable = user.devourable
+ user.client.prefs.devourable = user.devourable
if(href_list["toggledfeed"])
var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -722,19 +726,19 @@
if("Prevent Feeding")
user.feeding = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.feeding = user.feeding
+ user.client.prefs.feeding = user.feeding
if(href_list["toggledlickable"])
- if(user.client.prefs_vr)
- var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs_vr.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
- switch(choice)
- if("Cancel")
- return FALSE
- if("Allow Licking")
- user.client.prefs_vr.lickable = TRUE
- if("Prevent Licking")
- user.client.prefs_vr.lickable = FALSE
+ var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
+ if(!user || !user.client)
+ return
+ switch(choice)
+ if("Cancel")
+ return FALSE
+ if("Allow Licking")
+ user.client.prefs.lickable = TRUE
+ if("Prevent Licking")
+ user.client.prefs.lickable = FALSE
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return TRUE
diff --git a/tgstation.dme b/tgstation.dme
index 9ecf1ddd5e..a8110526f8 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -79,8 +79,8 @@
#include "code\__DEFINES\obj_flags.dm"
#include "code\__DEFINES\pinpointers.dm"
#include "code\__DEFINES\pipe_construction.dm"
-#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\pool.dm"
+#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
@@ -3132,7 +3132,6 @@
#include "code\modules\vore\eating\bellymodes.dm"
#include "code\modules\vore\eating\digest_act.dm"
#include "code\modules\vore\eating\living.dm"
-#include "code\modules\vore\eating\vore.dm"
#include "code\modules\vore\eating\voreitems.dm"
#include "code\modules\vore\eating\vorepanel.dm"
#include "code\modules\VR\vr_mob.dm"
From 31bde973e073e3381c73c601b97ac902b9e497d8 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 29 Feb 2020 15:44:05 +0100
Subject: [PATCH 002/102] Bad.
---
code/modules/client/preferences_savefile.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4ee8f37d63..5985ddd74f 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -256,8 +256,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
- belly_prefs = SANITIZE_LIST(belly_prefs)
-
return 1
/datum/preferences/proc/save_preferences()
@@ -560,7 +558,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
+ feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding))
vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
+ belly_prefs = SANITIZE_LIST(belly_prefs)
cit_character_pref_load(S)
From 185a0b092e7cc7e2dc3e4431b8183e282dd5dae8 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 1 Mar 2020 15:33:46 +0100
Subject: [PATCH 003/102] I hate this.
---
code/modules/vore/eating/living.dm | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 62ba420b15..113605d49e 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -350,12 +350,22 @@
//
// Clearly super important. Obviously.
//
-/mob/living/proc/lick(var/mob/living/tasted in oview(1))
+/mob/living/proc/lick()
set name = "Lick Someone"
set category = "Vore"
set desc = "Lick someone nearby!"
- if(!istype(tasted) || !(tasted.client?.prefs.lickable))
+ var/list/choices
+ for(var/mob/living/L in view(1))
+ if(L != src && (!L.ckey || L.client?.prefs.lickable))
+ LAZYADD(choices, L)
+
+ if(!choices)
+ return
+
+ var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
+
+ if(QDELETED(tasted) || (L.ckey && !(L.client?.prefs.lickable)))
return
setClickCooldown(100)
From aa79b9853b4c2be17502626ce62f539a34b5cadd Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 1 Mar 2020 15:42:41 +0100
Subject: [PATCH 004/102] Update living.dm
---
code/modules/vore/eating/living.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 113605d49e..bdd4b67f07 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -365,7 +365,7 @@
var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
- if(QDELETED(tasted) || (L.ckey && !(L.client?.prefs.lickable)))
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)))
return
setClickCooldown(100)
From 7502cec75644810318b1cc650f9b701c4eaa6d28 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:19:45 -0700
Subject: [PATCH 005/102] shut
---
_maps/arrival_cog.dmm | 278 +++++++++++++++++
_maps/emergency_cog.dmm | 55 ++++
_maps/labour_cog.dmm | 37 +++
_maps/whiteship_cog.dmm | 428 +++++++++++++++++++++++++
code/datums/shuttles.dm | 671 +++++-----------------------------------
5 files changed, 876 insertions(+), 593 deletions(-)
create mode 100644 _maps/arrival_cog.dmm
create mode 100644 _maps/emergency_cog.dmm
create mode 100644 _maps/labour_cog.dmm
create mode 100644 _maps/whiteship_cog.dmm
diff --git a/_maps/arrival_cog.dmm b/_maps/arrival_cog.dmm
new file mode 100644
index 0000000000..2ecbccaaab
--- /dev/null
+++ b/_maps/arrival_cog.dmm
@@ -0,0 +1,278 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/arrival)
+"c" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"d" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"e" = (
+/obj/docking_port/mobile/arrivals{
+ dir = 2;
+ dwidth = 4;
+ height = 12;
+ name = "cog arrivals shuttle";
+ width = 9
+ },
+/turf/template_noop,
+/area/template_noop)
+"f" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"g" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"h" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"i" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"j" = (
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"k" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"l" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"m" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"n" = (
+/obj/structure/window/shuttle,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"o" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"p" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"q" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"r" = (
+/obj/machinery/door/airlock/external{
+ name = "Arrival Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"s" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"t" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"u" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"v" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"w" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"x" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"y" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+
+(1,1,1) = {"
+a
+c
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(3,1,1) = {"
+c
+g
+i
+m
+o
+o
+p
+m
+s
+u
+b
+b
+"}
+(4,1,1) = {"
+d
+g
+j
+m
+o
+o
+o
+m
+o
+o
+w
+n
+"}
+(5,1,1) = {"
+e
+f
+k
+m
+m
+m
+m
+m
+m
+m
+x
+n
+"}
+(6,1,1) = {"
+c
+g
+j
+m
+o
+o
+o
+m
+o
+o
+y
+n
+"}
+(7,1,1) = {"
+d
+g
+l
+m
+o
+o
+q
+m
+t
+v
+b
+b
+"}
+(8,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(9,1,1) = {"
+a
+d
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/emergency_cog.dmm b/_maps/emergency_cog.dmm
new file mode 100644
index 0000000000..262537249e
--- /dev/null
+++ b/_maps/emergency_cog.dmm
@@ -0,0 +1,55 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
+"c" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"d" = (/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"e" = (/obj/machinery/light{dir = 1},/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"f" = (/obj/machinery/status_display/evac,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"g" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/escape)
+"h" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"i" = (/obj/machinery/light{dir = 4},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"j" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"k" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"m" = (/obj/effect/spawner/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"n" = (/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"o" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Classic"; width = 22},/turf/open/floor/plating,/area/shuttle/escape)
+"p" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
+"q" = (/obj/machinery/sleeper,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"r" = (/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"s" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"t" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"u" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"v" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/radio,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"w" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"x" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"y" = (/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"z" = (/obj/machinery/computer/emergency_shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"A" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"B" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/storage/firstaid/regular,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"C" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular,/obj/structure/window/reinforced,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"D" = (/obj/machinery/light,/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"H" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"J" = (/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"K" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"P" = (/obj/structure/table/optable,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"Q" = (/obj/machinery/light,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"R" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/storage/backpack/duffelbag/med/surgery,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"T" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"V" = (/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"W" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"X" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
+"Y" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
+
+(1,1,1) = {"
+aWcdddgmgmdmdmomgdaaaa
+dddldtrrrrdhesrrrdaaaa
+bpqqdtrrrrrrssrrrdmdaa
+bpnnwrrQrssrssrsrmjdmd
+bpPRfssdrssrssrsidkuvm
+dddddssmrssrrrrrrxykzm
+bpHTfssdrssrssssifkABm
+bpHJKrrVrrrrssssrmCdmd
+bpHHdssssrrrssssrdmdaa
+dddddssssrdhDsssrdaaaa
+aXYdddmmmmdmdmmmddaaaa
+"}
diff --git a/_maps/labour_cog.dmm b/_maps/labour_cog.dmm
new file mode 100644
index 0000000000..7fd72761f3
--- /dev/null
+++ b/_maps/labour_cog.dmm
@@ -0,0 +1,37 @@
+"a" = (/turf/closed/wall/mineral/titanium,/area/shuttle/labor)
+"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
+"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
+"d" = (/obj/structure/closet/crate/internals,/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/labor)
+"e" = (/turf/open/floor/plasteel,/area/shuttle/labor)
+"f" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"g" = (/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/labor)
+"h" = (/obj/structure/grille,/obj/structure/cable/yellow{icon_state = "0-8"},/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/labor)
+"i" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"j" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"k" = (/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/structure/chair/comfy/shuttle{dir = 8},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
+"l" = (/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"m" = (/obj/machinery/light,/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
+"n" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/labor)
+"o" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30},/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/shuttle/labor)
+"p" = (/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"q" = (/obj/machinery/light{dir = 1; light_color = "#c1caff"},/obj/machinery/button/flasher{dir = 1; id = "gulagshuttleflasher"; name = "Flash Control"; pixel_y = 26; req_access_txt = "1"},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"r" = (/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9},/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/labor)
+"s" = (/obj/machinery/computer/shuttle/labor{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = -31},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"t" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"u" = (/obj/structure/table/reinforced,/obj/item/folder/red,/obj/item/restraints/handcuffs,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"v" = (/obj/structure/window/shuttle,/turf/open/floor/plating/airless,/area/shuttle/labor)
+"w" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"x" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"y" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2; pixel_x = 30; pixel_y = -32},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+
+(1,1,1) = {"
+abbba
+aacaa
+adfig
+hjeka
+almoa
+awnxa
+hpqyr
+astua
+avvva
+"}
diff --git a/_maps/whiteship_cog.dmm b/_maps/whiteship_cog.dmm
new file mode 100644
index 0000000000..9410682219
--- /dev/null
+++ b/_maps/whiteship_cog.dmm
@@ -0,0 +1,428 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"b" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"c" = (
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"d" = (
+/turf/template_noop,
+/area/template_noop)
+"e" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"f" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"g" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/abandoned)
+"h" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"i" = (
+/obj/machinery/suit_storage_unit/security,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"j" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/abandoned)
+"k" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"l" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"m" = (
+/obj/structure/bed,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"n" = (
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"o" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"p" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"q" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced/spawner/east,
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"r" = (
+/obj/structure/filingcabinet,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"s" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"t" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"u" = (
+/obj/machinery/door/airlock/security,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"v" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"w" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"x" = (
+/obj/machinery/door/firedoor/border_only/closed{
+ icon_state = "door_closed";
+ dir = 4
+ },
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"y" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"z" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"A" = (
+/obj/machinery/door/window/eastright,
+/obj/structure/toilet{
+ contents = newlist(/obj/item/toy/snappop/phoenix);
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"B" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
+ },
+/obj/machinery/flasher{
+ id = "cogws";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"C" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/item/gun/energy/laser/carbine,
+/obj/machinery/button/flasher{
+ id = "cogws";
+ pixel_x = -24;
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"D" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/item/gun/energy/e_gun/stun,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"E" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"F" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"G" = (
+/obj/machinery/computer/shuttle/white_ship{
+ dir = 8
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"H" = (
+/obj/item/clothing/glasses/sunglasses/blindfold,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"I" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/sunglasses,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"J" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ name = "shower";
+ pixel_y = 12
+ },
+/obj/item/soap/nanotrasen,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"K" = (
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"L" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"M" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"N" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile{
+ dir = 2;
+ dwidth = 7;
+ height = 9;
+ id = "whiteship";
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "Prisoner Transport";
+ port_direction = 8;
+ preferred_direction = 4;
+ width = 13
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+
+(1,1,1) = {"
+a
+e
+l
+g
+c
+g
+a
+e
+l
+"}
+(2,1,1) = {"
+b
+f
+f
+t
+A
+t
+f
+f
+b
+"}
+(3,1,1) = {"
+c
+g
+m
+n
+n
+n
+m
+g
+c
+"}
+(4,1,1) = {"
+d
+c
+m
+n
+n
+n
+m
+c
+d
+"}
+(5,1,1) = {"
+d
+h
+n
+n
+B
+H
+n
+h
+d
+"}
+(6,1,1) = {"
+d
+g
+c
+u
+c
+g
+c
+g
+d
+"}
+(7,1,1) = {"
+c
+c
+o
+v
+C
+c
+J
+c
+c
+"}
+(8,1,1) = {"
+c
+i
+p
+w
+D
+c
+K
+M
+c
+"}
+(9,1,1) = {"
+c
+g
+q
+x
+c
+g
+L
+g
+c
+"}
+(10,1,1) = {"
+d
+j
+r
+s
+E
+s
+s
+j
+d
+"}
+(11,1,1) = {"
+d
+N
+s
+s
+F
+s
+s
+k
+d
+"}
+(12,1,1) = {"
+d
+j
+j
+y
+G
+I
+j
+j
+d
+"}
+(13,1,1) = {"
+d
+d
+j
+z
+z
+z
+j
+d
+d
+"}
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 779de8ff03..36ecebb699 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -1,593 +1,78 @@
-/datum/map_template/shuttle
- name = "Base Shuttle Template"
- var/prefix = "_maps/shuttles/"
- var/suffix
- var/port_id
- var/shuttle_id
-
- var/description
- var/prerequisites
- var/admin_notes
-
- var/credit_cost = INFINITY
- var/can_be_bought = TRUE
-
- var/port_x_offset
- var/port_y_offset
-
-/datum/map_template/shuttle/proc/prerequisites_met()
- return TRUE
-
-/datum/map_template/shuttle/New()
- shuttle_id = "[port_id]_[suffix]"
- mappath = "[prefix][shuttle_id].dmm"
- . = ..()
-
-/datum/map_template/shuttle/preload_size(path, cache)
- . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map
- if(!cached_map)
- return
-
- discover_port_offset()
-
- if(!cache)
- cached_map = null
-
-/datum/map_template/shuttle/proc/discover_port_offset()
- var/key
- var/list/models = cached_map.grid_models
- for(key in models)
- if(findtext(models[key], "[/obj/docking_port/mobile]")) // Yay compile time checks
- break // This works by assuming there will ever only be one mobile dock in a template at most
-
- for(var/i in cached_map.gridSets)
- var/datum/grid_set/gset = i
- var/ycrd = gset.ycrd
- for(var/line in gset.gridLines)
- var/xcrd = gset.xcrd
- for(var/j in 1 to length(line) step cached_map.key_len)
- if(key == copytext(line, j, j + cached_map.key_len))
- port_x_offset = xcrd
- port_y_offset = ycrd
- return
- ++xcrd
- --ycrd
-
-/datum/map_template/shuttle/load(turf/T, centered, register=TRUE)
- . = ..()
- if(!.)
- return
- var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]),
- locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ]))
- for(var/i in 1 to turfs.len)
- var/turf/place = turfs[i]
- if(istype(place, /turf/open/space)) // This assumes all shuttles are loaded in a single spot then moved to their real destination.
- continue
- if(length(place.baseturfs) < 2) // Some snowflake shuttle shit
- continue
- place.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle)
-
- for(var/obj/docking_port/mobile/port in place)
- if(register)
- port.register()
- if(isnull(port_x_offset))
- continue
- switch(port.dir) // Yeah this looks a little ugly but mappers had to do this in their head before
- if(NORTH)
- port.width = width
- port.height = height
- port.dwidth = port_x_offset - 1
- port.dheight = port_y_offset - 1
- if(EAST)
- port.width = height
- port.height = width
- port.dwidth = height - port_y_offset
- port.dheight = port_x_offset - 1
- if(SOUTH)
- port.width = width
- port.height = height
- port.dwidth = width - port_x_offset
- port.dheight = height - port_y_offset
- if(WEST)
- port.width = height
- port.height = width
- port.dwidth = port_y_offset - 1
- port.dheight = width - port_x_offset
-
- for(var/obj/structure/closet/closet in place)
- if(closet.anchorable)
- closet.anchored = TRUE
-
- for(var/obj/structure/table/table in place)
- table.AddComponent(/datum/component/magnetic_catch)
-
- for(var/obj/structure/rack/rack in place)
- rack.AddComponent(/datum/component/magnetic_catch)
-
-//Whatever special stuff you want
-/datum/map_template/shuttle/proc/on_bought()
- return
-
-/datum/map_template/shuttle/emergency
- port_id = "emergency"
- name = "Base Shuttle Template (Emergency)"
-
-/datum/map_template/shuttle/cargo
- port_id = "cargo"
- name = "Base Shuttle Template (Cargo)"
-
-/datum/map_template/shuttle/ferry
- port_id = "ferry"
- name = "Base Shuttle Template (Ferry)"
-
-/datum/map_template/shuttle/whiteship
- port_id = "whiteship"
-
-/datum/map_template/shuttle/labour
- port_id = "labour"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/mining
- port_id = "mining"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/mining_common
- port_id = "mining_common"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/cargo
- port_id = "cargo"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/arrival
- port_id = "arrival"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/infiltrator
- port_id = "infiltrator"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/aux_base
- port_id = "aux_base"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/escape_pod
- port_id = "escape_pod"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/assault_pod
- port_id = "assault_pod"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/pirate
- port_id = "pirate"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/ruin //For random shuttles in ruins
- port_id = "ruin"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/snowdin
- port_id = "snowdin"
- can_be_bought = FALSE
-
-// Shuttles start here:
-
-/datum/map_template/shuttle/emergency/backup
- suffix = "backup"
- name = "Backup Shuttle"
- can_be_bought = FALSE
-
-/datum/map_template/shuttle/emergency/airless
- suffix = "airless"
- name = "Build your own shuttle kit"
- description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and lighting not included."
- admin_notes = "No brig, no medical facilities, just an empty box."
- credit_cost = -7500
-
-/datum/map_template/shuttle/emergency/airless/prerequisites_met()
- // first 10 minutes only
- return world.time - SSticker.round_start_time < 6000
-
-/datum/map_template/shuttle/emergency/airless/on_bought()
- //enable buying engines from cargo
- var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine]
- P.special_enabled = TRUE
-
-
-/datum/map_template/shuttle/emergency/asteroid
- suffix = "asteroid"
- name = "Asteroid Station Emergency Shuttle"
- description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities."
- credit_cost = 3000
-
-/datum/map_template/shuttle/emergency/bar
- suffix = "bar"
- name = "The Emergency Escape Bar"
- description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table."
- admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \
- Has medical facilities."
- credit_cost = 5000
-
-/datum/map_template/shuttle/emergency/russiafightpit
- suffix = "russiafightpit"
- name = "Mother Russia Bleeds"
- description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!"
- admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them."
- credit_cost = 5000 // While the shuttle is rusted and poorly maintained, trained bears are costly.
-
-/datum/map_template/shuttle/emergency/meteor
- suffix = "meteor"
- name = "Asteroid With Engines Strapped To It"
- description = "A hollowed out asteroid with engines strapped to it. Due to its size and difficulty in steering it, this shuttle may damage the docking area."
- admin_notes = "This shuttle will likely crush escape, killing anyone there."
- credit_cost = -5000
-
-/datum/map_template/shuttle/emergency/luxury
- suffix = "luxury"
- name = "Luxury Shuttle"
- description = "A luxurious golden shuttle complete with an indoor swimming pool. Entry is free, so long as you can afford the initial cost."
- admin_notes = "Fancy, and very roomy!"
- credit_cost = 17500
-
-/datum/map_template/shuttle/emergency/discoinferno
- suffix = "discoinferno"
- name = "Disco Inferno"
- description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!"
- admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time."
- credit_cost = 10000
-
-/datum/map_template/shuttle/emergency/arena
- suffix = "arena"
- name = "The Arena"
- description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties. The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle."
- admin_notes = "RIP AND TEAR."
- credit_cost = 10000
-
-/datum/map_template/shuttle/emergency/arena/prerequisites_met()
- if("bubblegum" in SSshuttle.shuttle_purchase_requirements_met)
- return TRUE
- return FALSE
-
-/datum/map_template/shuttle/emergency/birdboat
- suffix = "birdboat"
- name = "Birdboat Station Emergency Shuttle"
- description = "Though a little on the small side, this shuttle is feature complete, which is more than can be said for the pattern of station it was commissioned for."
- credit_cost = 1000
-
-/datum/map_template/shuttle/emergency/box
- suffix = "box"
- name = "Box Station Emergency Shuttle"
- credit_cost = 2000
- description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home."
-
-/datum/map_template/shuttle/emergency/clown
- suffix = "clown"
- name = "Snappop(tm)!"
- description = "Hey kids and grownups! \
- Are you bored of DULL and TEDIOUS shuttle journeys after you're evacuating for probably BORING reasons. Well then order the Snappop(tm) today! \
- We've got fun activities for everyone, an all access cockpit, and no boring security brig! Boo! Play dress up with your friends! \
- Collect all the bedsheets before your neighbour does! Check if the AI is watching you with our patent pending \"Peeping Tom AI Multitool Detector\" or PEEEEEETUR for short. \
- Have a fun ride!"
- admin_notes = "Brig is replaced by anchored greentext book surrounded by lavaland chasms, stationside door has been removed to prevent accidental dropping. No brig."
- credit_cost = 8000
-
-/datum/map_template/shuttle/emergency/cramped
- suffix = "cramped"
- name = "Secure Transport Vessel 5 (STV5)"
- description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \
- Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\
- \n\
- Contains contraband armory guns, maintenance loot, and abandoned crates!"
- admin_notes = "Due to origin as a solo piloted secure vessel, has an active GPS onboard labeled STV5. Has roughly as much space as Hi Daniel, except with explosive crates."
-
-/datum/map_template/shuttle/emergency/meta
- suffix = "meta"
- name = "Meta Station Emergency Shuttle"
- credit_cost = 4000
- description = "A fairly standard shuttle, though larger and slightly better equipped than the Box Station variant."
-
-/datum/map_template/shuttle/emergency/kilo
- suffix = "kilo"
- name = "Kilo Station Emergency Shuttle"
- credit_cost = 5000
- description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities."
-
-/datum/map_template/shuttle/emergency/mini
- suffix = "mini"
- name = "Ministation emergency shuttle"
- credit_cost = 1000
- description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay."
-
-/datum/map_template/shuttle/emergency/scrapheap
- suffix = "scrapheap"
- name = "Standby Evacuation Vessel \"Scrapheap Challenge\""
- credit_cost = -1000
- description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean too heavily on the exterior windows, they are fragile."
- admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight."
-
-/datum/map_template/shuttle/emergency/syndicate
- suffix = "syndicate"
- name = "Syndicate GM Battlecruiser"
- credit_cost = 20000
- description = "(Emag only) Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!"
- admin_notes = "An emag exclusive, stocked with syndicate equipment and turrets that will target any simplemob."
-
-/datum/map_template/shuttle/emergency/syndicate/prerequisites_met()
- if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
- return TRUE
- return FALSE
-
-/datum/map_template/shuttle/emergency/narnar
- suffix = "narnar"
- name = "Shuttle 667"
- description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from."
- admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \
- Cloning pods in 'medbay' area are showcases and nonfunctional."
-
-/datum/map_template/shuttle/emergency/pubby
- suffix = "pubby"
- name = "Pubby Station Emergency Shuttle"
- description = "A train but in space! Complete with a first, second class, brig and storage area."
- admin_notes = "Choo choo motherfucker!"
- credit_cost = 1000
-
-/datum/map_template/shuttle/emergency/cere
- suffix = "cere"
- name = "Cere Station Emergency Shuttle"
- description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \
- an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere."
- admin_notes = "Seriously big, even larger than the Delta shuttle."
- credit_cost = 10000
-
-/datum/map_template/shuttle/emergency/supermatter
- suffix = "supermatter"
- name = "Hyperfractal Gigashuttle"
- description = "(Emag only) \"I dunno, this seems kinda needlessly complicated.\"\n\
- \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
- \"Are you sure?\"\n\
- \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
- admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \
- Outside of admin intervention, it cannot explode. \
- It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \
- Emitters spawn powered on, expect admin notices, they are harmless."
- credit_cost = 15000
-
-/datum/map_template/shuttle/emergency/supermatter/prerequisites_met()
- if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
- return TRUE
- return FALSE
-
-/datum/map_template/shuttle/emergency/imfedupwiththisworld
- suffix = "imfedupwiththisworld"
- name = "Oh, Hi Daniel"
- description = "How was space work today? Oh, pretty good. We got a new space station and the company will make a lot of money. What space station? I cannot tell you; it's space confidential. \
- Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?"
- admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?"
- credit_cost = -5000
-
-/datum/map_template/shuttle/emergency/goon
- suffix = "goon"
- name = "NES Port"
- description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) is a shuttle used at other less known Nanotrasen facilities and has a more open inside for larger crowds, but fewer onboard shuttle facilities."
- credit_cost = 500
-
-/datum/map_template/shuttle/emergency/wabbajack
- suffix = "wabbajack"
- name = "NT Lepton Violet"
- description = "The research team based on this vessel went missing one day, and no amount of investigation could discover what happened to them. \
- The only occupants were a number of dead rodents, who appeared to have clawed each other to death. \
- Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available."
- admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone."
- credit_cost = 15000
-
-/datum/map_template/shuttle/emergency/omega
- suffix = "omega"
- name = "Omegastation Emergency Shuttle"
- description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs."
- credit_cost = 1000
-
-/datum/map_template/shuttle/emergency/gorilla
- suffix = "gorilla"
- name = "Gorilla Cargo Freighter"
- description = "(Emag only) A rustic, barely excuseable shuttle transporting important cargo. Not for crew who are about to go ape."
- credit_cost = 2000
-
-/datum/map_template/shuttle/emergency/gorilla/prerequisites_met()
- if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
- return TRUE
- return FALSE
-
-/datum/map_template/shuttle/ferry/base
- suffix = "base"
- name = "transport ferry"
- description = "Standard issue Box/Metastation CentCom ferry."
-
-/datum/map_template/shuttle/ferry/meat
- suffix = "meat"
- name = "\"meat\" ferry"
- description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \
- Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \
- Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!"
- admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in."
-
-/datum/map_template/shuttle/ferry/lighthouse
- suffix = "lighthouse"
- name = "The Lighthouse(?)"
- description = "*static*... part of a much larger vessel, possibly military in origin. \
- The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \
- seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \
- Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!"
- admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included."
-
-/datum/map_template/shuttle/ferry/fancy
- suffix = "fancy"
- name = "fancy transport ferry"
- description = "At some point, someone upgraded the ferry to have fancier flooring... and less seats."
-
-/datum/map_template/shuttle/ferry/kilo
- suffix = "kilo"
- name = "kilo transport ferry"
- description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers."
-
-/datum/map_template/shuttle/whiteship/box
- suffix = "box"
- name = "Hospital Ship"
-
-/datum/map_template/shuttle/whiteship/meta
- suffix = "meta"
- name = "Salvage Ship"
-
-/datum/map_template/shuttle/whiteship/pubby
- suffix = "pubby"
- name = "NT White UFO"
-
-/datum/map_template/shuttle/whiteship/cere
- suffix = "cere"
- name = "NT Construction Vessel"
-
-/datum/map_template/shuttle/whiteship/delta
- suffix = "delta"
- name = "NT Frigate"
-
-/datum/map_template/shuttle/whiteship/pod
- suffix = "whiteship_pod"
- name = "Salvage Pod"
-
-/datum/map_template/shuttle/cargo/box
- suffix = "box"
- name = "supply shuttle (Box)"
-
-/datum/map_template/shuttle/cargo/kilo
- suffix = "kilo"
- name = "supply shuttle (Kilo)"
-
-/datum/map_template/shuttle/cargo/birdboat
- suffix = "birdboat"
- name = "supply shuttle (Birdboat)"
-
-/datum/map_template/shuttle/emergency/delta
- suffix = "delta"
- name = "Delta Station Emergency Shuttle"
- description = "A large shuttle for a large station, this shuttle can comfortably fit all your overpopulation and crowding needs. Complete with all facilities plus additional equipment."
- admin_notes = "Go big or go home."
- credit_cost = 7500
-
-/datum/map_template/shuttle/emergency/raven
- suffix = "raven"
- name = "CentCom Raven Battlecruiser"
- description = "The CentCom Raven Battlecruiser is currently docked at the CentCom ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The CentCom Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range CentCom Medical Bay."
- admin_notes = "Comes with turrets that will target any simplemob."
- credit_cost = 12500
-
-/datum/map_template/shuttle/arrival/box
- suffix = "box"
- name = "arrival shuttle (Box)"
-
-/datum/map_template/shuttle/cargo/box
- suffix = "box"
- name = "cargo ferry (Box)"
-
-/datum/map_template/shuttle/mining/box
- suffix = "box"
- name = "mining shuttle (Box)"
-
-/datum/map_template/shuttle/labour/box
- suffix = "box"
- name = "labour shuttle (Box)"
-
-/datum/map_template/shuttle/labour/kilo
- suffix = "kilo"
- name = "labour shuttle (Kilo)"
-
-/datum/map_template/shuttle/infiltrator/basic
- suffix = "basic"
- name = "basic syndicate infiltrator"
-
-/datum/map_template/shuttle/cargo/delta
- suffix = "delta"
- name = "cargo ferry (Delta)"
-
-/datum/map_template/shuttle/mining/delta
- suffix = "delta"
- name = "mining shuttle (Delta)"
-
-/datum/map_template/shuttle/mining/kilo
- suffix = "kilo"
- name = "mining shuttle (Kilo)"
-
-/datum/map_template/shuttle/labour/delta
- suffix = "delta"
- name = "labour shuttle (Delta)"
-
-/datum/map_template/shuttle/mining_common/meta
- suffix = "meta"
- name = "lavaland shuttle (Meta)"
-
-/datum/map_template/shuttle/labour/kilo
- suffix = "kilo"
- name = "labour shuttle (Kilo)"
-
-/datum/map_template/shuttle/arrival/delta
- suffix = "delta"
- name = "arrival shuttle (Delta)"
-
-/datum/map_template/shuttle/arrival/kilo
- suffix = "kilo"
- name = "arrival shuttle (Kilo)"
-
-/datum/map_template/shuttle/arrival/pubby
- suffix = "pubby"
- name = "arrival shuttle (Pubby)"
-
-/datum/map_template/shuttle/arrival/omega
- suffix = "omega"
- name = "arrival shuttle (Omega)"
-
-/datum/map_template/shuttle/aux_base/default
- suffix = "default"
- name = "auxilliary base (Default)"
-
-/datum/map_template/shuttle/aux_base/small
- suffix = "small"
- name = "auxilliary base (Small)"
-
-/datum/map_template/shuttle/escape_pod/default
- suffix = "default"
- name = "escape pod (Default)"
-
-/datum/map_template/shuttle/escape_pod/large
- suffix = "large"
- name = "escape pod (Large)"
-
-/datum/map_template/shuttle/assault_pod/default
- suffix = "default"
- name = "assault pod (Default)"
-
-/datum/map_template/shuttle/pirate/default
- suffix = "default"
- name = "pirate ship (Default)"
-
-/datum/map_template/shuttle/ruin/caravan_victim
- suffix = "caravan_victim"
- name = "Small Freighter"
-
-/datum/map_template/shuttle/ruin/pirate_cutter
- suffix = "pirate_cutter"
- name = "Pirate Cutter"
-
-/datum/map_template/shuttle/ruin/syndicate_dropship
- suffix = "syndicate_dropship"
- name = "Syndicate Dropship"
-
-/datum/map_template/shuttle/ruin/syndicate_fighter_shiv
- suffix = "syndicate_fighter_shiv"
- name = "Syndicate Fighter"
-
-/datum/map_template/shuttle/snowdin/mining
- suffix = "mining"
- name = "Snowdin Mining Elevator"
-
-/datum/map_template/shuttle/snowdin/excavation
- suffix = "excavation"
- name = "Snowdin Excavation Elevator"
+//shuttle mode defines
+#define SHUTTLE_IDLE "idle"
+#define SHUTTLE_IGNITING "igniting"
+#define SHUTTLE_RECALL "recall"
+#define SHUTTLE_CALL "call"
+#define SHUTTLE_DOCKED "docked"
+#define SHUTTLE_STRANDED "stranded"
+#define SHUTTLE_ESCAPE "escape"
+#define SHUTTLE_ENDGAME "endgame: game over"
+
+#define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL)))
+#define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)))
+#define EMERGENCY_AT_LEAST_DOCKED (SSshuttle.emergency && SSshuttle.emergency.mode != SHUTTLE_IDLE && SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_CALL)
+
+// Shuttle return values
+#define SHUTTLE_CAN_DOCK "can_dock"
+#define SHUTTLE_NOT_A_DOCKING_PORT "not a docking port"
+#define SHUTTLE_DWIDTH_TOO_LARGE "docking width too large"
+#define SHUTTLE_WIDTH_TOO_LARGE "width too large"
+#define SHUTTLE_DHEIGHT_TOO_LARGE "docking height too large"
+#define SHUTTLE_HEIGHT_TOO_LARGE "height too large"
+#define SHUTTLE_ALREADY_DOCKED "we are already docked"
+#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone else docked"
+
+//Launching Shuttles to CentCom
+#define NOLAUNCH -1
+#define UNLAUNCHED 0
+#define ENDGAME_LAUNCHED 1
+#define EARLY_LAUNCHED 2
+#define ENDGAME_TRANSIT 3
+
+// Ripples, effects that signal a shuttle's arrival
+#define SHUTTLE_RIPPLE_TIME 100
+
+#define TRANSIT_REQUEST 1
+#define TRANSIT_READY 2
+
+#define SHUTTLE_TRANSIT_BORDER 10
+
+#define PARALLAX_LOOP_TIME 25
+#define HYPERSPACE_END_TIME 5
+
+#define HYPERSPACE_WARMUP 1
+#define HYPERSPACE_LAUNCH 2
+#define HYPERSPACE_END 3
+
+#define CALL_SHUTTLE_REASON_LENGTH 12
+
+//Engine related
+#define ENGINE_COEFF_MIN 0.5
+#define ENGINE_COEFF_MAX 2
+#define ENGINE_DEFAULT_MAXSPEED_ENGINES 5
+
+//Docking error flags
+#define DOCKING_SUCCESS 0
+#define DOCKING_BLOCKED (1<<0)
+#define DOCKING_IMMOBILIZED (1<<1)
+#define DOCKING_AREA_EMPTY (1<<2)
+#define DOCKING_NULL_DESTINATION (1<<3)
+#define DOCKING_NULL_SOURCE (1<<4)
+
+//Docking turf movements
+#define MOVE_TURF 1
+#define MOVE_AREA 2
+#define MOVE_CONTENTS 4
+
+//Rotation params
+#define ROTATE_DIR 1
+#define ROTATE_SMOOTH 2
+#define ROTATE_OFFSET 4
+
+#define SHUTTLE_DOCKER_LANDING_CLEAR 1
+#define SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT 2
+#define SHUTTLE_DOCKER_BLOCKED 3
+
+//Shuttle defaults
+#define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle
+#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space
From 17877d0d75676f98500517436a46ffe5281f8c07 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:22:17 -0700
Subject: [PATCH 006/102] 5
---
_maps/{ => shuttles}/arrival_cog.dmm | 0
_maps/{ => shuttles}/emergency_cog.dmm | 0
_maps/{ => shuttles}/labour_cog.dmm | 0
_maps/{ => shuttles}/whiteship_cog.dmm | 0
4 files changed, 0 insertions(+), 0 deletions(-)
rename _maps/{ => shuttles}/arrival_cog.dmm (100%)
rename _maps/{ => shuttles}/emergency_cog.dmm (100%)
rename _maps/{ => shuttles}/labour_cog.dmm (100%)
rename _maps/{ => shuttles}/whiteship_cog.dmm (100%)
diff --git a/_maps/arrival_cog.dmm b/_maps/shuttles/arrival_cog.dmm
similarity index 100%
rename from _maps/arrival_cog.dmm
rename to _maps/shuttles/arrival_cog.dmm
diff --git a/_maps/emergency_cog.dmm b/_maps/shuttles/emergency_cog.dmm
similarity index 100%
rename from _maps/emergency_cog.dmm
rename to _maps/shuttles/emergency_cog.dmm
diff --git a/_maps/labour_cog.dmm b/_maps/shuttles/labour_cog.dmm
similarity index 100%
rename from _maps/labour_cog.dmm
rename to _maps/shuttles/labour_cog.dmm
diff --git a/_maps/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm
similarity index 100%
rename from _maps/whiteship_cog.dmm
rename to _maps/shuttles/whiteship_cog.dmm
From e3cbf88989445fd82ea5b0dc3a4a85cea7e04d08 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:33:32 -0700
Subject: [PATCH 007/102] Revert "5"
This reverts commit 17877d0d75676f98500517436a46ffe5281f8c07.
---
_maps/{shuttles => }/arrival_cog.dmm | 0
_maps/{shuttles => }/emergency_cog.dmm | 0
_maps/{shuttles => }/labour_cog.dmm | 0
_maps/{shuttles => }/whiteship_cog.dmm | 0
4 files changed, 0 insertions(+), 0 deletions(-)
rename _maps/{shuttles => }/arrival_cog.dmm (100%)
rename _maps/{shuttles => }/emergency_cog.dmm (100%)
rename _maps/{shuttles => }/labour_cog.dmm (100%)
rename _maps/{shuttles => }/whiteship_cog.dmm (100%)
diff --git a/_maps/shuttles/arrival_cog.dmm b/_maps/arrival_cog.dmm
similarity index 100%
rename from _maps/shuttles/arrival_cog.dmm
rename to _maps/arrival_cog.dmm
diff --git a/_maps/shuttles/emergency_cog.dmm b/_maps/emergency_cog.dmm
similarity index 100%
rename from _maps/shuttles/emergency_cog.dmm
rename to _maps/emergency_cog.dmm
diff --git a/_maps/shuttles/labour_cog.dmm b/_maps/labour_cog.dmm
similarity index 100%
rename from _maps/shuttles/labour_cog.dmm
rename to _maps/labour_cog.dmm
diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/whiteship_cog.dmm
similarity index 100%
rename from _maps/shuttles/whiteship_cog.dmm
rename to _maps/whiteship_cog.dmm
From dfe73565a1a3574d8a885bff6e792fc94c55d4a8 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:33:53 -0700
Subject: [PATCH 008/102] Revert "shut"
This reverts commit 7502cec75644810318b1cc650f9b701c4eaa6d28.
---
_maps/arrival_cog.dmm | 278 -----------------
_maps/emergency_cog.dmm | 55 ----
_maps/labour_cog.dmm | 37 ---
_maps/whiteship_cog.dmm | 428 ---------------------------
code/datums/shuttles.dm | 641 ++++++++++++++++++++++++++++++++++++----
5 files changed, 578 insertions(+), 861 deletions(-)
delete mode 100644 _maps/arrival_cog.dmm
delete mode 100644 _maps/emergency_cog.dmm
delete mode 100644 _maps/labour_cog.dmm
delete mode 100644 _maps/whiteship_cog.dmm
diff --git a/_maps/arrival_cog.dmm b/_maps/arrival_cog.dmm
deleted file mode 100644
index 2ecbccaaab..0000000000
--- a/_maps/arrival_cog.dmm
+++ /dev/null
@@ -1,278 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/template_noop,
-/area/template_noop)
-"b" = (
-/turf/closed/wall/mineral/titanium,
-/area/shuttle/arrival)
-"c" = (
-/obj/structure/shuttle/engine/propulsion/right{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/shuttle/arrival)
-"d" = (
-/obj/structure/shuttle/engine/propulsion/left{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/shuttle/arrival)
-"e" = (
-/obj/docking_port/mobile/arrivals{
- dir = 2;
- dwidth = 4;
- height = 12;
- name = "cog arrivals shuttle";
- width = 9
- },
-/turf/template_noop,
-/area/template_noop)
-"f" = (
-/turf/closed/wall/mineral/titanium/nosmooth,
-/area/shuttle/arrival)
-"g" = (
-/obj/structure/shuttle/engine/heater{
- dir = 1
- },
-/obj/structure/window/reinforced/spawner,
-/turf/open/floor/plating,
-/area/shuttle/arrival)
-"h" = (
-/obj/structure/shuttle/engine/heater{
- dir = 1
- },
-/turf/closed/wall/mineral/titanium/nosmooth,
-/area/shuttle/arrival)
-"i" = (
-/obj/machinery/sleeper,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/arrival)
-"j" = (
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/arrival)
-"k" = (
-/obj/structure/table/reinforced,
-/obj/item/radio,
-/obj/item/storage/toolbox/emergency,
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/arrival)
-"l" = (
-/obj/machinery/sleeper,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/mineral/titanium/white,
-/area/shuttle/arrival)
-"m" = (
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"n" = (
-/obj/structure/window/shuttle,
-/obj/structure/grille,
-/turf/open/floor/plating,
-/area/shuttle/arrival)
-"o" = (
-/obj/structure/chair/comfy/shuttle,
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"p" = (
-/obj/structure/chair/comfy/shuttle,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"q" = (
-/obj/structure/chair/comfy/shuttle,
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"r" = (
-/obj/machinery/door/airlock/external{
- name = "Arrival Shuttle Airlock"
- },
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/shuttle/arrival)
-"s" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/firstaid/regular,
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"t" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/emergency,
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"u" = (
-/obj/structure/table/reinforced,
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"v" = (
-/obj/structure/table/reinforced,
-/obj/item/radio,
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"w" = (
-/obj/machinery/computer{
- dir = 1;
- name = "Shuttle computer"
- },
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"x" = (
-/obj/machinery/computer{
- dir = 1;
- name = "Shuttle computer"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-"y" = (
-/obj/machinery/computer{
- dir = 1;
- name = "Shuttle computer"
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/shuttle/arrival)
-
-(1,1,1) = {"
-a
-c
-h
-b
-a
-a
-a
-a
-a
-a
-a
-a
-"}
-(2,1,1) = {"
-b
-f
-b
-b
-n
-b
-b
-r
-b
-b
-b
-a
-"}
-(3,1,1) = {"
-c
-g
-i
-m
-o
-o
-p
-m
-s
-u
-b
-b
-"}
-(4,1,1) = {"
-d
-g
-j
-m
-o
-o
-o
-m
-o
-o
-w
-n
-"}
-(5,1,1) = {"
-e
-f
-k
-m
-m
-m
-m
-m
-m
-m
-x
-n
-"}
-(6,1,1) = {"
-c
-g
-j
-m
-o
-o
-o
-m
-o
-o
-y
-n
-"}
-(7,1,1) = {"
-d
-g
-l
-m
-o
-o
-q
-m
-t
-v
-b
-b
-"}
-(8,1,1) = {"
-b
-f
-b
-b
-n
-b
-b
-r
-b
-b
-b
-a
-"}
-(9,1,1) = {"
-a
-d
-h
-b
-a
-a
-a
-a
-a
-a
-a
-a
-"}
diff --git a/_maps/emergency_cog.dmm b/_maps/emergency_cog.dmm
deleted file mode 100644
index 262537249e..0000000000
--- a/_maps/emergency_cog.dmm
+++ /dev/null
@@ -1,55 +0,0 @@
-"a" = (/turf/template_noop,/area/template_noop)
-"b" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
-"c" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
-"d" = (/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"e" = (/obj/machinery/light{dir = 1},/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"f" = (/obj/machinery/status_display/evac,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"g" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/escape)
-"h" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"i" = (/obj/machinery/light{dir = 4},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"j" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"k" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"m" = (/obj/effect/spawner/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
-"n" = (/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"o" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Classic"; width = 22},/turf/open/floor/plating,/area/shuttle/escape)
-"p" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
-"q" = (/obj/machinery/sleeper,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"r" = (/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"s" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"t" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"u" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"v" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/radio,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"w" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"x" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"y" = (/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"z" = (/obj/machinery/computer/emergency_shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"A" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"B" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/storage/firstaid/regular,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"C" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular,/obj/structure/window/reinforced,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"D" = (/obj/machinery/light,/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"H" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"J" = (/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"K" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"P" = (/obj/structure/table/optable,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"Q" = (/obj/machinery/light,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"R" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/storage/backpack/duffelbag/med/surgery,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"T" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"V" = (/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"W" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
-"X" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
-"Y" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
-
-(1,1,1) = {"
-aWcdddgmgmdmdmomgdaaaa
-dddldtrrrrdhesrrrdaaaa
-bpqqdtrrrrrrssrrrdmdaa
-bpnnwrrQrssrssrsrmjdmd
-bpPRfssdrssrssrsidkuvm
-dddddssmrssrrrrrrxykzm
-bpHTfssdrssrssssifkABm
-bpHJKrrVrrrrssssrmCdmd
-bpHHdssssrrrssssrdmdaa
-dddddssssrdhDsssrdaaaa
-aXYdddmmmmdmdmmmddaaaa
-"}
diff --git a/_maps/labour_cog.dmm b/_maps/labour_cog.dmm
deleted file mode 100644
index 7fd72761f3..0000000000
--- a/_maps/labour_cog.dmm
+++ /dev/null
@@ -1,37 +0,0 @@
-"a" = (/turf/closed/wall/mineral/titanium,/area/shuttle/labor)
-"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
-"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
-"d" = (/obj/structure/closet/crate/internals,/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/labor)
-"e" = (/turf/open/floor/plasteel,/area/shuttle/labor)
-"f" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"g" = (/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/labor)
-"h" = (/obj/structure/grille,/obj/structure/cable/yellow{icon_state = "0-8"},/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/labor)
-"i" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"j" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"k" = (/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/structure/chair/comfy/shuttle{dir = 8},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
-"l" = (/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"m" = (/obj/machinery/light,/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
-"n" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/labor)
-"o" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30},/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/shuttle/labor)
-"p" = (/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"q" = (/obj/machinery/light{dir = 1; light_color = "#c1caff"},/obj/machinery/button/flasher{dir = 1; id = "gulagshuttleflasher"; name = "Flash Control"; pixel_y = 26; req_access_txt = "1"},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"r" = (/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9},/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/labor)
-"s" = (/obj/machinery/computer/shuttle/labor{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = -31},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"t" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"u" = (/obj/structure/table/reinforced,/obj/item/folder/red,/obj/item/restraints/handcuffs,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"v" = (/obj/structure/window/shuttle,/turf/open/floor/plating/airless,/area/shuttle/labor)
-"w" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"x" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"y" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2; pixel_x = 30; pixel_y = -32},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-
-(1,1,1) = {"
-abbba
-aacaa
-adfig
-hjeka
-almoa
-awnxa
-hpqyr
-astua
-avvva
-"}
diff --git a/_maps/whiteship_cog.dmm b/_maps/whiteship_cog.dmm
deleted file mode 100644
index 9410682219..0000000000
--- a/_maps/whiteship_cog.dmm
+++ /dev/null
@@ -1,428 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/obj/structure/shuttle/engine/propulsion/left{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
-"b" = (
-/obj/structure/shuttle/engine/heater{
- dir = 8
- },
-/turf/closed/wall/mineral/titanium/nosmooth,
-/area/shuttle/abandoned)
-"c" = (
-/turf/closed/wall/mineral/titanium/interior,
-/area/shuttle/abandoned)
-"d" = (
-/turf/template_noop,
-/area/template_noop)
-"e" = (
-/obj/structure/shuttle/engine/propulsion/burst{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
-"f" = (
-/obj/structure/shuttle/engine/heater{
- dir = 8
- },
-/turf/closed/wall/mineral/titanium/interior,
-/area/shuttle/abandoned)
-"g" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/shuttle/abandoned)
-"h" = (
-/obj/machinery/door/airlock/external,
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
-"i" = (
-/obj/machinery/suit_storage_unit/security,
-/obj/machinery/light/small{
- brightness = 3;
- dir = 8
- },
-/obj/machinery/airalarm/all_access{
- pixel_y = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/shuttle/abandoned)
-"j" = (
-/turf/closed/wall/mineral/titanium,
-/area/shuttle/abandoned)
-"k" = (
-/obj/machinery/door/airlock/external,
-/obj/structure/fans/tiny,
-/turf/open/floor/plasteel/dark,
-/area/shuttle/abandoned)
-"l" = (
-/obj/structure/shuttle/engine/propulsion/right{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
-"m" = (
-/obj/structure/bed,
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"n" = (
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"o" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"p" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"q" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/east,
-/obj/machinery/recharger,
-/turf/open/floor/plasteel/dark,
-/area/shuttle/abandoned)
-"r" = (
-/obj/structure/filingcabinet,
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"s" = (
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"t" = (
-/turf/closed/wall/mineral/titanium/nosmooth,
-/area/shuttle/abandoned)
-"u" = (
-/obj/machinery/door/airlock/security,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"v" = (
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"w" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"x" = (
-/obj/machinery/door/firedoor/border_only/closed{
- icon_state = "door_closed";
- dir = 4
- },
-/obj/machinery/door/window/eastright,
-/turf/open/floor/plasteel/dark,
-/area/shuttle/abandoned)
-"y" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"z" = (
-/obj/structure/window/shuttle,
-/turf/open/floor/plating,
-/area/shuttle/abandoned)
-"A" = (
-/obj/machinery/door/window/eastright,
-/obj/structure/toilet{
- contents = newlist(/obj/item/toy/snappop/phoenix);
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"B" = (
-/obj/machinery/light{
- dir = 4;
- light_color = "#c1caff"
- },
-/obj/machinery/flasher{
- id = "cogws";
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"C" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/closet/crate/secure/weapon,
-/obj/item/gun/energy/laser/carbine,
-/obj/machinery/button/flasher{
- id = "cogws";
- pixel_x = -24;
- pixel_y = 8
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"D" = (
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/structure/closet/crate/secure/weapon,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/item/gun/energy/e_gun/stun,
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"E" = (
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/obj/machinery/airalarm/all_access{
- dir = 4;
- pixel_x = -24
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"F" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"G" = (
-/obj/machinery/computer/shuttle/white_ship{
- dir = 8
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"H" = (
-/obj/item/clothing/glasses/sunglasses/blindfold,
-/obj/machinery/airalarm/all_access{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel,
-/area/shuttle/abandoned)
-"I" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/glasses/sunglasses,
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/abandoned)
-"J" = (
-/obj/structure/curtain,
-/obj/machinery/shower{
- name = "shower";
- pixel_y = 12
- },
-/obj/item/soap/nanotrasen,
-/turf/open/floor/plasteel/white,
-/area/shuttle/abandoned)
-"K" = (
-/obj/structure/mirror{
- pixel_y = 32
- },
-/obj/structure/sink{
- pixel_y = 28
- },
-/turf/open/floor/plasteel/white,
-/area/shuttle/abandoned)
-"L" = (
-/obj/machinery/door/airlock/shuttle,
-/turf/open/floor/plasteel/white,
-/area/shuttle/abandoned)
-"M" = (
-/obj/structure/toilet{
- dir = 8
- },
-/obj/machinery/light/small{
- brightness = 3;
- dir = 8
- },
-/obj/machinery/airalarm/all_access{
- dir = 1;
- pixel_y = -24
- },
-/turf/open/floor/plasteel/white,
-/area/shuttle/abandoned)
-"N" = (
-/obj/machinery/door/airlock/external,
-/obj/structure/fans/tiny,
-/obj/docking_port/mobile{
- dir = 2;
- dwidth = 7;
- height = 9;
- id = "whiteship";
- movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
- name = "Prisoner Transport";
- port_direction = 8;
- preferred_direction = 4;
- width = 13
- },
-/turf/open/floor/plasteel/dark,
-/area/shuttle/abandoned)
-
-(1,1,1) = {"
-a
-e
-l
-g
-c
-g
-a
-e
-l
-"}
-(2,1,1) = {"
-b
-f
-f
-t
-A
-t
-f
-f
-b
-"}
-(3,1,1) = {"
-c
-g
-m
-n
-n
-n
-m
-g
-c
-"}
-(4,1,1) = {"
-d
-c
-m
-n
-n
-n
-m
-c
-d
-"}
-(5,1,1) = {"
-d
-h
-n
-n
-B
-H
-n
-h
-d
-"}
-(6,1,1) = {"
-d
-g
-c
-u
-c
-g
-c
-g
-d
-"}
-(7,1,1) = {"
-c
-c
-o
-v
-C
-c
-J
-c
-c
-"}
-(8,1,1) = {"
-c
-i
-p
-w
-D
-c
-K
-M
-c
-"}
-(9,1,1) = {"
-c
-g
-q
-x
-c
-g
-L
-g
-c
-"}
-(10,1,1) = {"
-d
-j
-r
-s
-E
-s
-s
-j
-d
-"}
-(11,1,1) = {"
-d
-N
-s
-s
-F
-s
-s
-k
-d
-"}
-(12,1,1) = {"
-d
-j
-j
-y
-G
-I
-j
-j
-d
-"}
-(13,1,1) = {"
-d
-d
-j
-z
-z
-z
-j
-d
-d
-"}
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 36ecebb699..779de8ff03 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -1,78 +1,593 @@
-//shuttle mode defines
-#define SHUTTLE_IDLE "idle"
-#define SHUTTLE_IGNITING "igniting"
-#define SHUTTLE_RECALL "recall"
-#define SHUTTLE_CALL "call"
-#define SHUTTLE_DOCKED "docked"
-#define SHUTTLE_STRANDED "stranded"
-#define SHUTTLE_ESCAPE "escape"
-#define SHUTTLE_ENDGAME "endgame: game over"
+/datum/map_template/shuttle
+ name = "Base Shuttle Template"
+ var/prefix = "_maps/shuttles/"
+ var/suffix
+ var/port_id
+ var/shuttle_id
-#define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL)))
-#define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)))
-#define EMERGENCY_AT_LEAST_DOCKED (SSshuttle.emergency && SSshuttle.emergency.mode != SHUTTLE_IDLE && SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_CALL)
+ var/description
+ var/prerequisites
+ var/admin_notes
-// Shuttle return values
-#define SHUTTLE_CAN_DOCK "can_dock"
-#define SHUTTLE_NOT_A_DOCKING_PORT "not a docking port"
-#define SHUTTLE_DWIDTH_TOO_LARGE "docking width too large"
-#define SHUTTLE_WIDTH_TOO_LARGE "width too large"
-#define SHUTTLE_DHEIGHT_TOO_LARGE "docking height too large"
-#define SHUTTLE_HEIGHT_TOO_LARGE "height too large"
-#define SHUTTLE_ALREADY_DOCKED "we are already docked"
-#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone else docked"
+ var/credit_cost = INFINITY
+ var/can_be_bought = TRUE
-//Launching Shuttles to CentCom
-#define NOLAUNCH -1
-#define UNLAUNCHED 0
-#define ENDGAME_LAUNCHED 1
-#define EARLY_LAUNCHED 2
-#define ENDGAME_TRANSIT 3
+ var/port_x_offset
+ var/port_y_offset
-// Ripples, effects that signal a shuttle's arrival
-#define SHUTTLE_RIPPLE_TIME 100
+/datum/map_template/shuttle/proc/prerequisites_met()
+ return TRUE
-#define TRANSIT_REQUEST 1
-#define TRANSIT_READY 2
+/datum/map_template/shuttle/New()
+ shuttle_id = "[port_id]_[suffix]"
+ mappath = "[prefix][shuttle_id].dmm"
+ . = ..()
-#define SHUTTLE_TRANSIT_BORDER 10
+/datum/map_template/shuttle/preload_size(path, cache)
+ . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map
+ if(!cached_map)
+ return
-#define PARALLAX_LOOP_TIME 25
-#define HYPERSPACE_END_TIME 5
+ discover_port_offset()
-#define HYPERSPACE_WARMUP 1
-#define HYPERSPACE_LAUNCH 2
-#define HYPERSPACE_END 3
+ if(!cache)
+ cached_map = null
-#define CALL_SHUTTLE_REASON_LENGTH 12
+/datum/map_template/shuttle/proc/discover_port_offset()
+ var/key
+ var/list/models = cached_map.grid_models
+ for(key in models)
+ if(findtext(models[key], "[/obj/docking_port/mobile]")) // Yay compile time checks
+ break // This works by assuming there will ever only be one mobile dock in a template at most
-//Engine related
-#define ENGINE_COEFF_MIN 0.5
-#define ENGINE_COEFF_MAX 2
-#define ENGINE_DEFAULT_MAXSPEED_ENGINES 5
+ for(var/i in cached_map.gridSets)
+ var/datum/grid_set/gset = i
+ var/ycrd = gset.ycrd
+ for(var/line in gset.gridLines)
+ var/xcrd = gset.xcrd
+ for(var/j in 1 to length(line) step cached_map.key_len)
+ if(key == copytext(line, j, j + cached_map.key_len))
+ port_x_offset = xcrd
+ port_y_offset = ycrd
+ return
+ ++xcrd
+ --ycrd
-//Docking error flags
-#define DOCKING_SUCCESS 0
-#define DOCKING_BLOCKED (1<<0)
-#define DOCKING_IMMOBILIZED (1<<1)
-#define DOCKING_AREA_EMPTY (1<<2)
-#define DOCKING_NULL_DESTINATION (1<<3)
-#define DOCKING_NULL_SOURCE (1<<4)
+/datum/map_template/shuttle/load(turf/T, centered, register=TRUE)
+ . = ..()
+ if(!.)
+ return
+ var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]),
+ locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ]))
+ for(var/i in 1 to turfs.len)
+ var/turf/place = turfs[i]
+ if(istype(place, /turf/open/space)) // This assumes all shuttles are loaded in a single spot then moved to their real destination.
+ continue
+ if(length(place.baseturfs) < 2) // Some snowflake shuttle shit
+ continue
+ place.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle)
-//Docking turf movements
-#define MOVE_TURF 1
-#define MOVE_AREA 2
-#define MOVE_CONTENTS 4
+ for(var/obj/docking_port/mobile/port in place)
+ if(register)
+ port.register()
+ if(isnull(port_x_offset))
+ continue
+ switch(port.dir) // Yeah this looks a little ugly but mappers had to do this in their head before
+ if(NORTH)
+ port.width = width
+ port.height = height
+ port.dwidth = port_x_offset - 1
+ port.dheight = port_y_offset - 1
+ if(EAST)
+ port.width = height
+ port.height = width
+ port.dwidth = height - port_y_offset
+ port.dheight = port_x_offset - 1
+ if(SOUTH)
+ port.width = width
+ port.height = height
+ port.dwidth = width - port_x_offset
+ port.dheight = height - port_y_offset
+ if(WEST)
+ port.width = height
+ port.height = width
+ port.dwidth = port_y_offset - 1
+ port.dheight = width - port_x_offset
-//Rotation params
-#define ROTATE_DIR 1
-#define ROTATE_SMOOTH 2
-#define ROTATE_OFFSET 4
+ for(var/obj/structure/closet/closet in place)
+ if(closet.anchorable)
+ closet.anchored = TRUE
-#define SHUTTLE_DOCKER_LANDING_CLEAR 1
-#define SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT 2
-#define SHUTTLE_DOCKER_BLOCKED 3
+ for(var/obj/structure/table/table in place)
+ table.AddComponent(/datum/component/magnetic_catch)
-//Shuttle defaults
-#define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle
-#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space
+ for(var/obj/structure/rack/rack in place)
+ rack.AddComponent(/datum/component/magnetic_catch)
+
+//Whatever special stuff you want
+/datum/map_template/shuttle/proc/on_bought()
+ return
+
+/datum/map_template/shuttle/emergency
+ port_id = "emergency"
+ name = "Base Shuttle Template (Emergency)"
+
+/datum/map_template/shuttle/cargo
+ port_id = "cargo"
+ name = "Base Shuttle Template (Cargo)"
+
+/datum/map_template/shuttle/ferry
+ port_id = "ferry"
+ name = "Base Shuttle Template (Ferry)"
+
+/datum/map_template/shuttle/whiteship
+ port_id = "whiteship"
+
+/datum/map_template/shuttle/labour
+ port_id = "labour"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/mining
+ port_id = "mining"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/mining_common
+ port_id = "mining_common"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/cargo
+ port_id = "cargo"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/arrival
+ port_id = "arrival"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/infiltrator
+ port_id = "infiltrator"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/aux_base
+ port_id = "aux_base"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/escape_pod
+ port_id = "escape_pod"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/assault_pod
+ port_id = "assault_pod"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/pirate
+ port_id = "pirate"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/ruin //For random shuttles in ruins
+ port_id = "ruin"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/snowdin
+ port_id = "snowdin"
+ can_be_bought = FALSE
+
+// Shuttles start here:
+
+/datum/map_template/shuttle/emergency/backup
+ suffix = "backup"
+ name = "Backup Shuttle"
+ can_be_bought = FALSE
+
+/datum/map_template/shuttle/emergency/airless
+ suffix = "airless"
+ name = "Build your own shuttle kit"
+ description = "Save money by building your own shuttle! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Interior and lighting not included."
+ admin_notes = "No brig, no medical facilities, just an empty box."
+ credit_cost = -7500
+
+/datum/map_template/shuttle/emergency/airless/prerequisites_met()
+ // first 10 minutes only
+ return world.time - SSticker.round_start_time < 6000
+
+/datum/map_template/shuttle/emergency/airless/on_bought()
+ //enable buying engines from cargo
+ var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine]
+ P.special_enabled = TRUE
+
+
+/datum/map_template/shuttle/emergency/asteroid
+ suffix = "asteroid"
+ name = "Asteroid Station Emergency Shuttle"
+ description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities."
+ credit_cost = 3000
+
+/datum/map_template/shuttle/emergency/bar
+ suffix = "bar"
+ name = "The Emergency Escape Bar"
+ description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table."
+ admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \
+ Has medical facilities."
+ credit_cost = 5000
+
+/datum/map_template/shuttle/emergency/russiafightpit
+ suffix = "russiafightpit"
+ name = "Mother Russia Bleeds"
+ description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!"
+ admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them."
+ credit_cost = 5000 // While the shuttle is rusted and poorly maintained, trained bears are costly.
+
+/datum/map_template/shuttle/emergency/meteor
+ suffix = "meteor"
+ name = "Asteroid With Engines Strapped To It"
+ description = "A hollowed out asteroid with engines strapped to it. Due to its size and difficulty in steering it, this shuttle may damage the docking area."
+ admin_notes = "This shuttle will likely crush escape, killing anyone there."
+ credit_cost = -5000
+
+/datum/map_template/shuttle/emergency/luxury
+ suffix = "luxury"
+ name = "Luxury Shuttle"
+ description = "A luxurious golden shuttle complete with an indoor swimming pool. Entry is free, so long as you can afford the initial cost."
+ admin_notes = "Fancy, and very roomy!"
+ credit_cost = 17500
+
+/datum/map_template/shuttle/emergency/discoinferno
+ suffix = "discoinferno"
+ name = "Disco Inferno"
+ description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!"
+ admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time."
+ credit_cost = 10000
+
+/datum/map_template/shuttle/emergency/arena
+ suffix = "arena"
+ name = "The Arena"
+ description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties. The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle."
+ admin_notes = "RIP AND TEAR."
+ credit_cost = 10000
+
+/datum/map_template/shuttle/emergency/arena/prerequisites_met()
+ if("bubblegum" in SSshuttle.shuttle_purchase_requirements_met)
+ return TRUE
+ return FALSE
+
+/datum/map_template/shuttle/emergency/birdboat
+ suffix = "birdboat"
+ name = "Birdboat Station Emergency Shuttle"
+ description = "Though a little on the small side, this shuttle is feature complete, which is more than can be said for the pattern of station it was commissioned for."
+ credit_cost = 1000
+
+/datum/map_template/shuttle/emergency/box
+ suffix = "box"
+ name = "Box Station Emergency Shuttle"
+ credit_cost = 2000
+ description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home."
+
+/datum/map_template/shuttle/emergency/clown
+ suffix = "clown"
+ name = "Snappop(tm)!"
+ description = "Hey kids and grownups! \
+ Are you bored of DULL and TEDIOUS shuttle journeys after you're evacuating for probably BORING reasons. Well then order the Snappop(tm) today! \
+ We've got fun activities for everyone, an all access cockpit, and no boring security brig! Boo! Play dress up with your friends! \
+ Collect all the bedsheets before your neighbour does! Check if the AI is watching you with our patent pending \"Peeping Tom AI Multitool Detector\" or PEEEEEETUR for short. \
+ Have a fun ride!"
+ admin_notes = "Brig is replaced by anchored greentext book surrounded by lavaland chasms, stationside door has been removed to prevent accidental dropping. No brig."
+ credit_cost = 8000
+
+/datum/map_template/shuttle/emergency/cramped
+ suffix = "cramped"
+ name = "Secure Transport Vessel 5 (STV5)"
+ description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \
+ Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\
+ \n\
+ Contains contraband armory guns, maintenance loot, and abandoned crates!"
+ admin_notes = "Due to origin as a solo piloted secure vessel, has an active GPS onboard labeled STV5. Has roughly as much space as Hi Daniel, except with explosive crates."
+
+/datum/map_template/shuttle/emergency/meta
+ suffix = "meta"
+ name = "Meta Station Emergency Shuttle"
+ credit_cost = 4000
+ description = "A fairly standard shuttle, though larger and slightly better equipped than the Box Station variant."
+
+/datum/map_template/shuttle/emergency/kilo
+ suffix = "kilo"
+ name = "Kilo Station Emergency Shuttle"
+ credit_cost = 5000
+ description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities."
+
+/datum/map_template/shuttle/emergency/mini
+ suffix = "mini"
+ name = "Ministation emergency shuttle"
+ credit_cost = 1000
+ description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay."
+
+/datum/map_template/shuttle/emergency/scrapheap
+ suffix = "scrapheap"
+ name = "Standby Evacuation Vessel \"Scrapheap Challenge\""
+ credit_cost = -1000
+ description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean too heavily on the exterior windows, they are fragile."
+ admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight."
+
+/datum/map_template/shuttle/emergency/syndicate
+ suffix = "syndicate"
+ name = "Syndicate GM Battlecruiser"
+ credit_cost = 20000
+ description = "(Emag only) Manufactured by the Gorlex Marauders, this cruiser has been specially designed with high occupancy in mind, while remaining robust in combat situations. Features a fully stocked EVA storage, armory, medbay, and bar!"
+ admin_notes = "An emag exclusive, stocked with syndicate equipment and turrets that will target any simplemob."
+
+/datum/map_template/shuttle/emergency/syndicate/prerequisites_met()
+ if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
+ return TRUE
+ return FALSE
+
+/datum/map_template/shuttle/emergency/narnar
+ suffix = "narnar"
+ name = "Shuttle 667"
+ description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from."
+ admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \
+ Cloning pods in 'medbay' area are showcases and nonfunctional."
+
+/datum/map_template/shuttle/emergency/pubby
+ suffix = "pubby"
+ name = "Pubby Station Emergency Shuttle"
+ description = "A train but in space! Complete with a first, second class, brig and storage area."
+ admin_notes = "Choo choo motherfucker!"
+ credit_cost = 1000
+
+/datum/map_template/shuttle/emergency/cere
+ suffix = "cere"
+ name = "Cere Station Emergency Shuttle"
+ description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \
+ an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere."
+ admin_notes = "Seriously big, even larger than the Delta shuttle."
+ credit_cost = 10000
+
+/datum/map_template/shuttle/emergency/supermatter
+ suffix = "supermatter"
+ name = "Hyperfractal Gigashuttle"
+ description = "(Emag only) \"I dunno, this seems kinda needlessly complicated.\"\n\
+ \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
+ \"Are you sure?\"\n\
+ \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
+ admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \
+ Outside of admin intervention, it cannot explode. \
+ It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \
+ Emitters spawn powered on, expect admin notices, they are harmless."
+ credit_cost = 15000
+
+/datum/map_template/shuttle/emergency/supermatter/prerequisites_met()
+ if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
+ return TRUE
+ return FALSE
+
+/datum/map_template/shuttle/emergency/imfedupwiththisworld
+ suffix = "imfedupwiththisworld"
+ name = "Oh, Hi Daniel"
+ description = "How was space work today? Oh, pretty good. We got a new space station and the company will make a lot of money. What space station? I cannot tell you; it's space confidential. \
+ Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?"
+ admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?"
+ credit_cost = -5000
+
+/datum/map_template/shuttle/emergency/goon
+ suffix = "goon"
+ name = "NES Port"
+ description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) is a shuttle used at other less known Nanotrasen facilities and has a more open inside for larger crowds, but fewer onboard shuttle facilities."
+ credit_cost = 500
+
+/datum/map_template/shuttle/emergency/wabbajack
+ suffix = "wabbajack"
+ name = "NT Lepton Violet"
+ description = "The research team based on this vessel went missing one day, and no amount of investigation could discover what happened to them. \
+ The only occupants were a number of dead rodents, who appeared to have clawed each other to death. \
+ Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available."
+ admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone."
+ credit_cost = 15000
+
+/datum/map_template/shuttle/emergency/omega
+ suffix = "omega"
+ name = "Omegastation Emergency Shuttle"
+ description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs."
+ credit_cost = 1000
+
+/datum/map_template/shuttle/emergency/gorilla
+ suffix = "gorilla"
+ name = "Gorilla Cargo Freighter"
+ description = "(Emag only) A rustic, barely excuseable shuttle transporting important cargo. Not for crew who are about to go ape."
+ credit_cost = 2000
+
+/datum/map_template/shuttle/emergency/gorilla/prerequisites_met()
+ if("emagged" in SSshuttle.shuttle_purchase_requirements_met)
+ return TRUE
+ return FALSE
+
+/datum/map_template/shuttle/ferry/base
+ suffix = "base"
+ name = "transport ferry"
+ description = "Standard issue Box/Metastation CentCom ferry."
+
+/datum/map_template/shuttle/ferry/meat
+ suffix = "meat"
+ name = "\"meat\" ferry"
+ description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \
+ Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \
+ Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!"
+ admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in."
+
+/datum/map_template/shuttle/ferry/lighthouse
+ suffix = "lighthouse"
+ name = "The Lighthouse(?)"
+ description = "*static*... part of a much larger vessel, possibly military in origin. \
+ The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \
+ seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \
+ Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!"
+ admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included."
+
+/datum/map_template/shuttle/ferry/fancy
+ suffix = "fancy"
+ name = "fancy transport ferry"
+ description = "At some point, someone upgraded the ferry to have fancier flooring... and less seats."
+
+/datum/map_template/shuttle/ferry/kilo
+ suffix = "kilo"
+ name = "kilo transport ferry"
+ description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers."
+
+/datum/map_template/shuttle/whiteship/box
+ suffix = "box"
+ name = "Hospital Ship"
+
+/datum/map_template/shuttle/whiteship/meta
+ suffix = "meta"
+ name = "Salvage Ship"
+
+/datum/map_template/shuttle/whiteship/pubby
+ suffix = "pubby"
+ name = "NT White UFO"
+
+/datum/map_template/shuttle/whiteship/cere
+ suffix = "cere"
+ name = "NT Construction Vessel"
+
+/datum/map_template/shuttle/whiteship/delta
+ suffix = "delta"
+ name = "NT Frigate"
+
+/datum/map_template/shuttle/whiteship/pod
+ suffix = "whiteship_pod"
+ name = "Salvage Pod"
+
+/datum/map_template/shuttle/cargo/box
+ suffix = "box"
+ name = "supply shuttle (Box)"
+
+/datum/map_template/shuttle/cargo/kilo
+ suffix = "kilo"
+ name = "supply shuttle (Kilo)"
+
+/datum/map_template/shuttle/cargo/birdboat
+ suffix = "birdboat"
+ name = "supply shuttle (Birdboat)"
+
+/datum/map_template/shuttle/emergency/delta
+ suffix = "delta"
+ name = "Delta Station Emergency Shuttle"
+ description = "A large shuttle for a large station, this shuttle can comfortably fit all your overpopulation and crowding needs. Complete with all facilities plus additional equipment."
+ admin_notes = "Go big or go home."
+ credit_cost = 7500
+
+/datum/map_template/shuttle/emergency/raven
+ suffix = "raven"
+ name = "CentCom Raven Battlecruiser"
+ description = "The CentCom Raven Battlecruiser is currently docked at the CentCom ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The CentCom Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range CentCom Medical Bay."
+ admin_notes = "Comes with turrets that will target any simplemob."
+ credit_cost = 12500
+
+/datum/map_template/shuttle/arrival/box
+ suffix = "box"
+ name = "arrival shuttle (Box)"
+
+/datum/map_template/shuttle/cargo/box
+ suffix = "box"
+ name = "cargo ferry (Box)"
+
+/datum/map_template/shuttle/mining/box
+ suffix = "box"
+ name = "mining shuttle (Box)"
+
+/datum/map_template/shuttle/labour/box
+ suffix = "box"
+ name = "labour shuttle (Box)"
+
+/datum/map_template/shuttle/labour/kilo
+ suffix = "kilo"
+ name = "labour shuttle (Kilo)"
+
+/datum/map_template/shuttle/infiltrator/basic
+ suffix = "basic"
+ name = "basic syndicate infiltrator"
+
+/datum/map_template/shuttle/cargo/delta
+ suffix = "delta"
+ name = "cargo ferry (Delta)"
+
+/datum/map_template/shuttle/mining/delta
+ suffix = "delta"
+ name = "mining shuttle (Delta)"
+
+/datum/map_template/shuttle/mining/kilo
+ suffix = "kilo"
+ name = "mining shuttle (Kilo)"
+
+/datum/map_template/shuttle/labour/delta
+ suffix = "delta"
+ name = "labour shuttle (Delta)"
+
+/datum/map_template/shuttle/mining_common/meta
+ suffix = "meta"
+ name = "lavaland shuttle (Meta)"
+
+/datum/map_template/shuttle/labour/kilo
+ suffix = "kilo"
+ name = "labour shuttle (Kilo)"
+
+/datum/map_template/shuttle/arrival/delta
+ suffix = "delta"
+ name = "arrival shuttle (Delta)"
+
+/datum/map_template/shuttle/arrival/kilo
+ suffix = "kilo"
+ name = "arrival shuttle (Kilo)"
+
+/datum/map_template/shuttle/arrival/pubby
+ suffix = "pubby"
+ name = "arrival shuttle (Pubby)"
+
+/datum/map_template/shuttle/arrival/omega
+ suffix = "omega"
+ name = "arrival shuttle (Omega)"
+
+/datum/map_template/shuttle/aux_base/default
+ suffix = "default"
+ name = "auxilliary base (Default)"
+
+/datum/map_template/shuttle/aux_base/small
+ suffix = "small"
+ name = "auxilliary base (Small)"
+
+/datum/map_template/shuttle/escape_pod/default
+ suffix = "default"
+ name = "escape pod (Default)"
+
+/datum/map_template/shuttle/escape_pod/large
+ suffix = "large"
+ name = "escape pod (Large)"
+
+/datum/map_template/shuttle/assault_pod/default
+ suffix = "default"
+ name = "assault pod (Default)"
+
+/datum/map_template/shuttle/pirate/default
+ suffix = "default"
+ name = "pirate ship (Default)"
+
+/datum/map_template/shuttle/ruin/caravan_victim
+ suffix = "caravan_victim"
+ name = "Small Freighter"
+
+/datum/map_template/shuttle/ruin/pirate_cutter
+ suffix = "pirate_cutter"
+ name = "Pirate Cutter"
+
+/datum/map_template/shuttle/ruin/syndicate_dropship
+ suffix = "syndicate_dropship"
+ name = "Syndicate Dropship"
+
+/datum/map_template/shuttle/ruin/syndicate_fighter_shiv
+ suffix = "syndicate_fighter_shiv"
+ name = "Syndicate Fighter"
+
+/datum/map_template/shuttle/snowdin/mining
+ suffix = "mining"
+ name = "Snowdin Mining Elevator"
+
+/datum/map_template/shuttle/snowdin/excavation
+ suffix = "excavation"
+ name = "Snowdin Excavation Elevator"
From d8e82c03ef3b6bc6110668d83fde755e211eb8c9 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:36:28 -0700
Subject: [PATCH 009/102] Update shuttles.dm
---
code/datums/shuttles.dm | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 779de8ff03..0a44954e51 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -480,6 +480,12 @@
admin_notes = "Comes with turrets that will target any simplemob."
credit_cost = 12500
+/datum/map_template/shuttle/emergency/cog
+ suffix = "cog"
+ name = "NES Classic"
+ description = "A blast from the past! This recreation of the Nanotrasen Emergency Shuttle Port features the same focus on seating as the original, but on a slightly longer frame to better accommodate modern shuttle docks."
+ credit_cost = 750
+
/datum/map_template/shuttle/arrival/box
suffix = "box"
name = "arrival shuttle (Box)"
@@ -500,6 +506,10 @@
suffix = "kilo"
name = "labour shuttle (Kilo)"
+/datum/map_template/shuttle/labour/cog
+ suffix = "cog"
+ name = "labour shuttle (Cog)"
+
/datum/map_template/shuttle/infiltrator/basic
suffix = "basic"
name = "basic syndicate infiltrator"
@@ -544,6 +554,10 @@
suffix = "omega"
name = "arrival shuttle (Omega)"
+/datum/map_template/shuttle/arrival/cog
+ suffix = "cog"
+ name = "arrival shuttle (Cog)"
+
/datum/map_template/shuttle/aux_base/default
suffix = "default"
name = "auxilliary base (Default)"
From 01d90f5cc859ab2c6997b24777538190342f1de7 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk
Date: Tue, 17 Mar 2020 08:37:24 -0700
Subject: [PATCH 010/102] shut
---
_maps/shuttles/arrival_cog.dmm | 278 ++++++++++++++++++++
_maps/shuttles/emergency_cog.dmm | 55 ++++
_maps/shuttles/labour_cog.dmm | 37 +++
_maps/shuttles/whiteship_cog.dmm | 428 +++++++++++++++++++++++++++++++
4 files changed, 798 insertions(+)
create mode 100644 _maps/shuttles/arrival_cog.dmm
create mode 100644 _maps/shuttles/emergency_cog.dmm
create mode 100644 _maps/shuttles/labour_cog.dmm
create mode 100644 _maps/shuttles/whiteship_cog.dmm
diff --git a/_maps/shuttles/arrival_cog.dmm b/_maps/shuttles/arrival_cog.dmm
new file mode 100644
index 0000000000..2ecbccaaab
--- /dev/null
+++ b/_maps/shuttles/arrival_cog.dmm
@@ -0,0 +1,278 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/arrival)
+"c" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"d" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"e" = (
+/obj/docking_port/mobile/arrivals{
+ dir = 2;
+ dwidth = 4;
+ height = 12;
+ name = "cog arrivals shuttle";
+ width = 9
+ },
+/turf/template_noop,
+/area/template_noop)
+"f" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"g" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/obj/structure/window/reinforced/spawner,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"h" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 1
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/arrival)
+"i" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"j" = (
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"k" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"l" = (
+/obj/machinery/sleeper,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/arrival)
+"m" = (
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"n" = (
+/obj/structure/window/shuttle,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"o" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"p" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"q" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"r" = (
+/obj/machinery/door/airlock/external{
+ name = "Arrival Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/arrival)
+"s" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"t" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"u" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"v" = (
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"w" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"x" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+"y" = (
+/obj/machinery/computer{
+ dir = 1;
+ name = "Shuttle computer"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/arrival)
+
+(1,1,1) = {"
+a
+c
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(3,1,1) = {"
+c
+g
+i
+m
+o
+o
+p
+m
+s
+u
+b
+b
+"}
+(4,1,1) = {"
+d
+g
+j
+m
+o
+o
+o
+m
+o
+o
+w
+n
+"}
+(5,1,1) = {"
+e
+f
+k
+m
+m
+m
+m
+m
+m
+m
+x
+n
+"}
+(6,1,1) = {"
+c
+g
+j
+m
+o
+o
+o
+m
+o
+o
+y
+n
+"}
+(7,1,1) = {"
+d
+g
+l
+m
+o
+o
+q
+m
+t
+v
+b
+b
+"}
+(8,1,1) = {"
+b
+f
+b
+b
+n
+b
+b
+r
+b
+b
+b
+a
+"}
+(9,1,1) = {"
+a
+d
+h
+b
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/shuttles/emergency_cog.dmm b/_maps/shuttles/emergency_cog.dmm
new file mode 100644
index 0000000000..262537249e
--- /dev/null
+++ b/_maps/shuttles/emergency_cog.dmm
@@ -0,0 +1,55 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
+"c" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"d" = (/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"e" = (/obj/machinery/light{dir = 1},/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"f" = (/obj/machinery/status_display/evac,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"g" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/escape)
+"h" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"i" = (/obj/machinery/light{dir = 4},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"j" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"k" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
+"m" = (/obj/effect/spawner/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"n" = (/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"o" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Classic"; width = 22},/turf/open/floor/plating,/area/shuttle/escape)
+"p" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
+"q" = (/obj/machinery/sleeper,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"r" = (/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"s" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"t" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"u" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"v" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/radio,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"w" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"x" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"y" = (/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"z" = (/obj/machinery/computer/emergency_shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"A" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"B" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/storage/firstaid/regular,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"C" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular,/obj/structure/window/reinforced,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
+"D" = (/obj/machinery/light,/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
+"H" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"J" = (/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"K" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"P" = (/obj/structure/table/optable,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"Q" = (/obj/machinery/light,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"R" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/storage/backpack/duffelbag/med/surgery,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
+"T" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
+"V" = (/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
+"W" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"X" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
+"Y" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
+
+(1,1,1) = {"
+aWcdddgmgmdmdmomgdaaaa
+dddldtrrrrdhesrrrdaaaa
+bpqqdtrrrrrrssrrrdmdaa
+bpnnwrrQrssrssrsrmjdmd
+bpPRfssdrssrssrsidkuvm
+dddddssmrssrrrrrrxykzm
+bpHTfssdrssrssssifkABm
+bpHJKrrVrrrrssssrmCdmd
+bpHHdssssrrrssssrdmdaa
+dddddssssrdhDsssrdaaaa
+aXYdddmmmmdmdmmmddaaaa
+"}
diff --git a/_maps/shuttles/labour_cog.dmm b/_maps/shuttles/labour_cog.dmm
new file mode 100644
index 0000000000..7fd72761f3
--- /dev/null
+++ b/_maps/shuttles/labour_cog.dmm
@@ -0,0 +1,37 @@
+"a" = (/turf/closed/wall/mineral/titanium,/area/shuttle/labor)
+"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
+"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
+"d" = (/obj/structure/closet/crate/internals,/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/labor)
+"e" = (/turf/open/floor/plasteel,/area/shuttle/labor)
+"f" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"g" = (/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/labor)
+"h" = (/obj/structure/grille,/obj/structure/cable/yellow{icon_state = "0-8"},/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/labor)
+"i" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"j" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"k" = (/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/structure/chair/comfy/shuttle{dir = 8},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
+"l" = (/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"m" = (/obj/machinery/light,/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
+"n" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/labor)
+"o" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30},/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/shuttle/labor)
+"p" = (/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"q" = (/obj/machinery/light{dir = 1; light_color = "#c1caff"},/obj/machinery/button/flasher{dir = 1; id = "gulagshuttleflasher"; name = "Flash Control"; pixel_y = 26; req_access_txt = "1"},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"r" = (/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9},/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/labor)
+"s" = (/obj/machinery/computer/shuttle/labor{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = -31},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"t" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"u" = (/obj/structure/table/reinforced,/obj/item/folder/red,/obj/item/restraints/handcuffs,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+"v" = (/obj/structure/window/shuttle,/turf/open/floor/plating/airless,/area/shuttle/labor)
+"w" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"x" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
+"y" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2; pixel_x = 30; pixel_y = -32},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+
+(1,1,1) = {"
+abbba
+aacaa
+adfig
+hjeka
+almoa
+awnxa
+hpqyr
+astua
+avvva
+"}
diff --git a/_maps/shuttles/whiteship_cog.dmm b/_maps/shuttles/whiteship_cog.dmm
new file mode 100644
index 0000000000..9410682219
--- /dev/null
+++ b/_maps/shuttles/whiteship_cog.dmm
@@ -0,0 +1,428 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/shuttle/engine/propulsion/left{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"b" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"c" = (
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"d" = (
+/turf/template_noop,
+/area/template_noop)
+"e" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"f" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/interior,
+/area/shuttle/abandoned)
+"g" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/abandoned)
+"h" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"i" = (
+/obj/machinery/suit_storage_unit/security,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"j" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/abandoned)
+"k" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"l" = (
+/obj/structure/shuttle/engine/propulsion/right{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"m" = (
+/obj/structure/bed,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"n" = (
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"o" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"p" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"q" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced/spawner/east,
+/obj/machinery/recharger,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"r" = (
+/obj/structure/filingcabinet,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"s" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"t" = (
+/turf/closed/wall/mineral/titanium/nosmooth,
+/area/shuttle/abandoned)
+"u" = (
+/obj/machinery/door/airlock/security,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"v" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"w" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"x" = (
+/obj/machinery/door/firedoor/border_only/closed{
+ icon_state = "door_closed";
+ dir = 4
+ },
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+"y" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"z" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/abandoned)
+"A" = (
+/obj/machinery/door/window/eastright,
+/obj/structure/toilet{
+ contents = newlist(/obj/item/toy/snappop/phoenix);
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"B" = (
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
+ },
+/obj/machinery/flasher{
+ id = "cogws";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"C" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/item/gun/energy/laser/carbine,
+/obj/machinery/button/flasher{
+ id = "cogws";
+ pixel_x = -24;
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"D" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/closet/crate/secure/weapon,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/item/gun/energy/e_gun/stun,
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"E" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"F" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"G" = (
+/obj/machinery/computer/shuttle/white_ship{
+ dir = 8
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"H" = (
+/obj/item/clothing/glasses/sunglasses/blindfold,
+/obj/machinery/airalarm/all_access{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/abandoned)
+"I" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/sunglasses,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/abandoned)
+"J" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ name = "shower";
+ pixel_y = 12
+ },
+/obj/item/soap/nanotrasen,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"K" = (
+/obj/structure/mirror{
+ pixel_y = 32
+ },
+/obj/structure/sink{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"L" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"M" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/machinery/airalarm/all_access{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel/white,
+/area/shuttle/abandoned)
+"N" = (
+/obj/machinery/door/airlock/external,
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile{
+ dir = 2;
+ dwidth = 7;
+ height = 9;
+ id = "whiteship";
+ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
+ name = "Prisoner Transport";
+ port_direction = 8;
+ preferred_direction = 4;
+ width = 13
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/abandoned)
+
+(1,1,1) = {"
+a
+e
+l
+g
+c
+g
+a
+e
+l
+"}
+(2,1,1) = {"
+b
+f
+f
+t
+A
+t
+f
+f
+b
+"}
+(3,1,1) = {"
+c
+g
+m
+n
+n
+n
+m
+g
+c
+"}
+(4,1,1) = {"
+d
+c
+m
+n
+n
+n
+m
+c
+d
+"}
+(5,1,1) = {"
+d
+h
+n
+n
+B
+H
+n
+h
+d
+"}
+(6,1,1) = {"
+d
+g
+c
+u
+c
+g
+c
+g
+d
+"}
+(7,1,1) = {"
+c
+c
+o
+v
+C
+c
+J
+c
+c
+"}
+(8,1,1) = {"
+c
+i
+p
+w
+D
+c
+K
+M
+c
+"}
+(9,1,1) = {"
+c
+g
+q
+x
+c
+g
+L
+g
+c
+"}
+(10,1,1) = {"
+d
+j
+r
+s
+E
+s
+s
+j
+d
+"}
+(11,1,1) = {"
+d
+N
+s
+s
+F
+s
+s
+k
+d
+"}
+(12,1,1) = {"
+d
+j
+j
+y
+G
+I
+j
+j
+d
+"}
+(13,1,1) = {"
+d
+d
+j
+z
+z
+z
+j
+d
+d
+"}
From 4391afa295a65580027a6a0c74e871dbb47530a7 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com>
Date: Tue, 17 Mar 2020 11:50:50 -0700
Subject: [PATCH 011/102] Add files via upload
---
_maps/shuttles/emergency_cog.dmm | 595 ++++++++++++++++++++++++++++---
1 file changed, 543 insertions(+), 52 deletions(-)
diff --git a/_maps/shuttles/emergency_cog.dmm b/_maps/shuttles/emergency_cog.dmm
index 262537249e..ad71dba4bd 100644
--- a/_maps/shuttles/emergency_cog.dmm
+++ b/_maps/shuttles/emergency_cog.dmm
@@ -1,55 +1,546 @@
-"a" = (/turf/template_noop,/area/template_noop)
-"b" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
-"c" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
-"d" = (/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"e" = (/obj/machinery/light{dir = 1},/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"f" = (/obj/machinery/status_display/evac,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"g" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/turf/open/floor/plating,/area/shuttle/escape)
-"h" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"i" = (/obj/machinery/light{dir = 4},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"j" = (/obj/structure/table/reinforced,/obj/item/storage/toolbox/emergency,/obj/structure/window/reinforced{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"k" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
-"m" = (/obj/effect/spawner/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
-"n" = (/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"o" = (/obj/machinery/door/airlock/titanium{name = "Emergency Shuttle Airlock"},/obj/structure/fans/tiny,/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Classic"; width = 22},/turf/open/floor/plating,/area/shuttle/escape)
-"p" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
-"q" = (/obj/machinery/sleeper,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"r" = (/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"s" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"t" = (/obj/structure/table/reinforced,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"u" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"v" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/radio,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"w" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"x" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"y" = (/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"z" = (/obj/machinery/computer/emergency_shuttle{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"A" = (/obj/structure/chair/comfy/brown{dir = 4},/obj/machinery/light/small,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"B" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/storage/firstaid/regular,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"C" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular,/obj/structure/window/reinforced,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/escape)
-"D" = (/obj/machinery/light,/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/titanium/blue,/area/shuttle/escape)
-"H" = (/obj/structure/chair/comfy/shuttle{dir = 4},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"J" = (/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"K" = (/obj/machinery/door/airlock/public/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"P" = (/obj/structure/table/optable,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"Q" = (/obj/machinery/light,/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"R" = (/obj/machinery/light/small,/obj/structure/table,/obj/item/storage/backpack/duffelbag/med/surgery,/turf/open/floor/mineral/titanium/white,/area/shuttle/escape)
-"T" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/machinery/light/small{dir = 1},/turf/open/floor/mineral/plastitanium/red/brig,/area/shuttle/escape)
-"V" = (/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium,/area/shuttle/escape)
-"W" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
-"X" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
-"Y" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plating,/area/shuttle/escape)
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"c" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"d" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"e" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"f" = (
+/obj/machinery/status_display/evac,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"g" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"h" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"i" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"j" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"k" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"l" = (
+/obj/machinery/vending/wallmed,
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/escape)
+"m" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"n" = (
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"o" = (
+/obj/machinery/door/airlock/titanium{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile/emergency{
+ dheight = 0;
+ dir = 2;
+ dwidth = 9;
+ name = "NES Classic";
+ width = 22
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"p" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"q" = (
+/obj/machinery/sleeper,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"r" = (
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"s" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"t" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"u" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"v" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/item/radio,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"w" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Infirmary"
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"x" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Cockpit";
+ req_access_txt = "19"
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"y" = (
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"z" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"A" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"B" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/item/storage/firstaid/regular,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"C" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/regular,
+/obj/structure/window/reinforced,
+/turf/open/floor/mineral/titanium/yellow,
+/area/shuttle/escape)
+"D" = (
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/escape)
+"H" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"J" = (
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"K" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Emergency Shuttle Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"P" = (
+/obj/structure/table/optable,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"Q" = (
+/obj/machinery/light,
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"R" = (
+/obj/machinery/light/small,
+/obj/structure/table,
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/escape)
+"T" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/escape)
+"V" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/mineral/titanium,
+/area/shuttle/escape)
+"W" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"X" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"Y" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/shuttle/escape)
(1,1,1) = {"
-aWcdddgmgmdmdmomgdaaaa
-dddldtrrrrdhesrrrdaaaa
-bpqqdtrrrrrrssrrrdmdaa
-bpnnwrrQrssrssrsrmjdmd
-bpPRfssdrssrssrsidkuvm
-dddddssmrssrrrrrrxykzm
-bpHTfssdrssrssssifkABm
-bpHJKrrVrrrrssssrmCdmd
-bpHHdssssrrrssssrdmdaa
-dddddssssrdhDsssrdaaaa
-aXYdddmmmmdmdmmmddaaaa
+a
+d
+b
+b
+b
+d
+b
+b
+b
+d
+a
+"}
+(2,1,1) = {"
+W
+d
+p
+p
+p
+d
+p
+p
+p
+d
+X
+"}
+(3,1,1) = {"
+c
+d
+q
+n
+P
+d
+H
+H
+H
+d
+Y
+"}
+(4,1,1) = {"
+d
+l
+q
+n
+R
+d
+T
+J
+H
+d
+d
+"}
+(5,1,1) = {"
+d
+d
+d
+w
+f
+d
+f
+K
+d
+d
+d
+"}
+(6,1,1) = {"
+d
+t
+t
+r
+s
+s
+s
+r
+s
+s
+d
+"}
+(7,1,1) = {"
+g
+r
+r
+r
+s
+s
+s
+r
+s
+s
+m
+"}
+(8,1,1) = {"
+m
+r
+r
+Q
+d
+m
+d
+V
+s
+s
+m
+"}
+(9,1,1) = {"
+g
+r
+r
+r
+r
+r
+r
+r
+s
+s
+m
+"}
+(10,1,1) = {"
+m
+r
+r
+s
+s
+s
+s
+r
+r
+r
+m
+"}
+(11,1,1) = {"
+d
+d
+r
+s
+s
+s
+s
+r
+r
+d
+d
+"}
+(12,1,1) = {"
+m
+h
+r
+r
+r
+r
+r
+r
+r
+h
+m
+"}
+(13,1,1) = {"
+d
+e
+s
+s
+s
+r
+s
+s
+s
+D
+d
+"}
+(14,1,1) = {"
+m
+s
+s
+s
+s
+r
+s
+s
+s
+s
+m
+"}
+(15,1,1) = {"
+o
+r
+r
+r
+r
+r
+s
+s
+s
+s
+m
+"}
+(16,1,1) = {"
+m
+r
+r
+s
+s
+r
+s
+s
+s
+s
+m
+"}
+(17,1,1) = {"
+g
+r
+r
+r
+i
+r
+i
+r
+r
+r
+d
+"}
+(18,1,1) = {"
+d
+d
+d
+m
+d
+x
+f
+m
+d
+d
+d
+"}
+(19,1,1) = {"
+a
+a
+m
+j
+k
+y
+k
+C
+m
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+d
+d
+u
+k
+A
+d
+d
+a
+a
+"}
+(21,1,1) = {"
+a
+a
+a
+m
+v
+z
+B
+m
+a
+a
+a
+"}
+(22,1,1) = {"
+a
+a
+a
+d
+m
+m
+m
+d
+a
+a
+a
"}
From 77c79843798a7c520519692d30d3a24e9d27564a Mon Sep 17 00:00:00 2001
From: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com>
Date: Tue, 17 Mar 2020 11:51:04 -0700
Subject: [PATCH 012/102] Add files via upload
---
labour_cog.dmm | 349 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 349 insertions(+)
create mode 100644 labour_cog.dmm
diff --git a/labour_cog.dmm b/labour_cog.dmm
new file mode 100644
index 0000000000..10f6561ed3
--- /dev/null
+++ b/labour_cog.dmm
@@ -0,0 +1,349 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/labor)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ icon_state = "propulsion";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"c" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 1
+ },
+/obj/structure/window/reinforced,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"d" = (
+/obj/structure/closet/crate/internals,
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"e" = (
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"f" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"g" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ id_tag = "prisonshuttle";
+ name = "Labor Shuttle Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"h" = (
+/obj/structure/grille,
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"i" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"j" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"k" = (
+/obj/machinery/flasher{
+ id = "gulagshuttleflasher";
+ pixel_x = 25
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"l" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"m" = (
+/obj/machinery/light,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"n" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/labor)
+"o" = (
+/obj/machinery/mineral/labor_claim_console{
+ machinedir = 2;
+ pixel_x = 30
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"p" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"q" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
+ },
+/obj/machinery/button/flasher{
+ dir = 1;
+ id = "gulagshuttleflasher";
+ name = "Flash Control";
+ pixel_y = 26;
+ req_access_txt = "1"
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"r" = (
+/obj/docking_port/mobile{
+ dir = 8;
+ dwidth = 2;
+ height = 5;
+ id = "laborcamp";
+ name = "labor camp shuttle";
+ port_direction = 4;
+ width = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"s" = (
+/obj/machinery/computer/shuttle/labor{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_x = -31
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"t" = (
+/obj/structure/chair/office/dark,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"u" = (
+/obj/structure/table/reinforced,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"v" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"w" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"x" = (
+/obj/machinery/mineral/stacking_machine/laborstacker{
+ input_dir = 2;
+ output_dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"y" = (
+/obj/machinery/mineral/stacking_unit_console{
+ machinedir = 2;
+ pixel_x = 30;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+
+(1,1,1) = {"
+a
+a
+a
+h
+a
+a
+h
+a
+a
+"}
+(2,1,1) = {"
+b
+a
+d
+j
+l
+w
+p
+s
+v
+"}
+(3,1,1) = {"
+b
+c
+f
+e
+m
+n
+q
+t
+v
+"}
+(4,1,1) = {"
+b
+a
+i
+k
+o
+x
+y
+u
+v
+"}
+(5,1,1) = {"
+a
+a
+g
+a
+a
+a
+r
+a
+a
+"}
From c5e315caaae8478ef4c76ac10202b199bbb86d88 Mon Sep 17 00:00:00 2001
From: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com>
Date: Tue, 17 Mar 2020 11:59:20 -0700
Subject: [PATCH 013/102] Delete labour_cog.dmm
---
labour_cog.dmm | 349 -------------------------------------------------
1 file changed, 349 deletions(-)
delete mode 100644 labour_cog.dmm
diff --git a/labour_cog.dmm b/labour_cog.dmm
deleted file mode 100644
index 10f6561ed3..0000000000
--- a/labour_cog.dmm
+++ /dev/null
@@ -1,349 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"a" = (
-/turf/closed/wall/mineral/titanium,
-/area/shuttle/labor)
-"b" = (
-/obj/structure/shuttle/engine/propulsion{
- icon_state = "propulsion";
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/shuttle/labor)
-"c" = (
-/obj/structure/shuttle/engine/heater{
- icon_state = "heater";
- dir = 1
- },
-/obj/structure/window/reinforced,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/shuttle/labor)
-"d" = (
-/obj/structure/closet/crate/internals,
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
- },
-/obj/item/tank/internals/emergency_oxygen/double{
- pixel_x = 3
- },
-/obj/item/tank/internals/emergency_oxygen/double{
- pixel_x = 3
- },
-/obj/item/tank/internals/emergency_oxygen/double{
- pixel_x = 3
- },
-/obj/item/tank/internals/emergency_oxygen/double{
- pixel_x = 3
- },
-/obj/item/tank/internals/emergency_oxygen/double{
- pixel_x = 3
- },
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/item/clothing/head/hardhat/orange{
- name = "protective hat";
- pixel_y = 9
- },
-/obj/item/clothing/head/hardhat/orange{
- name = "protective hat";
- pixel_y = 9
- },
-/obj/item/clothing/head/hardhat/orange{
- name = "protective hat";
- pixel_y = 9
- },
-/obj/item/clothing/head/hardhat/orange{
- name = "protective hat";
- pixel_y = 9
- },
-/obj/item/clothing/head/hardhat/orange{
- name = "protective hat";
- pixel_y = 9
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"e" = (
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"f" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"g" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/airlock/shuttle{
- id_tag = "prisonshuttle";
- name = "Labor Shuttle Airlock"
- },
-/turf/open/floor/plating,
-/area/shuttle/labor)
-"h" = (
-/obj/structure/grille,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/window/shuttle,
-/turf/open/floor/plating,
-/area/shuttle/labor)
-"i" = (
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"j" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"k" = (
-/obj/machinery/flasher{
- id = "gulagshuttleflasher";
- pixel_x = 25
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"l" = (
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"m" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"n" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/shuttle/labor)
-"o" = (
-/obj/machinery/mineral/labor_claim_console{
- machinedir = 2;
- pixel_x = 30
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"p" = (
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-"q" = (
-/obj/machinery/light{
- dir = 1;
- light_color = "#c1caff"
- },
-/obj/machinery/button/flasher{
- dir = 1;
- id = "gulagshuttleflasher";
- name = "Flash Control";
- pixel_y = 26;
- req_access_txt = "1"
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-"r" = (
-/obj/docking_port/mobile{
- dir = 8;
- dwidth = 2;
- height = 5;
- id = "laborcamp";
- name = "labor camp shuttle";
- port_direction = 4;
- width = 9
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/airlock/shuttle{
- name = "Labor Shuttle Airlock";
- req_access_txt = "2"
- },
-/turf/open/floor/plating,
-/area/shuttle/labor)
-"s" = (
-/obj/machinery/computer/shuttle/labor{
- dir = 4
- },
-/obj/structure/reagent_dispensers/peppertank{
- pixel_x = -31
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-"t" = (
-/obj/structure/chair/office/dark,
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-"u" = (
-/obj/structure/table/reinforced,
-/obj/item/folder/red,
-/obj/item/restraints/handcuffs,
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-"v" = (
-/obj/structure/window/shuttle,
-/turf/open/floor/plating/airless,
-/area/shuttle/labor)
-"w" = (
-/obj/machinery/door/airlock/shuttle{
- name = "Labor Shuttle Airlock";
- req_access_txt = "2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"x" = (
-/obj/machinery/mineral/stacking_machine/laborstacker{
- input_dir = 2;
- output_dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/shuttle/labor)
-"y" = (
-/obj/machinery/mineral/stacking_unit_console{
- machinedir = 2;
- pixel_x = 30;
- pixel_y = -32
- },
-/turf/open/floor/plasteel/grimy,
-/area/shuttle/labor)
-
-(1,1,1) = {"
-a
-a
-a
-h
-a
-a
-h
-a
-a
-"}
-(2,1,1) = {"
-b
-a
-d
-j
-l
-w
-p
-s
-v
-"}
-(3,1,1) = {"
-b
-c
-f
-e
-m
-n
-q
-t
-v
-"}
-(4,1,1) = {"
-b
-a
-i
-k
-o
-x
-y
-u
-v
-"}
-(5,1,1) = {"
-a
-a
-g
-a
-a
-a
-r
-a
-a
-"}
From 0df0910543c5eda781068b0555ce348a1486eacc Mon Sep 17 00:00:00 2001
From: EmeraldSundisk <51142887+EmeraldSundisk@users.noreply.github.com>
Date: Tue, 17 Mar 2020 11:59:45 -0700
Subject: [PATCH 014/102] Add files via upload
---
_maps/shuttles/labour_cog.dmm | 380 +++++++++++++++++++++++++++++++---
1 file changed, 346 insertions(+), 34 deletions(-)
diff --git a/_maps/shuttles/labour_cog.dmm b/_maps/shuttles/labour_cog.dmm
index 7fd72761f3..10f6561ed3 100644
--- a/_maps/shuttles/labour_cog.dmm
+++ b/_maps/shuttles/labour_cog.dmm
@@ -1,37 +1,349 @@
-"a" = (/turf/closed/wall/mineral/titanium,/area/shuttle/labor)
-"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
-"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/labor)
-"d" = (/obj/structure/closet/crate/internals,/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/labor)
-"e" = (/turf/open/floor/plasteel,/area/shuttle/labor)
-"f" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"g" = (/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/labor)
-"h" = (/obj/structure/grille,/obj/structure/cable/yellow{icon_state = "0-8"},/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/labor)
-"i" = (/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"j" = (/obj/structure/chair/comfy/shuttle{dir = 4},/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"k" = (/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/structure/chair/comfy/shuttle{dir = 8},/obj/effect/turf_decal/tile/red{dir = 4},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
-"l" = (/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"m" = (/obj/machinery/light,/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/turf/open/floor/plasteel,/area/shuttle/labor)
-"n" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/labor)
-"o" = (/obj/machinery/mineral/labor_claim_console{machinedir = 2; pixel_x = 30},/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/shuttle/labor)
-"p" = (/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"q" = (/obj/machinery/light{dir = 1; light_color = "#c1caff"},/obj/machinery/button/flasher{dir = 1; id = "gulagshuttleflasher"; name = "Flash Control"; pixel_y = 26; req_access_txt = "1"},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"r" = (/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9},/obj/effect/turf_decal/stripes/line{dir = 8},/obj/effect/turf_decal/stripes/line{dir = 4},/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/labor)
-"s" = (/obj/machinery/computer/shuttle/labor{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = -31},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"t" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"u" = (/obj/structure/table/reinforced,/obj/item/folder/red,/obj/item/restraints/handcuffs,/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
-"v" = (/obj/structure/window/shuttle,/turf/open/floor/plating/airless,/area/shuttle/labor)
-"w" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"; req_access_txt = "2"},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"x" = (/obj/machinery/mineral/stacking_machine/laborstacker{input_dir = 2; output_dir = 1},/obj/effect/turf_decal/stripes/line{dir = 1},/turf/open/floor/plasteel,/area/shuttle/labor)
-"y" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 2; pixel_x = 30; pixel_y = -32},/turf/open/floor/plasteel/grimy,/area/shuttle/labor)
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/labor)
+"b" = (
+/obj/structure/shuttle/engine/propulsion{
+ icon_state = "propulsion";
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"c" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 1
+ },
+/obj/structure/window/reinforced,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"d" = (
+/obj/structure/closet/crate/internals,
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/clothing/suit/hazardvest{
+ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
+ name = "emergency lifejacket"
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/tank/internals/emergency_oxygen/double{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/item/clothing/head/hardhat/orange{
+ name = "protective hat";
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"e" = (
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"f" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"g" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ id_tag = "prisonshuttle";
+ name = "Labor Shuttle Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"h" = (
+/obj/structure/grille,
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"i" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"j" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"k" = (
+/obj/machinery/flasher{
+ id = "gulagshuttleflasher";
+ pixel_x = 25
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"l" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"m" = (
+/obj/machinery/light,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"n" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/labor)
+"o" = (
+/obj/machinery/mineral/labor_claim_console{
+ machinedir = 2;
+ pixel_x = 30
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"p" = (
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"q" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
+ },
+/obj/machinery/button/flasher{
+ dir = 1;
+ id = "gulagshuttleflasher";
+ name = "Flash Control";
+ pixel_y = 26;
+ req_access_txt = "1"
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"r" = (
+/obj/docking_port/mobile{
+ dir = 8;
+ dwidth = 2;
+ height = 5;
+ id = "laborcamp";
+ name = "labor camp shuttle";
+ port_direction = 4;
+ width = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plating,
+/area/shuttle/labor)
+"s" = (
+/obj/machinery/computer/shuttle/labor{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_x = -31
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"t" = (
+/obj/structure/chair/office/dark,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"u" = (
+/obj/structure/table/reinforced,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
+"v" = (
+/obj/structure/window/shuttle,
+/turf/open/floor/plating/airless,
+/area/shuttle/labor)
+"w" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Labor Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"x" = (
+/obj/machinery/mineral/stacking_machine/laborstacker{
+ input_dir = 2;
+ output_dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/shuttle/labor)
+"y" = (
+/obj/machinery/mineral/stacking_unit_console{
+ machinedir = 2;
+ pixel_x = 30;
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/grimy,
+/area/shuttle/labor)
(1,1,1) = {"
-abbba
-aacaa
-adfig
-hjeka
-almoa
-awnxa
-hpqyr
-astua
-avvva
+a
+a
+a
+h
+a
+a
+h
+a
+a
+"}
+(2,1,1) = {"
+b
+a
+d
+j
+l
+w
+p
+s
+v
+"}
+(3,1,1) = {"
+b
+c
+f
+e
+m
+n
+q
+t
+v
+"}
+(4,1,1) = {"
+b
+a
+i
+k
+o
+x
+y
+u
+v
+"}
+(5,1,1) = {"
+a
+a
+g
+a
+a
+a
+r
+a
+a
"}
From 88bb9d8f1dc071ef8215c385d82fde14e876cfa0 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 18 Mar 2020 11:20:56 -0700
Subject: [PATCH 015/102] Update sword_point.dm (#11523)
---
code/datums/elements/sword_point.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/datums/elements/sword_point.dm b/code/datums/elements/sword_point.dm
index 5eaa9eaa70..8e1d923e33 100644
--- a/code/datums/elements/sword_point.dm
+++ b/code/datums/elements/sword_point.dm
@@ -15,4 +15,4 @@
/datum/element/sword_point/proc/point(datum/source, atom/target, mob/user, proximity_flag, params)
if(!proximity_flag && ismob(target))
- user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
+ user.visible_message("[user] points the tip of [source] at [target].", "You point the tip of [src] at [target].")
From fb0925047ad1bb98b38850f6e0a7c5df60d4271d Mon Sep 17 00:00:00 2001
From: Seris02 <49109742+Seris02@users.noreply.github.com>
Date: Thu, 19 Mar 2020 02:23:19 +0800
Subject: [PATCH 016/102] mentor fixes and improvements (#11519)
* one teensy fix but imma go do something else quick
* yee?
* yee?
* yee 3
* ah shit
* uhhhhhh
* oh
---
.../code/modules/mentor/dementor.dm | 19 +++++++++++++++++++
.../code/modules/mentor/mentor_verbs.dm | 3 ++-
.../code/modules/mentor/mentorpm.dm | 11 ++++++-----
tgstation.dme | 1 +
4 files changed, 28 insertions(+), 6 deletions(-)
create mode 100644 modular_citadel/code/modules/mentor/dementor.dm
diff --git a/modular_citadel/code/modules/mentor/dementor.dm b/modular_citadel/code/modules/mentor/dementor.dm
new file mode 100644
index 0000000000..8acd07f9a3
--- /dev/null
+++ b/modular_citadel/code/modules/mentor/dementor.dm
@@ -0,0 +1,19 @@
+/client/proc/cmd_mentor_dementor()
+ set category = "Mentor"
+ set name = "dementor"
+ if(!is_mentor())
+ return
+ remove_mentor_verbs()
+ if (/client/proc/mentor_unfollow in verbs)
+ mentor_unfollow()
+ GLOB.mentors -= src
+ verbs += /client/proc/cmd_mentor_rementor
+
+/client/proc/cmd_mentor_rementor()
+ set category = "Mentor"
+ set name = "rementor"
+ if(!is_mentor())
+ return
+ add_mentor_verbs()
+ GLOB.mentors += src
+ verbs -= /client/proc/cmd_mentor_rementor
diff --git a/modular_citadel/code/modules/mentor/mentor_verbs.dm b/modular_citadel/code/modules/mentor/mentor_verbs.dm
index 716a484ee2..534b877399 100644
--- a/modular_citadel/code/modules/mentor/mentor_verbs.dm
+++ b/modular_citadel/code/modules/mentor/mentor_verbs.dm
@@ -1,6 +1,7 @@
GLOBAL_LIST_INIT(mentor_verbs, list(
/client/proc/cmd_mentor_say,
- /client/proc/show_mentor_memo
+ /client/proc/show_mentor_memo,
+ /client/proc/cmd_mentor_dementor
))
GLOBAL_PROTECT(mentor_verbs)
diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm
index cb39f02092..d2d04495d4 100644
--- a/modular_citadel/code/modules/mentor/mentorpm.dm
+++ b/modular_citadel/code/modules/mentor/mentorpm.dm
@@ -38,8 +38,9 @@
if(!msg)
msg = input(src,"Message:", "Private message") as text|null
- if(!msg && is_mentor(whom))
- to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ if(!msg)
+ if (is_mentor(whom))
+ to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
if(!C)
@@ -54,10 +55,10 @@
return
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
- if(!msg && is_mentor(whom))
- to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ if(!msg)
+ if (is_mentor(whom))
+ to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
-
log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]")
msg = emoji_parse(msg)
diff --git a/tgstation.dme b/tgstation.dme
index 8b04b3deac..bdc536c037 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3252,6 +3252,7 @@
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
+#include "modular_citadel\code\modules\mentor\dementor.dm"
#include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm"
#include "modular_citadel\code\modules\mentor\mentor_memo.dm"
From cc454899c452d4cfa8b3ce8a5783e6dadcd5edb7 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Wed, 18 Mar 2020 13:23:22 -0500
Subject: [PATCH 017/102] Automatic changelog generation for PR #11519 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-11519.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-11519.yml
diff --git a/html/changelogs/AutoChangeLog-pr-11519.yml b/html/changelogs/AutoChangeLog-pr-11519.yml
new file mode 100644
index 0000000000..f932aced0a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11519.yml
@@ -0,0 +1,5 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "mentor de/rementor button"
+ - bugfix: "mentor !msg"
From 1e10a042bed78ea46026f1e456252bbdb51af829 Mon Sep 17 00:00:00 2001
From: Hatterhat <31829017+Hatterhat@users.noreply.github.com>
Date: Wed, 18 Mar 2020 13:34:14 -0500
Subject: [PATCH 018/102] arrow craft nitpicking (alt title: "why are subtypes
like this") (#11516)
* subtypes (tm)
* ok fine jeez
Co-authored-by: Hatterhat
---
.../crafting/recipes/recipes_weapon_and_ammo.dm | 8 ++++----
code/modules/cargo/exports/weapons.dm | 2 +-
.../modules/projectiles/ammunition/caseless/arrow.dm | 12 ++++++++----
.../modules/projectiles/projectile/reusable/arrow.dm | 6 +++---
4 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 0c41fb3e52..aa3f2d3969 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -278,7 +278,7 @@
/datum/crafting_recipe/arrow
name = "Arrow"
- result = /obj/item/ammo_casing/caseless/arrow
+ result = /obj/item/ammo_casing/caseless/arrow/wood
time = 30
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/stack/sheet/silk = 1,
@@ -293,17 +293,17 @@
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
- /obj/item/ammo_casing/caseless/arrow/ashen = 1)
+ /obj/item/ammo_casing/caseless/arrow/ash = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
/datum/crafting_recipe/ashen_arrow
name = "Fire Hardened Arrow"
- result = /obj/item/ammo_casing/caseless/arrow/ashen
+ result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
time = 30
always_availible = FALSE
- reqs = list(/obj/item/ammo_casing/caseless/arrow = 1)
+ reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
index c75a1c0bff..836dc044b7 100644
--- a/code/modules/cargo/exports/weapons.dm
+++ b/code/modules/cargo/exports/weapons.dm
@@ -211,7 +211,7 @@
/datum/export/weapon/arrows
cost = 150
unit_name = "arrow"
- export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ashen)
+ export_types = list(/obj/item/ammo_casing/caseless/arrow, /obj/item/ammo_casing/caseless/arrow/bone, /obj/item/ammo_casing/caseless/arrow/ash)
/datum/export/weapon/bow_teaching
cost = 500
diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm
index 0543e48f96..08f6ba8c70 100644
--- a/code/modules/projectiles/ammunition/caseless/arrow.dm
+++ b/code/modules/projectiles/ammunition/caseless/arrow.dm
@@ -1,17 +1,21 @@
/obj/item/ammo_casing/caseless/arrow
- name = "wooden arrow"
- desc = "An arrow made of wood, typically fired from a bow."
+ name = "arrow of questionable material"
+ desc = "You shouldn't be seeing this arrow."
projectile_type = /obj/item/projectile/bullet/reusable/arrow
caliber = "arrow"
icon_state = "arrow"
throwforce = 3 //good luck hitting someone with the pointy end of the arrow
throw_speed = 3
-/obj/item/ammo_casing/caseless/arrow/ashen
+/obj/item/ammo_casing/caseless/arrow/wood
+ name = "wooden arrow"
+ desc = "An arrow made of wood, typically fired from a bow."
+
+/obj/item/ammo_casing/caseless/arrow/ash
name = "ashen arrow"
desc = "An arrow made of wood, hardened by fire."
icon_state = "ashenarrow"
- projectile_type = /obj/item/projectile/bullet/reusable/arrow/ashen
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/ash
/obj/item/ammo_casing/caseless/arrow/bone
name = "bone arrow"
diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm
index d00de79eb1..7c1a06f72c 100644
--- a/code/modules/projectiles/projectile/reusable/arrow.dm
+++ b/code/modules/projectiles/projectile/reusable/arrow.dm
@@ -3,13 +3,13 @@
desc = "Woosh!"
damage = 15
icon_state = "arrow"
- ammo_type = /obj/item/ammo_casing/caseless/arrow
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/wood
-/obj/item/projectile/bullet/reusable/arrow/ashen
+/obj/item/projectile/bullet/reusable/arrow/ash
name = "ashen arrow"
desc = "Fire harderned arrow."
damage = 25
- ammo_type = /obj/item/ammo_casing/caseless/arrow/ashen
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/ash
/obj/item/projectile/bullet/reusable/arrow/bone //AP for ashwalkers
name = "bone arrow"
From 6b5bc5f45d6ceb8da40cf4f400175b1d831b19ae Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Wed, 18 Mar 2020 13:34:17 -0500
Subject: [PATCH 019/102] Automatic changelog generation for PR #11516 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-11516.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-11516.yml
diff --git a/html/changelogs/AutoChangeLog-pr-11516.yml b/html/changelogs/AutoChangeLog-pr-11516.yml
new file mode 100644
index 0000000000..e4721b6d42
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11516.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "Arrow crafting has been finagled with, preventing fire-hardened arrows from being fire-hardened repeatedly. Or something."
From 6758761a6554691d5cf6e0a3cf3dc685ea4f338b Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 18 Mar 2020 11:44:33 -0700
Subject: [PATCH 020/102] Update action.dm (#11521)
---
code/datums/action.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 144f5f7946..19e418579e 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -676,7 +676,8 @@
//Preset for general and toggled actions
/datum/action/innate
- check_flags = 0
+ check_flags = NONE
+ required_mobility_flags = NONE
var/active = 0
/datum/action/innate/Trigger()
From bd0514fffc597ecad186fb76f52ee363beba5040 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Wed, 18 Mar 2020 14:37:30 -0500
Subject: [PATCH 021/102] Automatic changelog generation for PR #11511 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-11511.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-11511.yml
diff --git a/html/changelogs/AutoChangeLog-pr-11511.yml b/html/changelogs/AutoChangeLog-pr-11511.yml
new file mode 100644
index 0000000000..db03ee30be
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11511.yml
@@ -0,0 +1,6 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds CogStation's shuttles to-be."
+ - rscadd: "Adds the \"NES Classic\" escape shuttle."
+ - refactor: "Accounts for the new shuttles."
From 32975bf509ca652ad1d848ccba460569ad07c4b4 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Wed, 18 Mar 2020 23:43:23 +0100
Subject: [PATCH 022/102] More bug reports yee'd their last haw.
---
code/__DEFINES/traits.dm | 2 ++
code/datums/components/virtual_reality.dm | 4 +++-
.../gamemodes/dynamic/dynamic_rulesets_midround.dm | 2 +-
code/game/objects/structures/ghost_role_spawners.dm | 9 ++++-----
.../antagonists/blood_contract/blood_contract.dm | 2 +-
code/modules/mining/lavaland/necropolis_chests.dm | 2 +-
.../mob/living/carbon/human/species_types/skeletons.dm | 2 +-
code/modules/research/rdconsole.dm | 4 ++++
code/modules/research/xenobiology/xenobiology.dm | 10 ++++++----
tgstation.dme | 2 +-
10 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index ba96b7cc7f..1ae2cda200 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -144,6 +144,7 @@
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
+#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -226,6 +227,7 @@
// unique trait sources, still defines
#define STATUE_MUTE "statue"
#define CLONING_POD_TRAIT "cloning-pod"
+#define VIRTUAL_REALITY_TRAIT "vr_trait"
#define CHANGELING_DRAIN "drain"
#define CHANGELING_HIVEMIND_MUTE "ling_mute"
#define ABYSSAL_GAZE_BLIND "abyssal_gaze"
diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm
index 63e4f4f092..9239d4c565 100644
--- a/code/datums/components/virtual_reality.dm
+++ b/code/datums/components/virtual_reality.dm
@@ -58,6 +58,7 @@
RegisterSignal(current_mind, COMSIG_PRE_MIND_TRANSFER, .proc/pre_player_transfer)
if(mastermind?.current)
mastermind.current.audiovisual_redirect = M
+ ADD_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/datum/component/virtual_reality/UnregisterFromParent()
. = ..()
@@ -69,6 +70,7 @@
current_mind = null
if(mastermind?.current)
mastermind.current.audiovisual_redirect = null
+ REMOVE_TRAIT(parent, TRAIT_NO_MIDROUND_ANTAG, VIRTUAL_REALITY_TRAIT)
/**
* Called when attempting to connect a mob to a virtual reality mob.
@@ -235,7 +237,7 @@
qdel(src)
/**
- * Used for recursive virtual realities shenanigeans and should be called only through the above proc.
+ * Used for recursive virtual realities shenanigeans and should be called by the above proc.
*/
/datum/component/virtual_reality/proc/vr_in_a_vr(mob/player, deathcheck = FALSE, lethal_cleanup = FALSE)
var/mob/M = parent
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 36b81afc26..9081622ec7 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -43,7 +43,7 @@
if (!istype(M, required_type))
trimmed_list.Remove(M)
continue
- if (M.GetComponent(/datum/component/virtual_reality))
+ if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
trimmed_list.Remove(M)
continue
if (!M.client) // Are they connected?
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 116c598235..4bb9d6954e 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -194,9 +194,7 @@
return
if(isgolem(user) && can_transfer)
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
- if(transfer_choice != "Yes")
- return
- if(QDELETED(src) || uses <= 0)
+ if(transfer_choice != "Yes" || QDELETED(src) || uses <= 0 || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY, NO_TK))
return
log_game("[key_name(user)] golem-swapped into [src]")
user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!")
@@ -679,8 +677,9 @@
new_spawn.AddElement(/datum/element/dusts_on_catatonia)
new_spawn.AddElement(/datum/element/dusts_on_leaving_area,list(A.type,/area/hilbertshotel))
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
- ADD_TRAIT(new_spawn,TRAIT_PACIFISM,GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT)
+ ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still elegible for ghost roles popups.
+ ADD_TRAIT(new_spawn, TRAIT_PACIFISM, GHOSTROLE_TRAIT)
to_chat(new_spawn,"You may be sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!")
to_chat(new_spawn,"You can turn yourself into a ghost and freely reenter your body with the ghost action.")
var/datum/action/ghost/G = new(new_spawn)
diff --git a/code/modules/antagonists/blood_contract/blood_contract.dm b/code/modules/antagonists/blood_contract/blood_contract.dm
index 4e7238647e..5d2fda08fc 100644
--- a/code/modules/antagonists/blood_contract/blood_contract.dm
+++ b/code/modules/antagonists/blood_contract/blood_contract.dm
@@ -27,7 +27,7 @@
INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H) //could use moving out from the mine
for(var/mob/living/carbon/human/P in GLOB.player_list)
- if(P == H)
+ if(P == H || HAS_TRAIT(P, TRAIT_NO_MIDROUND_ANTAG))
continue
to_chat(P, "You have an overwhelming desire to kill [H]. [H.p_theyve(TRUE)] been marked red! Whoever [H.p_they()] [H.p_were()], friend or foe, go kill [H.p_them()]!")
P.put_in_hands(new /obj/item/kitchen/knife/butcher(P), TRUE)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index bf25bb9da8..a95c0e24ed 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -136,7 +136,7 @@
desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it."
id = "bountymod"
materials = list(/datum/material/iron = 4000, /datum/material/silver = 4000, /datum/material/gold = 4000, /datum/material/bluespace = 4000)
- reagents_list = list("blood" = 40)
+ reagents_list = list(/datum/reagent/blood = 40)
build_path = /obj/item/borg/upgrade/modkit/bounty
//Spooky special loot
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 410ad05d93..8257238e9c 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -24,7 +24,7 @@
id = "spaceskeleton"
limbs_id = "skeleton"
blacklisted = 1
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT, TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
/datum/species/skeleton/space/check_roundstart_eligible()
return FALSE
\ No newline at end of file
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 0104bfba7b..be1b9460b0 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -55,6 +55,10 @@ Nothing else in the console has ID requirements.
if (istype(ID, /datum/material))
var/datum/material/material = ID
return material.name
+
+ else if(GLOB.chemical_reagents_list[ID])
+ var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID]
+ return reagent.name
return ID
/obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index af825eb5ee..967f874a02 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -705,8 +705,9 @@
desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems."
/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
- var/obj/item/implant/radio/syndicate/imp = new
- imp.implant(SM, user)
+ if(SM.can_be_implanted())
+ var/obj/item/implant/radio/syndicate/imp = new
+ imp.implant(SM, user)
SM.access_card = new /obj/item/card/id/syndicate(SM)
ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
@@ -961,11 +962,12 @@
icon_state = "potgrey"
/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user)
- if(!ismob(M))
- return
if(!isanimal(M))
to_chat(user, "[M] is too complex for the potion!")
return
+ if(!M.can_be_implanted())
+ to_chat(user, "[M] is incompatible with the potion!")
+ return
if(M.stat)
to_chat(user, "[M] is dead!")
return
diff --git a/tgstation.dme b/tgstation.dme
index 06c841e021..8b04b3deac 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1498,6 +1498,7 @@
#include "code\modules\antagonists\swarmer\swarmer.dm"
#include "code\modules\antagonists\swarmer\swarmer_event.dm"
#include "code\modules\antagonists\traitor\datum_traitor.dm"
+#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\classes\ai.dm"
#include "code\modules\antagonists\traitor\classes\assassin.dm"
#include "code\modules\antagonists\traitor\classes\freeform.dm"
@@ -1506,7 +1507,6 @@
#include "code\modules\antagonists\traitor\classes\martyr.dm"
#include "code\modules\antagonists\traitor\classes\subterfuge.dm"
#include "code\modules\antagonists\traitor\classes\traitor_class.dm"
-#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\equipment\contractor.dm"
#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
From 0285b4cee42a07cc638dff1fcb30383588006f70 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Wed, 18 Mar 2020 23:49:19 +0100
Subject: [PATCH 023/102] > virtual gf
---
code/modules/events/holiday/vday.dm | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index d3cbf03581..fbdda62e47 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -16,13 +16,14 @@
..()
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
H.put_in_hands(new /obj/item/valentine)
- var/obj/item/storage/backpack/b = locate() in H.contents
- new /obj/item/reagent_containers/food/snacks/candyheart(b)
- new /obj/item/storage/fancy/heart_box(b)
+ var/obj/item/storage/backpack/B = locate() in H.contents
+ if(B)
+ new /obj/item/reagent_containers/food/snacks/candyheart(b)
+ new /obj/item/storage/fancy/heart_box(b)
var/list/valentines = list()
for(var/mob/living/M in GLOB.player_list)
- if(!M.stat && M.client && M.mind)
+ if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, INVALID_MIDROUND_ANTAG))
valentines |= M
From 3aa3ed189a3b28291c8a52a3937e5b2bf675763c Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Wed, 18 Mar 2020 23:53:10 +0100
Subject: [PATCH 024/102] gunz
---
code/modules/events/holiday/vday.dm | 2 +-
code/modules/spells/spell_types/rightandwrong.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index fbdda62e47..fa4ef82c08 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -23,7 +23,7 @@
var/list/valentines = list()
for(var/mob/living/M in GLOB.player_list)
- if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, INVALID_MIDROUND_ANTAG))
+ if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
valentines |= M
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index ea131fb996..2beaa97b3d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -163,7 +163,7 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE)
for(var/mob/living/carbon/human/H in GLOB.player_list)
var/turf/T = get_turf(H)
- if(T && is_away_level(T.z))
+ if((T && is_away_level(T.z)) || HAS_TRAIT(H, TRAIT_NO_MIDROUND_ANTAG))
continue
if(summon_type == SUMMON_MAGIC)
give_magic(H)
From 6e9aff97ae84bd30c25768a8000a72e422dd7ff5 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 01:44:28 +0100
Subject: [PATCH 025/102] b
---
code/modules/events/holiday/vday.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm
index fa4ef82c08..cb742ca27f 100644
--- a/code/modules/events/holiday/vday.dm
+++ b/code/modules/events/holiday/vday.dm
@@ -18,8 +18,8 @@
H.put_in_hands(new /obj/item/valentine)
var/obj/item/storage/backpack/B = locate() in H.contents
if(B)
- new /obj/item/reagent_containers/food/snacks/candyheart(b)
- new /obj/item/storage/fancy/heart_box(b)
+ new /obj/item/reagent_containers/food/snacks/candyheart(B)
+ new /obj/item/storage/fancy/heart_box(B)
var/list/valentines = list()
for(var/mob/living/M in GLOB.player_list)
From a0294698c038a21ba877b9660503513fc0974054 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 04:49:01 +0100
Subject: [PATCH 026/102] extra runtime fixes, also porting tgstation#49997
---
code/modules/mob/living/blood.dm | 2 +-
.../projectiles/guns/energy/dueling.dm | 43 +++++++++++--------
.../chemistry/machinery/chem_dispenser.dm | 1 -
3 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index c569a2c59a..41f2c7142f 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -237,7 +237,7 @@
return /datum/reagent/blood/jellyblood
if(dna?.species?.exotic_blood)
return dna.species.exotic_blood
- else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
+ else if((dna && (NOBLOOD in dna.species.species_traits)) || HAS_TRAIT(src, TRAIT_NOCLONE))
return
else
return /datum/reagent/blood
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index 2f0aa00027..fcb035f586 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -28,6 +28,16 @@
/datum/duel/New()
id = next_id++
+/datum/duel/Destroy()
+ if(gun_A)
+ gun_A.duel = null
+ gun_A = null
+ if(gun_B)
+ gun_B.duel = null
+ gun_B = null
+ STOP_PROCESSING(SSobjs, duel)
+ . = ..()
+
/datum/duel/proc/try_begin()
//Check if both guns are held and if so begin.
var/mob/living/A = get_duelist(gun_A)
@@ -45,13 +55,13 @@
message_duelists("Set your gun setting and move [required_distance] steps away from your opponent.")
- START_PROCESSING(SSobj,src)
+ START_PROCESSING(SSobj, src)
-/datum/duel/proc/get_duelist(obj/gun)
- var/mob/living/G = gun.loc
- if(!istype(G) || !G.is_holding(gun))
- return null
- return G
+/datum/duel/proc/get_duelist(obj/item/gun/energy/dueling/G)
+ var/mob/living/L = gun.loc
+ if(!istype(L) || !L.is_holding(G))
+ return
+ return L
/datum/duel/proc/message_duelists(message)
var/mob/living/LA = get_duelist(gun_A)
@@ -66,7 +76,7 @@
/datum/duel/proc/end()
message_duelists("Duel finished. Re-engaging safety.")
- STOP_PROCESSING(SSobj,src)
+ STOP_PROCESSING(SSobj, src)
state = DUEL_IDLE
/datum/duel/process()
@@ -129,10 +139,11 @@
return FALSE
if(!isturf(A.loc) || !isturf(B.loc))
return FALSE
- if(get_dist(A,B) != required_distance)
+ if(get_dist(A, B) != required_distance)
return FALSE
- for(var/turf/T in getline(get_turf(A),get_turf(B)))
- if(is_blocked_turf(T,TRUE))
+ for(var/i in getline(A.loc, B.loc))
+ var/turf/T = i
+ if(is_blocked_turf(T, TRUE))
return FALSE
return TRUE
@@ -180,7 +191,6 @@
return "duel_red"
/obj/item/gun/energy/dueling/attack_self(mob/living/user)
- . = ..()
if(duel.state == DUEL_IDLE)
duel.try_begin()
else
@@ -205,12 +215,9 @@
add_overlay(setting_overlay)
/obj/item/gun/energy/dueling/Destroy()
- . = ..()
- if(duel.gun_A == src)
- duel.gun_A = null
- if(duel.gun_B == src)
- duel.gun_B = null
- duel = null
+ if(duel)
+ qdel(duel)
+ return ..()
/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user)
. = ..()
@@ -234,10 +241,8 @@
if(duel.state == DUEL_READY)
duel.confirmations[src] = TRUE
to_chat(user,"You confirm your readiness.")
- return
else if(!is_duelist(target)) //I kinda want to leave this out just to see someone shoot a bystander or missing.
to_chat(user,"[src] safety system prevents shooting anyone but your designated opponent.")
- return
else
duel.fired[src] = TRUE
. = ..()
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 2d177318aa..2974df29a6 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -356,7 +356,6 @@
replace_beaker(user, B)
to_chat(user, "You add [B] to [src].")
updateUsrDialog()
- update_icon()
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
to_chat(user, "You can't load [I] into [src]!")
return ..()
From b03955b08533c58e7dd58e77489f550ea9d73f96 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 05:26:38 +0100
Subject: [PATCH 027/102] Update dueling.dm
---
code/modules/projectiles/guns/energy/dueling.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index fcb035f586..7fa81f513f 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -35,7 +35,7 @@
if(gun_B)
gun_B.duel = null
gun_B = null
- STOP_PROCESSING(SSobjs, duel)
+ STOP_PROCESSING(SSobj, src)
. = ..()
/datum/duel/proc/try_begin()
@@ -58,7 +58,7 @@
START_PROCESSING(SSobj, src)
/datum/duel/proc/get_duelist(obj/item/gun/energy/dueling/G)
- var/mob/living/L = gun.loc
+ var/mob/living/L = G.loc
if(!istype(L) || !L.is_holding(G))
return
return L
From 700a2031c839782eb6a30357c269615a37dd2d90 Mon Sep 17 00:00:00 2001
From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com>
Date: Thu, 19 Mar 2020 00:40:59 -0400
Subject: [PATCH 028/102] Update construction.dm
---
code/game/machinery/pipe/construction.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 97c89c9168..3acbaba4fd 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -17,7 +17,7 @@ Buildable meters
icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
icon_state = "simple"
item_state = "buildpipe"
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_SMALL
level = 2
var/piping_layer = PIPING_LAYER_DEFAULT
var/RPD_type
From ab7fc2dc7235456edda1e086df6896ac4c941ef9 Mon Sep 17 00:00:00 2001
From: Hatterhat <31829017+Hatterhat@users.noreply.github.com>
Date: Thu, 19 Mar 2020 07:38:31 -0500
Subject: [PATCH 029/102] me and the boys stealing prs (#11517)
Co-authored-by: Hatterhat
---
_maps/RandomRuins/SpaceRuins/spacehermit.dmm | 2341 +++++++++---------
1 file changed, 1192 insertions(+), 1149 deletions(-)
diff --git a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
index 4faed2fee9..8113c586ff 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehermit.dmm
@@ -4,32 +4,32 @@
/area/template_noop)
"ab" = (
/turf/closed/mineral/random/low_chance,
-/area/ruin/space)
+/area/ruin/unpowered)
"ac" = (
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/unpowered)
"ad" = (
/obj/machinery/hydroponics/soil,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ae" = (
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"af" = (
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ag" = (
/obj/structure/shuttle/engine/propulsion/right{
dir = 4
},
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ah" = (
/obj/structure/table/wood,
/obj/item/shovel,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ai" = (
/obj/structure/lattice,
/turf/template_noop,
@@ -37,35 +37,33 @@
"aj" = (
/obj/machinery/computer/cryopod,
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ak" = (
/obj/structure/fluff/empty_cryostasis_sleeper,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"al" = (
/obj/machinery/status_display/shuttle,
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"am" = (
-/obj/item/circuitboard/computer/rdconsole,
-/obj/item/circuitboard/machine/protolathe/department/science,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"an" = (
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ao" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ap" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"aq" = (
/obj/machinery/computer{
desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages.";
@@ -73,37 +71,38 @@
name = "Broken Computer"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"ar" = (
/obj/machinery/door/airlock/titanium{
name = "Escape Pod Airlock"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"as" = (
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"at" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 4
},
/turf/closed/wall/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"au" = (
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"av" = (
/obj/structure/table/wood,
/obj/item/paper/crumpled{
info = "
So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.
Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..
Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.
Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.
Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.
Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?
The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders."
},
/obj/item/pen,
+/obj/item/stock_parts/cell/hyper,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aw" = (
/obj/item/stack/sheet/mineral/wood,
/obj/item/stack/sheet/mineral/wood,
@@ -111,51 +110,53 @@
/obj/item/stack/sheet/mineral/wood,
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ax" = (
/obj/item/twohanded/spear,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"ay" = (
/obj/item/grown/log,
/obj/item/grown/log,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"az" = (
/obj/structure/table/wood,
/obj/item/storage/bag/plants/portaseeder,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aA" = (
/turf/open/floor/plating/asteroid/airless,
-/area/ruin/space)
+/area/ruin/unpowered)
"aB" = (
/obj/item/seeds/banana,
/obj/item/seeds/banana,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aC" = (
/obj/effect/mob_spawn/human/clown/corpse,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aD" = (
/obj/item/mining_scanner,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
+"aE" = (
+/turf/open/floor/plating/asteroid/airless,
+/area/ruin/powered)
"aF" = (
-/obj/item/pickaxe/emergency,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aG" = (
/obj/structure/sink/puddle,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aH" = (
/obj/structure/table/wood,
/obj/item/storage/firstaid/regular,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aI" = (
/obj/effect/mob_spawn/human/corpse/assistant,
/turf/template_noop,
@@ -164,17 +165,17 @@
/obj/structure/table/wood,
/obj/item/storage/bag/ore,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aK" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aL" = (
/obj/structure/table/wood,
/obj/item/storage/toolbox/mechanical,
/obj/item/clothing/head/welding,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aM" = (
/mob/living/simple_animal/hostile/carp,
/turf/template_noop,
@@ -182,38 +183,38 @@
"aN" = (
/obj/structure/mineral_door/sandstone,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aO" = (
/mob/living/simple_animal/hostile/carp,
/turf/open/floor/plating/asteroid/airless,
-/area/ruin/space)
+/area/ruin/unpowered)
"aP" = (
/obj/item/stack/ore/gold,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aQ" = (
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aR" = (
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aS" = (
/turf/closed/wall/mineral/iron,
-/area/ruin/space)
+/area/ruin/powered)
"aT" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aU" = (
/obj/item/flashlight/lamp,
/obj/structure/table/wood,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"aV" = (
/obj/item/clothing/suit/space/orange,
/turf/template_noop,
@@ -232,76 +233,84 @@
job_description = "Space Hermit"
},
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
+"aZ" = (
+/turf/closed/mineral/random/low_chance,
+/area/ruin/powered)
+"ba" = (
+/turf/closed/mineral/random/low_chance/earth_like,
+/area/ruin/powered)
+"bb" = (
+/turf/closed/mineral/random/earth_like,
+/area/ruin/powered)
"bc" = (
/obj/item/circuitboard/machine/circuit_imprinter,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bd" = (
/obj/item/grown/bananapeel,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"be" = (
/obj/effect/mob_spawn/human/corpse/cargo_tech,
/obj/structure/fans/tiny/invisible,
-/obj/effect/decal/cleanable/vomit,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bf" = (
/obj/item/clothing/glasses/meson,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bg" = (
-/obj/item/stock_parts/matter_bin,
+/obj/item/stock_parts/matter_bin/adv,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bh" = (
/obj/item/circuitboard/machine/autolathe,
/turf/open/floor/mineral/titanium,
-/area/ruin/space)
+/area/ruin/powered)
"bi" = (
-/obj/item/stock_parts/manipulator,
+/obj/item/stock_parts/manipulator/pico,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bj" = (
/obj/item/holosign_creator/atmos,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bk" = (
/obj/structure/holosign/barrier/atmos,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bl" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
icon_state = "0-2"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bm" = (
/obj/structure/cable{
icon_state = "1-4"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bn" = (
/obj/structure/cable{
icon_state = "2-8"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bo" = (
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bp" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bq" = (
/obj/structure/cable,
/obj/machinery/power/port_gen/pacman{
@@ -310,20 +319,54 @@
sheets = 10
},
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"br" = (
/obj/item/stack/ore/iron,
/obj/item/stack/sheet/mineral/plasma,
/obj/item/stack/sheet/mineral/plasma,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bs" = (
/obj/item/flashlight/lamp/bananalamp,
/turf/open/floor/plating/asteroid,
-/area/ruin/space)
+/area/ruin/powered)
"bt" = (
/turf/closed/mineral/random/low_chance/earth_like,
-/area/ruin/space)
+/area/ruin/unpowered)
+"bC" = (
+/obj/item/pickaxe/titanium,
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
+"fp" = (
+/turf/closed/mineral/random/high_chance/earth_like,
+/area/ruin/powered)
+"jx" = (
+/turf/closed/mineral/silver/earth_like,
+/area/ruin/powered)
+"nc" = (
+/turf/closed/mineral/bscrystal/earth_like,
+/area/ruin/powered)
+"JZ" = (
+/turf/closed/mineral/titanium/earth_like,
+/area/ruin/powered)
+"Lt" = (
+/obj/structure/mirror,
+/turf/closed/wall/mineral/iron,
+/area/ruin/powered)
+"PG" = (
+/turf/closed/mineral/gold/earth_like,
+/area/ruin/powered)
+"Ue" = (
+/turf/closed/mineral/diamond/earth_like,
+/area/ruin/powered)
+"VS" = (
+/turf/closed/mineral/uranium/earth_like,
+/area/ruin/powered)
+"WH" = (
+/obj/item/circuitboard/machine/mining_equipment_vendor/golem,
+/obj/item/circuitboard/machine/ore_redemption,
+/turf/open/floor/plating/asteroid,
+/area/ruin/powered)
(1,1,1) = {"
aa
@@ -408,13 +451,13 @@ aA
aA
aA
aA
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
aA
aA
aA
@@ -455,20 +498,20 @@ aA
aA
aA
ab
-ab
-ab
-ab
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aZ
+aZ
+aZ
+aZ
+aZ
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
+aZ
ab
aA
aA
@@ -503,27 +546,27 @@ aa
aa
aa
aA
-ab
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aZ
+aZ
+aZ
+ba
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+aZ
+aZ
aA
aa
aa
@@ -554,29 +597,29 @@ aA
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+ba
+aZ
aA
aa
aa
@@ -600,36 +643,36 @@ aa
aa
aa
aA
-ab
-ab
-ab
-ab
+aZ
+aZ
+aZ
+aZ
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+fp
+ba
+bb
+ba
+bb
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+aZ
aA
aa
aM
@@ -651,38 +694,38 @@ aa
aM
aa
aA
-ab
-bt
-bt
-bt
-bt
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aZ
+bb
+bb
+bb
+bb
+aZ
+ba
+fp
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
aA
aa
aa
@@ -703,39 +746,39 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+VS
+ba
+ba
+ba
+ba
+bb
+ba
+bb
+bb
+JZ
+bb
+bb
+bb
+bb
ae
af
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+aZ
aA
aa
aa
@@ -755,40 +798,40 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+fp
+fp
+fp
+ba
+ba
+ba
+ba
+bb
+bb
+ba
+JZ
+ba
+ba
+ba
+bb
+bb
+bb
af
aq
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+bb
+bb
+bb
+fp
+ba
+ba
+aZ
aA
aa
aa
@@ -807,40 +850,40 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+fp
+VS
+fp
+ba
+bb
+fp
+fp
+bb
+ba
+bb
+bb
+bb
+bb
+fp
+bb
+bb
ae
ae
ao
ae
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+fp
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
aa
@@ -859,41 +902,41 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+ba
+ba
+bb
+ba
+Ue
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+bb
+bb
af
an
an
an
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+fp
+bb
+bb
+bb
+fp
+bb
+ba
+aZ
aA
aa
"}
@@ -912,25 +955,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+Ue
+ba
+bb
+ba
+ba
+bb
+fp
+bb
+fp
+fp
+ba
+ba
+bb
ae
ae
bh
@@ -938,14 +981,14 @@ an
an
ae
ae
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+fp
+fp
+bb
+jx
+fp
+bb
+ba
+aZ
aA
aa
"}
@@ -964,25 +1007,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+bb
+ba
+bb
+ba
+ba
+ba
+ba
+bb
af
aY
ao
@@ -990,14 +1033,14 @@ ao
ao
ak
af
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+fp
+bb
+bb
+bb
+ba
+aZ
aA
aa
"}
@@ -1016,25 +1059,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+bb
+bb
+bb
+bb
+fp
+bb
+ba
+fp
+ba
+bb
+bb
+bb
+ba
+ba
+ba
+bb
+bb
al
aj
ap
@@ -1042,14 +1085,14 @@ an
as
aj
al
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+ba
+bb
+jx
+bb
+bb
+fp
+ba
+aZ
aA
aa
"}
@@ -1068,25 +1111,25 @@ aa
aA
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+fp
+fp
+fp
+bb
+bb
+bb
+bb
+bb
af
ak
ao
@@ -1094,14 +1137,14 @@ ao
ao
ak
af
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+bb
+bb
+bb
+bb
+ba
+aZ
aA
aa
"}
@@ -1120,24 +1163,24 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
ah
az
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bb
aR
ae
ae
@@ -1146,14 +1189,14 @@ an
an
ae
ae
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aM
"}
@@ -1172,24 +1215,24 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bb
aR
ag
ag
@@ -1198,14 +1241,14 @@ ar
af
at
at
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+bb
+fp
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1224,40 +1267,40 @@ aa
aA
aA
ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
-ac
-ac
-ac
-ac
-bt
+aF
+aF
+aF
+aF
+ba
aH
aJ
aL
-bt
-bt
+bb
+bb
aT
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
+aF
aR
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1273,43 +1316,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
au
-ac
+aF
aB
-am
-ac
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+ba
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
bg
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+fp
+jx
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1325,43 +1368,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
ad
aw
bs
aC
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bC
+WH
+aF
+aF
+aF
+ba
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1377,43 +1420,43 @@ aM
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
ad
ax
-ac
+aF
aD
aF
-ac
-ac
-ac
-bt
-bt
-bt
+aF
+aF
+aF
+bb
+bb
+bb
aU
bd
-ac
-ac
+aF
+aF
bl
bm
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+aF
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aZ
aA
aa
"}
@@ -1429,43 +1472,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+bb
+fp
+bb
+fp
+bb
+bb
+bb
ad
ay
-ac
-ac
-ac
+aF
+aF
+aF
aG
-ac
-ac
-bt
-bt
-bt
+aF
+aF
+bb
+bb
+ba
av
be
-ac
-ac
-ac
+aF
+aF
+aF
bn
bo
bo
bq
-bt
-bt
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+fp
+ba
+ba
+aZ
aA
aa
"}
@@ -1481,43 +1524,43 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
bc
bf
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
br
-bt
-bt
-bt
-bt
-bt
-ab
-aA
+bb
+bb
+bb
+bb
+ba
+aZ
+aE
aa
aa
"}
@@ -1532,43 +1575,43 @@ aa
aa
aa
aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-bt
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-ab
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+bb
+bb
+bb
+fp
+ba
+aZ
aA
aa
aa
@@ -1584,42 +1627,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+aF
+aF
+aF
+aF
+aF
aN
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
aR
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-bt
-bt
-ab
+aF
+aF
+aF
+aF
+bb
+bb
+fp
+bb
+bb
+aZ
aA
aa
aa
@@ -1636,42 +1679,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-bt
-bt
-bt
-ab
+aZ
+ba
+ba
+ba
+bb
+nc
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+aF
+aF
+aF
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+ba
+ba
+ba
+aZ
aa
aa
aa
@@ -1688,42 +1731,42 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
aK
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
+aF
bp
-ac
-ac
+aF
+aF
aR
-bt
-bt
-ab
-aA
+ba
+ba
+aZ
+aE
aa
aa
aa
@@ -1740,41 +1783,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+nc
+bb
+bb
+fp
+fp
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+fp
+ba
+fp
+ba
aP
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
+aF
aR
-bt
-bt
-ab
+ba
+ba
+aZ
aA
aa
aa
@@ -1792,41 +1835,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
aQ
aP
-ac
-ac
+aF
+aF
aR
-ac
-ac
-ac
-ac
-bt
-ac
-bt
-bt
-ab
+aF
+aF
+aF
+aF
+bb
+aF
+ba
+ba
+aZ
aA
aa
aa
@@ -1844,41 +1887,41 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+PG
+bb
+bb
+ba
+ba
+ba
+ba
+ba
+aF
+aF
+aF
+aF
aP
-ac
+aF
bg
-bt
-bt
-bt
-bt
-ab
+bb
+bb
+bb
+ba
+aZ
aa
aa
aa
@@ -1896,41 +1939,41 @@ aa
aa
aa
aa
-aA
-ab
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
-ac
-ac
-ac
-ac
+aE
+aZ
+aZ
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+fp
+bb
+PG
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aF
+aF
+aF
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+bb
+fp
+bb
+aZ
+aE
aa
aa
aa
@@ -1951,38 +1994,38 @@ aa
aa
aA
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aZ
+ba
+bb
+bb
+bb
+fp
+fp
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
bg
-ac
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+bb
+fp
+bb
+aZ
+aE
aa
aa
aO
@@ -2003,38 +2046,38 @@ aa
aa
aa
aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ac
-ac
+aZ
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+bb
+bb
+fp
+ba
+aF
+aF
bj
-ac
-ac
-ac
+aF
+aF
+aF
aS
-bt
-bt
-bt
-ab
-aA
+fp
+bb
+bb
+aZ
+aE
aa
aA
ab
@@ -2055,38 +2098,38 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
+aE
+aZ
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+ba
+ba
+ba
aS
bi
-ac
-ac
-ac
+aF
+aF
+aF
aS
aS
-bt
-bt
-bt
-ab
-aA
+bb
+bb
+bb
+aZ
+aE
aa
aA
ab
@@ -2108,36 +2151,36 @@ aa
aa
aM
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-bt
+aE
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+fp
+ba
+ba
+ba
+aZ
+ba
aS
-ac
-ac
-ac
-ac
+aF
+aF
+aF
+aF
aS
aS
-bt
-bt
-ab
-aA
+ba
+ba
+aZ
+aE
aa
aa
aA
@@ -2160,36 +2203,36 @@ aa
aa
aa
aa
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aS
+aE
+aZ
+ba
+ba
+ba
+ba
+bb
+bb
+bb
+fp
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
aS
aS
+Lt
bk
bk
aS
aS
aS
aS
-ab
-ab
-aA
+aZ
+aZ
+aE
aa
aa
aa
@@ -2212,25 +2255,25 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aA
-aA
+aE
+aE
+aZ
+ba
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+fp
+fp
+ba
+aZ
+aE
+aE
+aE
aS
aS
aS
@@ -2238,10 +2281,10 @@ bk
aS
aS
aS
-aA
-aA
-ab
-aA
+aE
+aE
+aZ
+aE
aa
aa
aa
@@ -2265,23 +2308,23 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
-aA
+aE
+aE
+aZ
+ba
+ba
+bb
+bb
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
+aE
ai
ai
ai
@@ -2318,21 +2361,21 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-aA
+aE
+aE
+aZ
+ba
+fp
+fp
+bb
+bb
+bb
+bb
+bb
+ba
+ba
+aZ
+aE
aa
aa
aa
@@ -2371,21 +2414,21 @@ aa
aa
aa
aa
-aA
-aA
-ab
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-bt
-ab
-ab
+aE
+aE
+aZ
+ba
+ba
+ba
+ba
+ba
+bb
+bb
+ba
+ba
+ba
+aZ
+aZ
aa
aa
aa
@@ -2424,20 +2467,20 @@ aa
aa
aa
aa
-aA
-aA
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-bt
-bt
-bt
-ab
+aE
+aE
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+aZ
+ba
+ba
+ba
+aZ
aa
aa
aa
From 71f48b3b35a61594def7345116e3035d65a1b92b Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Thu, 19 Mar 2020 07:38:34 -0500
Subject: [PATCH 030/102] Automatic changelog generation for PR #11517 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-11517.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-11517.yml
diff --git a/html/changelogs/AutoChangeLog-pr-11517.yml b/html/changelogs/AutoChangeLog-pr-11517.yml
new file mode 100644
index 0000000000..142759e66c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11517.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "Space hermits (those quirky fellas stuck in a rock with carp surrounding them) now have gravity! But they lost their perpetual generators."
+ - balance: "Space hermits now have to mine for their research tech (golem vendor board, ORM board). They have slightly less bad parts, though. And better(?) rocks."
From ea8941343e5d58c259dad1f41c9754b853f96d42 Mon Sep 17 00:00:00 2001
From: Seris02 <49109742+Seris02@users.noreply.github.com>
Date: Thu, 19 Mar 2020 20:40:11 +0800
Subject: [PATCH 031/102] stops validhunting geneticists from knowing exactly
who is an is a vampire (and allows vampires genes) (#11520)
* yeet gone
* pfft oof
* oof
---
code/__DEFINES/traits.dm | 1 +
code/game/machinery/computer/dna_console.dm | 4 ++--
code/game/objects/items/devices/scanners.dm | 4 ++--
code/game/objects/items/dna_injector.dm | 4 ++--
.../antagonists/bloodsucker/datum_bloodsucker.dm | 10 +++++-----
5 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index ba96b7cc7f..613489323a 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -222,6 +222,7 @@
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
#define GHOSTROLE_TRAIT "ghostrole"
#define APHRO_TRAIT "aphro"
+#define BLOODSUCKER_TRAIT "bloodsucker"
// unique trait sources, still defines
#define STATUE_MUTE "statue"
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 5662737ff7..b9bd3da95e 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -136,7 +136,7 @@
if(connected && connected.is_operational())
if(connected.occupant) //set occupant_status message
viable_occupant = connected.occupant
- if(viable_occupant.has_dna() && !HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
+ if(viable_occupant.has_dna() && !HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
occupant_status += "[viable_occupant.name] => "
switch(viable_occupant.stat)
if(CONSCIOUS)
@@ -948,7 +948,7 @@
var/mob/living/carbon/viable_occupant = null
if(connected)
viable_occupant = connected.occupant
- if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
+ if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT_NOT_FROM(viable_occupant, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
viable_occupant = null
return viable_occupant
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 8802698b5d..0e109cd400 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -803,7 +803,7 @@ SLIME SCANNER
/obj/item/sequence_scanner/attack(mob/living/M, mob/living/carbon/human/user)
add_fingerprint(user)
- if (!HAS_TRAIT(M, TRAIT_RADIMMUNE)) //no scanning if its a husk or DNA-less Species
+ if (!HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT)) //no scanning if its a husk or DNA-less Species
user.visible_message("[user] analyzes [M]'s genetic sequence.", \
"You analyze [M]'s genetic sequence.")
gene_scan(M, user)
@@ -879,4 +879,4 @@ SLIME SCANNER
if(mutation in discovered)
return "[HM.name] ([HM.alias])"
else
- return HM.alias
\ No newline at end of file
+ return HM.alias
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 60b1e81c94..90c9d78272 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -20,7 +20,7 @@
return attack_hand(user)
/obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user)
- if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M, TRAIT_NOCLONE))
+ if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M, TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/HM in remove_mutations)
@@ -525,7 +525,7 @@
var/filled = FALSE
/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user)
- if(M.has_dna() && !HAS_TRAIT(M, TRAIT_RADIMMUNE) && !HAS_TRAIT(M,TRAIT_NOCLONE))
+ if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M,TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/mutation in add_mutations)
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index 4d06c127d4..755d12ae09 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -185,10 +185,10 @@
BuyPower(new /datum/action/bloodsucker/veil)
// Traits
for(var/T in defaultTraits)
- ADD_TRAIT(owner.current, T, "bloodsucker")
+ ADD_TRAIT(owner.current, T, BLOODSUCKER_TRAIT)
if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you
had_toxlover = TRUE
- REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, "species")
+ REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT)
// Traits: Species
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
@@ -235,9 +235,9 @@
// owner.RemoveSpell(power)
// Traits
for(var/T in defaultTraits)
- REMOVE_TRAIT(owner.current, T, "bloodsucker")
+ REMOVE_TRAIT(owner.current, T, BLOODSUCKER_TRAIT)
if(had_toxlover == TRUE)
- ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, "species")
+ ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT)
// Traits: Species
if(ishuman(owner.current))
@@ -387,7 +387,7 @@
add_objective(heartthief_objective)
/*
else
-
+
// Solars Objective, doesnt work due to TG updates.
var/datum/objective/bloodsucker/solars/solars_objective = new
solars_objective.owner = owner
From 80875a41f6f53ee0b06dfffb3f182f8322704df1 Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Thu, 19 Mar 2020 07:40:15 -0500
Subject: [PATCH 032/102] Automatic changelog generation for PR #11520 [ci
skip]
---
html/changelogs/AutoChangeLog-pr-11520.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-11520.yml
diff --git a/html/changelogs/AutoChangeLog-pr-11520.yml b/html/changelogs/AutoChangeLog-pr-11520.yml
new file mode 100644
index 0000000000..663e7d7e43
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11520.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - balance: "bloodsuckers being unable to accept genes"
From e9ad37fbd0dd33c7fdc8b35688b3d12663434fc2 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 15:28:41 +0100
Subject: [PATCH 033/102] Update belly_obj.dm
---
code/modules/vore/eating/belly_obj.dm | 8 --------
1 file changed, 8 deletions(-)
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index 374a4e2b5d..4917bd3dba 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -734,11 +734,3 @@
for(var/I in emote_lists[K])
dupe.emote_lists[K] += I
return dupe
-
-//
-// Belly searching for simplifying other procs
-// Mostly redundant now with belly-objects and isbelly(loc)
-//
-/proc/check_belly(atom/movable/A)
- return isbelly(A.loc)
-
From bd8847ab6699ed5dca548fd6f732fd571e422398 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 15:32:46 +0100
Subject: [PATCH 034/102] Update living.dm
---
code/modules/vore/eating/living.dm | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 20a051d0ca..980421e243 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -355,9 +355,12 @@
set category = "Vore"
set desc = "Lick someone nearby!"
+ if(incapacitated(ignore_restraints = TRUE))
+ to_chat(user, "You can't do that while incapacitated.")
+
var/list/choices
for(var/mob/living/L in view(1))
- if(L != src && (!L.ckey || L.client?.prefs.lickable))
+ if(L != src && (!L.ckey || L.client?.prefs.lickable) && Adjacent(L))
LAZYADD(choices, L)
if(!choices)
@@ -365,7 +368,7 @@
var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
- if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)))
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
setClickCooldown(100)
From 6f6c162138ee6c5a27a80487d07ca5b26042b62a Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 15:33:19 +0100
Subject: [PATCH 035/102] Update living.dm
---
code/modules/vore/eating/living.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 980421e243..caf17d7129 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -357,6 +357,7 @@
if(incapacitated(ignore_restraints = TRUE))
to_chat(user, "You can't do that while incapacitated.")
+ return
var/list/choices
for(var/mob/living/L in view(1))
From ddc7d11e6eb3b71950eac15d834009a7c521f512 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 15:34:23 +0100
Subject: [PATCH 036/102] Update living.dm
---
code/modules/vore/eating/living.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index caf17d7129..c59662d5b6 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -356,7 +356,7 @@
set desc = "Lick someone nearby!"
if(incapacitated(ignore_restraints = TRUE))
- to_chat(user, "You can't do that while incapacitated.")
+ to_chat(src, "You can't do that while incapacitated.")
return
var/list/choices
From bd9e195b11d4f01a3129c4f42bbfb791d86fb04a Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 16:41:19 +0100
Subject: [PATCH 037/102] shapes and sizes sanitized.
---
code/__DEFINES/citadel_defines.dm | 9 +++++++++
code/__HELPERS/mobs.dm | 4 ++--
code/modules/client/preferences.dm | 6 +++---
code/modules/client/preferences_savefile.dm | 6 ++++++
tgstation.dme | 2 +-
5 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index f1f0d45e90..62dde9d299 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -36,13 +36,20 @@
#define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8)
+#define BREASTS_SIZE_DEF "c" //lowercase cause those sprite accessory don't use uppercased letters.
+
+#define DEF_BREASTS_SHAPE "Pair"
+
#define COCK_SIZE_MIN 1
+#define COCK_SIZE_DEF 6
#define COCK_SIZE_MAX 20
#define COCK_DIAMETER_RATIO_MAX 0.42
#define COCK_DIAMETER_RATIO_DEF 0.25
#define COCK_DIAMETER_RATIO_MIN 0.15
+#define DEF_COCK_SHAPE "Human"
+
#define KNOT_GIRTH_RATIO_MAX 3
#define KNOT_GIRTH_RATIO_DEF 2.1
#define KNOT_GIRTH_RATIO_MIN 1.25
@@ -50,6 +57,8 @@
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
+#define DEF_BALLS_SHAPE "Single"
+
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7852ab9d06..66e855486b 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -181,7 +181,7 @@
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
- "cock_length" = 6,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_sheath" = FALSE,
@@ -209,7 +209,7 @@
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
- "breasts_shape" = "Pair",
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a9deba070a..a7c7912ccf 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -122,7 +122,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = "Human",
- "cock_length" = 6,
+ "cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
"has_sheath" = FALSE,
@@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"balls_color" = "fff",
"balls_amount" = 2,
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
@@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = "fff",
- "breasts_size" = "C",
+ "breasts_size" = BREASTS_SIZE_DEF,
"breasts_shape" = "Pair",
"breasts_producing" = FALSE,
"has_vag" = FALSE,
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 86148ee17c..289fe7da6c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -509,6 +509,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+ features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, BREASTS_SIZE_DEF)
+ features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
+ features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
+ features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF)
+ features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
+
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
diff --git a/tgstation.dme b/tgstation.dme
index 06c841e021..8b04b3deac 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1498,6 +1498,7 @@
#include "code\modules\antagonists\swarmer\swarmer.dm"
#include "code\modules\antagonists\swarmer\swarmer_event.dm"
#include "code\modules\antagonists\traitor\datum_traitor.dm"
+#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\classes\ai.dm"
#include "code\modules\antagonists\traitor\classes\assassin.dm"
#include "code\modules\antagonists\traitor\classes\freeform.dm"
@@ -1506,7 +1507,6 @@
#include "code\modules\antagonists\traitor\classes\martyr.dm"
#include "code\modules\antagonists\traitor\classes\subterfuge.dm"
#include "code\modules\antagonists\traitor\classes\traitor_class.dm"
-#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\equipment\contractor.dm"
#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
From dd7046cbd1b4d747c0b7bcfbd5f0b16e0ad34f54 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 16:53:58 +0100
Subject: [PATCH 038/102] no comment
---
code/__DEFINES/citadel_defines.dm | 2 ++
code/__HELPERS/mobs.dm | 2 +-
code/modules/client/preferences.dm | 6 +++---
code/modules/client/preferences_savefile.dm | 2 +-
modular_citadel/code/modules/arousal/genitals.dm | 2 +-
modular_citadel/code/modules/arousal/organs/breasts.dm | 4 ++--
modular_citadel/code/modules/arousal/organs/penis.dm | 1 +
modular_citadel/code/modules/arousal/organs/testicles.dm | 2 +-
modular_citadel/code/modules/arousal/organs/vagina.dm | 1 +
9 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 62dde9d299..185d5d8860 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -40,6 +40,8 @@
#define DEF_BREASTS_SHAPE "Pair"
+#define DEF_VAGINA_SHAPE "Human"
+
#define COCK_SIZE_MIN 1
#define COCK_SIZE_DEF 6
#define COCK_SIZE_MAX 20
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 66e855486b..d1ebcb1cd7 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -192,7 +192,7 @@
"balls_amount" = 2,
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
- "balls_shape" = "Single",
+ "balls_shape" = DEF_BALLS_SHAPE,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a7c7912ccf..331f4aa41f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"taur" = "None",
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
- "cock_shape" = "Human",
+ "cock_shape" = DEF_COCK_SHAPE,
"cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
@@ -150,10 +150,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"has_breasts" = FALSE,
"breasts_color" = "fff",
"breasts_size" = BREASTS_SIZE_DEF,
- "breasts_shape" = "Pair",
+ "breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
- "vag_shape" = "Human",
+ "vag_shape" = DEF_VAGINA_SHAPE,
"vag_color" = "fff",
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 289fe7da6c..4ca0ce8dba 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -514,7 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF)
features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
-
+ features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 7cf8fb8ff9..fbfb6f7fd5 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital
color = "#fcccb3"
w_class = WEIGHT_CLASS_NORMAL
- var/shape = "human"
+ var/shape
var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
var/masturbation_verb = "masturbate"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index f3ce834838..bfa506da6d 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -8,10 +8,10 @@
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
- size = "c" //refer to the breast_values static list below for the cups associated number values
+ size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
- shape = "pair"
+ shape = DEF_BREASTS_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE
masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive"
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c9eb0769cf..294ac6c877 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -11,6 +11,7 @@
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
+ shape = DEF_COCK_SHAPE
size = 2 //arbitrary value derived from length and diameter for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index eb6c1536cb..ff2422f082 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -11,7 +11,7 @@
linked_organ_slot = ORGAN_SLOT_PENIS
genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION
var/size_name = "average"
- shape = "Single"
+ shape = DEF_BALLS_SHAPE
var/sack_size = BALLS_SACK_SIZE_DEF
fluid_id = /datum/reagent/consumable/semen
masturbation_verb = "massage"
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
index 311afe75b0..91c3b8b8e9 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -6,6 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
size = 1 //There is only 1 size right now
+ shape = DEF_VAGINA_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
From eeab3ed11f1150f7bf3fbf1bc452c133270d481a Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 17:34:01 +0100
Subject: [PATCH 039/102] Everyday
---
code/__DEFINES/citadel_defines.dm | 14 -------
code/__HELPERS/_cit_helpers.dm | 12 ------
code/__HELPERS/mobs.dm | 14 -------
code/modules/client/preferences.dm | 37 +-----------------
code/modules/client/preferences_savefile.dm | 1 -
.../code/modules/arousal/genitals.dm | 6 ---
.../arousal/genitals_sprite_accessories.dm | 11 ------
.../code/modules/arousal/organs/eggsack.dm | 14 -------
.../code/modules/arousal/organs/ovipositor.dm | 16 --------
.../modules/client/preferences_savefile.dm | 2 -
.../icons/obj/genitals/ovipositor.dmi | Bin 775 -> 0 bytes
11 files changed, 1 insertion(+), 126 deletions(-)
delete mode 100644 modular_citadel/code/modules/arousal/organs/eggsack.dm
delete mode 100644 modular_citadel/code/modules/arousal/organs/ovipositor.dm
delete mode 100644 modular_citadel/icons/obj/genitals/ovipositor.dmi
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index f1f0d45e90..b783d2c981 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -43,10 +43,6 @@
#define COCK_DIAMETER_RATIO_DEF 0.25
#define COCK_DIAMETER_RATIO_MIN 0.15
-#define KNOT_GIRTH_RATIO_MAX 3
-#define KNOT_GIRTH_RATIO_DEF 2.1
-#define KNOT_GIRTH_RATIO_MIN 1.25
-
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
@@ -54,18 +50,10 @@
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
-#define BALLS_SACK_SIZE_MIN 1
-#define BALLS_SACK_SIZE_DEF 8
-#define BALLS_SACK_SIZE_MAX 40
-
#define CUM_RATE 2 // holy shit what a really shitty define name - relates to units per arbitrary measure of time?
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
-#define EGG_GIRTH_MIN 1//inches
-#define EGG_GIRTH_DEF 6
-#define EGG_GIRTH_MAX 16
-
#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups.
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
@@ -83,8 +71,6 @@
//Citadel istypes
#define isgenital(A) (istype(A, /obj/item/organ/genital))
-#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
-
#define CITADEL_MENTOR_OOC_COLOUR "#224724"
//xenobio console upgrade stuff
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index ffc1bcc6b7..1954a159b3 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -139,18 +139,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
return TRUE
return FALSE
-/mob/living/carbon/proc/has_ovipositor()
- var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_PENIS)
- if(G && istype(G, /obj/item/organ/genital/ovipositor))
- return TRUE
- return FALSE
-
-/mob/living/carbon/human/proc/has_eggsack()
- var/obj/item/organ/genital/G = getorganslot(ORGAN_SLOT_TESTICLES)
- if(G && istype(G, /obj/item/organ/genital/eggsack))
- return TRUE
- return FALSE
-
/mob/living/carbon/proc/is_groin_exposed(list/L)
if(!L)
L = get_equipped_items()
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7852ab9d06..511996276a 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -184,28 +184,14 @@
"cock_length" = 6,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "has_sheath" = FALSE,
- "sheath_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
"balls_shape" = "Single",
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 17e9720590..d29945508f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -125,28 +125,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"cock_length" = 6,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
- "has_sheath" = FALSE,
- "sheath_color" = "fff",
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = "fff",
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_shape" = "Single",
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = "fff",
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = "fff",
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = "fff",
- "eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = "fff",
"breasts_size" = "C",
@@ -1924,6 +1910,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list
if(new_dors)
features["xenodorsal"] = new_dors
+
//Genital code
if("cock_color")
var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null
@@ -1964,22 +1951,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_shape)
features["balls_shape"] = new_shape
- if("egg_size")
- var/new_size
- var/list/egg_sizes = list(1,2,3)
- new_size = input(user, "Egg Diameter(inches):", "Egg Size") as null|anything in egg_sizes
- if(new_size)
- features["eggsack_egg_size"] = new_size
-
- if("egg_color")
- var/new_egg_color = input(user, "Egg Color:", "Character Preference") as color|null
- if(new_egg_color)
- var/temp_hsv = RGBtoHSV(new_egg_color)
- if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
- else
- to_chat(user,"Invalid color. Your color is not bright enough.")
-
if("breasts_size")
var/new_size
new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breasts_size_list
@@ -2113,14 +2084,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["has_balls"] = FALSE
if("has_balls")
features["has_balls"] = !features["has_balls"]
- if("has_ovi")
- features["has_ovi"] = !features["has_ovi"]
- if("has_eggsack")
- features["has_eggsack"] = !features["has_eggsack"]
if("balls_internal")
features["balls_internal"] = !features["balls_internal"]
- if("eggsack_internal")
- features["eggsack_internal"] = !features["eggsack_internal"]
if("has_breasts")
features["has_breasts"] = !features["has_breasts"]
if(features["has_breasts"] == FALSE)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index d8b5edfa48..4c9733e97e 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -452,7 +452,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_balls_color"] >> features["balls_color"]
S["feature_balls_size"] >> features["balls_size"]
S["feature_balls_shape"] >> features["balls_shape"]
- S["feature_balls_sack_size"] >> features["balls_sack_size"]
//breasts features
S["feature_has_breasts"] >> features["has_breasts"]
S["feature_breasts_size"] >> features["breasts_size"]
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 7cf8fb8ff9..9aa4a26065 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -208,12 +208,6 @@
give_genital(/obj/item/organ/genital/breasts)
if(dna.features["has_cock"])
give_genital(/obj/item/organ/genital/penis)
- /*
- if(dna.features["has_ovi"])
- give_genital(/obj/item/organ/genital/ovipositor)
- if(dna.features["has_eggsack"])
- give_genital(/obj/item/organ/genital/eggsack)
- */
/mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G)
if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot)))
diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
index 594fc83e46..07453facdf 100644
--- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
@@ -137,14 +137,3 @@
/datum/sprite_accessory/breasts/sextuple
icon_state = "sextuple"
name = "Sextuple"
-
-//OVIPOSITORS BE HERE
-/datum/sprite_accessory/ovipositor
- icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
- icon_state = null
- name = "Ovipositor" //the preview name of the accessory
- color_src = "cock_color"
-
-/datum/sprite_accessory/ovipositor/knotted
- icon_state = "knotted"
- name = "Knotted"
diff --git a/modular_citadel/code/modules/arousal/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm
deleted file mode 100644
index ebdefd2371..0000000000
--- a/modular_citadel/code/modules/arousal/organs/eggsack.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/item/organ/genital/eggsack
- name = "Egg sack"
- desc = "An egg producing reproductive organ."
- icon_state = "egg_sack"
- icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
- zone = BODY_ZONE_PRECISE_GROIN
- slot = ORGAN_SLOT_TESTICLES
- genital_flags = GENITAL_INTERNAL|GENITAL_BLACKLISTED //unimplemented
- linked_organ_slot = ORGAN_SLOT_PENIS
- color = null //don't use the /genital color since it already is colored
- var/egg_girth = EGG_GIRTH_DEF
- var/cum_mult = CUM_RATE_MULT
- var/cum_rate = CUM_RATE
- var/cum_efficiency = CUM_EFFICIENCY
diff --git a/modular_citadel/code/modules/arousal/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
deleted file mode 100644
index 07a9e89746..0000000000
--- a/modular_citadel/code/modules/arousal/organs/ovipositor.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-/obj/item/organ/genital/ovipositor
- name = "Ovipositor"
- desc = "An egg laying reproductive organ."
- icon_state = "ovi_knotted_2"
- icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
- zone = BODY_ZONE_PRECISE_GROIN
- slot = ORGAN_SLOT_PENIS
- genital_flags = GENITAL_BLACKLISTED //unimplemented
- shape = "knotted"
- size = 3
- layer_index = PENIS_LAYER_INDEX
- var/length = 6 //inches
- var/girth = 0
- var/girth_ratio = COCK_DIAMETER_RATIO_DEF //citadel_defines.dm for these defines
- var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
- var/list/oviflags = list()
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index 334f301dca..80e20c9f48 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -50,13 +50,11 @@
WRITE_FILE(S["feature_cock_color"], features["cock_color"])
WRITE_FILE(S["feature_cock_length"], features["cock_length"])
WRITE_FILE(S["feature_cock_girth"], features["cock_girth"])
- WRITE_FILE(S["feature_has_sheath"], features["sheath_color"])
//balls features
WRITE_FILE(S["feature_has_balls"], features["has_balls"])
WRITE_FILE(S["feature_balls_color"], features["balls_color"])
WRITE_FILE(S["feature_balls_size"], features["balls_size"])
WRITE_FILE(S["feature_balls_shape"], features["balls_shape"])
- WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"])
//breasts features
WRITE_FILE(S["feature_has_breasts"], features["has_breasts"])
WRITE_FILE(S["feature_breasts_size"], features["breasts_size"])
diff --git a/modular_citadel/icons/obj/genitals/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi
deleted file mode 100644
index 81d857417fbad922796305fb5790d72247f5efa0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 775
zcmV+i1Ni)jP)
zv$KMNg7ozC-{0S;sHoT1*MTl9`mUV$n~0P{Mc{>S$7xl-z`#VnT_6Ae00DGTPE!Ct
z=GbNc005PGR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM
z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+zbrF8J1@VaBsC@8P>G8(C9|j)C~nBb
znO2mTn+joLRc%C)YGZ<`Q`6In6O*&!lX4RCvWZqr*v&ANgxw2MiPNph3a)-G;9v#-
zhBj)_^#^ov0005%Nkl_0G
z5SQY59{|>+*Tj7&7mercpe&PUV$A)a`Gy_l{{tBS4ssNoF&pA@pHJukT8MA_ffr;V
zEktwDaGAhpA-Y<4e0oh9Xn}IPBn`Acm^vIv
zGAN~5+1^jj(DtE`kwIx`QK8%``KDwsh&*MntuXnZUliT{Ar1C_uz~y!0vhc9kk(I%
Date: Thu, 19 Mar 2020 17:35:18 +0100
Subject: [PATCH 040/102] Nothing
---
modular_citadel/code/modules/arousal/organs/testicles.dm | 1 -
tgstation.dme | 2 --
2 files changed, 3 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index eb6c1536cb..1cffea5f23 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -12,7 +12,6 @@
genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION
var/size_name = "average"
shape = "Single"
- var/sack_size = BALLS_SACK_SIZE_DEF
fluid_id = /datum/reagent/consumable/semen
masturbation_verb = "massage"
layer_index = TESTICLES_LAYER_INDEX
diff --git a/tgstation.dme b/tgstation.dme
index c10faebf81..6d8a3f7bd5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3213,8 +3213,6 @@
#include "modular_citadel\code\modules\arousal\genitals.dm"
#include "modular_citadel\code\modules\arousal\genitals_sprite_accessories.dm"
#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
-#include "modular_citadel\code\modules\arousal\organs\eggsack.dm"
-#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm"
#include "modular_citadel\code\modules\arousal\organs\penis.dm"
#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
From 7c22b341b94ab70184cd358006e8399e267af8d0 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 17:38:41 +0100
Subject: [PATCH 041/102] Undefined var.
---
modular_citadel/code/modules/arousal/organs/testicles.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 1cffea5f23..0c9a8fb86f 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -63,7 +63,6 @@
color = "#[skintone2hex(H.skin_tone)]"
else
color = "#[D.features["balls_color"]]"
- sack_size = D.features["balls_sack_size"]
shape = D.features["balls_shape"]
if(D.features["balls_shape"] == "Hidden")
ENABLE_BITFIELD(genital_flags, GENITAL_INTERNAL)
From e6f40cce1421987413979fdb2fb55753f41cc7c5 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 19 Mar 2020 17:50:08 +0100
Subject: [PATCH 042/102] hex
---
code/modules/client/preferences_savefile.dm | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 877e2c40bc..350fe71317 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -545,12 +545,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+
features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, BREASTS_SIZE_DEF)
features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE)
features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE)
features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, COCK_SIZE_DEF)
features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE)
features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE)
+ features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF")
+ features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF")
+ features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF")
+ features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF")
+
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
From 64ccb99724519000c48bc51d27019d4d4021c18a Mon Sep 17 00:00:00 2001
From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com>
Date: Thu, 19 Mar 2020 18:00:45 -0400
Subject: [PATCH 043/102] Update uplink_badass.dm
---
code/modules/uplink/uplink_items/uplink_badass.dm | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/code/modules/uplink/uplink_items/uplink_badass.dm b/code/modules/uplink/uplink_items/uplink_badass.dm
index 8dc5afbadd..74be111346 100644
--- a/code/modules/uplink/uplink_items/uplink_badass.dm
+++ b/code/modules/uplink/uplink_items/uplink_badass.dm
@@ -75,3 +75,11 @@
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
illegal_tech = FALSE
+
+/datum/uplink_item/badass/shades
+ name = "Big Sunglasses"
+ desc = "Prevents flashes and looks badbass with some Smokes."
+ item = /obj/item/clothing/glasses/sunglasses/big
+ cost = 1
+ surplus = 5
+ illegal_tech = FALSE
From a2b0fd775b8fd2d91f02910102c95ab6906cbcb8 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 20 Mar 2020 00:24:26 +0100
Subject: [PATCH 044/102] Specific sprite accessory icon states improvement.
---
.../icons/obj/genitals/breasts_onmob.dmi | Bin 6159 -> 19045 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
index 578086c4c30308b403f1930738b9141dd13da6f3..3f3bcf5bd76198f2f0a867fc3128f682b35d6a92 100644
GIT binary patch
literal 19045
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
Date: Fri, 20 Mar 2020 12:37:57 +1100
Subject: [PATCH 045/102] Energy Gun Sprite cleanup and Animations (#11518)
* Sprite changes and animations by goldnharl
* While I'm here I'll port over a sprite from tg for the disabler
---
icons/obj/guns/energy.dmi | Bin 41473 -> 44109 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 20fe8272daf68ffb7b6a511ea786964691538f22..ba8111bb0033bcf53fc036e9cea2df4086e321ce 100644
GIT binary patch
literal 44109
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