diff --git a/code/controllers/Processes/bot.dm b/code/controllers/Processes/bot.dm
index a3cc23ce392..b93324d0901 100644
--- a/code/controllers/Processes/bot.dm
+++ b/code/controllers/Processes/bot.dm
@@ -1,11 +1,20 @@
+/datum/controller/process/bot
+ var/tmp/datum/updateQueue/updateQueueInstance
+
/datum/controller/process/bot/setup()
- name = "bot controller"
+ name = "bot"
schedule_interval = 20 // every 2 seconds
+ updateQueueInstance = new
+
+/datum/controller/process/bot/started()
+ ..()
+ if(!updateQueueInstance)
+ if(!aibots)
+ aibots = list()
+ else if(aibots.len)
+ updateQueueInstance = new
/datum/controller/process/bot/doWork()
- for(var/obj/machinery/bot/Bot in aibots)
- if(!Bot.gc_destroyed)
- spawn(0)
- Bot.bot_process()
- continue
- aibots -= Bot
\ No newline at end of file
+ if(updateQueueInstance)
+ updateQueueInstance.init(aibots, "bot_process")
+ updateQueueInstance.Run()
diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm
index 72bc01613d2..9948ef18ea6 100644
--- a/code/controllers/Processes/event.dm
+++ b/code/controllers/Processes/event.dm
@@ -1,5 +1,5 @@
/datum/controller/process/event/setup()
- name = "event controller"
+ name = "event"
schedule_interval = 20 // every 2 seconds
/datum/controller/process/event/doWork()
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index abd64146b1f..4f8af67358b 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -12,6 +12,7 @@
desc = "Completely shuts down the speech center of the subject's brain."
activation_message = "You feel unable to express yourself at all."
deactivation_message = "You feel able to speak freely again."
+ sdisability = 1
New()
..()
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 887cc3bd25f..de53e009d89 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -1,9 +1,9 @@
/obj/item/device/radio/headset
name = "radio headset"
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys."
+ desc = "An updated, modular intercom that fits over the head. Takes encryption keys"
+ var/radio_desc = ""
icon_state = "headset"
item_state = "headset"
- g_amt = 0
m_amt = 75
subspace_transmission = 1
canhear_range = 0 // can't hear headsets from very far away
@@ -15,13 +15,38 @@
var/obj/item/device/encryptionkey/keyslot2 = null
maxf = 1489
+ var/ks1type = /obj/item/device/encryptionkey
+ var/ks2type = null
+
/obj/item/device/radio/headset/New()
..()
- recalculateChannels()
+ if(ks1type)
+ keyslot1 = new ks1type(src)
+ if(ks2type)
+ keyslot2 = new ks2type(src)
+ recalculateChannels(1)
+/obj/item/device/radio/headset/examine(mob/user)
+ if(!(..(user, 1) && radio_desc))
+ return
+
+ user << "The following channels are built-in:"
+ user << radio_desc
+
+/obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel)
+ if (channel == "special")
+ if (translate_binary)
+ var/datum/language/binary = all_languages["Robot Talk"]
+ binary.broadcast(M, message)
+ if (translate_hive)
+ var/datum/language/hivemind = all_languages["Hivemind"]
+ hivemind.broadcast(M, message)
+ return null
+
+ return ..()
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
- if(aiOverride)
+ if (aiOverride)
return ..(freq, level)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
@@ -38,223 +63,213 @@
/obj/item/device/radio/headset/syndicate
origin_tech = "syndicate=3"
+ syndie = 1
+ ks1type = /obj/item/device/encryptionkey/syndicate
/obj/item/device/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
- desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking."
+ desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs."
flags = EARBANGPROTECT
origin_tech = "syndicate=3"
icon_state = "syndie_headset"
item_state = "syndie_headset"
-/obj/item/device/radio/headset/syndicate/New()
- ..()
- del(keyslot1)
- keyslot1 = new /obj/item/device/encryptionkey/syndicate
- syndie = 1
- recalculateChannels()
-
/obj/item/device/radio/headset/binary
origin_tech = "syndicate=3"
-/obj/item/device/radio/headset/binary/New()
- ..()
- del(keyslot1)
- keyslot1 = new /obj/item/device/encryptionkey/binary
- recalculateChannels()
-
+ ks1type = /obj/item/device/encryptionkey/binary
+
/obj/item/device/radio/headset/headset_sec
name = "security radio headset"
- desc = "This is used by your elite security force. To access the security channel, use :s."
+ desc = "This is used by your elite security force."
icon_state = "sec_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_sec
+ ks2type = /obj/item/device/encryptionkey/headset_sec
/obj/item/device/radio/headset/headset_sec/alt
name = "security bowman headset"
- desc = "This is used by your elite security force. Protects ears from flashbangs. \nTo access the security channel, use :s."
+ desc = "This is used by your elite security force. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "sec_headset_alt"
item_state = "sec_headset_alt"
/obj/item/device/radio/headset/headset_eng
name = "engineering radio headset"
- desc = "When the engineers wish to chat like girls. To access the engineering channel, use :e. "
+ desc = "When the engineers wish to chat like girls."
icon_state = "eng_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_eng
+ ks2type = /obj/item/device/encryptionkey/headset_eng
/obj/item/device/radio/headset/headset_rob
name = "robotics radio headset"
- desc = "Made specifically for the roboticists who cannot decide between departments. To access the engineering channel, use :e. For research, use :n."
+ desc = "Made specifically for the roboticists who cannot decide between departments."
icon_state = "rob_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_rob
+ ks2type = /obj/item/device/encryptionkey/headset_rob
/obj/item/device/radio/headset/headset_med
name = "medical radio headset"
- desc = "A headset for the trained staff of the medbay. To access the medical channel, use :m."
+ desc = "A headset for the trained staff of the medbay."
icon_state = "med_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_med
+ ks2type = /obj/item/device/encryptionkey/headset_med
/obj/item/device/radio/headset/headset_sci
name = "science radio headset"
- desc = "A sciency headset. Like usual. To access the science channel, use :n."
+ desc = "A sciency headset. Like usual."
icon_state = "sci_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_sci
+ ks2type = /obj/item/device/encryptionkey/headset_sci
/obj/item/device/radio/headset/headset_medsci
name = "medical research radio headset"
- desc = "A headset that is a result of the mating between medical and science. To access the medical channel, use :m. For science, use :n."
+ desc = "A headset that is a result of the mating between medical and science."
icon_state = "medsci_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_medsci
+ ks2type = /obj/item/device/encryptionkey/headset_medsci
/obj/item/device/radio/headset/headset_com
name = "command radio headset"
- desc = "A headset with a commanding channel. To access the command channel, use :c."
+ desc = "A headset with a commanding channel."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_com
+ ks2type = /obj/item/device/encryptionkey/headset_com
/obj/item/device/radio/headset/heads/captain
name = "captain's headset"
- desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :z - service, :m - medical, :n - science."
+ desc = "The headset of the boss."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/captain
+ ks2type = /obj/item/device/encryptionkey/heads/captain
/obj/item/device/radio/headset/heads/captain/alt
name = "\proper the captain's bowman headset"
- desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :z - service, :m - medical, :n - science."
+ desc = "The headset of the boss. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/device/radio/headset/heads/rd
name = "Research Director's headset"
- desc = "Headset of the researching God. To access the science channel, use :n. For command, use :c."
+ desc = "Headset of the researching God."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/rd
+ ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
name = "head of security's headset"
- desc = "The headset of the man who protects your worthless lifes. To access the security channel, use :s. For command, use :c."
+ desc = "The headset of the man who protects your worthless lives."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/hos
+ ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/hos/alt
name = "\proper the head of security's bowman headset"
- desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs. \nTo access the security channel, use :s. For command, use :c."
+ desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/device/radio/headset/heads/ce
name = "chief engineer's headset"
- desc = "The headset of the guy who is in charge of morons. To access the engineering channel, use :e. For command, use :c."
+ desc = "The headset of the guy who is in charge of morons."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/ce
+ ks2type = /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/cmo
name = "chief medical officer's headset"
- desc = "The headset of the highly trained medical chief. To access the medical channel, use :m. For command, use :c."
+ desc = "The headset of the highly trained medical chief."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/cmo
+ ks2type = /obj/item/device/encryptionkey/heads/cmo
/obj/item/device/radio/headset/heads/hop
name = "head of personnel's headset"
- desc = "The headset of the guy who will one day be captain. Channels are as follows: :u - supply, :z - service, :s - security, :c - command."
+ desc = "The headset of the guy who will one day be captain."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/hop
+ ks2type = /obj/item/device/encryptionkey/heads/hop
/*
/obj/item/device/radio/headset/headset_mine
name = "mining radio headset"
- desc = "Headset used by miners. How useless. To access the mining channel, use :d."
+ desc = "Headset used by miners. How useless."
icon_state = "mine_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_mine
+ ks2type = /obj/item/device/encryptionkey/headset_mine
/obj/item/device/radio/headset/heads/qm
name = "quartermaster's headset"
- desc = "The headset of the man who control your toiletpaper supply. To access the cargo channel, use :q. For mining, use :d."
+ desc = "The headset of the man who control your toiletpaper supply."
icon_state = "cargo_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/qm
+ ks2type = /obj/item/device/encryptionkey/heads/qm
*/
/obj/item/device/radio/headset/headset_cargo
name = "supply radio headset"
- desc = "A headset used by the cargo department. To access the supply channel, use :u."
+ desc = "A headset used by the cargo department."
icon_state = "cargo_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_cargo
+ ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_service
name = "service radio headset"
- desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean. To access the service channel, use :z."
+ desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean."
icon_state = "srv_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/headset_service
+ ks2type = /obj/item/device/encryptionkey/headset_service
/obj/item/device/radio/headset/heads/ntrep
name = "nanotrasen representative's headset"
- desc = "The headset of the Nanotrasen Representative. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :z - service, :m - medical, :n - science."
+ desc = "The headset of the Nanotrasen Representative."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/ntrep
+ ks2type = /obj/item/device/encryptionkey/heads/ntrep
/obj/item/device/radio/headset/heads/magistrate
name = "magistrate's headset"
- desc = "The headset of the Magistrate. Channels are as follows: :c - command, :s - security."
+ desc = "The headset of the Magistrate."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/magistrate
+ keyslot1 = /obj/item/device/encryptionkey/heads/magistrate
/obj/item/device/radio/headset/heads/blueshield
name = "blueshield's headset"
- desc = "The headset of the Blueshield. Channels are as follows: :c - command, :s - security."
+ desc = "The headset of the Blueshield."
icon_state = "com_headset"
item_state = "headset"
- keyslot1 = new /obj/item/device/encryptionkey/heads/blueshield
+ ks2type = /obj/item/device/encryptionkey/heads/blueshield
/obj/item/device/radio/headset/ert
name = "emergency response team headset"
- desc = "The headset of the boss's boss. Channels are as follows: :h - Response Team :c - command, :s - security, :e - engineering, :d - mining, :u - cargo, :z - service, :m - medical, :n - science."
+ desc = "The headset of the boss's boss."
icon_state = "com_headset"
item_state = "headset"
freerange = 1
- keyslot1 = new /obj/item/device/encryptionkey/ert
+ ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset/ert/alt
name = "\proper emergency response team's bowman headset"
- desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :h - Response Team, :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
+ desc = "The headset of the boss. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
-//The below was ported from Baystation.
/obj/item/device/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway.
- name = "AI Subspace Transceiver"
+ name = "\improper AI subspace transceiver"
desc = "Integrated AI radio transceiver."
icon = 'icons/obj/robot_component.dmi'
icon_state = "radio"
item_state = "headset"
- keyslot2 = new /obj/item/device/encryptionkey/heads/ai_integrated
- var/myAi = null // Atlantis: Reference back to the AI which has this radio.
+ ks2type = /obj/item/device/encryptionkey/heads/ai_integrated
+ var/myAi = null // Atlantis: Reference back to the AI which has this radio.
var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu.
/obj/item/device/radio/headset/heads/ai_integrated/receive_range(freq, level)
- if(disabledAi)
+ if (disabledAi)
return -1 //Transciever Disabled.
return ..(freq, level, 1)
-/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ ))))
@@ -287,7 +302,7 @@
user << "You pop out the encryption keys in the headset!"
else
- user << "This headset doesn't have any unique encryption keys! How useless..."
+ user << "This headset doesn't have any encryption keys! How useless..."
if(istype(W, /obj/item/device/encryptionkey/))
if(keyslot1 && keyslot2)
@@ -310,7 +325,7 @@
return
-/obj/item/device/radio/headset/proc/recalculateChannels()
+/obj/item/device/radio/headset/proc/recalculateChannels(var/setDescription = 0)
src.channels = list()
src.translate_binary = 0
src.translate_hive = 0
@@ -358,4 +373,19 @@
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+ if(setDescription)
+ setupRadioDescription()
+
return
+
+/obj/item/device/radio/headset/proc/setupRadioDescription()
+ var/radio_text = ""
+ for(var/i = 1 to channels.len)
+ var/channel = channels[i]
+ var/key = get_radio_key_from_channel(channel)
+ radio_text += "[key] - [channel]"
+ if(i != channels.len)
+ radio_text += ", "
+
+ radio_desc = radio_text
+
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 07af614f498..952b939cfc6 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -279,28 +279,28 @@
message_admins("\blue [key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1)
switch(href_list["simplemake"])
- if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob )
- if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob )
- if("hunter") M.change_mob_type( /mob/living/carbon/alien/humanoid/hunter , null, null, delmob )
- if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob )
- if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob )
- if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
- if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob )
- if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob )
- if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
- if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
- if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob )
- if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob )
- if("corgi") M.change_mob_type( /mob/living/simple_animal/corgi , null, null, delmob )
- if("ian") M.change_mob_type( /mob/living/simple_animal/corgi/Ian , null, null, delmob )
- if("crab") M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob )
- if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob )
- if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob )
- if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob )
- if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob )
- if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob )
- if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob )
- if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob )
+ if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob, 1 )
+ if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob, 1 )
+ if("hunter") M.change_mob_type( /mob/living/carbon/alien/humanoid/hunter , null, null, delmob, 1 )
+ if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
+ if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
+ if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
+ if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob, 1 )
+ if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
+ if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob, 1 )
+ if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
+ if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob, 1 )
+ if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob, 1 )
+ if("corgi") M.change_mob_type( /mob/living/simple_animal/corgi , null, null, delmob, 1 )
+ if("ian") M.change_mob_type( /mob/living/simple_animal/corgi/Ian , null, null, delmob, 1 )
+ if("crab") M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob, 1 )
+ if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 )
+ if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 )
+ if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob, 1 )
+ if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob, 1 )
+ if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob, 1 )
+ if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob, 1 )
+ if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 )
/////////////////////////////////////new ban stuff
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index cf3e5d951f9..da234e27680 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -2,20 +2,17 @@
set category = "Special Verbs"
set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite
set hidden = 1
-
if(!check_rights(R_ADMIN)) return
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
if(!msg) return
log_admin("[key_name(src)] : [msg]")
- var/color = "admin"
+
if(check_rights(R_ADMIN,0))
- color = "adminchat"
- msg = "ADMIN: [key_name(usr, 1)] (JMP): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
- C << msg
+ C << "ADMIN: [key_name(usr, 1)] (JMP): [msg]"
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -31,13 +28,11 @@
if (!msg)
return
- var/color = "mod"
- if (check_rights(R_ADMIN,0))
- color = "adminmod"
- var/channel = "MOD:"
- if(config.mods_are_mentors)
- channel = "MENTOR:"
+ var/spanclass = "mod_channel"
+ if(check_rights(R_ADMIN, 0))
+ spanclass = "mod_channel_admin"
for(var/client/C in admins)
- if((R_ADMIN|R_MOD) & C.holder.rights)
- C << "[channel] [key_name(src,1)] (JMP): [msg]"
+ C << "MOD: [key_name(usr, 1)] (JMP): [msg]"
+
+ feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 1fe7e90105f..1a4da3d8c58 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -18,12 +18,13 @@
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
return
-
var/stafftype = null
- if(src.holder.rights & R_MOD && !(src.holder.rights & R_ADMIN))
- stafftype = "MENTOR"
+ if (src.holder.rights & R_MOD)
+ stafftype = "MOD"
+ if (src.holder.rights & R_MENTOR)
+ stafftype = "MENTOR"
if (src.holder.rights & R_ADMIN)
stafftype = "ADMIN"
@@ -34,16 +35,6 @@
if (!msg)
return
- var/rendered = "DEAD: [stafftype] says, \"[msg]\""
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
-
- if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to admins who have deadchat toggled on
- M.show_message(rendered, 2)
-
- else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
- M.show_message(rendered, 2)
+ say_dead_direct("[stafftype] ([src.holder.fakekey ? src.holder.fakekey : src.key]) says, \"[msg]\"")
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f86d222a4a4..e21f3c11dc5 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1100,7 +1100,7 @@ datum/preferences
b_type = new_b_type
if("hair")
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell")
+ if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null
if(new_hair)
r_hair = hex2num(copytext(new_hair, 2, 4))
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 15cd226ec68..e6ed1ccde84 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -10,6 +10,8 @@
act = copytext(act,1,length(act))
var/muzzled = is_muzzled()
+ if(sdisabilities & MUTE || silent)
+ muzzled = 1
//var/m_type = 1
for (var/obj/item/weapon/implant/I in src)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 007281ec5cf..5808034d020 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -136,7 +136,7 @@
update_inv_glasses(0)
else if(I == head)
head = null
- if(I.flags & BLOCKHAIR)
+ if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair(0) //rebuild hair
update_inv_head(0)
else if(I == r_ear)
@@ -153,7 +153,7 @@
update_inv_belt(0)
else if(I == wear_mask)
wear_mask = null
- if(I.flags & BLOCKHAIR)
+ if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair(0) //rebuild hair
if(internal)
if(internals)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index c805cd8a6d2..1eda618789a 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -16,8 +16,8 @@
if(stat == 2)
return say_dead(message)
return
-
- if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
+
+ if (is_muzzled())
src << "You're muzzled and cannot speak!"
return
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 1fa969883f0..6a99f2fbb23 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -419,8 +419,8 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
return
- //masks and helmets can obscure our hair.
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ //masks and helmets can obscure our hair, unless we're a synthetic
+ if(!(species.flags & IS_SYNTHETIC) && (head && (head.flags & BLOCKHAIR)) || !(species.flags & IS_SYNTHETIC) && (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -438,7 +438,7 @@ proc/get_damage_icon_part(damage_state, body_part)
else
//warning("Invalid f_style for [species.name]: [f_style]")
- if(h_style && !(head && (head.flags & BLOCKHEADHAIR)))
+ if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(species.flags & IS_SYNTHETIC)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
if(hair_style && hair_style.species_allowed)
if(src.species.name in hair_style.species_allowed)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 45f6068f963..26d57d9d4cc 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -93,79 +93,6 @@
/mob/living/silicon/robot/drone/pick_module()
return
-//Drones can only use binary and say emotes. NOTHING else.
-//TBD, fix up boilerplate. ~ Z
-/mob/living/silicon/robot/drone/say(var/message)
- if (!message)
- return
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- src << "You cannot send IC messages (muted)."
- return
- if (src.client.handle_spam_prevention(message,MUTE_IC))
- return
-
- if (stat == 2)
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
- return say_dead(message)
-
- //Must be concious to speak
- if (stat)
- return
-
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
-
- if (length(message) >= 2)
- var/prefix = copytext(message, 1, 3)
- if (department_radio_keys[prefix] == "drone")
- message = copytext(message, 3)
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
-
- if(istype(src, /mob/living/silicon/robot/drone))
- var/mob/living/silicon/robot/drone/R = src
- if(!R.is_component_functioning("comms"))
- src << "\red Your drone communications component isn't functional."
- return
- drone_talk(message)
- else
- var/list/listeners = hearers(5,src)
- listeners |= src
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
- for(var/mob/living/silicon/D in listeners)
- if(D.client)
- D << "[src] transmits, \"[message]\""
-
- for (var/mob/M in player_list)
- if (!M.client)
- continue
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client)
- M << "[src] (Follow) transmits, \"[message]\""
- else if(M.stat == 2 && src.client && M in listeners)
- M << "[src] (Follow) transmits, \"[message]\""
-
-/mob/living/proc/drone_talk(var/message)
- log_say("[key_name(src)] : [message]")
- message = trim(message)
-
- if (!message)
- return
-
- var/message_a = say_quote(message)
- var/rendered = "Drone Talk, [name] [message_a]"
-
- for (var/mob/living/S in living_mob_list)
- if(istype(S, /mob/living/silicon/robot/drone))
- S.show_message(rendered, 2)
-
- for (var/mob/S in dead_mob_list)
- if(!istype(S,/mob/new_player) && !istype(S,/mob/living/carbon/brain))
- var/rendered2 = "Drone Talk, [name] (Follow) [message_a]"
- S.show_message(rendered2, 2)
-
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 144790401d0..7082e7fa656 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -913,6 +913,9 @@ var/list/slot_equipment_priority = list( \
process = processScheduler.getProcess("obj")
stat(null, "OBJ([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
+
+ process = processScheduler.getProcess("bot")
+ stat(null, "BOT([aibots.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
process = processScheduler.getProcess("pipenet")
stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]")
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 74ebd7eeefc..cf334f54def 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -477,7 +477,7 @@ var/list/intents = list("help","disarm","grab","harm")
name = realname
for(var/mob/M in player_list)
- if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && M.client.holder.rights == R_MOD)) && (M.client.prefs.toggles & CHAT_DEAD))
+ if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && (M.client.holder.rights & R_MOD))) && (M.client.prefs.toggles & CHAT_DEAD))
var/follow
var/lname
if(subject)
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index 399eeb1c83e..33428a9c096 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -2,7 +2,7 @@
//This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables.
//Returns the new mob
//Note that this proc does NOT do MMI related stuff!
-/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num)
+/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/forcekey = 0)
if(istype(src,/mob/new_player))
usr << "\red cannot convert players who have not entered yet."
@@ -43,7 +43,7 @@
if(src.dna)
M.dna = src.dna.Clone()
- if(mind && istype(M, /mob/living))
+ if((mind && istype(M, /mob/living)) && !forcekey)
mind.transfer_to(M)
else
M.key = key
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index dc92c41d718..138fd093eaf 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -12,8 +12,14 @@ var/global/image/typing_indicator
if(!typing_indicator)
typing_indicator = image('icons/mob/talk.dmi',null,"typing")
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ if(H.sdisabilities & MUTE || H.silent)
+ overlays -= typing_indicator
+ return
+
if(client)
- if((client.prefs.toggles & SHOW_TYPING) || stat != CONSCIOUS)
+ if((client.prefs.toggles & SHOW_TYPING) || stat != CONSCIOUS || is_muzzled())
overlays -= typing_indicator
else
if(state)
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 9752c68e886..af3e1bfa1b8 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -36,6 +36,9 @@ em {font-style: normal; font-weight: bold;}
.sciradio {color: #993399;}
.supradio {color: #5F4519;}
.srvradio {color: #6eaa2c;}
+.admin_channel {color: #9A04D1; font-weight: bold;}
+.mod_channel {color: #402A14; font-weight: bold;}
+.mod_channel_admin {color: #402A14; font-weight: bold;}
.alert {color: #ff0000;}
h1.alert, h2.alert {color: #000000;}
@@ -60,8 +63,6 @@ h1.alert, h2.alert {color: #000000;}
.mod {color: #735638; font-weight: bold;}
.modooc {color: #184880; font-weight: bold;}
-.adminchat {color: #9A04D1; font-weight: bold;}
-.adminmod {color: #402A14; font-weight: bold;}
.alien {color: #543354;}
.noticealien {color: #00c000;}
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 580d4203a68..94578207e79 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -8674,8 +8674,8 @@
"dkP" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = null; req_access_txt = "13"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"dkQ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom)
"dkR" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
-"dkS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
-"dkT" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = -4; req_access_txt = "101"},/obj/machinery/door/window/southleft{dir = 1; name = "Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"dkS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/evac)
+"dkT" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = -4; req_access_txt = "101"},/obj/machinery/door/window/southleft{dir = 1; name = "security checkpoint"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"dkU" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/evac)
"dkV" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"dkW" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
@@ -8688,8 +8688,8 @@
"dld" = (/obj/structure/stool/bed/chair,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; pixel_x = 0; pixel_y = 25; req_access_txt = "101"; req_one_access_txt = "0"; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"dle" = (/obj/structure/stool/bed/chair,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; pixel_x = 25; pixel_y = -8; req_access_txt = "101"; req_one_access_txt = "0"; tag_door = "specops_shuttle_port_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"dlf" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
-"dlg" = (/obj/machinery/door/window/westright{req_access_txt = "101"},/obj/structure/table/reinforced{icon_state = "reinf_tabledir"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
-"dlh" = (/obj/machinery/door/window/eastleft{req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"dlg" = (/obj/machinery/door/window/westright{name = "security checkpoint"; req_access_txt = "101"},/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
+"dlh" = (/obj/machinery/door/window/eastleft{name = "security checkpoint"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"dli" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom)
"dlj" = (/obj/machinery/computer/robotics,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"dlk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
@@ -8698,7 +8698,7 @@
"dln" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_port_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = null; req_access_txt = "101"},/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom)
"dlo" = (/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom)
"dlp" = (/turf/unsimulated/floor{icon_state = "green"; dir = 10},/area/centcom/evac)
-"dlq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
+"dlq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
"dlr" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"dls" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom)
"dlt" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape/centcom)
@@ -8709,9 +8709,9 @@
"dly" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"dlz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom)
"dlA" = (/obj/machinery/door/poddoor{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac)
-"dlB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
-"dlC" = (/obj/structure/table/reinforced{icon_state = "reinf_tabledir"},/obj/machinery/door/window/southleft{name = "Security"; req_access_txt = ""},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
-"dlD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
+"dlB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
+"dlC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac)
+"dlD" = (/obj/structure/table,/obj/machinery/door/window/southleft{name = "security checkpoint"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac)
"dlE" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
"dlF" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac)
"dlG" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
@@ -12559,6 +12559,7 @@
"eHA" = (/obj/structure/table,/obj/item/weapon/card/id/silver{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id/captains_spare,/obj/item/weapon/card/id/fluff/lifetime{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"eHB" = (/obj/machinery/account_database{name = "Admin Accounts Database"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"eHC" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
+"eHD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area)
"eHF" = (/obj/machinery/door_control{id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; req_access_txt = "101"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"eHG" = (/obj/machinery/door/poddoor/preopen{id = "adminshuttleblast"; name = "Blast Doors"; req_access_txt = "101"},/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
@@ -12971,17 +12972,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfTdfTdfTdfTdfTdfTdfTaaaaaaaaaaaadkAdkBdkCdkAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHdkIdkDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkcdkJdkKdkLdkKdkMdkcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkNdkOdkOdkOdkOdkPdkPdkOdkOdkQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkRdkSdkTdkSdkUdkDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkbdkndkVdkLdkLdkLdkWdkpdkdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkXdkYdkZdladlbdlcdlcdlddledkOdkQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdlfdlgdkGdlhdkUdkDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlidljdlkdkLdkLdkLdlldkLdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkXdkYdlmdlcdlcdlcdlcdlcdlcdlndlodfTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdlpdlqdlrdlqdlqdkDdkDdkDdkDdkDdkDdkDdkDdkDaaaaaadkbdlsdltdlsdlsdlsdludlsdlvdlsdltdlsdkdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkXdkYdlcdlydlydlydlydlydlydkOdlzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkDdlAdlBdlCdlBdkEdkIdlDdlEdlEdlFdlEdlEdlFdkDaaaaaadlidlGdlHdlIdlJdlGdkLdlIdlJdlGdlHdlIdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlKdkOdkOdkOdkOdkOdkOdkOdkOdlzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlLdkEdlMdlMdlMdlMdkFdkUdlDdlEdkDdlNdlOdlOdlPdkDaaaaaadlidlQdkLdlIdlRdlGdkLdlIdlRdlGdkLdlSdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlTdlfdlUdlVdkGdlUdlVdkUdlDdlEdkDdlWdlWdlWdlWdkDaaaaaadkcdlGdkLdlIdlRdlGdkLdlIdlRdlGdkLdlIdkcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlXdlYdlZdmadmbdlwdlwdlwaaadlxdlxdlxdlXdlYdlZdmadmbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlTdlfdlUdlVdkGdlUdlVdkUdlBdlEdkDdkGdkGdkGdmcdmddlOdlPdlidlGdkLdlIdmedlGdkLdlIdmedlGdkLdlIdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdmgdmgdmgdmhdmidmjdmidmidmidmkdmidmldmgdmgdmgdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkXdkYdlmdlcdlcdlcdlcdlcdlcdlndlodfTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdlpdlqdlrdlBdlPdkDdkDdkDdkDdkDdkDdkDdkDdkDaaaaaadkbdlsdltdlsdlsdlsdludlsdlvdlsdltdlsdkdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkXdkYdlcdlydlydlydlydlydlydkOdlzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkDdlAdlCdlDdlCdkEdkIdlqdlEdlEdlFdlEdlEdlFdkDaaaaaadlidlGdlHdlIdlJdlGdkLdlIdlJdlGdlHdlIdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlKdkOdkOdkOdkOdkOdkOdkOdkOdlzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlLdkEdlMdlMdlMdlMdkFdkUdlTdlEdkDdlNdlOdlOdlPdkDaaaaaadlidlQdkLdlIdlRdlGdkLdlIdlRdlGdkLdlSdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlwdlwdlwaaadlxdlxdlxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlTdlfdlUdlVdkGdlUdlVdkUdlTdlEdkDdlWdlWdlWdlWdkDaaaaaadkcdlGdkLdlIdlRdlGdkLdlIdlRdlGdkLdlIdkcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlXdlYdlZdmadmbdlwdlwdlwaaadlxdlxdlxdlXdlYdlZdmadmbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlTdlfdlUdlVdkGdlUdlVdkUdlCdlEdkDdkGdkGdkGdmcdmddlOdlPdlidlGdkLdlIdmedlGdkLdlIdmedlGdkLdlIdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdmgdmgdmgdmhdmidmjdmidmidmidmkdmidmldmgdmgdmgdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlTdlfdlUdlVdkGdlUdlVdkUdmmdkSdkDdmndkGdkGdmodmpdmqdmpdmrdkLdkLdkLdkLdkLdkLdkLdkLdkLdkLdlIdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdmsdmsdmtdmudmvdmwdmxdmydmzdmAdmvdmBdmCdmsdmsdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmDdlfdlUdlVdkGdlUdlVdkUdmEdmqdmEdkGdkGdkGdmFdmddlOdlPdlidmGdkLdlIdlJdlGdkLdlIdlJdlGdkLdlSdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdmsdmsdmHdmIdmJdmKdmJdmLdmJdmKdmJdmMdmHdmsdmsdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdlpdmNdmNdmNdmOdkGdkUdmmdkSdkDdmndkGdkGdkGdkDaaaaaadlJdlGdkLdlIdlRdlGdkLdlIdlRdlGdkLdlIdlJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmPdmCdmsdmQdmJdmKdmKdmKdmKdmKdmKdmKdmJdmQdmsdmtdmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkDdkDdkDdmSdmTdkDdkDdlfdkGdkUdkSdlEdkDdkGdkGdkGdmUdkDaaaaaadlRdlGdkLdlIdlRdlGdkLdlIdlRdlGdkLdlIdlRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmPdmidmldmVdmWdmXdmYdmKdmZdnadmKdnbdmhdmidmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdncdnddnednfdnddnddkDdlfdkGdkUdmmdkSdkDdmndkGdkGdkGdkDaaaaaadmedlGdkLdlIdmedlGdkLdlIdmedlGdkLdlIdmeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdngdnhdnidnjdmKdmZdnadmKdmvdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdnkdnddnldnfdnddnddnmdlfdkGdkUdmEdmqdmEdkGdkGdkGdmcdmddlOdlPdlidnndkLdkLdkLdkLdkLdkLdkLdkLdkLdnodliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdnpdnqdnqdmYdmKdmZdnadmKdmJdmfdnrdnrdnrdnraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeHDdkDdnkdnddnldnfdnddnddnmdlfdkGdkUdmEdmqdmEdkGdkGdkGdmcdmddlOdlPdlidnndkLdkLdkLdkLdkLdkLdkLdkLdkLdnodliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdnpdnqdnqdmYdmKdmZdnadmKdmJdmfdnrdnrdnrdnraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdnsdnddntdnfdnddnddkDdlpdmNdnudkDdkDdkDdmndkGdkGdmodmpdmqdmpdmrdkLdkLdkLdkLdnvdkLdnvdkLdkLdkLdnodkcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdnwdnqdnqdnxdmKdmJdmJdmKdnydnzdnrdnrdnrdnraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdnsdnddnddnddnddnddkDdkDdnAdkDdkDdlEdkDdkGdkGdkGdmFdmddlOdlPdlidnBdnCdnDdkcdnEdkcdnEdkcdnFdnBdnCdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmhdmidmidmidmldmKdmZdnadmKdnGdmfdnrdnrdnrdnraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkDdkDdkDdkDdkDdkDdkDdkDdkDdkDdkDdkDdkDdmqdmqdmqdkDdlEdkDdlWdlWdlWdlWdkDaaaaaadlidnHdnIdnJdnKdliaaadlidnLdnMdnLdnLdliaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmfdnNdnNdnOdnPdmKdmZdnadmKdnQdmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/paradise.dme b/paradise.dme
index a60078bd76c..4dc32c86dca 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -189,7 +189,7 @@
#include "code\controllers\Processes\obj.dm"
#include "code\controllers\Processes\pipenet.dm"
#include "code\controllers\Processes\powernet.dm"
-#include "code\controllers\Processes\shuttle.dm"
+#include "code\controllers\Processes\Shuttle.dm"
#include "code\controllers\Processes\sun.dm"
#include "code\controllers\Processes\supply.dm"
#include "code\controllers\Processes\ticker.dm"