diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm
index 3e03a5036e7..40ab4871e26 100644
--- a/_maps/cyberiad.dm
+++ b/_maps/cyberiad.dm
@@ -12,19 +12,17 @@ z6 = russian derelict
z7 = empty
*/
-#if !defined(MAP_FILE)
+#if !defined(USING_MAP_DATUM)
- #include "map_files\cyberiad\cyberiad.dmm"
- #include "map_files\cyberiad\z2.dmm"
- #include "map_files\cyberiad\z3.dmm"
- #include "map_files\cyberiad\z4.dmm"
- #include "map_files\cyberiad\z5.dmm"
- #include "map_files\cyberiad\z6.dmm"
- #include "map_files\cyberiad\z7.dmm"
+ #include "map_files\cyberiad\cyberiad.dmm"
+ #include "map_files\cyberiad\z2.dmm"
+ #include "map_files\cyberiad\z3.dmm"
+ #include "map_files\cyberiad\z4.dmm"
+ #include "map_files\cyberiad\z5.dmm"
+ #include "map_files\cyberiad\z6.dmm"
+ #include "map_files\cyberiad\z7.dmm"
- #define MAP_FILE "cyberiad.dmm"
- #define MAP_NAME "Cyberiad"
- #define MAP_TRANSITION_CONFIG list(\
+ #define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL,STATION_CONTACT,REACHABLE,AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
@@ -33,6 +31,8 @@ DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, HAS_WEATHER,
DECLARE_LEVEL(DERELICT, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)))
+ #define USING_MAP_DATUM /datum/map/cyberiad
+
#elif !defined(MAP_OVERRIDE)
#warn a map has already been included, ignoring Cyberiad.
diff --git a/_maps/metastation.dm b/_maps/metastation.dm
index 9240a5e928f..5cb5c14b03d 100644
--- a/_maps/metastation.dm
+++ b/_maps/metastation.dm
@@ -13,19 +13,17 @@ z6 = empty space
z7 = empty space
*/
-#if !defined(MAP_FILE)
+#if !defined(USING_MAP_DATUM)
- #include "map_files\MetaStation\MetaStation.v41A.II.dmm"
- #include "map_files\MetaStation\z2.dmm"
- #include "map_files\MetaStation\z3.dmm"
- #include "map_files\MetaStation\z4.dmm"
- #include "map_files\MetaStation\z5.dmm"
- #include "map_files\generic\z6.dmm"
- #include "map_files\generic\z7.dmm"
+ #include "map_files\MetaStation\MetaStation.v41A.II.dmm"
+ #include "map_files\MetaStation\z2.dmm"
+ #include "map_files\MetaStation\z3.dmm"
+ #include "map_files\MetaStation\z4.dmm"
+ #include "map_files\MetaStation\z5.dmm"
+ #include "map_files\generic\z6.dmm"
+ #include "map_files\generic\z7.dmm"
- #define MAP_FILE "MetaStation.v41A.II.dmm"
- #define MAP_NAME "MetaStation"
- #define MAP_TRANSITION_CONFIG list(\
+ #define MAP_TRANSITION_CONFIG list(\
DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\
DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\
DECLARE_LEVEL(TELECOMMS, CROSSLINKED, list(REACHABLE, BOOSTS_SIGNAL, AI_OK)),\
@@ -34,6 +32,8 @@ DECLARE_LEVEL(MINING, CROSSLINKED, list(REACHABLE, STATION_CONTACT, AI_OK, ORE_L
DECLARE_LEVEL(EMPTY_AREA, CROSSLINKED, list(REACHABLE)),\
DECLARE_LEVEL(EMPTY_AREA_2, CROSSLINKED, list(REACHABLE)))
+ #define USING_MAP_DATUM /datum/map/metastation
+
#elif !defined(MAP_OVERRIDE)
#warn a map has already been included, ignoring MetaStation.
diff --git a/_maps/test_away_missions.dm b/_maps/test_away_missions.dm
index e960cd3b065..42b068412bd 100644
--- a/_maps/test_away_missions.dm
+++ b/_maps/test_away_missions.dm
@@ -1,6 +1,6 @@
// This is for Travis testing. DO NOT SET THIS AS THE GAME'S MAP NORMALLY!
-#if !defined(MAP_FILE)
+#if !defined(USING_MAP_DATUM)
#include "map_files\RandomZLevels\beach.dmm"
#include "map_files\RandomZLevels\moonoutpost19.dmm"
#include "map_files\RandomZLevels\undergroundoutpost45.dmm"
@@ -12,10 +12,10 @@
#include "map_files\RandomZLevels\evil_santa.dmm"
- #define MAP_FILE "beach.dmm"
- #define MAP_NAME "Away Missions Test"
#define MAP_TRANSITION_CONFIG list(AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED)
+ #define USING_MAP_DATUM /datum/map
+
#elif !defined(MAP_OVERRIDE)
#warn a map has already been included.
#endif
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 2b3d461da4c..fb5fbb31bff 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -308,6 +308,9 @@
trade_dock_timelimit = 0
trade_dockrequest_timelimit = 0
event_announcement.Announce("Docking request for trading ship denied.", "Docking request")
+ if("ToggleATC")
+ atc.squelched = !atc.squelched
+ to_chat(usr, "ATC traffic is now: [atc.squelched ? "Disabled" : "Enabled"]")
nanomanager.update_uis(src)
return 1
@@ -407,6 +410,8 @@
else
data["dock_request"] = 0
+ data["atcSquelched"] = atc.squelched
+
return data
diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm
new file mode 100644
index 00000000000..178433623f1
--- /dev/null
+++ b/code/modules/busy_space/air_traffic.dm
@@ -0,0 +1,128 @@
+//Cactus, Speedbird, Dynasty, oh my
+
+var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
+
+/datum/lore/atc_controller
+ var/delay_max = 5 MINUTES //How long between ATC traffic, max. Default is 5 mins.
+ var/delay_min = 1 MINUTES //How long between ATC traffic, min. Default is 1 mins.
+ var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins.
+ var/next_message //When the next message should happen in world.time
+ var/force_chatter_type //Force a specific type of messages
+
+ var/squelched = 0 //If ATC is squelched currently
+
+/datum/lore/atc_controller/New()
+ spawn(30 SECONDS) //Lots of lag at the start of a shift.
+ msg("New shift beginning, resuming traffic control.")
+ next_message = world.time + rand(delay_min, delay_max)
+ process()
+
+/datum/lore/atc_controller/proc/process()
+ if(world.time >= next_message)
+ if(squelched)
+ next_message = world.time + backoff_delay
+ else
+ next_message = world.time + rand(delay_min,delay_max)
+ random_convo()
+
+ spawn(1 MINUTES) //We don't really need high-accuracy here.
+ process()
+
+/datum/lore/atc_controller/proc/msg(var/message,var/sender)
+ ASSERT(message)
+ global_announcer.autosay("[message]", sender ? sender : "[using_map.station_short] Space Control")
+
+/datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1)
+ if(yes)
+ if(!squelched)
+ msg("Rerouting traffic away from [using_map.station_name].")
+ squelched = 1
+ else
+ if(squelched)
+ msg("Resuming normal traffic routing around [using_map.station_name].")
+ squelched = 0
+
+/datum/lore/atc_controller/proc/shift_ending(var/evac = 0)
+ msg("Automated Shuttle departing [using_map.station_name] for [using_map.dock_name] on routine transfer route.", "NT Automated Shuttle")
+ sleep(5 SECONDS)
+ msg("Automated Shuttle, cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].")
+
+/datum/lore/atc_controller/proc/random_convo()
+ var/one = pick(loremaster.organizations) //These will pick an index, not an instance
+ var/two = pick(loremaster.organizations)
+
+ var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances
+ var/datum/lore/organization/dest = loremaster.organizations[two]
+
+ //Let's get some mission parameters
+ var/owner = source.short_name //Use the short name
+ var/prefix = pick(source.ship_prefixes) //Pick a random prefix
+ var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does
+ var/shipname = pick(source.ship_names) //Pick a random ship name to go with it
+ var/destname = pick(dest.destination_names) //Pick a random holding from the destination
+
+ var/combined_name = "[owner] [prefix] [shipname]"
+ var/alt_atc_names = list("[using_map.station_short] TraCon","[using_map.station_short] Control","[using_map.station_short] STC","[using_map.station_short] Airspace")
+ var/wrong_atc_names = list("Sol Command","Orion Control", "[using_map.dock_name]")
+ var/mission_noun = list("flight","mission","route")
+ var/request_verb = list("requesting","calling for","asking for")
+
+ //First response is 'yes', second is 'no'
+ var/requests = list("[using_map.station_short] transit clearance" = list("permission for transit granted", "permission for transit denied, contact regional on 953.5"),
+ "planetary flight rules" = list("authorizing planetary flight rules", "denying planetary flight rules right now due to traffic"),
+ "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"),
+ "current solar weather info" = list("sending you the relevant information via tightbeam", "cannot fulfill your request at the moment"),
+ "nearby traffic info" = list("sending you current traffic info", "no available info in your area"),
+ "remote telemetry data" = list("sending telemetry now", "no uplink from your ship, recheck your uplink and ask again"),
+ "refueling information" = list("sending refueling information now", "no fuel for your ship class in this sector"),
+ "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"),
+ "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now"),
+ "permission to engage FTL" = list("permission to engage FTL granted, good day", "permission denied, wait for current traffic to pass"),
+ "permission to transit system" = list("permission to transit granted, good day", "permission denied, wait for current traffic to pass"),
+ "permission to depart system" = list("permission to depart granted, good day", "permission denied, wait for current traffic to pass"),
+ "permission to enter system" = list("good day, permission to enter granted", "permission denied, wait for current traffic to pass"),
+ )
+
+ //Random chance things for variety
+ var/chatter_type = "normal"
+ if(force_chatter_type)
+ chatter_type = force_chatter_type
+ else
+ chatter_type = pick(2;"emerg",5;"wrong_freq","normal") //Be nice to have wrong_lang...
+
+ var/yes = prob(90) //Chance for them to say yes vs no
+
+ var/request = pick(requests)
+ var/callname = pick(alt_atc_names)
+ var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no
+
+ var/full_request
+ var/full_response
+ var/full_closure
+
+ switch(chatter_type)
+ if("wrong_freq")
+ callname = pick(wrong_atc_names)
+ full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]."
+ full_response = "[combined_name], this is [using_map.station_short] TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]."
+ full_closure = "[using_map.station_short] TraCon, understood, apologies."
+ if("wrong_lang")
+ //Can't implement this until autosay has language support
+ if("emerg")
+ var/problem = pick("hull breaches on multiple decks","unknown life forms on board","a drive about to go critical","asteroids impacting the hull","a total loss of engine power","people trying to board the ship")
+ full_request = "This is [combined_name] declaring an emergency! We have [problem]!"
+ full_response = "[combined_name], this is [using_map.station_short] TraCon, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)]."
+ full_closure = "[using_map.station_short] TraCon, okay, switching now."
+ else
+ full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]."
+ full_response = "[combined_name], this is [using_map.station_short] TraCon, [response]." //Station TraCon always calls themselves TraCon
+ full_closure = "[using_map.station_short] TraCon, [yes ? "thank you" : "understood"], good day." //They always copy what TraCon called themselves in the end when they realize they said it wrong
+
+ //Ship sends request to ATC
+ msg(full_request,"[prefix] [shipname]")
+ sleep(5 SECONDS)
+ //ATC sends response to ship
+ msg(full_response)
+ sleep(5 SECONDS)
+ //Ship sends response to ATC
+ msg(full_closure,"[prefix] [shipname]")
\ No newline at end of file
diff --git a/code/modules/busy_space/loremaster.dm b/code/modules/busy_space/loremaster.dm
new file mode 100644
index 00000000000..28dca0055b0
--- /dev/null
+++ b/code/modules/busy_space/loremaster.dm
@@ -0,0 +1,16 @@
+//I AM THE LOREMASTER, ARE YOU THE GATEKEEPER?
+
+var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster
+
+/datum/lore/loremaster
+ var/list/organizations = list()
+
+/datum/lore/loremaster/New()
+
+ var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization
+ for(var/path in paths)
+ // Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names
+ var/datum/lore/organization/instance = path
+ if(initial(instance.name))
+ instance = new path()
+ organizations[path] = instance
diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm
new file mode 100644
index 00000000000..edc0a0bcf2a
--- /dev/null
+++ b/code/modules/busy_space/organizations.dm
@@ -0,0 +1,321 @@
+//Datums for different companies that can be used by busy_space
+/datum/lore/organization
+ var/name = "" // Organization's name
+ var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated")
+ var/acronym = "" // Organization's acronym, e.g. 'NT' for NanoTrasen'.
+ var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused.
+ var/history = "" // Historical discription of the organization's origins Currently unused.
+ var/work = "" // Short description of their work, eg "an arms manufacturer"
+ var/headquarters = "" // Location of the organization's HQ. Currently unused.
+ var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused.
+
+ var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc")
+ var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better.
+ "Kestrel",
+ "Beacon",
+ "Signal",
+ "Freedom",
+ "Glory",
+ "Axiom",
+ "Eternal",
+ "Icarus",
+ "Harmony",
+ "Light",
+ "Discovery",
+ "Endeavour",
+ "Explorer",
+ "Swift",
+ "Dragonfly",
+ "Ascendant",
+ "Tenacious",
+ "Pioneer",
+ "Hawk",
+ "Haste",
+ "Radiant",
+ "Luminous"
+ )
+ var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
+ var/autogenerate_destination_names = TRUE
+
+/datum/lore/organization/New()
+ ..()
+ if(autogenerate_destination_names) // Lets pad out the destination names.
+ var/i = rand(6, 10)
+ var/list/star_names = list(
+ "Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran",
+ "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti",
+ "Wazn", "Alphard", "Phact", "Altair")
+ var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost")
+ while(i)
+ destination_names.Add("a [pick(destination_types)] in [pick(star_names)]")
+ i--
+
+//////////////////////////////////////////////////////////////////////////////////
+
+// TSCs
+/datum/lore/organization/tsc/nanotrasen
+ name = "NanoTrasen Incorporated"
+ short_name = "NanoTrasen"
+ acronym = "NT"
+ desc = "NanoTrasen is one of the foremost research and development companies in SolGov space. \
+ Originally focused on consumer products, their swift move into the field of Phoron has lead to \
+ them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \
+ itself on being an early adopter to as many new technologies as possible, often offering the newest \
+ products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \
+ also offers one of the most comprehensive medical plans in SolGov space, up to and including cloning \
+ and therapy.\
+
\
+ NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \
+ It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \
+ for newly tested posibrains to remain with the company."
+ history = "" // To be written someday.
+ work = "research giant"
+ headquarters = "Luna"
+ motto = ""
+
+ ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response")
+ // Note that the current station being used will be pruned from this list upon being instantiated
+ destination_names = list(
+ "NSS Exodus in Nyx",
+ "NCS Northern Star in Vir",
+ "NCS Southern Cross in Vir",
+ "NDV Icarus in Nyx",
+ "NAS Vir Central Command",
+ "a dockyard orbiting Sif",
+ "an asteroid orbiting Kara",
+ "an asteroid orbiting Rota",
+ "Vir Interstellar Spaceport"
+ )
+
+/datum/lore/organization/tsc/nanotrasen/New()
+ ..()
+ spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick.
+ // Get rid of the current map from the list, so ships flying in don't say they're coming to the current map.
+ var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]"
+ if(string_to_test in destination_names)
+ destination_names.Remove(string_to_test)
+
+
+
+/datum/lore/organization/tsc/hephaestus
+ name = "Hephaestus Industries"
+ short_name = "Hephaestus"
+ acronym = "HI"
+ desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \
+ Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \
+ from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \
+ prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephastus� largest \
+ bulk contractors owing to the above factors."
+ history = ""
+ work = "arms manufacturer"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply")
+ destination_names = list(
+ "a SolGov dockyard on Luna"
+ )
+
+/datum/lore/organization/tsc/vey_med
+ name = "Vey Medical"
+ short_name = "Vey Med"
+ acronym = "VM"
+ desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated by Skrell. \
+ Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \
+ the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \
+ and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \
+ human-like FBP designs. Vey�s rise to stardom came from their introduction of ressurective cloning, although in \
+ recent years they�ve been forced to diversify as their patents expired and NanoTrasen-made medications became \
+ essential to modern cloning."
+ history = ""
+ work = "medical equipment supplier"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply")
+ destination_names = list()
+
+/datum/lore/organization/tsc/zeng_hu
+ name = "Zeng-Hu pharmaceuticals"
+ short_name = "Zeng-Hu"
+ acronym = "ZH"
+ desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \
+ on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \
+ and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu�s fortunes have been in decline as Nanotrasen�s near monopoly \
+ on phoron research cuts into their R&D and Vey-Med�s superior medical equipment effectively decimated their own equipment \
+ interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \
+ constant economic speculation."
+ history = ""
+ work = "pharmaceuticals company"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply")
+ destination_names = list()
+
+/datum/lore/organization/tsc/ward_takahashi
+ name = "Ward-Takahashi General Manufacturing Conglomerate"
+ short_name = "Ward-Takahashi"
+ acronym = "WT"
+ desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \
+ and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \
+ of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \
+ led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi�s economies \
+ of scale frequently steal market share from Nanotrasen�s high-price products, leading to a bitter rivalry in the \
+ consumer electronics market."
+ history = ""
+ work = "electronics manufacturer"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("WTV" = "freight")
+ destination_names = list()
+
+/datum/lore/organization/tsc/bishop
+ name = "Bishop Cybernetics"
+ short_name = "Bishop"
+ acronym = "BC"
+ desc = "Bishop�s focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a b�te noire for \
+ bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \
+ and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \
+ it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med�s for cost. Bishop�s reputation \
+ for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \
+ Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics."
+ history = ""
+ work = "cybernetics and augmentation manufacturer"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("BTV" = "transportation")
+ destination_names = list()
+
+/datum/lore/organization/tsc/morpheus
+ name = "Morpheus Cyberkinetics"
+ short_name = "Morpheus"
+ acronym = "MC"
+ desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \
+ and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \
+ relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \
+ positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \
+ the good-will of the positronics, and the ire of those who wish to exploit them."
+ history = ""
+ work = "cybernetics manufacturer"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("MTV" = "freight")
+ // Culture names, because Anewbe told me so.
+ ship_names = list(
+ "Nervous Energy",
+ "Prosthetic Conscience",
+ "Revisionist",
+ "Trade Surplus",
+ "Flexible Demeanour",
+ "Just Read The Instructions",
+ "Limiting Factor",
+ "Cargo Cult",
+ "Gunboat Diplomat",
+ "A Ship With A View",
+ "Cantankerous",
+ "I Thought He Was With You",
+ "Never Talk To Strangers",
+ "Sacrificial Victim",
+ "Unwitting Accomplice",
+ "Bad For Business",
+ "Just Testing",
+ "Size Isn't Everything",
+ "Yawning Angel",
+ "Liveware Problem",
+ "Very Little Gravitas Indeed",
+ "Zero Gravitas",
+ "Gravitas Free Zone",
+ "Absolutely No You-Know-What",
+ "Existence Is Pain",
+ "I'm Walking Here",
+ "Screw Loose",
+ "Of Course I Still Love You",
+ "Limiting Factor",
+ "So Much For Subtley",
+ "Unfortunate Conflict Of Evidence",
+ "Prime Mover",
+ "It's One Of Ours",
+ "Thank You And Goodnight",
+ "Boo!",
+ "Reasonable Excuse",
+ "Honest Mistake",
+ "Appeal To Reason",
+ "My First Ship II",
+ "Hidden Income",
+ "Anything Legal Considered",
+ "New Toy",
+ "Me, I'm Always Counting",
+ "Just Five More Minutes",
+ "Are You Feeling It",
+ "Great White Snark",
+ "No Shirt No Shoes",
+ "Callsign"
+
+
+ )
+ destination_names = list()
+
+/datum/lore/organization/tsc/xion
+ name = "Xion Manufacturing Group"
+ short_name = "Xion"
+ desc = "Xion, quietly, controls most of the market for industrial equipment. Their portfolio includes mining exosuits, \
+ factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \
+ keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \
+ lawsuits. Xion are noted to be a favorite contractor for SolGov engineers, owing to their low cost and rugged design."
+ history = ""
+ work = "industrial equipment manufacturer"
+ headquarters = ""
+ motto = ""
+
+ ship_prefixes = list("XTV" = "hauling")
+ destination_names = list()
+
+// Governments
+
+/datum/lore/organization/gov/sifgov
+ name = "Sif Governmental Authority"
+ short_name = "SifGov"
+ desc = "SifGov is the sole governing administration for the Vir system, based in New Reykjavik, Sif. It is a representative \
+ democratic government, and a fully recognized member of the Solar Confederate Government. Anyone operating inside of Vir must \
+ comply with SifGov's legislation and regulations."
+ history = "" // Todo like the rest of them
+ work = "governing body of Sif"
+ headquarters = "New Reykjavik, Sif"
+ motto = ""
+ autogenerate_destination_names = FALSE
+
+ ship_prefixes = list("SGA" = "hauling", "SGA" = "energy relay")
+ destination_names = list(
+ "New Reykjavik on Sif",
+ "Radiance Energy Chain",
+ "a dockyard orbiting Sif",
+ "a telecommunications satellite",
+ "Vir Interstellar Spaceport"
+ )
+
+/datum/lore/organization/gov/solgov
+ name = "Solar Confederate Government"
+ short_name = "SolGov"
+ acronym = "SCG"
+ desc = "SolGov is a decentralized confederation of human governmental entities based on Luna, Sol, which defines top-level law for their member states. \
+ Member states receive various benefits such as defensive pacts, trade agreements, social support and funding, and being able to participate \
+ in the Colonial Assembly. The majority, but not all human territories are members of SolGov. As such, SolGov is a major power and \
+ defacto represents humanity on the galactic stage."
+ history = "" // Todo
+ work = "governing polity of humanity's Confederation"
+ headquarters = "Luna"
+ motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'.
+ autogenerate_destination_names = TRUE
+
+ ship_prefixes = list("SCG-T" = "transportation", "SCG-D" = "diplomatic", "SCG-F" = "freight")
+ destination_names = list(
+ "Venus",
+ "Earth",
+ "Luna",
+ "Mars",
+ "Titan"
+ )
\ No newline at end of file
diff --git a/code/modules/fancytitle/fancytitle.dm b/code/modules/fancytitle/fancytitle.dm
index e445024aae1..e85f1f59ec5 100644
--- a/code/modules/fancytitle/fancytitle.dm
+++ b/code/modules/fancytitle/fancytitle.dm
@@ -11,7 +11,7 @@
else if(L.len > 1)
if(use_rare_screens && lowertext(L[1]) == "rare")
title_screens += S
- else if(lowertext(L[1]) == lowertext(MAP_NAME))
+ else if(using_map && (lowertext(L[1]) == lowertext(using_map.name)))
title_screens += S
if(!isemptylist(title_screens))
diff --git a/code/modules/map_fluff/cyberiad.dm b/code/modules/map_fluff/cyberiad.dm
new file mode 100644
index 00000000000..e0865f6fb1d
--- /dev/null
+++ b/code/modules/map_fluff/cyberiad.dm
@@ -0,0 +1,10 @@
+/datum/map/cyberiad
+ name = "Cyberiad"
+ full_name = "NSS Cyberiad"
+
+ station_name = "NSS Cyberiad"
+ station_short = "Cyberiad"
+ dock_name = "NAS Trurl"
+ company_name = "Nanotrasen"
+ company_short = "NT"
+ starsys_name = "Epsilon Eridani "
diff --git a/code/modules/map_fluff/maps.dm b/code/modules/map_fluff/maps.dm
new file mode 100644
index 00000000000..638baffde73
--- /dev/null
+++ b/code/modules/map_fluff/maps.dm
@@ -0,0 +1,12 @@
+var/datum/map/using_map = new USING_MAP_DATUM
+
+/datum/map
+ var/name = "Unnamed Map"
+ var/full_name = "Unnamed Map"
+
+ var/station_name = "BAD Station"
+ var/station_short = "Baddy"
+ var/dock_name = "THE PirateBay"
+ var/company_name = "BadMan"
+ var/company_short = "BM"
+ var/starsys_name = "Dull Star"
\ No newline at end of file
diff --git a/code/modules/map_fluff/metastation.dm b/code/modules/map_fluff/metastation.dm
new file mode 100644
index 00000000000..c7cd42cca8f
--- /dev/null
+++ b/code/modules/map_fluff/metastation.dm
@@ -0,0 +1,10 @@
+/datum/map/metastation
+ name = "MetaStation"
+ full_name = "MetaStation"
+
+ station_name = "MetaStation"
+ station_short = "MetaStation"
+ dock_name = "NAS Trurl"
+ company_name = "Nanotrasen"
+ company_short = "NT"
+ starsys_name = "Epsilon Eridani "
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index 8b749a67903..96b0486688a 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -178,7 +178,7 @@ nanoui is used to open and update nano browser uis
var/name = "[src_object]"
var/list/config_data = list(
"title" = title,
- "map" = MAP_NAME,
+ "map" = (using_map && using_map.name) ? using_map.name : "Unknown",
"srcObject" = list("name" = name),
"stateKey" = state_key,
"status" = status,
diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm
index 42bfb39b4eb..fa1e6b6c841 100644
--- a/code/modules/security_levels/security levels.dm
+++ b/code/modules/security_levels/security levels.dm
@@ -119,6 +119,11 @@
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta")
+ if(level >= SEC_LEVEL_RED)
+ atc.reroute_traffic(yes = TRUE) // Tell them fuck off we're busy.
+ else
+ atc.reroute_traffic(yes = FALSE)
+
else
return
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 3d459dd08a4..ab37aa18651 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -150,6 +150,12 @@
emergency_shuttle_called.Announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][shuttle_master.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]")
+ if(reason == "Automatic Crew Transfer" && signalOrigin == null) // Best way we have to check that it's actually a crew transfer and not just a player using the same message- any other calls to this proc should have a signalOrigin.
+ atc.shift_ending()
+ else // Emergency shuttle call (probably)
+ atc.reroute_traffic(yes = TRUE)
+
+
/obj/docking_port/mobile/emergency/cancel(area/signalOrigin)
if(!canRecall)
return
diff --git a/code/world.dm b/code/world.dm
index 34d61dbbc21..7b2db832ea1 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -63,11 +63,10 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
master_controller.setup()
sleep_offline = 1
- #ifdef MAP_NAME
- map_name = "[MAP_NAME]"
- #else
- map_name = "Unknown"
- #endif
+ if(using_map && using_map.name)
+ map_name = "[using_map.name]"
+ else
+ map_name = "Unknown"
diff --git a/nano/templates/comm_console.tmpl b/nano/templates/comm_console.tmpl
index 062c8d844f3..63f85e57e60 100644
--- a/nano/templates/comm_console.tmpl
+++ b/nano/templates/comm_console.tmpl
@@ -1,4 +1,4 @@
-
@@ -57,7 +57,7 @@ Used In File(s): /code/game/machinery/computers/communications.dm