From 999291fc949145ca5bb9f829aa8e9e877f1fc445 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Dec 2015 14:15:43 +1030 Subject: [PATCH 01/55] Added minimum ages to head roles. --- code/game/jobs/job/captain.dm | 8 ++++++++ code/game/jobs/job/civilian.dm | 3 +++ code/game/jobs/job/engineering.dm | 5 +++++ code/game/jobs/job/job.dm | 2 ++ code/game/jobs/job/medical.dm | 3 +++ code/game/jobs/job/science.dm | 3 +++ code/game/jobs/job_controller.dm | 24 +++++++++--------------- 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 6c4e3b8f6ee..70b0dc75f48 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -18,6 +18,11 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) minimal_access = list() //See get_access() minimal_player_age = 14 economic_modifier = 20 + + minimum_character_age = 30 + ideal_character_age = 70 // Old geezer captains ftw + + equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) @@ -63,6 +68,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) req_admin_notify = 1 minimal_player_age = 10 economic_modifier = 10 + minimum_character_age = 23 + ideal_character_age = 50 + access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 5fe43b0a439..e6a0a779b71 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -101,6 +101,9 @@ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + minimum_character_age = 25 + ideal_character_age = 40 + equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 27cd6a753e5..ae57428972e 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -12,6 +12,11 @@ idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 economic_modifier = 10 + + minimum_character_age = 35 + ideal_character_age = 50 + + access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, access_sec_doors, diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index b84b673a40a..839870de91c 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -19,6 +19,8 @@ var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) var/department = null // Does this position have a department tag? var/head_position = 0 // Is this position Command? + var/minimum_character_age + var/ideal_character_age var/account_allowed = 1 // Does this job type come with a station account? var/economic_modifier = 2 // With how much does this job modify the initial account amount? diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 179a4c4fea5..1bc4ead4803 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -18,7 +18,10 @@ minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + minimal_player_age = 10 + minimum_character_age = 35 + ideal_character_age = 50 equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 05690d43390..cfa96d6af19 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -20,7 +20,10 @@ access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) + minimal_player_age = 14 + minimum_character_age = 35 + ideal_character_age = 50 equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 37f00428dd9..125c3a38bf5 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -137,30 +137,24 @@ var/global/datum/controller/occupations/job_master // Build a weighted list, weight by age. var/list/weightedCandidates = list() - - // Different head positions have different good ages. - var/good_age_minimal = 25 - var/good_age_maximal = 60 - if(command_position == "Captain") - good_age_minimal = 30 - good_age_maximal = 70 // Old geezer captains ftw - for(var/mob/V in candidates) // Log-out during round-start? What a bad boy, no head position for you! if(!V.client) continue var/age = V.client.prefs.age + + if(age < job.minimum_character_age) // Nope. + continue + switch(age) - if(good_age_minimal - 10 to good_age_minimal) + if(job.minimum_character_age to (job.minimum_character_age+10)) weightedCandidates[V] = 3 // Still a bit young. - if(good_age_minimal to good_age_minimal + 10) + if((job.minimum_character_age+10) to (job.ideal_character_age-10)) weightedCandidates[V] = 6 // Better. - if(good_age_minimal + 10 to good_age_maximal - 10) + if((job.ideal_character_age-10) to (job.ideal_character_age+10)) weightedCandidates[V] = 10 // Great. - if(good_age_maximal - 10 to good_age_maximal) + if((job.ideal_character_age+10) to (job.ideal_character_age+20)) weightedCandidates[V] = 6 // Still good. - if(good_age_maximal to good_age_maximal + 10) - weightedCandidates[V] = 6 // Bit old, don't you think? - if(good_age_maximal to good_age_maximal + 50) + if((job.ideal_character_age+20) to INFINITY) weightedCandidates[V] = 3 // Geezer. else // If there's ABSOLUTELY NOBODY ELSE From b2ab041c3f7bab3b99c1fab610fa40e8c82fae8e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Dec 2015 15:00:27 +1030 Subject: [PATCH 02/55] Added checks for character age to numerous jobs. --- code/game/jobs/job/assistant.dm | 2 ++ code/game/jobs/job/job.dm | 4 ++-- code/game/jobs/job_controller.dm | 18 +++++++++++++++--- .../preference_setup/occupation/occupation.dm | 3 +++ code/modules/mob/new_player/new_player.dm | 4 +++- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 19a578b3553..2bb17313354 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -12,6 +12,8 @@ access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident") + minimum_character_age = null + ideal_character_age = null /datum/job/assistant/equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 839870de91c..2f6ab796446 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -19,8 +19,8 @@ var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) var/department = null // Does this position have a department tag? var/head_position = 0 // Is this position Command? - var/minimum_character_age - var/ideal_character_age + var/minimum_character_age = 17 + var/ideal_character_age = 30 var/account_allowed = 1 // Does this job type come with a station account? var/economic_modifier = 2 // With how much does this job modify the initial account amount? diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 125c3a38bf5..122ca43aa32 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -49,9 +49,15 @@ var/global/datum/controller/occupations/job_master Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") if(player && player.mind && rank) var/datum/job/job = GetJob(rank) - if(!job) return 0 - if(jobban_isbanned(player, rank)) return 0 - if(!job.player_old_enough(player.client)) return 0 + if(!job) + return 0 + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + return 0 + if(jobban_isbanned(player, rank)) + return 0 + if(!job.player_old_enough(player.client)) + return 0 + var/position_limit = job.total_positions if(!latejoin) position_limit = job.spawn_positions @@ -82,6 +88,9 @@ var/global/datum/controller/occupations/job_master if(!job.player_old_enough(player.client)) Debug("FOC player not old enough, Player: [player]") continue + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + Debug("FOC character not old enough, Player: [player]") + continue if(flag && (!player.client.prefs.be_special & flag)) Debug("FOC flag failed, Player: [player], Flag: [flag], ") continue @@ -96,6 +105,9 @@ var/global/datum/controller/occupations/job_master if(!job) continue + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + continue + if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring! continue diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 561ffb3ec40..92c6320c646 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -89,6 +89,9 @@ var/available_in_days = job.available_in_days(user.client) . += "[rank] \[IN [(available_in_days)] DAYS]" continue + if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age)) + . += "[rank] \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]" + continue if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant")) . += "[rank]" continue diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ee5e786db8d..cb09a4a029d 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -375,9 +375,11 @@ else // Crew transfer initiated dat += "The station is currently undergoing crew transfer procedures.
" - dat += "Choose from the following open positions:
" + dat += "Choose from the following open/valid positions:
" for(var/datum/job/job in job_master.occupations) if(job && IsJobAvailable(job.title)) + if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age)) + continue var/active = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10) From af802266e415239846ce428c0f668560ec65aaf5 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 14 Dec 2015 20:20:35 +0000 Subject: [PATCH 03/55] Removes the else to properly for the switch statement, meaning that it no longer wipes your flavour text/thinks you're opening the general slot ever time. --- code/modules/client/preference_setup/general/06_flavor.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index 3c2d93073bf..6a02e3f7d71 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -42,10 +42,11 @@ . += "Set Robot Flavor Text
" /datum/category_item/player_setup_item/general/flavor/OnTopic(var/href,var/list/href_list, var/mob/user) + user << href_list["flavor_text"] if(href_list["flavor_text"]) switch(href_list["flavor_text"]) if("open") - else if("general") + if("general") var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(pref.flavor_texts[href_list["task"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg @@ -59,7 +60,7 @@ else if(href_list["flavour_text_robot"]) switch(href_list["flavour_text_robot"]) if("open") - else if("Default") + if("Default") var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg From 14bc2afe43d3988d997a1bbe36e56d12214b5130 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 14 Dec 2015 20:22:18 +0000 Subject: [PATCH 04/55] Removes errant debug line. --- code/modules/client/preference_setup/general/06_flavor.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index 6a02e3f7d71..120749cef70 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -42,7 +42,6 @@ . += "Set Robot Flavor Text
" /datum/category_item/player_setup_item/general/flavor/OnTopic(var/href,var/list/href_list, var/mob/user) - user << href_list["flavor_text"] if(href_list["flavor_text"]) switch(href_list["flavor_text"]) if("open") From 3e5436c4b763530527e8f028bc85eab1c93e0324 Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 14 Dec 2015 15:43:53 -0500 Subject: [PATCH 05/55] Upgrades communicators to NanoUI, adds a new EPv2 fake networking system, adds new semi-telecomms machine, lets communicators call ghosts, call other communicators, and have as many ghosts or communicators linked as the user desires. Adds preference option to remain invisible on communicator device searches. --- code/datums/EPv2.dm | 127 ++++ code/datums/locations/locations.dm | 20 +- code/datums/locations/vir.dm | 11 + code/game/machinery/exonet_node.dm | 173 +++++ code/game/machinery/newscaster.dm | 21 +- .../devices/communicator/communicator.dm | 683 +++++++++++++----- .../circuitboards/machinery/telecomms.dm | 16 +- .../global/04_communicators.dm | 26 + code/modules/client/preferences.dm | 3 + .../modules/events/communications_blackout.dm | 2 + code/modules/events/money_spam.dm | 6 + code/modules/examine/descriptions/devices.dm | 22 + .../modules/examine/descriptions/telecomms.dm | 36 + code/modules/mob/living/voice/voice.dm | 81 ++- code/modules/research/designs.dm | 7 + html/changelogs/neerti-communicators2.yml | 38 + icons/obj/stationobjs.dmi | Bin 88480 -> 96897 bytes nano/templates/communicator.tmpl | 167 +++++ nano/templates/exonet_node.tmpl | 40 + polaris.dme | 5 + 20 files changed, 1271 insertions(+), 213 deletions(-) create mode 100644 code/datums/EPv2.dm create mode 100644 code/game/machinery/exonet_node.dm create mode 100644 code/modules/client/preference_setup/global/04_communicators.dm create mode 100644 code/modules/examine/descriptions/devices.dm create mode 100644 code/modules/examine/descriptions/telecomms.dm create mode 100644 html/changelogs/neerti-communicators2.yml create mode 100644 nano/templates/communicator.tmpl create mode 100644 nano/templates/exonet_node.tmpl diff --git a/code/datums/EPv2.dm b/code/datums/EPv2.dm new file mode 100644 index 00000000000..f0e912fa55a --- /dev/null +++ b/code/datums/EPv2.dm @@ -0,0 +1,127 @@ +/* +Exonet Protocol Version 2 + +This is designed to be a fairly simple fake-networking system, allowing you to send and receive messages +between the exonet_protocol datums, and for atoms to react to those messages, based on the contents of the message. +Hopefully, this can evolve to be a more robust fake-networking system and allow for some devious network hacking in the future. + +Version 1 never existed. + +*Setting up* + +To set up the exonet link, define a variable on your desired atom it is like this; + var/datum/exonet_protocol/exonet = null +Afterwards, before you want to do networking, call exonet = New(src), then exonet.make_address(string), and give it a string to hash into the new IP. +The reason it needs a string is so you can have the addresses be persistant, assuming no-one already took it first. + +When you're no longer wanting to use the address and want to free it up, like when you want to Destroy() it, you need to call remove_address() + +*Sending messages* + +To send a message to another datum, you need to know it's EPv2 (fake IP) address. Once you know that, call send_message(), place your +intended address in the first argument, then the message in the second. For example, send_message(exonet.address, "ping") will make you +ping yourself. + +*Receiving messages* +You don't need to do anything special to receive the messages, other than give your target exonet datum an address as well. Once something hits +your datum with send_message(), receive_message() is called, and the default action is to call receive_exonet_message() on the datum's holder. +You'll want to override receive_exonet_message() on your atom, and define what will occur when the message is received. +The receiving atom will receive the origin atom (the atom that sent the message), the origin address, and finally the message itself. +It's suggested to start with an if or switch statement for the message, to determine what to do. +*/ + +var/global/list/all_exonet_connections = list() + +/datum/exonet_protocol + var/address = "" //Resembles IPv6, but with only five 'groups', e.g. XXXX:XXXX:XXXX:XXXX:XXXX + var/atom/movable/holder = null + +/datum/exonet_protocol/New(var/atom/holder) + src.holder = holder + ..() + + +// Proc: make_address() +// Parameters: 1 (string - used to make into a hash that will be part of the new address) +// Description: Allocates a new address based on the string supplied. It results in consistant addresses for each round assuming it is not already taken.. +/datum/exonet_protocol/proc/make_address(var/string) + if(string) + var/new_address = null + while(new_address == find_address(new_address)) //Collision test. + var/hash = md5(string) + var/raw_address = copytext(hash,1,25) + var/addr_0 = "fc00" //Used for unique local address in real-life IPv6. + var/addr_1 = hexadecimal_to_EPv2(raw_address) + + new_address = "[addr_0]:[addr_1]" + string = "[string]0" //If we did get a collision, this should make the next attempt not have one. + sleep(1) + address = new_address + all_exonet_connections |= src + + +// Proc: make_arbitrary_address() +// Parameters: 1 (new_address - the desired address) +// Description: Allocates that specific address, if it is available. +/datum/exonet_protocol/proc/make_arbitrary_address(var/new_address) + if(new_address) + if(new_address == find_address(new_address) ) //Collision test. + return 0 + address = new_address + all_exonet_connections |= src + return 1 + +// Proc: hexadecimal_to_EPv2() +// Parameters: 1 (hex - a string of hexadecimals to convert) +// Description: Helper proc to add colons to a string in the right places. +/proc/hexadecimal_to_EPv2(var/hex) + if(!hex) + return null + var/addr_1 = copytext(hex,1,5) + var/addr_2 = copytext(hex,5,9) + var/addr_3 = copytext(hex,9,13) + var/addr_4 = copytext(hex,13,17) + var/new_address = "[addr_1]:[addr_2]:[addr_3]:[addr_4]" + return new_address + + +// Proc: remove_address() +// Parameters: None +// Description: Deallocates the address, freeing it for use. +/datum/exonet_protocol/proc/remove_address() + address = "" + all_exonet_connections.Remove(src) + + +// Proc: find_address() +// Parameters: 1 (target_address - the desired address to find) +// Description: Searches the global list all_exonet_connections for a specific address, and returns it if found, otherwise returns null. +/datum/exonet_protocol/proc/find_address(var/target_address) + for(var/datum/exonet_protocol/exonet in all_exonet_connections) + if(exonet.address == target_address) + return exonet.address + return null + +// Proc: send_message() +// Parameters: 2 (target_address - the desired address to send the message to, message - the message to send) +// Description: Sends the message to target_address, by calling receive_message() on the desired datum. +/datum/exonet_protocol/proc/send_message(var/target_address, var/message) + if(!address) + return 0 + for(var/datum/exonet_protocol/exonet in all_exonet_connections) + if(exonet.address == target_address) + exonet.receive_message(holder, address, message) + break + +// Proc: receive_message() +// Parameters: 3 (origin_atom - the origin datum's holder, origin_address - the address the message originated from, message - the message that was sent) +// Description: Called when send_message() successfully reaches the intended datum. By default, calls receive_exonet_message() on the holder atom. +/datum/exonet_protocol/proc/receive_message(var/atom/origin_atom, var/origin_address, var/message) + holder.receive_exonet_message(origin_atom, origin_address, message) + return + +// Proc: receive_exonet_message() +// Parameters: 3 (origin_atom - the origin datum's holder, origin_address - the address the message originated from, message - the message that was sent) +// Description: Override this to make your atom do something when a message is received. +/atom/proc/receive_exonet_message(var/atom/origin_atom, var/origin_address, var/message) + return diff --git a/code/datums/locations/locations.dm b/code/datums/locations/locations.dm index 8fdeaf1912c..bc4365c716a 100644 --- a/code/datums/locations/locations.dm +++ b/code/datums/locations/locations.dm @@ -8,7 +8,7 @@ if(creator) parent = creator -var/global/datum/locations/milky_way/locations = new() +var/global/datum/locations/milky_way/all_locations = new() //Galaxy @@ -26,6 +26,24 @@ var/global/datum/locations/milky_way/locations = new() new /datum/locations/uueoa_esa(src), new /datum/locations/vir(src) ) + +/proc/choose_location_datum(client/user) + var/datum/locations/choice = all_locations + while(length(choice.contents) > 0) //For some reason it wouldn't let me do contents.len even when I defined it as a list. + var/specific = alert(user, "The location currently selected is [choice.name]. More specific options exist, would you like to pick a more specific location?", + "Choose location", "Yes", "No") + if(specific == "Yes" && length(choice.contents) > 0) + choice = input(user, "Please choose a location.","Locations") as null|anything in choice.contents + else + break + user << choice.name + user << choice.desc + return choice + +// var/datum/locations/choice = input(user, "Please choose a location.","Locations") as null|anything in all_locations +// if(choice && choice.contents.len > 0) + + /* /datum/locations/proc/show_contents() // world << "[src]\n[desc]" diff --git a/code/datums/locations/vir.dm b/code/datums/locations/vir.dm index 7b3a9b60d06..f750fc4c857 100644 --- a/code/datums/locations/vir.dm +++ b/code/datums/locations/vir.dm @@ -52,6 +52,17 @@ desc = "The Northern Star is an asteroid colony owned and operated by Nanotrasen, among many other asteroid installations. \ Originally conceived as 'just another pitstop' for weary asteroid miners, it has grown to become a significant installation in the Kara subsystem." +/datum/locations/northern_star/New(var/creator) + contents.Add( + new /datum/locations/northern_star_interior(src) + ) + ..(creator) + +/datum/locations/northern_star_interior + name = "Northern Star Inner Level" + desc = "The Northern Star contains multiple layers, this one being the inner level, also known as the residentual area. It contains most of the \ + homes for the Northern Star, as well as acting as the heart of commerece, with many shops and markets near the center." + /datum/locations/rota name = "Rota" desc = "A Neptune-like ice giant, with a beautiful ring system circling it. It is 165 kelvin (-157°C)." \ No newline at end of file diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm new file mode 100644 index 00000000000..f826bbafff4 --- /dev/null +++ b/code/game/machinery/exonet_node.dm @@ -0,0 +1,173 @@ +/obj/machinery/exonet_node + name = "exonet node" + desc = "This machine is one of many, many nodes inside Vir's section of the Exonet, connecting the Northern Star to the rest of the system, at least \ + electronically." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "exonet_node" + idle_power_usage = 2500 + density = 1 + var/on = 1 + var/toggle = 1 + + var/allow_external_PDAs = 1 + var/allow_external_communicators = 1 + var/allow_external_newscasters = 1 + + var/opened = 0 + +// Proc: New() +// Parameters: None +// Description: Adds components to the machine for deconstruction. +/obj/machinery/exonet_node/New() + ..() + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/exonet_node(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + +// Proc: update_icon() +// Parameters: None +// Description: Self explanatory. +/obj/machinery/exonet_node/update_icon() + if(on) + if(!allow_external_PDAs && !allow_external_communicators && !allow_external_newscasters) + icon_state = "[initial(icon_state)]_idle" + else + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_off" + +// Proc: update_power() +// Parameters: None +// Description: Sets the device on/off and adjusts power draw based on stat and toggle variables. +/obj/machinery/exonet_node/proc/update_power() + if(toggle) + if(stat & (BROKEN|NOPOWER|EMPED)) + on = 0 + idle_power_usage = 0 + else + on = 1 + idle_power_usage = 2500 + else + on = 0 + idle_power_usage = 0 + +// Proc: emp_act() +// Parameters: 1 (severity - how strong the EMP is, with lower numbers being stronger) +// Description: Shuts off the machine for awhile if an EMP hits it. Ion anomalies also call this to turn it off. +/obj/machinery/exonet_node/emp_act(severity) + if(!(stat & EMPED)) + stat |= EMPED + var/duration = (300 * 10)/severity + spawn(rand(duration - 20, duration + 20)) + stat &= ~EMPED + update_icon() + ..() + +// Proc: process() +// Parameters: None +// Description: Calls the procs below every tick. +/obj/machinery/exonet_node/process() + update_power() + +// Proc: attackby() +// Parameters: 2 (I - the item being whacked against the machine, user - the person doing the whacking) +// Description: Handles deconstruction. +/obj/machinery/exonet_node/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/screwdriver)) + default_deconstruction_screwdriver(user, I) + else if(istype(I, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(user, I) + else + ..() + +// Proc: attack_ai() +// Parameters: 1 (user - the AI clicking on the machine) +// Description: Redirects to attack_hand() +/obj/machinery/exonet_node/attack_ai(mob/user) + attack_hand(user) + +// Proc: attack_hand() +// Parameters: 1 (user - the person clicking on the machine) +// Description: Opens the NanoUI interface with ui_interact() +/obj/machinery/exonet_node/attack_hand(mob/user) + ui_interact(user) + +// Proc: ui_interact() +// Parameters: 4 (standard NanoUI arguments) +// Description: Allows the user to turn the machine on or off, or open or close certain 'ports' for things like external PDA messages, newscasters, etc. +/obj/machinery/exonet_node/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + // this is the data which will be sent to the ui + var/data[0] + + + data["on"] = toggle ? 1 : 0 + data["allowPDAs"] = allow_external_PDAs + data["allowCommunicators"] = allow_external_communicators + data["allowNewscasters"] = allow_external_newscasters + + + // update the ui if it exists, returns null if no ui is passed/found + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "exonet_node.tmpl", "Exonet Node #157", 400, 400) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every Master Controller tick + ui.set_auto_update(1) + +// Proc: Topic() +// Parameters: 2 (standard Topic arguments) +// Description: Responds to button presses on the NanoUI interface. +/obj/machinery/exonet_node/Topic(href, href_list) + if(..()) + return 1 + if(href_list["toggle_power"]) + toggle = !toggle + update_power() + if(!toggle) + var/msg = "[usr.client.key] ([usr]) has turned [src] off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + if(href_list["toggle_PDA_port"]) + allow_external_PDAs = !allow_external_PDAs + + if(href_list["toggle_communicator_port"]) + allow_external_communicators = !allow_external_communicators + if(!allow_external_communicators) + var/msg = "[usr.client.key] ([usr]) has turned [src]'s communicator port off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + if(href_list["toggle_newscaster_port"]) + allow_external_newscasters = !allow_external_newscasters + if(!allow_external_newscasters) + var/msg = "[usr.client.key] ([usr]) has turned [src]'s newscaster port off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + update_icon() + nanomanager.update_uis(src) + add_fingerprint(usr) + +// Proc: get_exonet_node() +// Parameters: None +// Description: Helper proc to get a reference to an Exonet node. +/proc/get_exonet_node() + for(var/obj/machinery/exonet_node/E in machines) + if(E.on) + return E diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index f80e71ef422..5a2663a7d1b 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -166,6 +166,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/datum/feed_channel/viewing_channel = null light_range = 0 anchored = 1 + var/obj/machinery/exonet_node/node = null /obj/machinery/newscaster/security_unit //Security unit @@ -178,6 +179,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number src.unit_no++ src.update_icon() //for any custom ones on the map... + spawn(10) //Should be enough time for the node to spawn at tcomms. + node = get_exonet_node() ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that /obj/machinery/newscaster/Destroy() @@ -247,6 +250,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(!src.ispowered || src.isbroken) return + if(!node) + node = get_exonet_node() + + if(!node || !node.on || !node.allow_external_newscasters) + user << "Error: Cannot connect to external content. Please try again in a few minutes. If this error persists, please \ + contact the system administrator." + return 0 + if(!user.IsAdvancedToolUser()) return 0 @@ -984,12 +995,10 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) src.paper_remaining-- return -//Removed for now so these aren't even checked every tick. Left this here in-case Agouri needs it later. -///obj/machinery/newscaster/process() //Was thinking of doing the icon update through process, but multiple iterations per second does not -// return //bode well with a newscaster network of 10+ machines. Let's just return it, as it's added in the machines list. - -/obj/machinery/newscaster/proc/newsAlert(var/news_call) //This isn't Agouri's work, for it is ugly and vile. - var/turf/T = get_turf(src) //Who the fuck uses spawn(600) anyway, jesus christ +/obj/machinery/newscaster/proc/newsAlert(var/news_call) + if(!node || !node.on || !node.allow_external_newscasters) //The messages will still be there once the connection returns. + return + var/turf/T = get_turf(src) if(news_call) for(var/mob/O in hearers(world.view-1, T)) O.show_message("[src.name] beeps, \"[news_call]\"",2) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 23cc51b518f..a6f0959e4bf 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -1,3 +1,7 @@ +// Communicators +// +// Allows ghosts to roleplay with crewmembers without having to commit to joining the round, and also allows communications between two communicators. + var/global/list/obj/item/device/communicator/all_communicators = list() /obj/item/device/communicator @@ -12,21 +16,33 @@ var/global/list/obj/item/device/communicator/all_communicators = list() origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) - var/mob/living/voice/voice_mob = null + var/list/voice_mobs = list() var/list/voice_requests = list() - var/owner = null - var/owner_job = null - var/owner_rank = null //Is this different from job? + var/list/voice_invites = list() + var/selected_tab = 1 //1 equals dialing, 2 equals reviewing requests/invites. + var/owner = "" var/alert_called = 0 - var/obj/machinery/message_server/server = null //Reference to the PDA server, to avoid having to look it up so often. + var/obj/machinery/exonet_node/node = null //Reference to the Exonet node, to avoid having to look it up so often. + var/target_address = "" + var/network_visibility = 1 + var/list/known_devices = list() + var/datum/exonet_protocol/exonet = null + var/list/communicating = list() + var/update_ticks = 0 + +// Proc: New() +// Parameters: None +// Description: Adds the new communicator to the global list of all communicators, sorts the list, obtains a reference to the Exonet node, then tries to +// assign the device to the holder's name automatically in a spectacularly shitty way. /obj/item/device/communicator/New() ..() all_communicators += src all_communicators = sortAtom(all_communicators) - server = get_message_server() + node = get_exonet_node() + processing_objects |= src //This is a pretty terrible way of doing this. - spawn(20) //Wait for our mob to finish spawning. + spawn(50) //Wait for our mob to finish spawning. if(ismob(loc)) register_device(loc) else if(istype(loc, /obj/item/weapon/storage)) @@ -34,201 +50,452 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(ismob(S.loc)) register_device(S.loc) +// Proc: examine() +// Parameters: 1 (user - the person examining the device) +// Description: Shows all the voice mobs inside the device, and their status. /obj/item/device/communicator/examine(mob/user) if(!..(user)) return var/msg = "" - if(voice_mob) - msg += "On the screen, you can see a image feed of [voice_mob].\n" - msg += "" + for(var/mob/living/voice/voice in contents) + msg += "On the screen, you can see a image feed of [voice].\n" + msg += "" - if(src.voice_mob && src.voice_mob.key) - switch(src.voice_mob.stat) - if(CONSCIOUS) - if(!src.voice_mob.client) - msg += "[voice_mob] appears to be asleep.\n" //afk - if(UNCONSCIOUS) - msg += "[voice_mob] doesn't appear to be conscious.\n" - if(DEAD) - msg += "[voice_mob] appears to have died...\n" //Hopefully this never has to be used. - else - msg += "The device doesn't appear to be transmitting any data.\n" - msg += "" + if(voice && voice.key) + switch(voice.stat) + if(CONSCIOUS) + if(!voice.client) + msg += "[voice] appears to be asleep.\n" //afk + if(UNCONSCIOUS) + msg += "[voice] doesn't appear to be conscious.\n" + if(DEAD) + msg += "[voice] appears to have died...\n" //Hopefully this never has to be used. + else + msg += "The device doesn't appear to be transmitting any data.\n" + msg += "" user << msg return -//This is pretty lengthy +// Proc: emp_act() +// Parameters: None +// Description: Drops all calls when EMPed, so the holder can then get murdered by the antagonist. +/obj/item/device/communicator/emp_act() + close_connection(reason = "Hardware error de%#_^@%-BZZZZZZZT") + +// Proc: add_to_EPv2() +// Parameters: 1 (hex - a single hexadecimal character) +// Description: Called when someone is manually dialing with nanoUI. Adds colons when appropiate. +/obj/item/device/communicator/proc/add_to_EPv2(var/hex) + var/length = length(target_address) + if(length >= 24) + return + if(length == 4 || length == 9 || length == 14 || length == 19 || length == 24 || length == 29) + target_address += ":[hex]" + return + target_address += hex + +// Proc: populate_known_devices() +// Parameters: 1 (user - the person using the device) +// Description: Searches all communicators and ghosts in the world, and adds them to the known_devices list if they are 'visible'. +/obj/item/device/communicator/proc/populate_known_devices(mob/user) + if(!exonet) + exonet = new(src) + src.known_devices.Cut() + if(!get_connection_to_tcomms()) //If the network's down, we can't see anything. + return + for(var/obj/item/device/communicator/comm in all_communicators) + if(!comm || !comm.exonet || !comm.exonet.address || comm.exonet.address == src.exonet.address) //Don't add addressless devices, and don't add ourselves. + continue + src.known_devices |= comm + for(var/mob/dead/observer/O in dead_mob_list) + if(!O.client || O.client.prefs.communicator_visibility == 0) + continue + src.known_devices |= O + +// Proc: get_connection_to_tcomms() +// Parameters: None +// Description: Simple check to see if the exonet node is active. +/obj/item/device/communicator/proc/get_connection_to_tcomms() + if(node) + if(node.on && node.allow_external_communicators) + return 1 + return 0 + +// Proc: process() +// Parameters: None +// Description: Ticks the update_ticks variable, and checks to see if it needs to disconnect communicators every five ticks.. +/obj/item/device/communicator/process() + update_ticks++ + if(update_ticks % 5) + if(!node) + node = get_exonet_node() + if(!node || !node.on || !node.allow_external_communicators) + close_connection(reason = "Connection timed out") + +// Proc: attack_self() +// Parameters: 1 (user - the mob that clicked the device in their hand) +// Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and +// finally makes NanoUI appear. /obj/item/device/communicator/attack_self(mob/user) - if(!owner) - var/choice = alert(user,"Would you like to register [src]?","Communicator","Yes","No") - if(choice == "Yes") - register_device(user) - return + if(!exonet) + exonet = new(src) + if(!exonet.address) + exonet.make_address("communicator-[user.client]-[user.name]") + if(!node) + node = get_exonet_node() + populate_known_devices() + alert_called = 0 + update_icon() + ui_interact(user) - if(voice_mob) - var/choice = alert(user,"Would you like to hang up?","Communicator","No","Yes") - if(choice == "Yes") - close_connection(user, "[user] hung up") - return +// Proc: attack_ghost() +// Parameters: 1 (user - the ghost clicking on the device) +// Description: Recreates the known_devices list, so that the ghost looking at the device can see themselves, then calls ..() so that NanoUI appears. +/obj/item/device/communicator/attack_ghost(mob/user) + populate_known_devices() //Update the devices so ghosts can see the list on NanoUI. + ..() - if(!server || !server.active) - user << "\icon[src] Error: Cannot establish connection to telecommunications." - sleep(30) - user << "\icon[src] Attempting to connect to telecommunications." - sleep(30) - if(!server) - server = get_message_server() - if(!server) - user << "\icon[src] Query to telecommunications timed out." - else if(server.active) - user << "\icon[src] Connection re-established." +/mob/dead/observer + var/datum/exonet_protocol/exonet = null + +// Proc: New() +// Parameters: None +// Description: Gives ghosts an exonet address based on their key and ghost name. +/mob/dead/observer/New() + . = ..() + spawn(20) + exonet = new(src) + if(client) + exonet.make_address("communicator-[src.client]-[src.client.prefs.real_name]") else - if(server.active) - user << "\icon[src] Connection re-established." - else - user << "\icon[src] Query to telecommunications timed out." + exonet.make_address("communicator-[key]-[src.real_name]") + ..() - return +// Proc: Destroy() +// Parameters: None +// Description: Removes the ghost's address and nulls the exonet datum, to allow qdel()ing. +/mob/dead/observer/Destroy() + . = ..() + processing_objects -= src + if(exonet) + exonet.remove_address() + exonet = null + ..() - var/mode = alert(user,"Would you like to check for communications requests or attempt to send a communication request to an external device?", - "Communicator","Check Requests","Send Request", "Cancel") - switch(mode) - if("Check Requests") - if(!voice_requests.len) - user << "\icon[src] No incoming communications requests." - return +// Proc: ui_interact() +// Parameters: 4 (standard NanoUI arguments) +// Description: Uses a bunch of for loops to turn lists into lists of lists, so they can be displayed in nanoUI, then displays various buttons to the user. +/obj/item/device/communicator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + // this is the data which will be sent to the ui + var/data[0] //General nanoUI information + var/communicators[0] //List of communicators + var/invites[0] //Communicators and ghosts we've invited to our communicator. + var/requests[0] //Communicators and ghosts wanting to go in our communicator. + var/voices[0] //Current /mob/living/voice s inside the device. + var/connected_communicators[0] //Current communicators connected to the device. - else - alert_called = 0 - update_icon() - var/choice = input(user,"Would would you like to talk to?","Communicator") as null|anything in voice_requests - if(choice) - open_connection(user, choice) - return + //First we add other 'local' communicators. + for(var/obj/item/device/communicator/comm in known_devices) + if(comm.network_visibility && comm.exonet) + communicators[++communicators.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address) - if("Send Request") - var/list/potential_candidates = list() - for(var/mob/dead/observer/O in dead_mob_list) //To my knowledge, there isn't a list of all ghosts. - if(O.client) //We only want logged in ghosts. - potential_candidates.Add(O.client.prefs.real_name) //This is needed so you don't see ghosted maint drones on the list. + //Now for ghosts who we pretend have communicators. + for(var/mob/dead/observer/O in known_devices) + if(O.client && O.client.prefs.communicator_visibility == 1 && O.exonet) + communicators[++communicators.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address) - if(!potential_candidates.len) - user << "\icon[src] Unfortunately, no other communicators outside your local area could be found. Please try again later." - return + //Lists all the other communicators that we invited. + for(var/obj/item/device/communicator/comm in voice_invites) + if(comm.exonet) + invites[++invites.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address) - var/choice = input(src,"Please select a person to call. Due to the vast distances involved \ - as well as time-zones, please note that your request may take a long time to be noticed, and \ - that the available people to call may change as time passes.") as null|anything in potential_candidates - if(choice) - var/mob/dead/observer/boo = null - for(var/mob/dead/observer/O in dead_mob_list) - if(O.client && O.client.prefs.real_name == choice) - boo = O - break - boo << "\icon[src] A communications request has been received from [src]. If you would like to answer, please use the Call Communicator verb." - user << "\icon[src] A communications request has been sent to [choice]. Now you need to wait until they answer, if they do." + //Ghosts we invited. + for(var/mob/dead/observer/O in voice_invites) + if(O.exonet && O.client) + invites[++invites.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address) + + //Communicators that want to talk to us. + for(var/obj/item/device/communicator/comm in voice_requests) + if(comm.exonet) + requests[++requests.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address) + + //Ghosts that want to talk to us. + for(var/mob/dead/observer/O in voice_requests) + if(O.exonet && O.client) + requests[++requests.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address) + + //Now for all the voice mobs inside the communicator. + for(var/mob/living/voice/voice in contents) + voices[++voices.len] = list("name" = sanitize("[voice.name]'s communicator"), "true_name" = sanitize(voice.name)) + + //Finally, all the communicators linked to this one. + for(var/obj/item/device/communicator/comm in communicating) + connected_communicators[++connected_communicators.len] = list("name" = sanitize(comm.name), "true_name" = sanitize(comm.name)) + + + data["owner"] = owner ? owner : "Unset" + data["connectionStatus"] = get_connection_to_tcomms() + data["visible"] = network_visibility + data["address"] = exonet.address ? exonet.address : "Unallocated" + data["targetAddress"] = target_address + data["currentTab"] = selected_tab + data["knownDevices"] = communicators + data["invitesSent"] = invites + data["requestsReceived"] = requests + data["voice_mobs"] = voices + data["communicating"] = connected_communicators + + // update the ui if it exists, returns null if no ui is passed/found + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 450, 700) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every five Master Controller tick + ui.set_auto_update(5) + +// Proc: Topic() +// Parameters: 2 (standard Topic arguments) +// Description: Responds to NanoUI button presses. +/obj/item/device/communicator/Topic(href, href_list) + if(..()) + return 1 + if(href_list["rename"]) + var/new_name = sanitizeSafe(input(usr,"Please enter your name.","Communicator",usr.name) ) + if(new_name) + owner = new_name + name = "[owner]'s [initial(name)]" + + if(href_list["toggle_visibility"]) + network_visibility = !network_visibility + + if(href_list["add_hex"]) + var/hex = href_list["add_hex"] + add_to_EPv2(hex) + + if(href_list["write_target_address"]) + var/new_address = sanitizeSafe(input(usr,"Please enter the desired target EPv2 address. Note that you must write the colons \ + yourself.","Communicator",src.target_address) ) + if(new_address) + target_address = new_address + + if(href_list["clear_target_address"]) + target_address = "" + + if(href_list["dial"]) + if(!get_connection_to_tcomms()) + usr << "Error: Cannot connect to Exonet node." return + var/their_address = href_list["dial"] + exonet.send_message(their_address, "voice") + if(href_list["disconnect"]) + var/name_to_disconnect = href_list["disconnect"] + for(var/mob/living/voice/V in contents) + if(name_to_disconnect == V.name) + close_connection(usr, V, "[usr] hung up") + for(var/obj/item/device/communicator/comm in communicating) + if(name_to_disconnect == comm.name) + close_connection(usr, comm, "[usr] hung up") -/obj/item/device/communicator/proc/register_device(mob/user, var/job = null) + if(href_list["copy"]) + target_address = href_list["copy"] + + if(href_list["switch_tab"]) + selected_tab = href_list["switch_tab"] + + nanomanager.update_uis(src) + add_fingerprint(usr) + +// Proc: receive_exonet_message() +// Parameters: 3 (origin atom - the source of the message's holder, origin_address - where the message came from, message - the message received) +// Description: Handles voice requests and invite messages originating from both real communicators and ghosts. Also includes a ping response. +/obj/item/device/communicator/receive_exonet_message(var/atom/origin_atom, origin_address, message) + if(message == "voice") + if(isobserver(origin_atom) || istype(origin_atom, /obj/item/device/communicator)) + if(origin_atom in voice_invites) + var/user = null + if(ismob(origin_atom.loc)) + user = origin_atom.loc + open_connection(user, origin_atom) + return + else if(origin_atom in voice_requests) + return //Spam prevention + else + request(origin_atom) + if(message == "ping") + if(network_visibility) + var/random = rand(200,350) + random = random / 10 + exonet.send_message(origin_address, "64 bytes received from [exonet.address] ecmp_seq=1 ttl=51 time=[random] ms") + +// Proc: receive_exonet_message() +// Parameters: 3 (origin atom - the source of the message's holder, origin_address - where the message came from, message - the message received) +// Description: Handles voice requests and invite messages originating from both real communicators and ghosts. Also includes a ping response. +/mob/dead/observer/receive_exonet_message(origin_atom, origin_address, message) + if(message == "voice") + if(istype(origin_atom, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = origin_atom + if(src in comm.voice_invites) + comm.open_connection(src) + return + src << "\icon[origin_atom] Receiving communicator request from [origin_atom]. To answer, use the Call Communicator \ + verb, and select that name to answer the call." + comm.voice_invites |= src + if(message == "ping") + if(client && client.prefs.communicator_visibility) + var/random = rand(450,700) + random = random / 10 + exonet.send_message(origin_address, "64 bytes received from [exonet.address] ecmp_seq=1 ttl=51 time=[random] ms") + +// Proc: register_device() +// Parameters: 1 (user - the person to use their name for) +// Description: Updates the owner's name and the device's name. +/obj/item/device/communicator/proc/register_device(mob/user) if(!user) return owner = user.name - if(job) - owner_job = job - owner_rank = job + + name = "[owner]'s [initial(name)]" + +// Proc: open_connection() +// Parameters: 2 (user - the person who initiated the connecting being opened, candidate - the communicator or observer that will connect to the device) +// Description: Typechecks the candidate, then calls the correct proc for further connecting. +/obj/item/device/communicator/proc/open_connection(mob/user, var/atom/candidate) + if(isobserver(candidate)) + voice_invites.Remove(candidate) + open_connection_to_ghost(user, candidate) else - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/weapon/card/id/idcard = H.wear_id - if(idcard) - owner_job = idcard.assignment - owner_rank = idcard.rank - else - user << "\icon[src] ID not found. Please swipe your ID on the device." - return - else //They're probably a synth. - owner_job = user.job - owner_rank = user.job + if(istype(candidate, /obj/item/device/communicator)) + open_connection_to_communicator(user, candidate) - name = "\improper [initial(name)]-[owner] ([owner_job])" +// Proc: open_connection_to_communicator() +// Parameters: 2 (user - the person who initiated this and will be receiving feedback information, candidate - someone else's communicator) +// Description: Adds the candidate and src to each other's communicating lists, allowing messages seen by the devices to be relayed. +/obj/item/device/communicator/proc/open_connection_to_communicator(mob/user, var/atom/candidate) + if(!istype(candidate, /obj/item/device/communicator)) + return + var/obj/item/device/communicator/comm = candidate + voice_invites.Remove(candidate) + comm.voice_requests.Remove(src) -/* - owner = idcard.registered_name - owner_job = idcard.assignment - owner_rank = idcard.rank - name = "\improper communicator-[owner] ([ownjob])" -*/ + if(user) + comm.visible_message("\icon[src] Connecting to [src].") + user << "\icon[src] Attempting to call [comm]." + sleep(10) + user << "\icon[src] Dialing internally from [station_name()], Kara Subsystem, [system_name()]." + sleep(20) //If they don't have an exonet something is very wrong and we want a runtime. + user << "\icon[src] Connection re-routed to [comm] at [comm.exonet.address]." + sleep(40) + user << "\icon[src] Connection to [comm] at [comm.exonet.address] established." + comm.visible_message("\icon[src] Connection to [src] at [exonet.address] established.") + sleep(20) -/obj/item/device/communicator/proc/open_connection(mob/user, var/mob/candidate) + communicating |= comm + comm.communicating |= src + +// Proc: open_connection_to_ghost() +// Parameters: 2 (user - the person who initiated this, candidate - the ghost that will be turned into a voice mob) +// Description: Pulls the candidate ghost from deadchat, makes a new voice mob, transfers their identity, then their client. +/obj/item/device/communicator/proc/open_connection_to_ghost(mob/user, var/mob/candidate) if(!isobserver(candidate)) return - //Handle moving the ghost into the new shell. announce_ghost_joinleave(candidate, 0, "They are occupying a personal communications device now.") - voice_mob = new /mob/living/voice(src) //Make the voice mob the ghost is going to be. - voice_mob.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences. + voice_requests.Remove(candidate) + voice_invites.Remove(candidate) + var/mob/living/voice/new_voice = new /mob/living/voice(src) //Make the voice mob the ghost is going to be. + new_voice.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences. //Do some simple logging since this is a tad risky as a concept. - var/msg = "[candidate.client ? "[candidate.client.key]" : "*no key*"] ([candidate]) has entered [src], triggered by \ - [user.client ? "[user.client.key]" : "*no key*"] ([user]) at [x],[y],[z]. They have joined as [voice_mob.name]." + var/msg = "[candidate && candidate.client ? "[candidate.client.key]" : "*no key*"] ([candidate]) has entered [src], triggered by \ + [user && user.client ? "[user.client.key]" : "*no key*"] ([user ? "[user]" : "*null*"]) at [x],[y],[z]. They have joined as [new_voice.name]." message_admins(msg) log_game(msg) - voice_mob.mind = candidate.mind //Transfer the mind, if any. - voice_mob.ckey = candidate.ckey //Finally, bring the client over. + new_voice.mind = candidate.mind //Transfer the mind, if any. + new_voice.ckey = candidate.ckey //Finally, bring the client over. + voice_mobs.Add(new_voice) var/obj/screen/blackness = new() //Makes a black screen, so the candidate can't see what's going on before actually 'connecting' to the communicator. blackness.screen_loc = ui_entire_screen blackness.icon = 'icons/effects/effects.dmi' blackness.icon_state = "1" blackness.mouse_opacity = 2 //Can't see anything! - voice_mob.client.screen.Add(blackness) + new_voice.client.screen.Add(blackness) update_icon() //Now for some connection fluff. - user << "\icon[src] Connecting to [candidate]." - src.voice_mob << "\icon[src] Attempting to call [src]." + if(user) + user << "\icon[src] Connecting to [candidate]." + new_voice << "\icon[src] Attempting to call [src]." sleep(10) - src.voice_mob << "\icon[src] Dialing to [station_name()], Kara Subsystem, [system_name()]." + new_voice << "\icon[src] Dialing to [station_name()], Kara Subsystem, [system_name()]." sleep(20) - src.voice_mob << "\icon[src] Connecting to [station_name()] telecommunications array." + new_voice << "\icon[src] Connecting to [station_name()] telecommunications array." sleep(40) - src.voice_mob << "\icon[src] Connection to [station_name()] telecommunications array established. Redirecting signal to [src]." + new_voice << "\icon[src] Connection to [station_name()] telecommunications array established. Redirecting signal to [src]." sleep(20) //We're connected, no need to hide everything. - voice_mob.client.screen.Remove(blackness) + new_voice.client.screen.Remove(blackness) qdel(blackness) - voice_mob.stable_connection = 1 - voice_mob << "\icon[src] Connection to [src] established." - voice_mob << "To talk to the person on the other end of the call, just talk normally." - voice_mob << "If you want to end the call, use the 'Hang Up' verb. The other person can also hang up at any time." - voice_mob << "Remember, your character does not know anything you've learned from observing!" - if(voice_mob.mind) - voice_mob.mind.assigned_role = "Disembodied Voice" - user << "\icon[src] Your communicator is now connected to [candidate]'s communicator." + new_voice << "\icon[src] Connection to [src] established." + new_voice << "To talk to the person on the other end of the call, just talk normally." + new_voice << "If you want to end the call, use the 'Hang Up' verb. The other person can also hang up at any time." + new_voice << "Remember, your character does not know anything you've learned from observing!" + if(new_voice.mind) + new_voice.mind.assigned_role = "Disembodied Voice" + if(user) + user << "\icon[src] Your communicator is now connected to [candidate]'s communicator." -/obj/item/device/communicator/proc/close_connection(mob/user, var/reason) - if(!voice_mob) +// Proc: close_connection() +// Parameters: 3 (user - the user who initiated the disconnect, target - the mob or device being disconnected, reason - string shown when disconnected) +// Description: Deletes specific voice_mobs or disconnects communicators, and shows a message to everyone when doing so. If target is null, all communicators +// and voice mobs are removed. +/obj/item/device/communicator/proc/close_connection(mob/user, var/atom/target, var/reason) + if(voice_mobs.len == 0 && communicating.len == 0) return - if(user != voice_mob) - user << "\icon[src] [reason]." - voice_mob << "\icon[src] [reason]." - else - if(ismob(loc)) - user << "\icon[src] [reason]." - loc << "\icon[src] [reason]." - qdel(voice_mob) + for(var/mob/living/voice/voice in voice_mobs) //Handle ghost-callers + if(target && voice != target) //If no target is inputted, it deletes all of them. + continue + voice << "\icon[src] [reason]." + visible_message("\icon[src] [reason].") + voice_mobs.Remove(voice) + qdel(voice) + + for(var/obj/item/device/communicator/comm in communicating) //Now we handle real communicators. + if(target && comm != target) + continue + comm.visible_message("\icon[src] [reason].") + visible_message("\icon[src] [reason].") + comm.communicating.Remove(src) + communicating.Remove(comm) update_icon() -/obj/item/device/communicator/proc/request(var/mob/candidate) - if(!isobserver(candidate)) - return +// Proc: request() +// Parameters: 1 (candidate - the ghost or communicator wanting to call the device) +// Description: Response to a communicator or observer trying to call the device. Adds them to the list of requesters +/obj/item/device/communicator/proc/request(var/atom/candidate) if(candidate in voice_requests) return - voice_requests.Add(candidate) + var/who = null + if(isobserver(candidate)) + who = candidate.name + else if(istype(candidate, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = candidate + who = comm.owner + comm.voice_invites |= src + + if(!who) + return + + voice_requests |= candidate playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/O in hearers(2, loc)) @@ -243,17 +510,31 @@ var/global/list/obj/item/device/communicator/all_communicators = list() L = loc if(L) - L << "\icon[src] Communications request from [candidate]." + L << "\icon[src] Communications request from [who]." +// Proc: Destroy() +// Parameters: None +// Description: Deletes all the voice mobs, disconnects all linked communicators, and cuts lists to allow successful qdel() /obj/item/device/communicator/Destroy() - if(voice_mob) - voice_mob << "\icon[src] Connection timed out with remote host." - qdel(voice_mob) + for(var/mob/living/voice/voice in contents) + voice_mobs.Remove(voice) + voice << "\icon[src] Connection timed out with remote host." + qdel(voice) + close_connection(reason = "Connection timed out") + communicating.Cut() + voice_requests.Cut() + voice_invites.Cut() all_communicators -= src + if(exonet) + exonet.remove_address() + exonet = null ..() +// Proc: update_icon() +// Parameters: None +// Description: Self explanatory /obj/item/device/communicator/update_icon() - if(voice_mob) + if(voice_mobs.len > 0) icon_state = "communicator-active" return @@ -263,37 +544,54 @@ var/global/list/obj/item/device/communicator/all_communicators = list() icon_state = initial(icon_state) +// Proc: see_emote() +// Parameters: 2 (M - the mob the emote originated from, text - the emote's contents) +// Description: Relays the emote to all linked communicators. /obj/item/device/communicator/see_emote(mob/living/M, text) - if(voice_mob && voice_mob.client) - if(!voice_mob.stable_connection) - return 0 - var/rendered = "[text]" - voice_mob.show_message(rendered, 2) + var/rendered = "\icon[src] [text]" + for(var/obj/item/device/communicator/comm in communicating) + for(var/mob/mob in viewers(comm)) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other. + mob.show_message(rendered) ..() +// Proc: hear_talk() +// Parameters: 4 (M - the mob the speech originated from, text - what is being said, verb - the word used to describe how text is being said, speaking - language +// being used) +// Description: Relays the speech to all linked communicators. +/obj/item/device/communicator/hear_talk(mob/living/M, text, verb, datum/language/speaking) + for(var/obj/item/device/communicator/comm in communicating) + for(var/mob/mob in viewers(comm)) + //Can whoever is hearing us understand? + if(!mob.say_understands(M, speaking)) + if(speaking) + text = speaking.scramble(text) + else + text = stars(text) + var/name_used = M.GetVoice() + var/rendered = null + if(speaking) //Language being used + rendered = "\icon[src] [name_used] [speaking.format_message(text, verb)]" + else + rendered = "\icon[src] [name_used] [verb], \"[text]\"" + mob.show_message(rendered, 2) + +// Proc: show_message() +// Parameters: 4 (msg - the message, type - number to determine if message is visible or audible, alt - unknown, alt_type - unknown) +// Description: Relays the message to all linked communicators. /obj/item/device/communicator/show_message(msg, type, alt, alt_type) - if(voice_mob && voice_mob.client) - if(!voice_mob.stable_connection) - return 0 - var/rendered = "[msg]" - voice_mob.show_message(rendered, type) + var/rendered = "\icon[src] [msg]" + for(var/mob/living/voice/voice in contents) + if(voice.client) + voice.show_message(rendered, type) + for(var/obj/item/device/communicator/comm in communicating) +// comm.audible_message(rendered) + for(var/mob/mob in hearers(comm)) //Ditto for audible messages. + mob.show_message(rendered) ..() -/obj/item/device/communicator/attackby(obj/item/C as obj, mob/user as mob) - if(istype(C, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/idcard = C - if(!idcard.registered_name) - user << "\icon[src] \The [src] rejects the ID." - return - if(!owner) - owner = idcard.registered_name - owner_job = idcard.assignment - owner_rank = idcard.rank - name = "\improper communicator-[owner] ([owner_job])" - user << "\icon[src] Card scanned." - else - ..() - +// Verb: join_as_voice() +// Parameters: None +// Description: Allows ghosts to call communicators, if they meet all the requirements. /mob/dead/verb/join_as_voice() set category = "Ghost" set name = "Call Communicator" @@ -319,25 +617,50 @@ var/global/list/obj/item/device/communicator/all_communicators = list() src << "Your identity is already present in the game world. Please load in a different character first." return - if(!all_communicators.len) + var/obj/machinery/exonet_node/E = get_exonet_node() + if(!E || !E.on || !E.allow_external_communicators) + src << "The Exonet node at telecommunications is down at the moment, or is actively blocking you, so your call can't go through." + return + + var/list/choices = list() + for(var/obj/item/device/communicator/comm in all_communicators) + if(!comm.network_visibility) + continue + choices.Add(comm) + + if(!choices.len) src << "There are no available communicators, sorry." return - if(!get_message_server()) - src << "The messaging server or telecommunications is down at the moment, so your call can't go through." - return - - var/choice = input(src,"Send a voice request to whom?") as null|anything in all_communicators + var/choice = input(src,"Send a voice request to whom?") as null|anything in choices if(choice) var/obj/item/device/communicator/chosen_communicator = choice - chosen_communicator.request(src) + var/mob/dead/observer/O = src + if(O.exonet) + O.exonet.send_message(chosen_communicator.exonet.address, "voice") - src << "A communications request has been sent to [chosen_communicator]. Now you need to wait until someone answers." + src << "A communications request has been sent to [chosen_communicator]. Now you need to wait until someone answers." /obj/item/device/communicator/integrated //For synths who have no hands. name = "integrated communicator" desc = "A circuit used for long-range communications, able to be integrated into a system." +//A stupid hack because synths don't use languages properly or something. +//I don't want to go digging in saycode for a week, so BS it as translation software or something. + +// Proc: open_connection_to_ghost() +// Parameters: 2 (refer to base definition for arguments) +// Description: Synths don't use languages properly, so this is a bandaid fix until that can be resolved.. +/obj/item/device/communicator/integrated/open_connection_to_ghost(user, candidate) + ..(user, candidate) + spawn(1) + for(var/mob/living/voice/V in contents) + V.universal_speak = 1 + V.universal_understand = 1 + +// Verb: activate() +// Parameters: None +// Description: Lets synths use their communicators without hands. /obj/item/device/communicator/integrated/verb/activate() set category = "AI IM" set name = "Use Communicator" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm index 2b94d05cebc..9ee761a7305 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif /obj/item/weapon/circuitboard/telecomms @@ -73,3 +73,17 @@ "/obj/item/weapon/stock_parts/subspace/filter" = 1, "/obj/item/weapon/stock_parts/subspace/crystal" = 1, "/obj/item/weapon/stock_parts/micro_laser/high" = 2) + +//This isn't a real telecomms board but I don't want to make a whole file to hold only one circuitboard. +/obj/item/weapon/circuitboard/telecomms/exonet_node + name = T_BOARD("exonet node") + build_path = "/obj/machinery/exonet_node" + origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) + req_components = list( + "/obj/item/weapon/stock_parts/subspace/ansible" = 1, + "/obj/item/weapon/stock_parts/subspace/filter" = 1, + "/obj/item/weapon/stock_parts/manipulator" = 2, + "/obj/item/weapon/stock_parts/micro_laser" = 1, + "/obj/item/weapon/stock_parts/subspace/crystal" = 1, + "/obj/item/weapon/stock_parts/subspace/treatment" = 2, + "/obj/item/stack/cable_coil" = 2) diff --git a/code/modules/client/preference_setup/global/04_communicators.dm b/code/modules/client/preference_setup/global/04_communicators.dm new file mode 100644 index 00000000000..e0fc2c8e313 --- /dev/null +++ b/code/modules/client/preference_setup/global/04_communicators.dm @@ -0,0 +1,26 @@ +/datum/category_item/player_setup_item/player_global/communicators + name = "Communicators" + sort_order = 4 + +/datum/category_item/player_setup_item/player_global/communicators/load_preferences(var/savefile/S) + S["communicator_visibility"] >> pref.communicator_visibility + + +/datum/category_item/player_setup_item/player_global/communicators/save_preferences(var/savefile/S) + S["communicator_visibility"] << pref.communicator_visibility + + +/datum/category_item/player_setup_item/player_global/communicators/sanitize_preferences() + pref.communicator_visibility = sanitize_integer(pref.communicator_visibility, 0, 1, initial(pref.communicator_visibility)) + +/datum/category_item/player_setup_item/player_global/communicators/content(var/mob/user) + . += "Communicator Identity:
" + . += "Visibility: [(pref.communicator_visibility) ? "Yes" : "No"]
" + +/datum/category_item/player_setup_item/player_global/communicators/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["toggle_comm_visibility"]) + if(CanUseTopic(user)) + pref.communicator_visibility = !pref.communicator_visibility + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5199eb0b697..6bc9b888459 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -108,6 +108,9 @@ datum/preferences // OOC Metadata: var/metadata = "" + // Communicator identity data + var/communicator_visibility = 0 + var/client/client = null var/datum/category_collection/player_setup_collection/player_setup diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 68f60304251..6b666117f26 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -18,3 +18,5 @@ /datum/event/communications_blackout/start() for(var/obj/machinery/telecomms/T in telecomms_list) T.emp_act(1) + for(var/obj/machinery/exonet_node/N in machines) + N.emp_act(1) diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 8451101b4fc..4f46fb9bace 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -2,6 +2,7 @@ endWhen = 36000 var/last_spam_time = 0 var/obj/machinery/message_server/useMS + var/obj/machinery/exonet_node/node /datum/event/pda_spam/setup() last_spam_time = world.time @@ -19,6 +20,11 @@ //if there's no spam managed to get to receiver for five minutes, give up kill() return + if(!node) + node = get_exonet_node() + + if(!node || !node.on || !node.allow_external_PDAs) + return if(!useMS || !useMS.active) useMS = null diff --git a/code/modules/examine/descriptions/devices.dm b/code/modules/examine/descriptions/devices.dm new file mode 100644 index 00000000000..05182df0a58 --- /dev/null +++ b/code/modules/examine/descriptions/devices.dm @@ -0,0 +1,22 @@ +/obj/item/device/communicator + description_info = "This device allows someone to speak to another player sourced from the observer pool, as well as other communicators linked to it. \ + To use the device, use it in your hand, and it will open an interface with various buttons. Near the bottom will be a list of devices currently available \ + for you to call, both from communications on the station, and communicators very far away (observers). To call someone, send a communications request to \ + someone and hope they respond, or receive one yourself and respond to them. Hanging up is also simple, and is handled in the 'Manage Connections' tab." + + description_fluff = "As a concept, a device that allows long-distance communication has existed for over five hundred years. A device that can accomplish \ + that while in space, across star systems, and that the consumer can afford and use without training, is much more recent, and is thanks to the backbone \ + that is the Exonet.
\ +
\ + The Exonet is the predominant interstellar telecom system, servicing trillions of devices across a large portion of human-controlled space. \ + It is distributed by a massive network of telecommunication satellites, some privately owned and others owned by the systems’ local governments, \ + that utilize FTL technologies to bounce data between satellites at speeds that would not be possible at sub-light technology. This communicator \ + uses a protocol called Exonet Protocol Version 2, generally shortened to EPv2.
\ +
\ + EPv2 is the most common communications protocol in the Exonet, and was specifically designed for it. It was designed to facilitate communication \ + between any device in a star system, and have the ability to forward interstellar requests at the root node of that system’s Exonet. \ + It is also built to cope with the reality that the numerous nodes in a system will likely have frequent outages. The protocol allows for \ + up to 18,446,744,073,709,551,616 unique addresses, one of which is assigned to this device." + + description_antag = "Electromagnetic pulses will cause the device to disconnect all linked communicators. Turning off the Exonet node at the Telecomms \ + satellite will also accomplish this, but for all communicators on and near the station. This may be needed to allow for a quiet kill or capture." \ No newline at end of file diff --git a/code/modules/examine/descriptions/telecomms.dm b/code/modules/examine/descriptions/telecomms.dm new file mode 100644 index 00000000000..421d7022c51 --- /dev/null +++ b/code/modules/examine/descriptions/telecomms.dm @@ -0,0 +1,36 @@ +//This is not strictly a telecomms machine but conceptually it is. +/obj/machinery/exonet_node + description_info = "This machine is needed for several machines back at the colony to interact with systems beyond this region of space, such as \ + communicators, external PDA messages, and even newscaster units, which host their content externally. You can fiddle with the device with \ + just your hands, due to the integrated monitor and keyboard. Synthetic units can interface with it as well, just like most other machines." + + description_fluff = "This is one of many nodes that make up the Exonet, which services trillions of devices across space. This particular node \ + is referred to as a terminal node, servicing the Northern Star.
\ +
\ + In the beginning of humanity's ascend into space, the Exonet didn't exist. Instead, the Exonet is the evolution to a network called the Interplanetary \ + Internet (sometimes referred to as the InterPlaNet), which was conceived and developed due to the limitations of the terrestrial Internet, mainly because \ + the IP protocol was unsuitable for long range communications in space, due to the massive delays associated with lightspeed being unable to overcome \ + the massive distances between planets in a timely manner. It was a store-and-forward network of smaller internets, distributed between various nodes, \ + and was designed to be error, fault, and delay tolerant. The first nodes were put into space around the time when colonization had begun, to service humanity’s \ + close holdings, such as Luna and Mars.
\ +
\ + By 2104, the Interplanetary Internet had coverage within most of Sol, but the network of networks were limited by the speed of light, and due \ + to orbital mechanics, the delay for a request to be processed could vary. As an example, a direct message from Mars to Earth could take anywhere \ + between three to twenty two minutes to get to Earth, and then the same amount of time to return to Mars. Coverage was also spotty due to the \ + nature of operating at such vast distances.
\ +
\ + Fortunately, a method for traveling faster than light was discovered, which could allow data to be transmitted beyond the speed of light, \ + and thus overcome the limitations of the Interplanetary Internet. One by one, each of the nodes were upgraded to utilize cutting edge \ + (at the time) FTL technologies to rapidly increase response time.
\ +
\ + Once humanity had send colonists out beyond Sol, to other star systems such as Sirius and Alpha Centauri, they required their own interplanetary \ + internet, so a new protocol had to be created, and another hardware upgrade for the separate interplanetary internets. The end result allowed \ + communications between Sol and the various exosolar systems, and was dubbed the Exonet. It remains the most common way for consumers to engage \ + in long range communications across planets and star systems. Generally, each system has their own Exonet, which is connected to all the other \ + Exonets at the root node(s), and is typically arranged in a tree structure. The root node(s) are generally government-owned and are very secure \ + and resilient to failure.
\ +
\ + This node is privately owned and maintained by Nanotrasen, and allows the colonists of the Northern Star to have access to the Exonet." + + description_antag = "An EMP will disable this device for a short period of time. A longer downage can be achieved by turning it off, or rigging \ + the APC it uses to turn off remotely, such as with a signaler in the right wire." \ No newline at end of file diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index e5ae40c5480..82bd397ac13 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -1,13 +1,11 @@ //A very, very simple mob that exists inside other objects to talk and has zero influence on the world. /mob/living/voice - name = "unknown" + name = "unknown person" desc = "How are you examining me?" -// default_language = "Galactic Common" + see_invisible = SEE_INVISIBLE_LIVING var/obj/item/device/communicator/comm = null emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so... - var/stable_connection = 0 //If set to zero, makes the mob effectively deaf, mute, and blind, due to interferance. - /mob/living/voice/New(loc) add_language("Galactic Common") @@ -20,11 +18,15 @@ comm = loc ..() +// Proc: transfer_identity() +// Parameters: 1 (speaker - the mob (usually an observer) to copy information from) +// Description: Copies the mob's icons, overlays, TOD, gender, currently loaded character slot, and languages, to src. /mob/living/voice/proc/transfer_identity(mob/speaker) if(ismob(speaker)) icon = speaker.icon icon_state = speaker.icon_state overlays = speaker.overlays + timeofdeath = speaker.timeofdeath alpha = 127 //Maybe we'll have hologram calls later. if(speaker.client && speaker.client.prefs) @@ -36,6 +38,9 @@ for(var/language in p.alternate_languages) add_language(language) +// Proc: Login() +// Parameters: None +// Description: Adds a static overlay to the client's screen. /mob/living/voice/Login() var/obj/screen/static_effect = new() //Since what the player sees is essentially a video feed, from a vast distance away, the view isn't going to be perfect. static_effect.screen_loc = ui_entire_screen @@ -44,10 +49,23 @@ static_effect.mouse_opacity = 0 //So the static doesn't get in the way of clicking. client.screen.Add(static_effect) +// Proc: Destroy() +// Parameters: None +// Description: Removes reference to the communicator, so it can qdel() successfully. /mob/living/voice/Destroy() comm = null ..() +// Proc: ghostize() +// Parameters: None +// Description: Sets a timeofdeath variable, to fix the free respawn bug. +/mob/living/voice/ghostize() + timeofdeath = world.time + . = ..() + +// Verb: hang_up() +// Parameters: None +// Description: Disconnects the voice mob from the communicator. /mob/living/voice/verb/hang_up() set name = "Hang Up" set category = "Communicator" @@ -55,40 +73,53 @@ set src = usr if(comm) - comm.close_connection(src, "[src] hung up") + comm.close_connection(user = src, target = src, reason = "[src] hung up") else src << "You appear to not be inside a communicator. This is a bug and you should report it." +// Verb: change_name() +// Parameters: None +// Description: Allows the voice mob to change their name, assuming it is valid. +/mob/living/voice/verb/change_name() + set name = "Change Name" + set category = "Communicator" + set desc = "Changes your name." + set src = usr + + var/new_name = sanitizeSafe(input(src, "Who would you like to be now?", "Communicator", src.client.prefs.real_name) as text, MAX_NAME_LEN) + if(new_name) + if(comm) + comm.visible_message("\icon[comm] [src.name] has left, and now you see [new_name].") + //Do a bit of logging in-case anyone tries to impersonate other characters for whatever reason. + var/msg = "[src.client.key] ([src]) has changed their communicator identity's name to [new_name]." + message_admins(msg) + log_game(msg) + src.name = new_name + else + src << "Invalid name. Rejected." + +// Proc: Life() +// Parameters: None +// Description: Checks the active variable on the Exonet node, and kills the mob if it goes down or stops existing. /mob/living/voice/Life() - if(comm && comm.server && !comm.server.active) - comm.close_connection(src,"Connection to telecommunications array timed out") + if(comm) + if(!comm.node || !comm.node.on || !comm.node.allow_external_communicators) + comm.close_connection(user = src, target = src, reason = "Connection to telecommunications array timed out") ..() +// Proc: say() +// Parameters: 4 (generic say() arguments) +// Description: Adds a speech bubble to the communicator device, then calls ..() to do the real work. /mob/living/voice/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="") -// world << "say() was called. Arguments: ([message], [speaking], [verb], [alt_name])." - if(!stable_connection) - return 0 - //Speech bubbles. if(comm) var/speech_bubble_test = say_test(message) - var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") + var/image/speech_bubble = image('icons/mob/talk.dmi',comm,"h[speech_bubble_test]") spawn(30) qdel(speech_bubble) - for(var/mob/M in hearers(world.view,comm)) //simplifed since it's just a speech bubble + for(var/mob/M in hearers(comm)) //simplifed since it's just a speech bubble M << speech_bubble src << speech_bubble - ..(message, speaking, verb, alt_name) //mob/living/say() can do the actual talking. -/* -/mob/verb/test_voice_mob() - set name = "Make Voice Mob" - set category = "Debug" - set desc = "For testing only!" - set src = usr - - var/turf/T = get_turf(src) - var/obj/item/device/communicator/comm = new(T) - comm.open_connection(src, src) -*/ + ..(message, speaking, verb, alt_name) //mob/living/say() can do the actual talking. \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1dd988f05b9..c5d4648375a 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1215,6 +1215,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/telecomms/receiver sort_string = "PAAAG" +/datum/design/circuit/tcom/exonet_node + name = "exonet node" + id = "tcom-exonet_node" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) + build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster + sort_string = "PAAAH" + /datum/design/circuit/shield req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) materials = list("glass" = 2000, "gold" = 1000) diff --git a/html/changelogs/neerti-communicators2.yml b/html/changelogs/neerti-communicators2.yml new file mode 100644 index 00000000000..8f30b0edd29 --- /dev/null +++ b/html/changelogs/neerti-communicators2.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Neerti + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds NanoUI for communicators, the ability for communicators to call other communicators on the station, the ability for station-bound people to call ghosts, and for ghosts to toggle their visibility to communicators on or off in character preferences (defaults to off). Communicators can now also support more than one call at the same time, for both ghosts and normal communicators." + - rscadd: "Adds new machine to telecomms, the Exonet node. It is very basic in terms of functionality, but certain services can be selectively disabled from it, such as newscaster updates, communicators, or external PDA messages. Adds methods for building and deconstructing Exonet nodes." + - experiment: "Adds framework for a fake-networking system called EPv2 that communicators will now use, and perhaps other machines will in the future, for good or for evil." diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 57e0f69a266b78953a8f59ed99b0016eb31da239..a9998cd6243a71135524199df6b883bddafbcead 100644 GIT binary patch literal 96897 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 +xUp||d6rAHyEB7QiF><6V$FX9B<1gm_-x^4 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 N6UQt~-Wj<>{TJIJd13$n literal 88480 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 z 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 diff --git a/nano/templates/communicator.tmpl b/nano/templates/communicator.tmpl new file mode 100644 index 00000000000..8911ae87104 --- /dev/null +++ b/nano/templates/communicator.tmpl @@ -0,0 +1,167 @@ + + +

Status

+
+
+ Owner: +
+
+
{{:data.owner}}
{{:helper.link('Rename', 'pencil', {'rename' : 1})}} +
+
+ +
+
+ Connection: +
+
+ {{if data.connectionStatus == 1}} + Connected + {{else}} + Disconnected + {{/if}} +
+
+ +
+
+ Device EPv2 Address: +
+
+
{{:data.address}}
+
+
+
{{:helper.link('Visible', 'signal-diag', {'toggle_visibility' : 1}, data.visible ? 'selected' : null)}}{{:helper.link('Invisible', 'close', {'toggle_visibility' : 1}, data.visible ? null : 'selected')}}
+
+
+ + + +
+
+
{{:helper.link('Dialing', 'gear', {'switch_tab' : 1}, data.currentTab == 1 ? 'selected' : null)}}{{:helper.link('Manage Connections', 'gear', {'switch_tab' : 2}, data.currentTab == 1 ? null : 'selected')}}
+
+
+ +{{if data.currentTab == 1}} + +

Manual Dial

+ +
+ +
+
+ Target EPv2 Address: +
+
+
{{:data.targetAddress}}
+
+
+
{{:helper.link('Write', 'pencil', {'write_target_address' : 1})}} {{:helper.link('Clear', 'close', {'clear_target_address' : 1})}}
+
+
+ +
+
+
+
+ {{:helper.link('0', null, {'add_hex' : '0'})}} + {{:helper.link('1', null, {'add_hex' : '1'})}} + {{:helper.link('2', null, {'add_hex' : '2'})}} + {{:helper.link('3', null, {'add_hex' : '3'})}} +
+
+ {{:helper.link('4', null, {'add_hex' : '4'})}} + {{:helper.link('5', null, {'add_hex' : '5'})}} + {{:helper.link('6', null, {'add_hex' : '6'})}} + {{:helper.link('7', null, {'add_hex' : '7'})}} +
+
+ {{:helper.link('8', null, {'add_hex' : '8'})}} + {{:helper.link('9', null, {'add_hex' : '9'})}} + {{:helper.link('A', null, {'add_hex' : 'a'})}} + {{:helper.link('B', null, {'add_hex' : 'b'})}} +
+
+ {{:helper.link('C', null, {'add_hex' : 'c'})}} + {{:helper.link('D', null, {'add_hex' : 'd'})}} + {{:helper.link('E', null, {'add_hex' : 'e'})}} + {{:helper.link('F', null, {'add_hex' : 'f'})}} +
+
+ {{:helper.link('Dial', 'signal-diag', {'dial' : data.targetAddress})}} + {{:helper.link('Hang Up', 'close', {'hang_up' : '1'})}} +
+
+
+
+
+ +

Known Devices

+ + {{for data.knownDevices}} +
+
+ {{:value.name}} +
+
+
{{:value.address}}
{{:helper.link('Copy', 'pencil', {'copy' : value.address})}} +
+
+ {{/for}} + + + +{{else}} +

Connection Management

+
+

External Connections

+ {{for data.voice_mobs}} +
+
+ {{:value.name}} +
+
+
{{:helper.link('Disconnect', 'close', {'disconnect' : value.true_name}, null, 'redButton')}}
+
+
+ {{/for}} +

Internal Connections

+ {{for data.communicating}} +
+
+ {{:value.name}} +
+
+
{{:helper.link('Disconnect', 'close', {'disconnect' : value.true_name}, null, 'redButton')}}
+
+
+ {{/for}} +

Requests Received

+ {{for data.requestsReceived}} +
+
+ {{:value.name}} +
+
+
{{:value.address}}
{{:helper.link('Copy', 'pencil', {'copy' : value.address})}} +
+
+ {{/for}} + +

Invites Sent

+ {{for data.invitesSent}} +
+
+ {{:value.name}} +
+
+
{{:value.address}}
{{:helper.link('Copy', 'pencil', {'copy' : value.address})}} +
+
+ {{/for}} +
+{{/if}} diff --git a/nano/templates/exonet_node.tmpl b/nano/templates/exonet_node.tmpl new file mode 100644 index 00000000000..f9d81d4e92f --- /dev/null +++ b/nano/templates/exonet_node.tmpl @@ -0,0 +1,40 @@ + + +

Status

+
+
+ Power: +
+
+ {{:helper.link('On', 'power', {'toggle_power' : 1}, data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', {'toggle_power' : 1}, data.on ? null : 'selected', data.on ? 'redButton' : null)}} +
+
+ +

Ports

+
+
+ Incoming PDA Messages: +
+
+ {{:helper.link('Open', 'check', {'toggle_PDA_port' : 1}, data.allowPDAs ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_PDA_port' : 1}, data.allowPDAs ? null : 'selected')}} +
+
+
+
+ Incoming Communicators: +
+
+ {{:helper.link('Open', 'check', {'toggle_communicator_port' : 1}, data.allowCommunicators ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_communicator_port' : 1}, data.allowCommunicators ? null : 'selected')}} +
+
+
+
+ Incoming Newscaster Content: +
+
+ {{:helper.link('Open', 'check', {'toggle_newscaster_port' : 1}, data.allowNewscasters ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_newscaster_port' : 1}, data.allowNewscasters ? null : 'selected')}} +
+
diff --git a/polaris.dme b/polaris.dme index 16f869bee95..8d54da0e1fa 100644 --- a/polaris.dme +++ b/polaris.dme @@ -150,6 +150,7 @@ #include "code\datums\crew.dm" #include "code\datums\datacore.dm" #include "code\datums\disease.dm" +#include "code\datums\EPv2.dm" #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" @@ -408,6 +409,7 @@ #include "code\game\machinery\deployable.dm" #include "code\game\machinery\door_control.dm" #include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\exonet_node.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\floodlight.dm" #include "code\game\machinery\floor_light.dm" @@ -1022,6 +1024,7 @@ #include "code\modules\client\preference_setup\global\01_ui.dm" #include "code\modules\client\preference_setup\global\02_settings.dm" #include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\04_communicators.dm" #include "code\modules\client\preference_setup\occupation\occupation.dm" #include "code\modules\client\preference_setup\skills\skills.dm" #include "code\modules\clothing\chameleon.dm" @@ -1152,12 +1155,14 @@ #include "code\modules\examine\stat_icons.dm" #include "code\modules\examine\descriptions\armor.dm" #include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\devices.dm" #include "code\modules\examine\descriptions\engineering.dm" #include "code\modules\examine\descriptions\medical.dm" #include "code\modules\examine\descriptions\mobs.dm" #include "code\modules\examine\descriptions\paperwork.dm" #include "code\modules\examine\descriptions\stacks.dm" #include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\telecomms.dm" #include "code\modules\examine\descriptions\turfs.dm" #include "code\modules\examine\descriptions\weapons.dm" #include "code\modules\ext_scripts\irc.dm" From bcdd436d278a987ab2019358ff332a2cb12b1152 Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 14 Dec 2015 17:00:02 -0500 Subject: [PATCH 06/55] Adds the Exonet node to telecomms, makes telecomms a bit prettier, adds air/fire alarms and firelocks, adds teleporter board outside, and adds spare exonet node circuitboard in storage on telecomms. --- maps/polaris-3.dmm | 275 +++++++++++++++++++++++---------------------- 1 file changed, 142 insertions(+), 133 deletions(-) diff --git a/maps/polaris-3.dmm b/maps/polaris-3.dmm index cbfa2fcbf23..664aa86b800 100644 --- a/maps/polaris-3.dmm +++ b/maps/polaris-3.dmm @@ -118,18 +118,18 @@ "cn" = (/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "co" = (/turf/space,/area/turret_protected/tcomsat) "cp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing North"},/turf/space,/area/turret_protected/tcomsat) -"cq" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"cq" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cr" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cs" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Mixed Air Outlet Valve"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"ct" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"ct" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/meter,/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cu" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cv" = (/turf/simulated/floor/airless,/area/tcommsat/computer) -"cw" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor,/area/tcommsat/computer) -"cx" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) -"cy" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor,/area/tcommsat/computer) -"cz" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Lounge"},/turf/simulated/floor,/area/tcommsat/computer) -"cA" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor,/area/tcommsat/computer) -"cB" = (/turf/simulated/floor,/area/tcommsat/computer) +"cw" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cx" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cy" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Lounge"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cz" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cA" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cB" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) "cC" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) "cD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cE" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -137,14 +137,14 @@ "cG" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cH" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cI" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) -"cJ" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/tcommsat/computer) -"cK" = (/obj/structure/filingcabinet,/turf/simulated/floor/tiled,/area/tcommsat/computer) -"cL" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Main Computer Room"},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"cM" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cJ" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Main Computer Room"},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"cK" = (/obj/structure/filingcabinet,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"cL" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"cM" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) "cN" = (/turf/simulated/floor/tiled,/area/tcommsat/computer) -"cO" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/tcommsat/computer) -"cP" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/airless,/area/tcommsat/computer) -"cQ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) +"cO" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"cP" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -29; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cQ" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/obj/item/device/radio/intercom{name = "General Listening Channel"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) "cR" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) "cS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cT" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -157,8 +157,8 @@ "da" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "db" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dc" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"dd" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/obj/item/device/radio/intercom{name = "General Listening Channel"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"de" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) +"dd" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"de" = (/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor/tiled,/area/tcommsat/computer) "df" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "dg" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "dh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -169,47 +169,47 @@ "dm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/computer) "do" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/tcommsat/computer) -"dp" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"dq" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/airless,/area/tcommsat/computer) -"dr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"ds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"dt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/tcommsat/computer) -"du" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"dv" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/tcommsat/computer) -"dw" = (/obj/structure/bed/chair{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor,/area/tcommsat/computer) -"dx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"dp" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"dq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"ds" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"du" = (/obj/structure/bed/chair{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dv" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"dx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "dy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) -"dz" = (/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"dz" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "dA" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) -"dB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/computer) "dC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dF" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/tcommsat/computer) "dG" = (/turf/simulated/wall/r_wall,/area/tcommsat/chamber) -"dH" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/tcommsat/computer) -"dI" = (/obj/machinery/vending/cola,/turf/simulated/floor,/area/tcommsat/computer) -"dJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/computer) -"dK" = (/obj/item/weapon/cigbutt,/obj/machinery/light,/turf/simulated/floor,/area/tcommsat/computer) -"dL" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) -"dM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"dH" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dI" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dJ" = (/obj/item/weapon/cigbutt,/obj/machinery/light,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dM" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) "dO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/space) "dP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space) "dQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/airless,/area/space) "dR" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/airless,/area/space) -"dS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"dS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "dT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) "dU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/turret_protected/tcomsat) "dV" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) -"dW" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"dX" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) -"dY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dW" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"dX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) +"dY" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/computer) "dZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/airlock_sensor/airlock_exterior{frequency = 1381; id_tag = "server_access_ex_sensor"; master_tag = "server_access_airlock"; pixel_x = 25; pixel_y = 22},/turf/simulated/floor/tiled,/area/tcommsat/computer) "ea" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_outer"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/chamber) "eb" = (/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "server_access_sensor"; pixel_x = 12; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1381; id_tag = "server_access_pump"},/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{frequency = 1381; id_tag = "server_access_airlock"; name = "Server Access Airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "server_access_pump"; tag_chamber_sensor = "server_access_sensor"; tag_exterior_door = "server_access_outer"; tag_exterior_sensor = "server_access_ex_sensor"; tag_interior_door = "server_access_inner"; tag_interior_sensor = "server_access_in_sensor"; tag_secure = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) "ec" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"ed" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"ed" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/computer) "ee" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor/airless,/area/turret_protected/tcomsat) "ef" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "eg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) @@ -221,51 +221,51 @@ "em" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "en" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "eo" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) -"ep" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"ep" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "eq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/space,/area/turret_protected/tcomsat) "er" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "es" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "et" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/black,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ev" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment North"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ev" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment North"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ew" = (/obj/machinery/atmospherics/pipe/simple/hidden/black,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ex" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; master_tag = "server_access_airlock"; name = "interior sensor"; pixel_x = 8; pixel_y = 25},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ey" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; name = "interior sensor"; pixel_y = 25},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ez" = (/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space) -"eC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"eC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "eD" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/space,/area/turret_protected/tcomsat) "eE" = (/obj/machinery/atmospherics/pipe/simple/hidden/black,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"eH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"eI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"eF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"eG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"eH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"eI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "eJ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space) "eK" = (/obj/machinery/power/solar,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) -"eL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"eL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "eM" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/turret_protected/tcomsat) "eN" = (/obj/machinery/telecomms/server/presets/supply,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eO" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eP" = (/obj/machinery/telecomms/server/presets/unused,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/broadcaster/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eQ" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/telecomms/exonet_node,/turf/simulated/floor,/area/turret_protected/tcomsat) "eR" = (/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eS" = (/obj/machinery/telecomms/server/presets/engineering,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/space,/area/turret_protected/tcomsat) "eU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) -"eV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"eV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "eW" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor,/area/turret_protected/tcomsat) "eX" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Storage"},/turf/simulated/floor,/area/turret_protected/tcomsat) -"eY" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/turf/simulated/floor,/area/turret_protected/tcomsat) +"eY" = (/obj/machinery/exonet_node,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eZ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing Central"; dir = 8},/turf/space,/area/turret_protected/tcomsat) -"fa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "fb" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/space,/area/turret_protected/tcomsat) "fc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "fd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) -"fe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fe" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor,/area/turret_protected/tcomsat) "ff" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor,/area/turret_protected/tcomsat) "fg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fh" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fh" = (/obj/machinery/telecomms/hub/preset,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/space) "fj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/space) "fk" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar West"; dir = 8},/turf/simulated/floor/airless,/area/space) @@ -274,14 +274,14 @@ "fn" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fo" = (/obj/machinery/telecomms/bus/preset_two,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fp" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/hub/preset,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fq" = (/obj/machinery/telecomms/broadcaster/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fr" = (/obj/machinery/telecomms/relay/preset/station,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fs" = (/obj/machinery/telecomms/bus/preset_four,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ft" = (/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fu" = (/obj/structure/sign/nosmoking_2{pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/space,/area/turret_protected/tcomsat) "fw" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) -"fx" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Telecoms Storage"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fx" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomsat) "fz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/turret_protected/tcomsat) "fA" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomsat) @@ -292,11 +292,11 @@ "fF" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fG" = (/obj/machinery/telecomms/bus/preset_three,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) -"fI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fI" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Telecoms Storage"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "fJ" = (/turf/simulated/floor,/area/turret_protected/tcomsat) "fK" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fL" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fM" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/turret_protected/tcomsat) "fN" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor,/area/turret_protected/tcomsat) "fO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor,/area/turret_protected/tcomsat) "fP" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor,/area/turret_protected/tcomsat) @@ -308,96 +308,96 @@ "fV" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 10},/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fW" = (/obj/machinery/telecomms/server/presets/command,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fX" = (/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor/bluegrid{icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "fZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; use_power = 1; pressure_checks = 0; pressure_checks_default = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ga" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment South"; dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ga" = (/obj/machinery/light,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment South"; dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "gb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"gc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcommsat/chamber) +"gc" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) "gd" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) "ge" = (/obj/structure/window/reinforced,/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) "gf" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomfoyer) -"gg" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gh" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Foyer"},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gg" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) +"gh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Foyer"},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) +"gi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) +"gj" = (/obj/machinery/porta_turret{dir = 10},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) "gk" = (/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gl" = (/obj/machinery/porta_turret{dir = 10},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gl" = (/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) +"gm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) "gn" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) "go" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) -"gp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) -"gq" = (/obj/machinery/door/airlock/hatch{name = "Telecoms West Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"gq" = (/obj/machinery/door/airlock/hatch{name = "Telecoms West Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) "gr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gt" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) "gu" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "gv" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms East Wing South"; dir = 8},/turf/space,/area/turret_protected/tcomsat) "gw" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing South"; dir = 4},/turf/space,/area/turret_protected/tcomsat) "gx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) -"gy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gz" = (/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gy" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gz" = (/obj/machinery/light/small,/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) "gA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) "gB" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"gC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) -"gD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"gC" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) +"gD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/turret_protected/tcomfoyer) "gE" = (/turf/simulated/floor/tiled,/area/tcommsat/entrance) "gF" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled,/area/tcommsat/entrance) "gG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/entrance) "gH" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"gI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gJ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room West"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"gK" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room East"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gJ" = (/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"gK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcommsat/entrance) "gL" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"gM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcommsat/entrance) "gN" = (/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol) "gO" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol) -"gP" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance North"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"gQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"gR" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Airlock"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"gP" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room West"},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"gQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"gR" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room East"},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "gS" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"gT" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"gU" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"gT" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"gU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/entrance) "gV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar Control"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "gW" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"gX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"gY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"gX" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance North"},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"gY" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Airlock"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "gZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "ha" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hb" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar_control/autostart,/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"hc" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hc" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"hd" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "he" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) "hf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hg" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hg" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hh" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated,/area/tcommsat/powercontrol) "hi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hj" = (/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hk" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/power/sensor{long_range = 1; name_tag = "Telecommunications"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"hl" = (/obj/item/weapon/cell,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hl" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "hm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hn" = (/obj/structure/closet/malf/suits,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hn" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "ho" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/tcommsat/powercontrol) "hp" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/tcommsat/powercontrol) "hq" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/tcommsat/powercontrol) "hr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"ht" = (/obj/machinery/door/airlock/hatch{name = "Power Control"; req_access = list(61)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"ht" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hu" = (/obj/machinery/bluespace_beacon,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hv" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hv" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "hw" = (/turf/simulated/floor/airless,/area/space) "hx" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hy" = (/obj/machinery/power/smes/buildable{charge = 2.5e+006; input_attempt = 1; input_level = 250000; inputting = 1; output_level = 250000; RCon_tag = "Telecommunications Satellite"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"hA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/standard,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"hA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "hB" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol) -"hC" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hD" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance South"; dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"hE" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hC" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"hD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"hE" = (/obj/item/weapon/cell,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "hF" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/tracker,/turf/simulated/floor/airless,/area/space) "hG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/space) -"hH" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"hI" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"hJ" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/tcommsat/entrance) +"hH" = (/obj/structure/closet/malf/suits,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"hI" = (/obj/machinery/door/airlock/hatch{name = "Power Control"; req_access = list(61)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"hJ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) "hK" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar South"},/turf/simulated/floor/airless,/area/space) "hL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space) "hM" = (/turf/space,/area/syndicate_station/commssat) @@ -418,6 +418,15 @@ "ib" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless,/area/AIsattele) "ic" = (/obj/structure/grille/broken,/turf/space,/area/AIsattele) "id" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/airless,/area/AIsattele) +"ie" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"if" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"ig" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance South"; dir = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"ih" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"ii" = (/obj/machinery/teleport/station,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"ij" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"ik" = (/obj/machinery/teleport/hub,/turf/simulated/floor/holofloor/tiled/dark,/area/tcommsat/entrance) +"il" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/AIsattele) +"im" = (/obj/item/weapon/circuitboard/teleporter,/turf/space,/area/space) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -533,38 +542,38 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaachcdcdcdcdcdcdcdcdcdcdcdcdcdcicdcdcdcdcdcdcdcdcdcdcdcdcdcjaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaachcfckckckckckckckckckckckckckckckckckckckckckckckckckckckcccjaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaachcfckckclclclclclclclclclckckckckckckckckckcmcmcmcmcmcmcmcmckcccjaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckckclcncocpcqcrcsctcuclcmcmcmcmcmcmcmcmcvcmcwcxcyczcAcBcmckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcncncncCcDcEcFcGcHcIcmcJcKcLcMcNcOcmcPcmcQcBcBcBcBcBcmckckcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTcgckclcocncocRcScTcUcVcWcXcmcYcZdadbdcddcmcPcmdecBcBcBcBcBcmckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcocncocodfdgdhdidjdkdldmdncNcNdodpcmdqcmdrdsdtdudvdwcmckckcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgckclcocncocRdxdydzdAdAdAdBdCdDdEdDdFdGdGdGcmdHdIdJdKdLdMdNdOdOdPdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaacgckclcocncocRdSdTdUdVdVdVcmdWdXdYcNdZeaebeccmcmcmedcmcmcmcmckckcgaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckckclcncocpcqcrcsctcuclcmcmcmcmcmcmcmcmcvcmcxcwczcycAcNcmckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcncncncCcDcEcFcGcHcIcmcBcKcJcMcLcOcmcvcmcPcNcNcNcNcNcmckckcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTcgckclcocncocRcScTcUcVcWcXcmcYcZdadbdccQcmcvcmddcNcNcNcNdecmckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcocncocodfdgdhdidjdkdldmdncNcNdodpcmcvcmdrdqdtdsdvducmckckcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgckclcocncocRdxdwdzdAdAdAdBdCdDdEdDdFdGdGdGcmdIdHdKdJdMdLdNdOdOdPdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaacgckclcocncocRdSdTdUdVdVdVcmdWdYdXcNdZeaebeccmcmcmedcmcmcmcmckckcgaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaTaaaaaacgckclcneecnefdScIdGdGdGdGdGegeheiejekdGdGeldGdGefemencneecnclckcgaaaaaaaaaTaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeoeoeoeoeoeoeoeoeoeoaaaacgckclcocncocRepeqdGererereseteueverewexeyezeAdGefemcXcocncoclckcccjaaaaeoeoeoeoeoeoeoeoeoeoaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTeBeBeBeBeBeBeBeBeBeBcjaTcgckclcocncocReCeDdGerezezezeEezeFezeEezezezerdGefemcXeGeHeIclckckcgaTcheJeJeJeJeJeJeJeJeJeJaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeKeKeKeKeKeKeKeKeKeKcgaacgckclcocncocReLeMdGereNeOePeEezeQezeEezeReSerdGeTeUcXeVeWeXeYclckcgaacgeKeKeKeKeKeKeKeKeKeKaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaaaaaaaaaaaaaTaacgaacgckclcocncocRemeZdGerezezezeEezfaezeEezezezerdGfbfcfdfefffgfhclckcgaacgaaaTaaaaaaaaaaaaaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaTaTaTaTaTaTaTaTfifjfkckclcncncnefdSfldGfmfnfofpewerfqerewfrfsftfudGfvfwdyfxfyfzfAclckfBfjfCaTaTaTaTaTaTaTaTaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaaaaaaaaaaaaaTaacgaacgckclcocncocRdScXdGerfDfEezeEezfaezeEezfFfGerdGcRemfHfIfJfKfLclckcgaacgaaaTaaaaaaaaaaaaaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeoeoeoeoeoeoeoeoeoeocgaacgckclcocncocRemcXdGerezezezeEezfMezeEezezezerdGcRemcXeVfNfOfPclckcgaacgeoeoeoeoeoeoeoeoeoeoaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTeBeBeBeBeBeBeBeBeBeBcfaTcgckclcocncocRdScXdGerfQfRfSfTezeFezfUfVfWfXerdGcRemcXfYeHeIclckckcgaTcceJeJeJeJeJeJeJeJeJeJaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTeBeBeBeBeBeBeBeBeBeBcjaTcgckclcocncocReCeDdGerezezezeEezezezeEezezezerdGefemcXeGeFeHclckckcgaTcheJeJeJeJeJeJeJeJeJeJaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeKeKeKeKeKeKeKeKeKeKcgaacgckclcocncocReIeMdGereNeOePeEezerezeEezeReSerdGeTeUcXeLeWeXeQclckcgaacgeKeKeKeKeKeKeKeKeKeKaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaaaaaaaaaaaaaTaacgaacgckclcocncocReVeZdGerezezezeEezeYezeEezezezerdGfbfcfdfafffgfeclckcgaacgaaaTaaaaaaaaaaaaaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaTaTaTaTaTaTaTaTfifjfkckclcncncnefdSfldGfmfnfofpewfqfhfxewfrfsftfudGfvfwdyfIfyfzfAclckfBfjfCaTaTaTaTaTaTaTaTaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaTaaaaaaaaaaaaaTaacgaacgckclcocncocRdScXdGerfDfEezeEezerezeEezfFfGerdGcRemfHfLfJfKfMclckcgaacgaaaTaaaaaaaaaaaaaTaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeoeoeoeoeoeoeoeoeoeocgaacgckclcocncocReVcXdGerezezezeEezerezeEezezezerdGcRemcXeLfNfOfPclckcgaacgeoeoeoeoeoeoeoeoeoeoaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTeBeBeBeBeBeBeBeBeBeBcfaTcgckclcocncocRdScXdGerfQfRfSfTezezezfUfVfWfXerdGcRemcXfYeFeHclckckcgaTcceJeJeJeJeJeJeJeJeJeJaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeKeKeKeKeKeKeKeKeKeKaaaacgckclcocncocRdScXdGerererfZerergaerergberererdGcRemcXcocncoclckchcfaaaaeKeKeKeKeKeKeKeKeKeKaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaTaaaaaacgckclcneecnefemcIdGdGdGdGdGdGdGgcdGdGdGdGdGdGdGefemcIcneecnclckcgaaaaaaaaaTaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaacgckclcocncocRemgdgedkdkgfggghgigjgkglgmgfdkdkgngoemcXcocncoclckcgaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgckclcocncocRgpdydydydygqgrgrgrgsgrgrgrgtdydydydygucXcocngvclckcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclgwcncocodVdVgxdVdVgfgygzgkgAgkgzgmgfdVdVdVdVdVcococncoclckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTcgckclcocncococococncogBgfgfgfgfgCgfgfgfgfgBcococococococncoclckcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcncncncncncncncngDgEgEgBgFgGgHgBgEgEgIcncncncncncncncnclckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckckclcncocococococlgBgEgEgJgEgGgEgKgEgEgBclcocococococnclckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacccjckckclclclclclclclgBgBgBgBgLgMgLgBgBgBgBclclclclclclclckckchcfaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaacccjckgNgOgNgNgNgNgNgNgNgBgBgEgGgPgBgBgBckckckckckckckckckchcfaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaacccjgNgQgRgSgTgUgVgWgNgBgBgEgGgEgBgBgBchcdcdcdcdcdcdcdcdcfaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaacggNgXgYgNgZhahahbgNgBhchdhehfhggBgBcgaaaaaaaaaaaaaaaTaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaacggNhhgNgNhihjhjhkgNgEhlgEhmgEgEhngBcgaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacchohphqgNhrhjhjhshthfhfhfhugEgEhvgBcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaThwhwcghwgNhxhyhzhAhBhCgEgEgEgEgEhngBcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaahwhwcghwgNgNgNgNgNgNgBhDgEgEgEhEgBgBcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFcdhGcdcdcdcdcdcdcjgBgBhHhIhJgBgBchcfaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaTaaaaaacgckclcneecnefeVcIdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGefemcIcneecnclckcgaaaaaaaaaTaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaacgckclcocncocReVgdgedkdkgfgggcgighglgjgmgfdkdkgngoemcXcocncoclckcgaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgckclcocncocRgpdwdwdwdwgqgsgsgsgtgrgrgrgydydydydygucXcocngvclckcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclgwcncocodVdVgxdVdVgfgCgzgkgAgkgzgDgfdVdVdVdVdVcococncoclckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaTcgckclcocncococococncogBgfgfgfgfgIgfgfgfgfgBcococococococncoclckcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckclcncncncncncncncngKgJgJgBgFgGgHgBgJgJgMcncncncncncncncnclckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacgckckclcncocococococlgBgJgQgPgEgGgEgRgTgJgBclcocococococnclckckcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacccjckckclclclclclclclgBgBgBgBgLgUgLgBgBgBgBclclclclclclclckckchcfaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaacccjckgNgOgNgNgNgNgNgNgNgBgBgJgGgXgBgBgBckckckckckckckckckchcfaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaacccjgNhcgYgShdhggVgWgNgBgBhlgGgJgBgBgBchcdcdcdcdcdcdcdcdcfaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaacggNhthngNgZhahahbgNgBhvhAhehDhCgBgBcgaaaaaaaaaaaaaaaTaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaacggNhhgNgNhihjhjhkgNgJhEgEhmgEgJhHgBcgaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacchohphqgNhrhjhjhshIhDhfhfhugEgEhJgBcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaThwhwcghwgNhxhyhziehBifgJgEgEgEgJhHgBcgaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaahwhwcghwgNgNgNgNgNgNgBiggJgJgJihgBgBcgaTbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFcdhGcdcdcdcdcdcdcjgBgBijiiikgBgBchcfaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaTaaaacccjgBgBgBgBgBchcfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYaaaacccdcdhKcdcdcfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaacgaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -605,7 +614,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahNhNhNhNhNaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaThNhNhOhPhQhNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaThNhNhOhPilhNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaTaThNhNhRhQhShQhThNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahUhVhQhWhXhQhQhYhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQhQhQhZhZhZhQhQhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -627,9 +636,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMaahMhMhMhMhMaahMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMaaaaaaaaaaaaaahMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaimaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 0cb2586ce5972ad1aec507555cda64d018783b57 Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 14 Dec 2015 17:09:52 -0500 Subject: [PATCH 07/55] Fixes misplaced processing_objects -= src in observer Destroy() --- code/game/objects/items/devices/communicator/communicator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index a6f0959e4bf..cf401b3bc4b 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -177,7 +177,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Description: Removes the ghost's address and nulls the exonet datum, to allow qdel()ing. /mob/dead/observer/Destroy() . = ..() - processing_objects -= src if(exonet) exonet.remove_address() exonet = null @@ -525,6 +524,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() voice_requests.Cut() voice_invites.Cut() all_communicators -= src + processing_objects -= src if(exonet) exonet.remove_address() exonet = null From 172ef26cc9a6725d8f0f20fca04f0ebee8e6eb31 Mon Sep 17 00:00:00 2001 From: Mark9013100 Date: Mon, 14 Dec 2015 18:32:00 -0500 Subject: [PATCH 08/55] Adds festive santa hats! --- code/modules/client/preferences_gear.dm | 12 ++++++++++++ code/modules/clothing/head/misc_special.dm | 14 +++++++++++++- icons/mob/head.dmi | Bin 152684 -> 153340 bytes icons/obj/clothing/hats.dmi | Bin 70728 -> 71094 bytes 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 002b0807d34..91194dd71de 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -281,6 +281,18 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head +/datum/gear/santahatred + display_name = "santa hat, red" + path = /obj/item/clothing/head/santa + cost = 1 + slot = slot_head + +/datum/gear/santahatgreen + display_name = "santa hat, green" + path = /obj/item/clothing/head/santa/green + cost = 1 + slot = slot_head + // This was sprited and coded specifically for Zhan-Khazan characters. Before you // decide that it's 'not even Taj themed' maybe you should read the wiki, gamer. ~ Z /datum/gear/zhan_scarf diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 42e830c4e48..a8887c17f59 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -5,7 +5,7 @@ * Ushanka * Pumpkin head * Kitty ears - * + * Holiday hats */ /* @@ -153,3 +153,15 @@ icon_state = "richard" body_parts_covered = HEAD|FACE flags_inv = BLOCKHAIR + +/obj/item/clothing/head/santa + name = "santa hat" + desc = "It's a festive christmas hat, in red!" + icon_state = "santahatnorm" + body_parts_covered = 0 + +/obj/item/clothing/head/santa/green + name = "green santa hat" + desc = "It's a festive christmas hat, in green!" + icon_state = "santahatgreen" + body_parts_covered = 0 \ No newline at end of file diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 4cc00ae37f6170c01ad8bdcfebdbc4e30de276a3..25d066ddd7eaba69bf9cb531e814ef34a82b0dcd 100644 GIT binary patch delta 16902 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 delta 16246 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 z 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 MzELQbGY$U#0Ga_m<^TWy diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 8a1659dc9d51c51cf853598571d6aafe6bbc05b7..73818507ca807b09dee84b77c921d613d1efef36 100644 GIT binary patch delta 14619 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

&d{9*JF)cwD7Euz$5{&i|ec;HRm|@;M(3Mn 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 delta 14250 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 K-^zq^z5W-IuPihG From edd53b813c5a5777c11208f7dcc90cbaeea7d293 Mon Sep 17 00:00:00 2001 From: Mark9013100 Date: Mon, 14 Dec 2015 19:18:56 -0500 Subject: [PATCH 09/55] Corrections to custom loadout --- code/modules/client/preferences_gear.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 91194dd71de..380647d90f9 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -354,17 +354,18 @@ var/global/list/gear_datums = list() allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/thugshades - display_name = "Sunglasses, Fat (Security)" + display_name = "Sunglasses, Fat" path = /obj/item/clothing/glasses/sunglasses/big cost = 1 slot = slot_glasses - allowed_roles = list("Security Officer","Head of Security","Warden") + allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") /datum/gear/prescriptionsun display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription cost = 2 slot = slot_glasses + allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") // Mask @@ -1253,6 +1254,7 @@ var/global/list/gear_datums = list() path = /obj/item/clothing/suit/storage/toggle/labcoat/emt cost = 2 slot = slot_wear_suit + allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist") /datum/gear/overalls display_name = "overalls" @@ -1628,11 +1630,13 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/* /datum/gear/boot_knife display_name = "boot knife" path = /obj/item/weapon/material/kitchen/utensil/knife/boot sort_category = "misc" cost = 3 +*/ /datum/gear/cane display_name = "cane" From b994a07dc2b2f86ae8224cf22f7fc9349ca8565c Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 15 Dec 2015 13:32:01 +0100 Subject: [PATCH 10/55] Fixes duplicate gas layers --- code/ZAS/Controller.dm | 1 + code/ZAS/Zone.dm | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index f5939b023db..cfd6cff4148 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -234,6 +234,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/remove_zone(zone/z) zones.Remove(z) + zones_to_update.Remove(z) /datum/controller/air_system/proc/air_blocked(turf/A, turf/B) #ifdef ZASDBG diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index 9fcddc92465..da39b868d3a 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -108,11 +108,12 @@ Class Procs: c_invalidate() for(var/turf/simulated/T in contents) into.add(T) + T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG T.dbg(merged) #endif - - //rebuild the old zone's edges so that the will be possesed by the new zone + + //rebuild the old zone's edges so that they will be possessed by the new zone for(var/connection_edge/E in edges) if(E.contains_zone(into)) continue //don't need to rebuild this edge From 58cb56492e26018b13e3f18b7dfbf7ee119f0d1c Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 15 Dec 2015 13:57:52 +0100 Subject: [PATCH 11/55] Tweaks Filtering and Toxic Gases --- code/__defines/machinery.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 97d2d2fc32b..eaa0b7d2a9f 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -91,7 +91,7 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret // Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. #define MINIMUM_MOLES_TO_PUMP 0.01 -#define MINIMUM_MOLES_TO_FILTER 0.1 +#define MINIMUM_MOLES_TO_FILTER 0.04 // The flow rate/effectiveness of various atmos devices is limited by their internal volume, // so for many atmos devices these will control maximum flow rates in L/s. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index eea05654d7f..97327c4bbdb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -375,7 +375,7 @@ safe_pressure_min *= 1.25 var/safe_exhaled_max = 10 - var/safe_toxins_max = 0.005 + var/safe_toxins_max = 0.2 var/SA_para_min = 1 var/SA_sleep_min = 5 var/inhaled_gas_used = 0 From bb55eb736852648f868c18ad56bbdacdea4e8301 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Tue, 15 Dec 2015 15:38:26 +0100 Subject: [PATCH 12/55] Fixes vaccum pockets on new floors --- code/modules/mining/mine_turfs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index f49ee26cb7b..03fadf92a58 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -492,7 +492,7 @@ return qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - ChangeTurf(/turf/simulated/floor/airless) + ChangeTurf(/turf/simulated/floor) S.use(1) return else From 075121d2018f869d9e02669b595c287ff3dd10b0 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Tue, 15 Dec 2015 18:08:15 +0000 Subject: [PATCH 13/55] unix2dos polaris.dme --- polaris.dme | 3810 +++++++++++++++++++++++++-------------------------- 1 file changed, 1905 insertions(+), 1905 deletions(-) diff --git a/polaris.dme b/polaris.dme index eb1d35ef920..2acbed414ca 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1,1905 +1,1905 @@ -// DM Environment file for baystation12.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "code\_macros.dm" -#include "code\global.dm" -#include "code\hub.dm" -#include "code\names.dm" -#include "code\stylesheet.dm" -#include "code\world.dm" -#include "code\__defines\_compile_options.dm" -#include "code\__defines\admin.dm" -#include "code\__defines\atmos.dm" -#include "code\__defines\chemistry.dm" -#include "code\__defines\damage_organs.dm" -#include "code\__defines\dna.dm" -#include "code\__defines\gamemode.dm" -#include "code\__defines\items_clothing.dm" -#include "code\__defines\lighting.dm" -#include "code\__defines\machinery.dm" -#include "code\__defines\math_physics.dm" -#include "code\__defines\misc.dm" -#include "code\__defines\mobs.dm" -#include "code\__defines\research.dm" -#include "code\__defines\species_languages.dm" -#include "code\__defines\turfs.dm" -#include "code\_helpers\atmospherics.dm" -#include "code\_helpers\datum_pool.dm" -#include "code\_helpers\files.dm" -#include "code\_helpers\game.dm" -#include "code\_helpers\global_lists.dm" -#include "code\_helpers\icons.dm" -#include "code\_helpers\lists.dm" -#include "code\_helpers\logging.dm" -#include "code\_helpers\maths.dm" -#include "code\_helpers\matrices.dm" -#include "code\_helpers\mobs.dm" -#include "code\_helpers\names.dm" -#include "code\_helpers\sanitize_values.dm" -#include "code\_helpers\text.dm" -#include "code\_helpers\time.dm" -#include "code\_helpers\turfs.dm" -#include "code\_helpers\type2type.dm" -#include "code\_helpers\unsorted.dm" -#include "code\_helpers\vector.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\spell_screen_objects.dm" -#include "code\ATMOSPHERICS\_atmos_setup.dm" -#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_pipe_network.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\he_pipes.dm" -#include "code\ATMOSPHERICS\mainspipe.dm" -#include "code\ATMOSPHERICS\pipes.dm" -#include "code\ATMOSPHERICS\components\portables_connector.dm" -#include "code\ATMOSPHERICS\components\tvalve.dm" -#include "code\ATMOSPHERICS\components\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary\generator_input.dm" -#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary\oxygen_generator.dm" -#include "code\ATMOSPHERICS\components\unary\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" -#include "code\controllers\autotransfer.dm" -#include "code\controllers\communications.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\emergency_shuttle_controller.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master_controller.dm" -#include "code\controllers\shuttle_controller.dm" -#include "code\controllers\subsystems.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\voting.dm" -#include "code\controllers\Processes\air.dm" -#include "code\controllers\Processes\alarm.dm" -#include "code\controllers\Processes\chemistry.dm" -#include "code\controllers\Processes\disease.dm" -#include "code\controllers\Processes\emergencyShuttle.dm" -#include "code\controllers\Processes\event.dm" -#include "code\controllers\Processes\garbage.dm" -#include "code\controllers\Processes\inactivity.dm" -#include "code\controllers\Processes\machinery.dm" -#include "code\controllers\Processes\mob.dm" -#include "code\controllers\Processes\nanoui.dm" -#include "code\controllers\Processes\obj.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" -#include "code\controllers\Processes\turf.dm" -#include "code\controllers\Processes\vote.dm" -#include "code\controllers\ProcessScheduler\core\_define.dm" -#include "code\controllers\ProcessScheduler\core\_stubs.dm" -#include "code\controllers\ProcessScheduler\core\process.dm" -#include "code\controllers\ProcessScheduler\core\processScheduler.dm" -#include "code\controllers\ProcessScheduler\core\updateQueue.dm" -#include "code\controllers\ProcessScheduler\core\updateQueueWorker.dm" -#include "code\controllers\subsystem\alarms.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\browser.dm" -#include "code\datums\category.dm" -#include "code\datums\computerfiles.dm" -#include "code\datums\crew.dm" -#include "code\datums\datacore.dm" -#include "code\datums\disease.dm" -#include "code\datums\EPv2.dm" -#include "code\datums\mind.dm" -#include "code\datums\mixed.dm" -#include "code\datums\modules.dm" -#include "code\datums\organs.dm" -#include "code\datums\recipe.dm" -#include "code\datums\sun.dm" -#include "code\datums\supplypacks.dm" -#include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\dna_spread.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\jungle_fever.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\plasmatoid.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\robotic_transformation.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\xeno_transformation.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\damage_converter.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\global_iterator.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\locations\locations.dm" -#include "code\datums\locations\nyx.dm" -#include "code\datums\locations\qerrvallis.dm" -#include "code\datums\locations\s_randarr.dm" -#include "code\datums\locations\sol.dm" -#include "code\datums\locations\tau_ceti.dm" -#include "code\datums\locations\uueoa_esa.dm" -#include "code\datums\locations\vir.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\mulebot.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\smes.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\gases.dm" -#include "code\defines\obj.dm" -#include "code\defines\obj\weapon.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\hud.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\sd_Alert.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\asteroid.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\base_turf.dm" -#include "code\game\periodic_news.dm" -#include "code\game\response_team.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\skincmd.dm" -#include "code\game\sound.dm" -#include "code\game\supplyshuttle.dm" -#include "code\game\antagonist\_antagonist_setup.dm" -#include "code\game\antagonist\antagonist.dm" -#include "code\game\antagonist\antagonist_add.dm" -#include "code\game\antagonist\antagonist_create.dm" -#include "code\game\antagonist\antagonist_equip.dm" -#include "code\game\antagonist\antagonist_factions.dm" -#include "code\game\antagonist\antagonist_helpers.dm" -#include "code\game\antagonist\antagonist_objectives.dm" -#include "code\game\antagonist\antagonist_panel.dm" -#include "code\game\antagonist\antagonist_place.dm" -#include "code\game\antagonist\antagonist_print.dm" -#include "code\game\antagonist\antagonist_update.dm" -#include "code\game\antagonist\alien\borer.dm" -#include "code\game\antagonist\alien\xenomorph.dm" -#include "code\game\antagonist\outsider\commando.dm" -#include "code\game\antagonist\outsider\deathsquad.dm" -#include "code\game\antagonist\outsider\ert.dm" -#include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" -#include "code\game\antagonist\outsider\raider.dm" -#include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\changeling.dm" -#include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\highlander.dm" -#include "code\game\antagonist\station\loyalist.dm" -#include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" -#include "code\game\antagonist\station\rogue_ai.dm" -#include "code\game\antagonist\station\traitor.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\asteroid_areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\game_mode_latespawn.dm" -#include "code\game\gamemodes\gameticker.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_powers.dm" -#include "code\game\gamemodes\changeling\generic_equip_procs.dm" -#include "code\game\gamemodes\changeling\modularchangling.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\armblade.dm" -#include "code\game\gamemodes\changeling\powers\armor.dm" -#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" -#include "code\game\gamemodes\changeling\powers\blind_sting.dm" -#include "code\game\gamemodes\changeling\powers\boost_range.dm" -#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" -#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" -#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" -#include "code\game\gamemodes\changeling\powers\digital_camo.dm" -#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" -#include "code\game\gamemodes\changeling\powers\endoarmor.dm" -#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" -#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" -#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" -#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" -#include "code\game\gamemodes\changeling\powers\fake_death.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" -#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" -#include "code\game\gamemodes\changeling\powers\respec.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\self_respiration.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\silence_sting.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" -#include "code\game\gamemodes\cult\cultify\obj.dm" -#include "code\game\gamemodes\cult\cultify\turf.dm" -#include "code\game\gamemodes\endgame\endgame.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" -#include "code\game\gamemodes\events\black_hole.dm" -#include "code\game\gamemodes\events\clang.dm" -#include "code\game\gamemodes\events\dust.dm" -#include "code\game\gamemodes\events\power_failure.dm" -#include "code\game\gamemodes\events\wormholes.dm" -#include "code\game\gamemodes\events\holidays\Christmas.dm" -#include "code\game\gamemodes\events\holidays\Holidays.dm" -#include "code\game\gamemodes\events\holidays\Other.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\malfunction\malf_hardware.dm" -#include "code\game\gamemodes\malfunction\malf_research.dm" -#include "code\game\gamemodes\malfunction\malf_research_ability.dm" -#include "code\game\gamemodes\malfunction\malfunction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\mixed\bughunt.dm" -#include "code\game\gamemodes\mixed\conflux.dm" -#include "code\game\gamemodes\mixed\infestation.dm" -#include "code\game\gamemodes\mixed\paranoia.dm" -#include "code\game\gamemodes\mixed\traitorling.dm" -#include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\ninja\ninja.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\jobs\_access_defs.dm" -#include "code\game\jobs\access.dm" -#include "code\game\jobs\access_datum.dm" -#include "code\game\jobs\job_controller.dm" -#include "code\game\jobs\jobprocs.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\job\assistant.dm" -#include "code\game\jobs\job\captain.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\civilian_chaplain.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\alarm.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\autolathe_datums.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\biogenerator.dm" -#include "code\game\machinery\bioprinter.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\CableLayer.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\exonet_node.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\floor_light.dm" -#include "code\game\machinery\floorlayer.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\jukebox.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\nuclear_bomb.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\robot_fabricator.dm" -#include "code\game\machinery\seed_extractor.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\status_display_ai.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\turrets.dm" -#include "code\game\machinery\vending.dm" -#include "code\game\machinery\wall_frames.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\bots\bots.dm" -#include "code\game\machinery\bots\mulebot.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\buildandrepair.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\guestpass.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\prisonshuttle.dm" -#include "code\game\machinery\computer\RCON_Console.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\shuttle.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\supply.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer3\bios.dm" -#include "code\game\machinery\computer3\buildandrepair.dm" -#include "code\game\machinery\computer3\component.dm" -#include "code\game\machinery\computer3\computer.dm" -#include "code\game\machinery\computer3\computer3_notes.dm" -#include "code\game\machinery\computer3\file.dm" -#include "code\game\machinery\computer3\laptop.dm" -#include "code\game\machinery\computer3\lapvend.dm" -#include "code\game\machinery\computer3\networking.dm" -#include "code\game\machinery\computer3\NTOS.dm" -#include "code\game\machinery\computer3\program.dm" -#include "code\game\machinery\computer3\program_disks.dm" -#include "code\game\machinery\computer3\server.dm" -#include "code\game\machinery\computer3\storage.dm" -#include "code\game\machinery\computer3\computers\arcade.dm" -#include "code\game\machinery\computer3\computers\atmos_alert.dm" -#include "code\game\machinery\computer3\computers\camera.dm" -#include "code\game\machinery\computer3\computers\card.dm" -#include "code\game\machinery\computer3\computers\communications.dm" -#include "code\game\machinery\computer3\computers\crew.dm" -#include "code\game\machinery\computer3\computers\customs.dm" -#include "code\game\machinery\computer3\computers\HolodeckControl.dm" -#include "code\game\machinery\computer3\computers\law.dm" -#include "code\game\machinery\computer3\computers\medical.dm" -#include "code\game\machinery\computer3\computers\Operating.dm" -#include "code\game\machinery\computer3\computers\power.dm" -#include "code\game\machinery\computer3\computers\prisoner.dm" -#include "code\game\machinery\computer3\computers\robot.dm" -#include "code\game\machinery\computer3\computers\security.dm" -#include "code\game\machinery\computer3\computers\welcome.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\blast_door.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\firedoor_assembly.dm" -#include "code\game\machinery\doors\multi_tile.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\docking_program.dm" -#include "code\game\machinery\embedded_controller\docking_program_multi.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\kitchen\gibber.dm" -#include "code\game\machinery\kitchen\microwave.dm" -#include "code\game\machinery\kitchen\smartfridge.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\pipe\pipelayer.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mech_sensor.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\tools.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\hoverpod.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\explosion_recursive.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\weapons.dm" -#include "code\game\objects\effects\aliens.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\effect_system.dm" -#include "code\game\objects\effects\explosion_particles.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\chem\chemsmoke.dm" -#include "code\game\objects\effects\chem\foam.dm" -#include "code\game\objects\effects\chem\water.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\posters\bs12.dm" -#include "code\game\objects\effects\decals\posters\polarisposters.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\glassjar.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\paintkit.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\toys.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\binoculars.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\debugger.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\modkit.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\spy_bug.dm" -#include "code\game\objects\items\devices\suit_cooling.dm" -#include "code\game\objects\items\devices\t_scanner.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_categories.dm" -#include "code\game\objects\items\devices\uplink_items.dm" -#include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\violin.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\communicator\communicator.dm" -#include "code\game\objects\items\devices\PDA\cart.dm" -#include "code\game\objects\items\devices\PDA\chatroom.dm" -#include "code\game\objects\items\devices\PDA\PDA.dm" -#include "code\game\objects\items\devices\PDA\radio.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\stacks\matter_synth.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\rods.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\autopsy.dm" -#include "code\game\objects\items\weapons\candle.dm" -#include "code\game\objects\items\weapons\cards_ids.dm" -#include "code\game\objects\items\weapons\cards_ids_syndicate.dm" -#include "code\game\objects\items\weapons\cigs_lighters.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\dice.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\kitchen.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\mop_deploy.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\policetape.dm" -#include "code\game\objects\items\weapons\power_cells.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\surgery_tools.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\tools.dm" -#include "code\game\objects\items\weapons\traps.dm" -#include "code\game\objects\items\weapons\trays.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\weldbackpack.dm" -#include "code\game\objects\items\weapons\wires.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" -#include "code\game\objects\items\weapons\circuitboards\mecha.dm" -#include "code\game\objects\items\weapons\circuitboards\other.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" -#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\explosive.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\fragmentation.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implantfreedom.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\material\ashtray.dm" -#include "code\game\objects\items\weapons\material\bats.dm" -#include "code\game\objects\items\weapons\material\kitchen.dm" -#include "code\game\objects\items\weapons\material\knives.dm" -#include "code\game\objects\items\weapons\material\material_weapons.dm" -#include "code\game\objects\items\weapons\material\misc.dm" -#include "code\game\objects\items\weapons\material\shards.dm" -#include "code\game\objects\items\weapons\material\swords.dm" -#include "code\game\objects\items\weapons\material\thrown.dm" -#include "code\game\objects\items\weapons\material\twohanded.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\misc.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\random\random.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\lamarr_cage.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" -#include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\simple_doors.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\transit_tubes.dm" -#include "code\game\objects\structures\under_wardrobe.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\window_spawner.dm" -#include "code\game\objects\structures\crates_lockers\closets.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\turf_changing.dm" -#include "code\game\turfs\turf_flick_animations.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\flooring\flooring.dm" -#include "code\game\turfs\flooring\flooring_decals.dm" -#include "code\game\turfs\flooring\flooring_premade.dm" -#include "code\game\turfs\initialization\init.dm" -#include "code\game\turfs\initialization\maintenance.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\floor_acts.dm" -#include "code\game\turfs\simulated\floor_attackby.dm" -#include "code\game\turfs\simulated\floor_damage.dm" -#include "code\game\turfs\simulated\floor_icon.dm" -#include "code\game\turfs\simulated\floor_static.dm" -#include "code\game\turfs\simulated\floor_types.dm" -#include "code\game\turfs\simulated\wall_attacks.dm" -#include "code\game\turfs\simulated\wall_icon.dm" -#include "code\game\turfs\simulated\wall_types.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\game\verbs\ooc.dm" -#include "code\game\verbs\suicide.dm" -#include "code\game\verbs\who.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_attack_log.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_secrets.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\map_capture.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\player_notes.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\callproc\callproc.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" -#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" -#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" -#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" -#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" -#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" -#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" -#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" -#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" -#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" -#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" -#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" -#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" -#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" -#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" -#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\make_all_areas_powered.dm" -#include "code\modules\admin\secrets\fun_secrets\make_all_areas_unpowered.dm" -#include "code\modules\admin\secrets\fun_secrets\only_one.dm" -#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" -#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" -#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" -#include "code\modules\admin\secrets\random_events\gravity.dm" -#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" -#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\buildmode.dm" -#include "code\modules\admin\verbs\check_customitem_activity.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\icarus.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\SDQL.dm" -#include "code\modules\admin\verbs\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\ticklag.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\view_variables\helpers.dm" -#include "code\modules\admin\view_variables\topic.dm" -#include "code\modules\admin\view_variables\view_variables.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\trigger.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\blob\blob.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\movement.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_factions.dm" -#include "code\modules\client\preferences_gear.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggles.dm" -#include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\preference_setup.dm" -#include "code\modules\client\preference_setup\antagonism\01_basic.dm" -#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" -#include "code\modules\client\preference_setup\general\01_basic.dm" -#include "code\modules\client\preference_setup\general\02_language.dm" -#include "code\modules\client\preference_setup\general\03_body.dm" -#include "code\modules\client\preference_setup\general\04_equipment.dm" -#include "code\modules\client\preference_setup\general\05_background.dm" -#include "code\modules\client\preference_setup\general\06_flavor.dm" -#include "code\modules\client\preference_setup\global\01_ui.dm" -#include "code\modules\client\preference_setup\global\02_settings.dm" -#include "code\modules\client\preference_setup\global\03_pai.dm" -#include "code\modules\client\preference_setup\global\04_communicators.dm" -#include "code\modules\client\preference_setup\occupation\occupation.dm" -#include "code\modules\client\preference_setup\skills\skills.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\ears\skrell.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\voice.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\jobs.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\captain.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\spacesuits.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" -#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" -#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" -#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\spacesuits\void\merc.dm" -#include "code\modules\clothing\spacesuits\void\station.dm" -#include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" -#include "code\modules\clothing\suits\alien.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\toggles.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\badges.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\lockets.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\xenos\resomi.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detectivework\footprints.dm" -#include "code\modules\detectivework\forensics.dm" -#include "code\modules\detectivework\microscope\dnascanner.dm" -#include "code\modules\detectivework\microscope\microscope.dm" -#include "code\modules\detectivework\microscope\slides.dm" -#include "code\modules\detectivework\tools\crimekit.dm" -#include "code\modules\detectivework\tools\evidencebag.dm" -#include "code\modules\detectivework\tools\luminol.dm" -#include "code\modules\detectivework\tools\rag.dm" -#include "code\modules\detectivework\tools\sample_kits.dm" -#include "code\modules\detectivework\tools\storage.dm" -#include "code\modules\detectivework\tools\swabs.dm" -#include "code\modules\detectivework\tools\uvlight.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\cash.dm" -#include "code\modules\economy\economy_misc.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Events.dm" -#include "code\modules\economy\Events_Mundane.dm" -#include "code\modules\economy\TradeDestinations.dm" -#include "code\modules\events\apc_damage.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\camera_damage.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\comms_blackout.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_dynamic.dm" -#include "code\modules\events\event_manager.dm" -#include "code\modules\events\gravity.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\random_antagonist.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\space_ninja.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\viral_infection.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\stat_icons.dm" -#include "code\modules\examine\descriptions\armor.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\devices.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\paperwork.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\telecomms.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food\recipes_microwave.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\genetics\side_effects.dm" -#include "code\modules\ghosttrap\trap.dm" -#include "code\modules\holodeck\HolodeckControl.dm" -#include "code\modules\holodeck\HolodeckObjects.dm" -#include "code\modules\holodeck\HolodeckPrograms.dm" -#include "code\modules\hydroponics\_hydro_setup.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\grown_inedible.dm" -#include "code\modules\hydroponics\grown_predefined.dm" -#include "code\modules\hydroponics\seed.dm" -#include "code\modules\hydroponics\seed_controller.dm" -#include "code\modules\hydroponics\seed_datums.dm" -#include "code\modules\hydroponics\seed_machines.dm" -#include "code\modules\hydroponics\seed_mobs.dm" -#include "code\modules\hydroponics\seed_packets.dm" -#include "code\modules\hydroponics\seed_storage.dm" -#include "code\modules\hydroponics\beekeeping\beehive.dm" -#include "code\modules\hydroponics\spreading\spreading.dm" -#include "code\modules\hydroponics\spreading\spreading_growth.dm" -#include "code\modules\hydroponics\spreading\spreading_response.dm" -#include "code\modules\hydroponics\trays\tray.dm" -#include "code\modules\hydroponics\trays\tray_process.dm" -#include "code\modules\hydroponics\trays\tray_reagents.dm" -#include "code\modules\hydroponics\trays\tray_soil.dm" -#include "code\modules\hydroponics\trays\tray_tools.dm" -#include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\lighting\_lighting_defs.dm" -#include "code\modules\lighting\light_source.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_overlay.dm" -#include "code\modules\lighting\lighting_process.dm" -#include "code\modules\lighting\lighting_system.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\lighting\~lighting_undefs.dm" -#include "code\modules\liquid\splash_simulation.dm" -#include "code\modules\maps\dmm_suite.dm" -#include "code\modules\maps\reader.dm" -#include "code\modules\maps\swapmaps.dm" -#include "code\modules\maps\writer.dm" -#include "code\modules\materials\material_recipes.dm" -#include "code\modules\materials\material_sheets.dm" -#include "code\modules\materials\material_synth.dm" -#include "code\modules\materials\materials.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\alloys.dm" -#include "code\modules\mining\coins.dm" -#include "code\modules\mining\machine_input_output_plates.dm" -#include "code\modules\mining\machine_processing.dm" -#include "code\modules\mining\machine_stacking.dm" -#include "code\modules\mining\machine_unloading.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\mine_turfs.dm" -#include "code\modules\mining\mineral_effect.dm" -#include "code\modules\mining\mint.dm" -#include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\ore_datum.dm" -#include "code\modules\mining\satchel_ore_boxdm.dm" -#include "code\modules\mining\drilling\drill.dm" -#include "code\modules\mining\drilling\scanner.dm" -#include "code\modules\mob\animations.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\gender.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_cleanup.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_grab_specials.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\freelook\chunk.dm" -#include "code\modules\mob\freelook\eye.dm" -#include "code\modules\mob\freelook\life.dm" -#include "code\modules\mob\freelook\update_triggers.dm" -#include "code\modules\mob\freelook\visualnet.dm" -#include "code\modules\mob\freelook\ai\cameranet.dm" -#include "code\modules\mob\freelook\ai\chunk.dm" -#include "code\modules\mob\freelook\ai\eye.dm" -#include "code\modules\mob\freelook\ai\update_triggers.dm" -#include "code\modules\mob\freelook\mask\chunk.dm" -#include "code\modules\mob\freelook\mask\cultnet.dm" -#include "code\modules\mob\freelook\mask\eye.dm" -#include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\language\generic.dm" -#include "code\modules\mob\language\language.dm" -#include "code\modules\mob\language\monkey.dm" -#include "code\modules\mob\language\outsider.dm" -#include "code\modules\mob\language\station.dm" -#include "code\modules\mob\language\synthetic.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_powers.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\bot\bot.dm" -#include "code\modules\mob\living\bot\cleanbot.dm" -#include "code\modules\mob\living\bot\ed209bot.dm" -#include "code\modules\mob\living\bot\farmbot.dm" -#include "code\modules\mob\living\bot\floorbot.dm" -#include "code\modules\mob\living\bot\medbot.dm" -#include "code\modules\mob\living\bot\secbot.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\shock.dm" -#include "code\modules\mob\living\carbon\viruses.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" -#include "code\modules\mob\living\carbon\alien\alien_damage.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\progression.dm" -#include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" -#include "code\modules\mob\living\carbon\alien\diona\life.dm" -#include "code\modules\mob\living\carbon\alien\diona\progression.dm" -#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" -#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\progression.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\brain_item.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\posibrain.dm" -#include "code\modules\mob\living\carbon\brain\robot.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\stripping.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\whisper.dm" -#include "code\modules\mob\living\carbon\human\species\species.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack.dm" -#include "code\modules\mob\living\carbon\human\species\species_hud.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" -#include "code\modules\mob\living\carbon\human\species\station\golem.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\station\resomi.dm" -#include "code\modules\mob\living\carbon\human\species\station\slime.dm" -#include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" -#include "code\modules\mob\living\carbon\metroid\death.dm" -#include "code\modules\mob\living\carbon\metroid\emote.dm" -#include "code\modules\mob\living\carbon\metroid\examine.dm" -#include "code\modules\mob\living\carbon\metroid\hud.dm" -#include "code\modules\mob\living\carbon\metroid\items.dm" -#include "code\modules\mob\living\carbon\metroid\life.dm" -#include "code\modules\mob\living\carbon\metroid\login.dm" -#include "code\modules\mob\living\carbon\metroid\metroid.dm" -#include "code\modules\mob\living\carbon\metroid\powers.dm" -#include "code\modules\mob\living\carbon\metroid\say.dm" -#include "code\modules\mob\living\carbon\metroid\subtypes.dm" -#include "code\modules\mob\living\carbon\metroid\update_icons.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\subystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_movement.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\icons.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\malf.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\admin.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\examine.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\robot\analyzer.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" -#include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\worm.dm" -#include "code\modules\mob\living\simple_animal\borer\borer.dm" -#include "code\modules\mob\living\simple_animal\borer\borer_captive.dm" -#include "code\modules\mob\living\simple_animal\borer\borer_powers.dm" -#include "code\modules\mob\living\simple_animal\borer\say.dm" -#include "code\modules\mob\living\simple_animal\constructs\constructs.dm" -#include "code\modules\mob\living\simple_animal\constructs\soulstone.dm" -#include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" -#include "code\modules\mob\living\simple_animal\friendly\slime.dm" -#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" -#include "code\modules\mob\living\simple_animal\friendly\tomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\creature.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" -#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" -#include "code\modules\mob\living\simple_animal\hostile\tree.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\voice\voice.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\skill.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\multiz\_stubs.dm" -#include "code\modules\multiz\basic.dm" -#include "code\modules\multiz\movement.dm" -#include "code\modules\multiz\pipes.dm" -#include "code\modules\multiz\structures.dm" -#include "code\modules\multiz\turf.dm" -#include "code\modules\nano\_JSON.dm" -#include "code\modules\nano\JSON Reader.dm" -#include "code\modules\nano\JSON Writer.dm" -#include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanomanager.dm" -#include "code\modules\nano\nanomapgen.dm" -#include "code\modules\nano\nanoui.dm" -#include "code\modules\nano\interaction\admin.dm" -#include "code\modules\nano\interaction\base.dm" -#include "code\modules\nano\interaction\conscious.dm" -#include "code\modules\nano\interaction\contained.dm" -#include "code\modules\nano\interaction\default.dm" -#include "code\modules\nano\interaction\interactive.dm" -#include "code\modules\nano\interaction\inventory.dm" -#include "code\modules\nano\interaction\inventory_deep.dm" -#include "code\modules\nano\interaction\outside.dm" -#include "code\modules\nano\interaction\physical.dm" -#include "code\modules\nano\interaction\remote.dm" -#include "code\modules\nano\interaction\self.dm" -#include "code\modules\nano\interaction\zlevel.dm" -#include "code\modules\nano\modules\alarm_monitor.dm" -#include "code\modules\nano\modules\atmos_control.dm" -#include "code\modules\nano\modules\crew_monitor.dm" -#include "code\modules\nano\modules\human_appearance.dm" -#include "code\modules\nano\modules\law_manager.dm" -#include "code\modules\nano\modules\nano_module.dm" -#include "code\modules\nano\modules\power_monitor.dm" -#include "code\modules\nano\modules\rcon.dm" -#include "code\modules\organs\blood.dm" -#include "code\modules\organs\misc.dm" -#include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_internal.dm" -#include "code\modules\organs\organ_stump.dm" -#include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\subtypes\diona.dm" -#include "code\modules\organs\subtypes\machine.dm" -#include "code\modules\organs\subtypes\resomi.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\unbreakable.dm" -#include "code\modules\organs\subtypes\xenos.dm" -#include "code\modules\overmap\_defines.dm" -#include "code\modules\overmap\sectors.dm" -#include "code\modules\overmap\ships\ship.dm" -#include "code\modules\overmap\ships\computers\engine_control.dm" -#include "code\modules\overmap\ships\computers\helm.dm" -#include "code\modules\overmap\ships\computers\shuttle.dm" -#include "code\modules\overmap\ships\engines\engine.dm" -#include "code\modules\overmap\ships\engines\thermal.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\papershredder.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\batteryrack.dm" -#include "code\modules\power\breaker_box.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\fractal_reactor.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\generator_type2.dm" -#include "code\modules\power\gravitygenerator.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\smes_construction.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\sensors\powernet_sensor.dm" -#include "code\modules\power\sensors\sensor_monitoring.dm" -#include "code\modules\power\singularity\act.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\effects.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\targeting.dm" -#include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\bullets.dm" -#include "code\modules\projectiles\guns\alien.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\launcher.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\temperature.dm" -#include "code\modules\projectiles\guns\launcher\crossbow.dm" -#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" -#include "code\modules\projectiles\guns\launcher\pneumatic.dm" -#include "code\modules\projectiles\guns\launcher\rocket.dm" -#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\dartgun.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\projectile\animate.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\change.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\random_map\_random_map_setup.dm" -#include "code\modules\random_map\random_map.dm" -#include "code\modules\random_map\random_map_verbs.dm" -#include "code\modules\random_map\automata\automata.dm" -#include "code\modules\random_map\automata\caves.dm" -#include "code\modules\random_map\building\building.dm" -#include "code\modules\random_map\drop\drop_types.dm" -#include "code\modules\random_map\drop\droppod.dm" -#include "code\modules\random_map\drop\droppod_doors.dm" -#include "code\modules\random_map\drop\supply.dm" -#include "code\modules\random_map\mazes\maze.dm" -#include "code\modules\random_map\mazes\maze_cell.dm" -#include "code\modules\random_map\noise\desert.dm" -#include "code\modules\random_map\noise\magma.dm" -#include "code\modules\random_map\noise\noise.dm" -#include "code\modules\random_map\noise\ore.dm" -#include "code\modules\random_map\noise\tundra.dm" -#include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Holder.dm" -#include "code\modules\reagents\Chemistry-Logging.dm" -#include "code\modules\reagents\Chemistry-Machinery.dm" -#include "code\modules\reagents\Chemistry-Metabolism.dm" -#include "code\modules\reagents\Chemistry-Readme.dm" -#include "code\modules\reagents\Chemistry-Reagents.dm" -#include "code\modules\reagents\Chemistry-Recipes.dm" -#include "code\modules\reagents\reagent_containers.dm" -#include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Core.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Dispenser.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm" -#include "code\modules\reagents\dispenser\_defines.dm" -#include "code\modules\reagents\dispenser\cartridge.dm" -#include "code\modules\reagents\dispenser\cartridge_presets.dm" -#include "code\modules\reagents\dispenser\cartridge_spawn.dm" -#include "code\modules\reagents\dispenser\dispenser2.dm" -#include "code\modules\reagents\dispenser\dispenser_old.dm" -#include "code\modules\reagents\dispenser\dispenser_presets.dm" -#include "code\modules\reagents\dispenser\supply.dm" -#include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\borghydro.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\food.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\reagents\reagent_containers\food\cans.dm" -#include "code\modules\reagents\reagent_containers\food\condiment.dm" -#include "code\modules\reagents\reagent_containers\food\drinks.dm" -#include "code\modules\reagents\reagent_containers\food\sandwich.dm" -#include "code\modules\reagents\reagent_containers\food\snacks.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm" -#include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" -#include "code\modules\reagents\reagent_containers\glass\bottle.dm" -#include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\mechfab_designs.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\xenoarchaeology\chemistry.dm" -#include "code\modules\research\xenoarchaeology\geosample.dm" -#include "code\modules\research\xenoarchaeology\manuals.dm" -#include "code\modules\research\xenoarchaeology\master_controller.dm" -#include "code\modules\research\xenoarchaeology\misc.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm" -#include "code\modules\research\xenoarchaeology\artifact\effect.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_teleport.dm" -#include "code\modules\research\xenoarchaeology\finds\finds.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_eguns.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_special.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm" -#include "code\modules\research\xenoarchaeology\machinery\coolant.dm" -#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm" -#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm" -#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm" -#include "code\modules\research\xenoarchaeology\tools\gearbelt.dm" -#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm" -#include "code\modules\research\xenoarchaeology\tools\tools.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm" -#include "code\modules\scripting\Errors.dm" -#include "code\modules\scripting\IDE.dm" -#include "code\modules\scripting\Options.dm" -#include "code\modules\scripting\stack.dm" -#include "code\modules\scripting\AST\AST Nodes.dm" -#include "code\modules\scripting\AST\Blocks.dm" -#include "code\modules\scripting\AST\Statements.dm" -#include "code\modules\scripting\AST\Operators\Binary Operators.dm" -#include "code\modules\scripting\AST\Operators\Unary Operators.dm" -#include "code\modules\scripting\Implementations\_Logic.dm" -#include "code\modules\scripting\Implementations\Telecomms.dm" -#include "code\modules\scripting\Interpreter\Evaluation.dm" -#include "code\modules\scripting\Interpreter\Interaction.dm" -#include "code\modules\scripting\Interpreter\Interpreter.dm" -#include "code\modules\scripting\Interpreter\Scope.dm" -#include "code\modules\scripting\Parser\Expressions.dm" -#include "code\modules\scripting\Parser\Keywords.dm" -#include "code\modules\scripting\Parser\Parser.dm" -#include "code\modules\scripting\Scanner\Scanner.dm" -#include "code\modules\scripting\Scanner\Tokens.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" -#include "code\modules\shieldgen\emergency_shield.dm" -#include "code\modules\shieldgen\energy_field.dm" -#include "code\modules\shieldgen\sheldwallgen.dm" -#include "code\modules\shieldgen\shield_capacitor.dm" -#include "code\modules\shieldgen\shield_gen.dm" -#include "code\modules\shieldgen\shield_gen_external.dm" -#include "code\modules\shuttles\antagonist.dm" -#include "code\modules\shuttles\departmental.dm" -#include "code\modules\shuttles\escape_pods.dm" -#include "code\modules\shuttles\shuttle.dm" -#include "code\modules\shuttles\shuttle_console.dm" -#include "code\modules\shuttles\shuttle_emergency.dm" -#include "code\modules\shuttles\shuttle_ferry.dm" -#include "code\modules\shuttles\shuttle_specops.dm" -#include "code\modules\shuttles\shuttle_supply.dm" -#include "code\modules\shuttles\shuttles_multi.dm" -#include "code\modules\spells\artifacts.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\rune_write.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\harvest.dm" -#include "code\modules\spells\targeted\mind_transfer.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\supermatter\supermatter.dm" -#include "code\modules\surgery\_defines.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\face.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\implant.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\slimes.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\~defines.dm" -#include "code\modules\tables\flipping.dm" -#include "code\modules\tables\interactions.dm" -#include "code\modules\tables\presets.dm" -#include "code\modules\tables\rack.dm" -#include "code\modules\tables\tables.dm" -#include "code\modules\tables\update_triggers.dm" -#include "code\modules\vehicles\cargo_train.dm" -#include "code\modules\vehicles\train.dm" -#include "code\modules\vehicles\vehicle.dm" -#include "code\modules\virus2\admin.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" -#include "code\modules\xgm\xgm_gas_data.dm" -#include "code\modules\xgm\xgm_gas_mixture.dm" -#include "code\ZAS\_docs.dm" -#include "code\ZAS\Airflow.dm" -#include "code\ZAS\Atom.dm" -#include "code\ZAS\Connection.dm" -#include "code\ZAS\ConnectionGroup.dm" -#include "code\ZAS\ConnectionManager.dm" -#include "code\ZAS\Controller.dm" -#include "code\ZAS\Debug.dm" -#include "code\ZAS\Diagnostic.dm" -#include "code\ZAS\Fire.dm" -#include "code\ZAS\Phoron.dm" -#include "code\ZAS\Turf.dm" -#include "code\ZAS\Variable Settings.dm" -#include "code\ZAS\Zone.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -#include "maps\polaris-1.dmm" -#include "maps\polaris-2.dmm" -#include "maps\polaris-3.dmm" -#include "maps\polaris-4.dmm" -#include "maps\polaris-5.dmm" -// END_INCLUDE +// DM Environment file for baystation12.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "code\_macros.dm" +#include "code\global.dm" +#include "code\hub.dm" +#include "code\names.dm" +#include "code\stylesheet.dm" +#include "code\world.dm" +#include "code\__defines\_compile_options.dm" +#include "code\__defines\admin.dm" +#include "code\__defines\atmos.dm" +#include "code\__defines\chemistry.dm" +#include "code\__defines\damage_organs.dm" +#include "code\__defines\dna.dm" +#include "code\__defines\gamemode.dm" +#include "code\__defines\items_clothing.dm" +#include "code\__defines\lighting.dm" +#include "code\__defines\machinery.dm" +#include "code\__defines\math_physics.dm" +#include "code\__defines\misc.dm" +#include "code\__defines\mobs.dm" +#include "code\__defines\research.dm" +#include "code\__defines\species_languages.dm" +#include "code\__defines\turfs.dm" +#include "code\_helpers\atmospherics.dm" +#include "code\_helpers\datum_pool.dm" +#include "code\_helpers\files.dm" +#include "code\_helpers\game.dm" +#include "code\_helpers\global_lists.dm" +#include "code\_helpers\icons.dm" +#include "code\_helpers\lists.dm" +#include "code\_helpers\logging.dm" +#include "code\_helpers\maths.dm" +#include "code\_helpers\matrices.dm" +#include "code\_helpers\mobs.dm" +#include "code\_helpers\names.dm" +#include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\text.dm" +#include "code\_helpers\time.dm" +#include "code\_helpers\turfs.dm" +#include "code\_helpers\type2type.dm" +#include "code\_helpers\unsorted.dm" +#include "code\_helpers\vector.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\spell_screen_objects.dm" +#include "code\ATMOSPHERICS\_atmos_setup.dm" +#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_pipe_network.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\he_pipes.dm" +#include "code\ATMOSPHERICS\mainspipe.dm" +#include "code\ATMOSPHERICS\pipes.dm" +#include "code\ATMOSPHERICS\components\portables_connector.dm" +#include "code\ATMOSPHERICS\components\tvalve.dm" +#include "code\ATMOSPHERICS\components\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary\generator_input.dm" +#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary\oxygen_generator.dm" +#include "code\ATMOSPHERICS\components\unary\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" +#include "code\controllers\autotransfer.dm" +#include "code\controllers\communications.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master_controller.dm" +#include "code\controllers\shuttle_controller.dm" +#include "code\controllers\subsystems.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\voting.dm" +#include "code\controllers\Processes\air.dm" +#include "code\controllers\Processes\alarm.dm" +#include "code\controllers\Processes\chemistry.dm" +#include "code\controllers\Processes\disease.dm" +#include "code\controllers\Processes\emergencyShuttle.dm" +#include "code\controllers\Processes\event.dm" +#include "code\controllers\Processes\garbage.dm" +#include "code\controllers\Processes\inactivity.dm" +#include "code\controllers\Processes\machinery.dm" +#include "code\controllers\Processes\mob.dm" +#include "code\controllers\Processes\nanoui.dm" +#include "code\controllers\Processes\obj.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" +#include "code\controllers\Processes\turf.dm" +#include "code\controllers\Processes\vote.dm" +#include "code\controllers\ProcessScheduler\core\_define.dm" +#include "code\controllers\ProcessScheduler\core\_stubs.dm" +#include "code\controllers\ProcessScheduler\core\process.dm" +#include "code\controllers\ProcessScheduler\core\processScheduler.dm" +#include "code\controllers\ProcessScheduler\core\updateQueue.dm" +#include "code\controllers\ProcessScheduler\core\updateQueueWorker.dm" +#include "code\controllers\subsystem\alarms.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\browser.dm" +#include "code\datums\category.dm" +#include "code\datums\computerfiles.dm" +#include "code\datums\crew.dm" +#include "code\datums\datacore.dm" +#include "code\datums\disease.dm" +#include "code\datums\EPv2.dm" +#include "code\datums\mind.dm" +#include "code\datums\mixed.dm" +#include "code\datums\modules.dm" +#include "code\datums\organs.dm" +#include "code\datums\recipe.dm" +#include "code\datums\sun.dm" +#include "code\datums\supplypacks.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\dna_spread.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\jungle_fever.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\plasmatoid.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\robotic_transformation.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\xeno_transformation.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\locations\locations.dm" +#include "code\datums\locations\nyx.dm" +#include "code\datums\locations\qerrvallis.dm" +#include "code\datums\locations\s_randarr.dm" +#include "code\datums\locations\sol.dm" +#include "code\datums\locations\tau_ceti.dm" +#include "code\datums\locations\uueoa_esa.dm" +#include "code\datums\locations\vir.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\smes.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\gases.dm" +#include "code\defines\obj.dm" +#include "code\defines\obj\weapon.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\hud.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\sd_Alert.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\asteroid.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\base_turf.dm" +#include "code\game\periodic_news.dm" +#include "code\game\response_team.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\skincmd.dm" +#include "code\game\sound.dm" +#include "code\game\supplyshuttle.dm" +#include "code\game\antagonist\_antagonist_setup.dm" +#include "code\game\antagonist\antagonist.dm" +#include "code\game\antagonist\antagonist_add.dm" +#include "code\game\antagonist\antagonist_create.dm" +#include "code\game\antagonist\antagonist_equip.dm" +#include "code\game\antagonist\antagonist_factions.dm" +#include "code\game\antagonist\antagonist_helpers.dm" +#include "code\game\antagonist\antagonist_objectives.dm" +#include "code\game\antagonist\antagonist_panel.dm" +#include "code\game\antagonist\antagonist_place.dm" +#include "code\game\antagonist\antagonist_print.dm" +#include "code\game\antagonist\antagonist_update.dm" +#include "code\game\antagonist\alien\borer.dm" +#include "code\game\antagonist\alien\xenomorph.dm" +#include "code\game\antagonist\outsider\commando.dm" +#include "code\game\antagonist\outsider\deathsquad.dm" +#include "code\game\antagonist\outsider\ert.dm" +#include "code\game\antagonist\outsider\mercenary.dm" +#include "code\game\antagonist\outsider\ninja.dm" +#include "code\game\antagonist\outsider\raider.dm" +#include "code\game\antagonist\outsider\wizard.dm" +#include "code\game\antagonist\station\changeling.dm" +#include "code\game\antagonist\station\cultist.dm" +#include "code\game\antagonist\station\highlander.dm" +#include "code\game\antagonist\station\loyalist.dm" +#include "code\game\antagonist\station\renegade.dm" +#include "code\game\antagonist\station\revolutionary.dm" +#include "code\game\antagonist\station\rogue_ai.dm" +#include "code\game\antagonist\station\traitor.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\asteroid_areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\game_mode_latespawn.dm" +#include "code\game\gamemodes\gameticker.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\calamity\calamity.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_powers.dm" +#include "code\game\gamemodes\changeling\generic_equip_procs.dm" +#include "code\game\gamemodes\changeling\modularchangling.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\armblade.dm" +#include "code\game\gamemodes\changeling\powers\armor.dm" +#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" +#include "code\game\gamemodes\changeling\powers\blind_sting.dm" +#include "code\game\gamemodes\changeling\powers\boost_range.dm" +#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" +#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" +#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" +#include "code\game\gamemodes\changeling\powers\digital_camo.dm" +#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" +#include "code\game\gamemodes\changeling\powers\endoarmor.dm" +#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" +#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" +#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" +#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" +#include "code\game\gamemodes\changeling\powers\fake_death.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" +#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" +#include "code\game\gamemodes\changeling\powers\respec.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\self_respiration.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\silence_sting.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\hell_universe.dm" +#include "code\game\gamemodes\cult\narsie.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\cult\cultify\mob.dm" +#include "code\game\gamemodes\cult\cultify\obj.dm" +#include "code\game\gamemodes\cult\cultify\turf.dm" +#include "code\game\gamemodes\endgame\endgame.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" +#include "code\game\gamemodes\events\black_hole.dm" +#include "code\game\gamemodes\events\clang.dm" +#include "code\game\gamemodes\events\dust.dm" +#include "code\game\gamemodes\events\power_failure.dm" +#include "code\game\gamemodes\events\wormholes.dm" +#include "code\game\gamemodes\events\holidays\Christmas.dm" +#include "code\game\gamemodes\events\holidays\Holidays.dm" +#include "code\game\gamemodes\events\holidays\Other.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\malfunction\malf_hardware.dm" +#include "code\game\gamemodes\malfunction\malf_research.dm" +#include "code\game\gamemodes\malfunction\malf_research_ability.dm" +#include "code\game\gamemodes\malfunction\malfunction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\mixed\bughunt.dm" +#include "code\game\gamemodes\mixed\conflux.dm" +#include "code\game\gamemodes\mixed\infestation.dm" +#include "code\game\gamemodes\mixed\paranoia.dm" +#include "code\game\gamemodes\mixed\traitorling.dm" +#include "code\game\gamemodes\mixed\uprising.dm" +#include "code\game\gamemodes\ninja\ninja.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\_access_defs.dm" +#include "code\game\jobs\access.dm" +#include "code\game\jobs\access_datum.dm" +#include "code\game\jobs\job_controller.dm" +#include "code\game\jobs\jobprocs.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\job\assistant.dm" +#include "code\game\jobs\job\captain.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\civilian_chaplain.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\alarm.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\autolathe_datums.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\biogenerator.dm" +#include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\CableLayer.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\exonet_node.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floor_light.dm" +#include "code\game\machinery\floorlayer.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\jukebox.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\nuclear_bomb.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\robot_fabricator.dm" +#include "code\game\machinery\seed_extractor.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\status_display_ai.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\supplybeacon.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\turrets.dm" +#include "code\game\machinery\vending.dm" +#include "code\game\machinery\wall_frames.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\bots\bots.dm" +#include "code\game\machinery\bots\mulebot.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\guestpass.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\prisonshuttle.dm" +#include "code\game\machinery\computer\RCON_Console.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\shuttle.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\supply.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer3\bios.dm" +#include "code\game\machinery\computer3\buildandrepair.dm" +#include "code\game\machinery\computer3\component.dm" +#include "code\game\machinery\computer3\computer.dm" +#include "code\game\machinery\computer3\computer3_notes.dm" +#include "code\game\machinery\computer3\file.dm" +#include "code\game\machinery\computer3\laptop.dm" +#include "code\game\machinery\computer3\lapvend.dm" +#include "code\game\machinery\computer3\networking.dm" +#include "code\game\machinery\computer3\NTOS.dm" +#include "code\game\machinery\computer3\program.dm" +#include "code\game\machinery\computer3\program_disks.dm" +#include "code\game\machinery\computer3\server.dm" +#include "code\game\machinery\computer3\storage.dm" +#include "code\game\machinery\computer3\computers\arcade.dm" +#include "code\game\machinery\computer3\computers\atmos_alert.dm" +#include "code\game\machinery\computer3\computers\camera.dm" +#include "code\game\machinery\computer3\computers\card.dm" +#include "code\game\machinery\computer3\computers\communications.dm" +#include "code\game\machinery\computer3\computers\crew.dm" +#include "code\game\machinery\computer3\computers\customs.dm" +#include "code\game\machinery\computer3\computers\HolodeckControl.dm" +#include "code\game\machinery\computer3\computers\law.dm" +#include "code\game\machinery\computer3\computers\medical.dm" +#include "code\game\machinery\computer3\computers\Operating.dm" +#include "code\game\machinery\computer3\computers\power.dm" +#include "code\game\machinery\computer3\computers\prisoner.dm" +#include "code\game\machinery\computer3\computers\robot.dm" +#include "code\game\machinery\computer3\computers\security.dm" +#include "code\game\machinery\computer3\computers\welcome.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\blast_door.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\firedoor_assembly.dm" +#include "code\game\machinery\doors\multi_tile.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\docking_program.dm" +#include "code\game\machinery\embedded_controller\docking_program_multi.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" +#include "code\game\machinery\kitchen\gibber.dm" +#include "code\game\machinery\kitchen\microwave.dm" +#include "code\game\machinery\kitchen\smartfridge.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mech_sensor.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\tools\medical_tools.dm" +#include "code\game\mecha\equipment\tools\tools.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\working\hoverpod.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\explosion_recursive.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\weapons.dm" +#include "code\game\objects\effects\aliens.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\effect_system.dm" +#include "code\game\objects\effects\explosion_particles.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\chem\chemsmoke.dm" +#include "code\game\objects\effects\chem\foam.dm" +#include "code\game\objects\effects\chem\water.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\contraband.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\posters\bs12.dm" +#include "code\game\objects\effects\decals\posters\polarisposters.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\glassjar.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\paintkit.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\binoculars.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\debugger.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\modkit.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\spy_bug.dm" +#include "code\game\objects\items\devices\suit_cooling.dm" +#include "code\game\objects\items\devices\t_scanner.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\uplink.dm" +#include "code\game\objects\items\devices\uplink_categories.dm" +#include "code\game\objects\items\devices\uplink_items.dm" +#include "code\game\objects\items\devices\uplink_random_lists.dm" +#include "code\game\objects\items\devices\violin.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\communicator\communicator.dm" +#include "code\game\objects\items\devices\PDA\cart.dm" +#include "code\game\objects\items\devices\PDA\chatroom.dm" +#include "code\game\objects\items\devices\PDA\PDA.dm" +#include "code\game\objects\items\devices\PDA\radio.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\matter_synth.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\sheets\leather.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\autopsy.dm" +#include "code\game\objects\items\weapons\candle.dm" +#include "code\game\objects\items\weapons\cards_ids.dm" +#include "code\game\objects\items\weapons\cards_ids_syndicate.dm" +#include "code\game\objects\items\weapons\cigs_lighters.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\dice.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\kitchen.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\mop_deploy.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\policetape.dm" +#include "code\game\objects\items\weapons\power_cells.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\surgery_tools.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\tools.dm" +#include "code\game\objects\items\weapons\traps.dm" +#include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\weldbackpack.dm" +#include "code\game\objects\items\weapons\wires.dm" +#include "code\game\objects\items\weapons\circuitboards\broken.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\mecha.dm" +#include "code\game\objects\items\weapons\circuitboards\other.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" +#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\explosive.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\fragmentation.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implantfreedom.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\material\ashtray.dm" +#include "code\game\objects\items\weapons\material\bats.dm" +#include "code\game\objects\items\weapons\material\kitchen.dm" +#include "code\game\objects\items\weapons\material\knives.dm" +#include "code\game\objects\items\weapons\material\material_weapons.dm" +#include "code\game\objects\items\weapons\material\misc.dm" +#include "code\game\objects\items\weapons\material\shards.dm" +#include "code\game\objects\items\weapons\material\swords.dm" +#include "code\game\objects\items\weapons\material\thrown.dm" +#include "code\game\objects\items\weapons\material\twohanded.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\misc.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\random\random.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\flora.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\lamarr_cage.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\simple_doors.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\under_wardrobe.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\turf_changing.dm" +#include "code\game\turfs\turf_flick_animations.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\flooring\flooring.dm" +#include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\initialization\init.dm" +#include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\floor_acts.dm" +#include "code\game\turfs\simulated\floor_attackby.dm" +#include "code\game\turfs\simulated\floor_damage.dm" +#include "code\game\turfs\simulated\floor_icon.dm" +#include "code\game\turfs\simulated\floor_static.dm" +#include "code\game\turfs\simulated\floor_types.dm" +#include "code\game\turfs\simulated\wall_attacks.dm" +#include "code\game\turfs\simulated\wall_icon.dm" +#include "code\game\turfs\simulated\wall_types.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\game\verbs\ooc.dm" +#include "code\game\verbs\suicide.dm" +#include "code\game\verbs\who.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_attack_log.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_secrets.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\map_capture.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\player_notes.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\callproc\callproc.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" +#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" +#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" +#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" +#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" +#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" +#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" +#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" +#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" +#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" +#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" +#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" +#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" +#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" +#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" +#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\make_all_areas_powered.dm" +#include "code\modules\admin\secrets\fun_secrets\make_all_areas_unpowered.dm" +#include "code\modules\admin\secrets\fun_secrets\only_one.dm" +#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" +#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" +#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" +#include "code\modules\admin\secrets\random_events\gravity.dm" +#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" +#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\buildmode.dm" +#include "code\modules\admin\verbs\check_customitem_activity.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\icarus.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\massmodvar.dm" +#include "code\modules\admin\verbs\modifyvariables.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\SDQL.dm" +#include "code\modules\admin\verbs\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\ticklag.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\view_variables\helpers.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\view_variables.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\trigger.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob\blob.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\movement.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" +#include "code\modules\client\preferences_gear.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_spawnpoints.dm" +#include "code\modules\client\preferences_toggles.dm" +#include "code\modules\client\ui_style.dm" +#include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\antagonism\01_basic.dm" +#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" +#include "code\modules\client\preference_setup\general\01_basic.dm" +#include "code\modules\client\preference_setup\general\02_language.dm" +#include "code\modules\client\preference_setup\general\03_body.dm" +#include "code\modules\client\preference_setup\general\04_equipment.dm" +#include "code\modules\client\preference_setup\general\05_background.dm" +#include "code\modules\client\preference_setup\general\06_flavor.dm" +#include "code\modules\client\preference_setup\global\01_ui.dm" +#include "code\modules\client\preference_setup\global\02_settings.dm" +#include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\04_communicators.dm" +#include "code\modules\client\preference_setup\occupation\occupation.dm" +#include "code\modules\client\preference_setup\skills\skills.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\ears\skrell.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\jobs.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\captain.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\spacesuits.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\combat.dm" +#include "code\modules\clothing\spacesuits\rig\modules\computer.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\ninja.dm" +#include "code\modules\clothing\spacesuits\rig\modules\utility.dm" +#include "code\modules\clothing\spacesuits\rig\modules\vision.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\void\merc.dm" +#include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\void.dm" +#include "code\modules\clothing\spacesuits\void\wizard.dm" +#include "code\modules\clothing\suits\alien.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\toggles.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\lockets.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\xenos\resomi.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detectivework\footprints.dm" +#include "code\modules\detectivework\forensics.dm" +#include "code\modules\detectivework\microscope\dnascanner.dm" +#include "code\modules\detectivework\microscope\microscope.dm" +#include "code\modules\detectivework\microscope\slides.dm" +#include "code\modules\detectivework\tools\crimekit.dm" +#include "code\modules\detectivework\tools\evidencebag.dm" +#include "code\modules\detectivework\tools\luminol.dm" +#include "code\modules\detectivework\tools\rag.dm" +#include "code\modules\detectivework\tools\sample_kits.dm" +#include "code\modules\detectivework\tools\storage.dm" +#include "code\modules\detectivework\tools\swabs.dm" +#include "code\modules\detectivework\tools\uvlight.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cash.dm" +#include "code\modules\economy\economy_misc.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Events.dm" +#include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\events\apc_damage.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\camera_damage.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\comms_blackout.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\disease_outbreak.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_dynamic.dm" +#include "code\modules\events\event_manager.dm" +#include "code\modules\events\gravity.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\random_antagonist.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\space_ninja.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\viral_infection.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\stat_icons.dm" +#include "code\modules\examine\descriptions\armor.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\devices.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\telecomms.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food\recipes_microwave.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghosttrap\trap.dm" +#include "code\modules\holodeck\HolodeckControl.dm" +#include "code\modules\holodeck\HolodeckObjects.dm" +#include "code\modules\holodeck\HolodeckPrograms.dm" +#include "code\modules\hydroponics\_hydro_setup.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\grown_inedible.dm" +#include "code\modules\hydroponics\grown_predefined.dm" +#include "code\modules\hydroponics\seed.dm" +#include "code\modules\hydroponics\seed_controller.dm" +#include "code\modules\hydroponics\seed_datums.dm" +#include "code\modules\hydroponics\seed_machines.dm" +#include "code\modules\hydroponics\seed_mobs.dm" +#include "code\modules\hydroponics\seed_packets.dm" +#include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\beekeeping\beehive.dm" +#include "code\modules\hydroponics\spreading\spreading.dm" +#include "code\modules\hydroponics\spreading\spreading_growth.dm" +#include "code\modules\hydroponics\spreading\spreading_response.dm" +#include "code\modules\hydroponics\trays\tray.dm" +#include "code\modules\hydroponics\trays\tray_process.dm" +#include "code\modules\hydroponics\trays\tray_reagents.dm" +#include "code\modules\hydroponics\trays\tray_soil.dm" +#include "code\modules\hydroponics\trays\tray_tools.dm" +#include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\lighting\_lighting_defs.dm" +#include "code\modules\lighting\light_source.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_overlay.dm" +#include "code\modules\lighting\lighting_process.dm" +#include "code\modules\lighting\lighting_system.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\lighting\~lighting_undefs.dm" +#include "code\modules\liquid\splash_simulation.dm" +#include "code\modules\maps\dmm_suite.dm" +#include "code\modules\maps\reader.dm" +#include "code\modules\maps\swapmaps.dm" +#include "code\modules\maps\writer.dm" +#include "code\modules\materials\material_recipes.dm" +#include "code\modules\materials\material_sheets.dm" +#include "code\modules\materials\material_synth.dm" +#include "code\modules\materials\materials.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\alloys.dm" +#include "code\modules\mining\coins.dm" +#include "code\modules\mining\machine_input_output_plates.dm" +#include "code\modules\mining\machine_processing.dm" +#include "code\modules\mining\machine_stacking.dm" +#include "code\modules\mining\machine_unloading.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\mineral_effect.dm" +#include "code\modules\mining\mint.dm" +#include "code\modules\mining\money_bag.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\ore_datum.dm" +#include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mining\drilling\drill.dm" +#include "code\modules\mining\drilling\scanner.dm" +#include "code\modules\mob\animations.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\gender.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_cleanup.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_grab_specials.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\freelook\chunk.dm" +#include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\update_triggers.dm" +#include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" +#include "code\modules\mob\language\generic.dm" +#include "code\modules\mob\language\language.dm" +#include "code\modules\mob\language\monkey.dm" +#include "code\modules\mob\language\outsider.dm" +#include "code\modules\mob\language\station.dm" +#include "code\modules\mob\language\synthetic.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_powers.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\cleanbot.dm" +#include "code\modules\mob\living\bot\ed209bot.dm" +#include "code\modules\mob\living\bot\farmbot.dm" +#include "code\modules\mob\living\bot\floorbot.dm" +#include "code\modules\mob\living\bot\medbot.dm" +#include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\carbon\breathe.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_powers.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\resist.dm" +#include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\viruses.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" +#include "code\modules\mob\living\carbon\alien\alien_damage.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\progression.dm" +#include "code\modules\mob\living\carbon\alien\say.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\progression.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\brain_item.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\posibrain.dm" +#include "code\modules\mob\living\carbon\brain\robot.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_attackhand.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\stripping.dm" +#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\whisper.dm" +#include "code\modules\mob\living\carbon\human\species\species.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack.dm" +#include "code\modules\mob\living\carbon\human\species\species_hud.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\resomi.dm" +#include "code\modules\mob\living\carbon\human\species\station\slime.dm" +#include "code\modules\mob\living\carbon\human\species\station\station.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" +#include "code\modules\mob\living\carbon\metroid\death.dm" +#include "code\modules\mob\living\carbon\metroid\emote.dm" +#include "code\modules\mob\living\carbon\metroid\examine.dm" +#include "code\modules\mob\living\carbon\metroid\hud.dm" +#include "code\modules\mob\living\carbon\metroid\items.dm" +#include "code\modules\mob\living\carbon\metroid\life.dm" +#include "code\modules\mob\living\carbon\metroid\login.dm" +#include "code\modules\mob\living\carbon\metroid\metroid.dm" +#include "code\modules\mob\living\carbon\metroid\powers.dm" +#include "code\modules\mob\living\carbon\metroid\say.dm" +#include "code\modules\mob\living\carbon\metroid\subtypes.dm" +#include "code\modules\mob\living\carbon\metroid\update_icons.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\subystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_movement.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\icons.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\malf.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\admin.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\examine.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\robot\analyzer.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\shade.dm" +#include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\worm.dm" +#include "code\modules\mob\living\simple_animal\borer\borer.dm" +#include "code\modules\mob\living\simple_animal\borer\borer_captive.dm" +#include "code\modules\mob\living\simple_animal\borer\borer_powers.dm" +#include "code\modules\mob\living\simple_animal\borer\say.dm" +#include "code\modules\mob\living\simple_animal\constructs\constructs.dm" +#include "code\modules\mob\living\simple_animal\constructs\soulstone.dm" +#include "code\modules\mob\living\simple_animal\friendly\cat.dm" +#include "code\modules\mob\living\simple_animal\friendly\corgi.dm" +#include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" +#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" +#include "code\modules\mob\living\simple_animal\friendly\slime.dm" +#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" +#include "code\modules\mob\living\simple_animal\friendly\tomato.dm" +#include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bat.dm" +#include "code\modules\mob\living\simple_animal\hostile\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\creature.dm" +#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" +#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\russian.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" +#include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\voice\voice.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\skill.dm" +#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\basic.dm" +#include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\pipes.dm" +#include "code\modules\multiz\structures.dm" +#include "code\modules\multiz\turf.dm" +#include "code\modules\nano\_JSON.dm" +#include "code\modules\nano\JSON Reader.dm" +#include "code\modules\nano\JSON Writer.dm" +#include "code\modules\nano\nanoexternal.dm" +#include "code\modules\nano\nanomanager.dm" +#include "code\modules\nano\nanomapgen.dm" +#include "code\modules\nano\nanoui.dm" +#include "code\modules\nano\interaction\admin.dm" +#include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\conscious.dm" +#include "code\modules\nano\interaction\contained.dm" +#include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\interactive.dm" +#include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\inventory_deep.dm" +#include "code\modules\nano\interaction\outside.dm" +#include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\remote.dm" +#include "code\modules\nano\interaction\self.dm" +#include "code\modules\nano\interaction\zlevel.dm" +#include "code\modules\nano\modules\alarm_monitor.dm" +#include "code\modules\nano\modules\atmos_control.dm" +#include "code\modules\nano\modules\crew_monitor.dm" +#include "code\modules\nano\modules\human_appearance.dm" +#include "code\modules\nano\modules\law_manager.dm" +#include "code\modules\nano\modules\nano_module.dm" +#include "code\modules\nano\modules\power_monitor.dm" +#include "code\modules\nano\modules\rcon.dm" +#include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" +#include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_icon.dm" +#include "code\modules\organs\organ_internal.dm" +#include "code\modules\organs\organ_stump.dm" +#include "code\modules\organs\pain.dm" +#include "code\modules\organs\robolimbs.dm" +#include "code\modules\organs\wound.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\resomi.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\xenos.dm" +#include "code\modules\overmap\_defines.dm" +#include "code\modules\overmap\sectors.dm" +#include "code\modules\overmap\ships\ship.dm" +#include "code\modules\overmap\ships\computers\engine_control.dm" +#include "code\modules\overmap\ships\computers\helm.dm" +#include "code\modules\overmap\ships\computers\shuttle.dm" +#include "code\modules\overmap\ships\engines\engine.dm" +#include "code\modules\overmap\ships\engines\thermal.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\papershredder.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\batteryrack.dm" +#include "code\modules\power\breaker_box.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\fractal_reactor.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\generator_type2.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\smes_construction.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\sensors\powernet_sensor.dm" +#include "code\modules\power\sensors\sensor_monitoring.dm" +#include "code\modules\power\singularity\act.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\effects.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\targeting.dm" +#include "code\modules\projectiles\ammunition\boxes.dm" +#include "code\modules\projectiles\ammunition\bullets.dm" +#include "code\modules\projectiles\guns\alien.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\temperature.dm" +#include "code\modules\projectiles\guns\launcher\crossbow.dm" +#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" +#include "code\modules\projectiles\guns\launcher\pneumatic.dm" +#include "code\modules\projectiles\guns\launcher\rocket.dm" +#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\dartgun.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\projectile\animate.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\change.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\random_map\_random_map_setup.dm" +#include "code\modules\random_map\random_map.dm" +#include "code\modules\random_map\random_map_verbs.dm" +#include "code\modules\random_map\automata\automata.dm" +#include "code\modules\random_map\automata\caves.dm" +#include "code\modules\random_map\building\building.dm" +#include "code\modules\random_map\drop\drop_types.dm" +#include "code\modules\random_map\drop\droppod.dm" +#include "code\modules\random_map\drop\droppod_doors.dm" +#include "code\modules\random_map\drop\supply.dm" +#include "code\modules\random_map\mazes\maze.dm" +#include "code\modules\random_map\mazes\maze_cell.dm" +#include "code\modules\random_map\noise\desert.dm" +#include "code\modules\random_map\noise\magma.dm" +#include "code\modules\random_map\noise\noise.dm" +#include "code\modules\random_map\noise\ore.dm" +#include "code\modules\random_map\noise\tundra.dm" +#include "code\modules\reagents\Chemistry-Colours.dm" +#include "code\modules\reagents\Chemistry-Holder.dm" +#include "code\modules\reagents\Chemistry-Logging.dm" +#include "code\modules\reagents\Chemistry-Machinery.dm" +#include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\Chemistry-Readme.dm" +#include "code\modules\reagents\Chemistry-Reagents.dm" +#include "code\modules\reagents\Chemistry-Recipes.dm" +#include "code\modules\reagents\reagent_containers.dm" +#include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Core.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Dispenser.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm" +#include "code\modules\reagents\dispenser\_defines.dm" +#include "code\modules\reagents\dispenser\cartridge.dm" +#include "code\modules\reagents\dispenser\cartridge_presets.dm" +#include "code\modules\reagents\dispenser\cartridge_spawn.dm" +#include "code\modules\reagents\dispenser\dispenser2.dm" +#include "code\modules\reagents\dispenser\dispenser_old.dm" +#include "code\modules\reagents\dispenser\dispenser_presets.dm" +#include "code\modules\reagents\dispenser\supply.dm" +#include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\food.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\food\cans.dm" +#include "code\modules\reagents\reagent_containers\food\condiment.dm" +#include "code\modules\reagents\reagent_containers\food\drinks.dm" +#include "code\modules\reagents\reagent_containers\food\sandwich.dm" +#include "code\modules\reagents\reagent_containers\food\snacks.dm" +#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" +#include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm" +#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm" +#include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm" +#include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" +#include "code\modules\reagents\reagent_containers\glass\bottle.dm" +#include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\xenoarchaeology\chemistry.dm" +#include "code\modules\research\xenoarchaeology\geosample.dm" +#include "code\modules\research\xenoarchaeology\manuals.dm" +#include "code\modules\research\xenoarchaeology\master_controller.dm" +#include "code\modules\research\xenoarchaeology\misc.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm" +#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm" +#include "code\modules\research\xenoarchaeology\artifact\effect.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm" +#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_teleport.dm" +#include "code\modules\research\xenoarchaeology\finds\finds.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_eguns.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_special.dm" +#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm" +#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm" +#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm" +#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm" +#include "code\modules\research\xenoarchaeology\machinery\coolant.dm" +#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm" +#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm" +#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm" +#include "code\modules\research\xenoarchaeology\tools\gearbelt.dm" +#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm" +#include "code\modules\research\xenoarchaeology\tools\tools.dm" +#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm" +#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm" +#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm" +#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm" +#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm" +#include "code\modules\scripting\Errors.dm" +#include "code\modules\scripting\IDE.dm" +#include "code\modules\scripting\Options.dm" +#include "code\modules\scripting\stack.dm" +#include "code\modules\scripting\AST\AST Nodes.dm" +#include "code\modules\scripting\AST\Blocks.dm" +#include "code\modules\scripting\AST\Statements.dm" +#include "code\modules\scripting\AST\Operators\Binary Operators.dm" +#include "code\modules\scripting\AST\Operators\Unary Operators.dm" +#include "code\modules\scripting\Implementations\_Logic.dm" +#include "code\modules\scripting\Implementations\Telecomms.dm" +#include "code\modules\scripting\Interpreter\Evaluation.dm" +#include "code\modules\scripting\Interpreter\Interaction.dm" +#include "code\modules\scripting\Interpreter\Interpreter.dm" +#include "code\modules\scripting\Interpreter\Scope.dm" +#include "code\modules\scripting\Parser\Expressions.dm" +#include "code\modules\scripting\Parser\Keywords.dm" +#include "code\modules\scripting\Parser\Parser.dm" +#include "code\modules\scripting\Scanner\Scanner.dm" +#include "code\modules\scripting\Scanner\Tokens.dm" +#include "code\modules\security levels\keycard authentication.dm" +#include "code\modules\security levels\security levels.dm" +#include "code\modules\shieldgen\emergency_shield.dm" +#include "code\modules\shieldgen\energy_field.dm" +#include "code\modules\shieldgen\sheldwallgen.dm" +#include "code\modules\shieldgen\shield_capacitor.dm" +#include "code\modules\shieldgen\shield_gen.dm" +#include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shuttles\antagonist.dm" +#include "code\modules\shuttles\departmental.dm" +#include "code\modules\shuttles\escape_pods.dm" +#include "code\modules\shuttles\shuttle.dm" +#include "code\modules\shuttles\shuttle_console.dm" +#include "code\modules\shuttles\shuttle_emergency.dm" +#include "code\modules\shuttles\shuttle_ferry.dm" +#include "code\modules\shuttles\shuttle_specops.dm" +#include "code\modules\shuttles\shuttle_supply.dm" +#include "code\modules\shuttles\shuttles_multi.dm" +#include "code\modules\spells\artifacts.dm" +#include "code\modules\spells\construct_spells.dm" +#include "code\modules\spells\no_clothes.dm" +#include "code\modules\spells\spell_code.dm" +#include "code\modules\spells\spell_projectile.dm" +#include "code\modules\spells\spellbook.dm" +#include "code\modules\spells\spells.dm" +#include "code\modules\spells\aoe_turf\aoe_turf.dm" +#include "code\modules\spells\aoe_turf\blink.dm" +#include "code\modules\spells\aoe_turf\charge.dm" +#include "code\modules\spells\aoe_turf\disable_tech.dm" +#include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\smoke.dm" +#include "code\modules\spells\aoe_turf\summons.dm" +#include "code\modules\spells\aoe_turf\conjure\conjure.dm" +#include "code\modules\spells\aoe_turf\conjure\construct.dm" +#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\rune_write.dm" +#include "code\modules\spells\targeted\ethereal_jaunt.dm" +#include "code\modules\spells\targeted\genetic.dm" +#include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\mind_transfer.dm" +#include "code\modules\spells\targeted\shift.dm" +#include "code\modules\spells\targeted\subjugate.dm" +#include "code\modules\spells\targeted\targeted.dm" +#include "code\modules\spells\targeted\equip\equip.dm" +#include "code\modules\spells\targeted\equip\horsemask.dm" +#include "code\modules\spells\targeted\projectile\dumbfire.dm" +#include "code\modules\spells\targeted\projectile\fireball.dm" +#include "code\modules\spells\targeted\projectile\magic_missile.dm" +#include "code\modules\spells\targeted\projectile\projectile.dm" +#include "code\modules\supermatter\supermatter.dm" +#include "code\modules\surgery\_defines.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\face.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\slimes.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" +#include "code\modules\tables\flipping.dm" +#include "code\modules\tables\interactions.dm" +#include "code\modules\tables\presets.dm" +#include "code\modules\tables\rack.dm" +#include "code\modules\tables\tables.dm" +#include "code\modules\tables\update_triggers.dm" +#include "code\modules\vehicles\cargo_train.dm" +#include "code\modules\vehicles\train.dm" +#include "code\modules\vehicles\vehicle.dm" +#include "code\modules\virus2\admin.dm" +#include "code\modules\virus2\analyser.dm" +#include "code\modules\virus2\antibodies.dm" +#include "code\modules\virus2\centrifuge.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\helpers.dm" +#include "code\modules\virus2\isolator.dm" +#include "code\modules\virus2\items_devices.dm" +#include "code\modules\xgm\xgm_gas_data.dm" +#include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\ZAS\_docs.dm" +#include "code\ZAS\Airflow.dm" +#include "code\ZAS\Atom.dm" +#include "code\ZAS\Connection.dm" +#include "code\ZAS\ConnectionGroup.dm" +#include "code\ZAS\ConnectionManager.dm" +#include "code\ZAS\Controller.dm" +#include "code\ZAS\Debug.dm" +#include "code\ZAS\Diagnostic.dm" +#include "code\ZAS\Fire.dm" +#include "code\ZAS\Phoron.dm" +#include "code\ZAS\Turf.dm" +#include "code\ZAS\Variable Settings.dm" +#include "code\ZAS\Zone.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +#include "maps\polaris-1.dmm" +#include "maps\polaris-2.dmm" +#include "maps\polaris-3.dmm" +#include "maps\polaris-4.dmm" +#include "maps\polaris-5.dmm" +// END_INCLUDE From c84260a4de3b3dda14f2362588a2834a6302afc0 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 16:08:53 -0500 Subject: [PATCH 14/55] Nerfs Changelings in various ways. Spacearmor is weaker. Cryosting is less potent, and there is now a three minute cooldown when using Cryostring or Delayed Toxic Sting --- .../game/gamemodes/changeling/powers/armor.dm | 14 +++---- .../gamemodes/changeling/powers/cryo_sting.dm | 6 ++- .../changeling/powers/delayed_toxin_sting.dm | 11 ++++-- html/changelogs/neerti-lingnerfs.yml | 38 +++++++++++++++++++ 4 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 html/changelogs/neerti-lingnerfs.yml diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index 4738d8a7543..7f624d32ad9 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -72,8 +72,8 @@ icon_state = "lingarmor" // item_state = "lingarmor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - armor = list(melee = 85, bullet = 70, laser = 70, energy = 70, bomb = 70, bio = 0, rad = 0) //It costs 3 points, so it should be very protective. - siemens_coefficient = 0.1 + armor = list(melee = 75, bullet = 60, laser = 60, energy = 60, bomb = 60, bio = 0, rad = 0) //It costs 3 points, so it should be very protective. + siemens_coefficient = 0.3 max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE slowdown = 3 @@ -92,8 +92,8 @@ desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" // item_state = "lingarmorhelmet" - armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) - siemens_coefficient = 0.1 + armor = list(melee = 75, bullet = 60, laser = 60,energy = 60, bomb = 60, bio = 0, rad = 0) + siemens_coefficient = 0.3 max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/head/helmet/space/changeling/armored/dropped() @@ -103,7 +103,7 @@ name = "chitinous gauntlets" desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements." icon_state = "lingarmorgloves" - armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) //No idea if glove armor gets checked + armor = list(melee = 75, bullet = 60, laser = 60,energy = 60, bomb = 60, bio = 0, rad = 0) //No idea if glove armor gets checked siemens_coefficient = 0 /obj/item/clothing/shoes/combat/changeling //Noslips @@ -111,8 +111,8 @@ name = "Footwear made out of a hard, black chitinous material. The bottoms of these appear to have spikes that can protrude or extract itself into and out \ of the floor at will, granting the wearer stability." icon_state = "lingboots" - armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0) - siemens_coefficient = 0.1 + armor = list(melee = 75, bullet = 60, laser = 70,energy = 60, bomb = 60, bio = 0, rad = 0) + siemens_coefficient = 0.3 cold_protection = FEET min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE heat_protection = FEET diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm index ef9cfa0acda..d6a4f6302bd 100644 --- a/code/game/gamemodes/changeling/powers/cryo_sting.dm +++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm @@ -22,6 +22,10 @@ if(T.reagents) T.reagents.add_reagent("cryotoxin", inject_amount) feedback_add_details("changeling_powers","CS") + src.verbs -= /mob/proc/changeling_cryo_sting + spawn(3 MINUTES) + src << "Our cryogenic string is ready to be used once more." + src.verbs |= /mob/proc/changeling_cryo_sting return 1 /datum/reagent/cryotoxin //A much more potent version of frost oil. @@ -34,7 +38,7 @@ /datum/reagent/cryotoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return - M.bodytemperature = max(M.bodytemperature - 40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) + M.bodytemperature = max(M.bodytemperature - 30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) if(prob(3)) M.emote("shiver") ..() diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm index d532248da05..0b0b95589ca 100644 --- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm +++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm @@ -19,13 +19,18 @@ i = i * 2 src << "Our toxin will be extra potent, when it strikes." src.mind.changeling.recursive_enhancement = 0 - spawn(120) //Two minutes + spawn(2 MINUTES) if(T) //We might not exist in two minutes, for whatever reason. T << "You feel a burning sensation flowing through your veins!" while(i) T.adjustToxLoss(1) i-- sleep(20) + src.verbs -= /mob/proc/changeling_delayed_toxic_sting + spawn(3 MINUTES) + src << "We are ready to use our delayed toxic string once more." + src.verbs |= /mob/proc/changeling_delayed_toxic_sting - feedback_add_details("changeling_powers","DTS") - return 1 \ No newline at end of file + + feedback_add_details("changeling_powers","DTS") + return 1 \ No newline at end of file diff --git a/html/changelogs/neerti-lingnerfs.yml b/html/changelogs/neerti-lingnerfs.yml new file mode 100644 index 00000000000..76c9f565bcc --- /dev/null +++ b/html/changelogs/neerti-lingnerfs.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Neerti + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscdel: "Changeling Spacearmor reduced in protective ability." + - rscdel: "Cryogenic String and Delayed Toxic Sting now have a three minute cooldown upon strining someone." + - rscdel: "Cryotoxin, the chemical used in Cryogenic String, is 25% less potent now." From 49af831b20e1242d6bd80a3f1459bd86ef80aa40 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 16:17:20 -0500 Subject: [PATCH 15/55] Fixes typo in changelog --- html/changelogs/neerti-lingnerfs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/neerti-lingnerfs.yml b/html/changelogs/neerti-lingnerfs.yml index 76c9f565bcc..e0da0b4fd78 100644 --- a/html/changelogs/neerti-lingnerfs.yml +++ b/html/changelogs/neerti-lingnerfs.yml @@ -34,5 +34,5 @@ delete-after: True # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscdel: "Changeling Spacearmor reduced in protective ability." - - rscdel: "Cryogenic String and Delayed Toxic Sting now have a three minute cooldown upon strining someone." + - rscdel: "Cryogenic String and Delayed Toxic Sting now have a three minute cooldown upon stinging someone." - rscdel: "Cryotoxin, the chemical used in Cryogenic String, is 25% less potent now." From e73a809adeaa17d380e166e03b1ac05d22663ffb Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 16:57:58 -0500 Subject: [PATCH 16/55] Uses get_turf(), so that messages can be heard while someone is holding the communicator. --- .../objects/items/devices/communicator/communicator.dm | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index cf401b3bc4b..38a16e7ad16 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -550,7 +550,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() /obj/item/device/communicator/see_emote(mob/living/M, text) var/rendered = "\icon[src] [text]" for(var/obj/item/device/communicator/comm in communicating) - for(var/mob/mob in viewers(comm)) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other. + for(var/mob/mob in viewers(get_turf(comm))) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other. mob.show_message(rendered) ..() @@ -560,7 +560,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Description: Relays the speech to all linked communicators. /obj/item/device/communicator/hear_talk(mob/living/M, text, verb, datum/language/speaking) for(var/obj/item/device/communicator/comm in communicating) - for(var/mob/mob in viewers(comm)) + for(var/mob/mob in viewers(get_turf(comm))) //Can whoever is hearing us understand? if(!mob.say_understands(M, speaking)) if(speaking) @@ -580,12 +580,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Description: Relays the message to all linked communicators. /obj/item/device/communicator/show_message(msg, type, alt, alt_type) var/rendered = "\icon[src] [msg]" - for(var/mob/living/voice/voice in contents) - if(voice.client) - voice.show_message(rendered, type) for(var/obj/item/device/communicator/comm in communicating) -// comm.audible_message(rendered) - for(var/mob/mob in hearers(comm)) //Ditto for audible messages. + for(var/mob/mob in hearers(get_turf(comm))) //Ditto for audible messages. mob.show_message(rendered) ..() From 579320dbc89e69575a040e81afa296384e4c3551 Mon Sep 17 00:00:00 2001 From: woodratt Date: Tue, 15 Dec 2015 14:45:53 -0800 Subject: [PATCH 17/55] -1.3.4.- Minor Hot fixes. - Adjusted areas on centcomm. - Doubled body scanners on merc shuttle removed. --- maps/polaris-2.dmm | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index c16f3bf10ed..bcf0eabaa65 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -1156,7 +1156,7 @@ "wl" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/floor,/area/supply/dock) "wm" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) "wn" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"wo" = (/obj/machinery/bodyscanner,/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"wo" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "wp" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "wq" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "wr" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -1412,9 +1412,9 @@ "Bh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space) "Bi" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/security) "Bj" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"Bk" = (/obj/machinery/turretid{pixel_x = -28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"Bl" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"Bm" = (/obj/machinery/computer/secure_data,/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"Bk" = (/obj/machinery/door/airlock/centcom{name = "Arrivals Processing"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"Bl" = (/obj/machinery/computer/card,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"Bm" = (/obj/machinery/turretid{pixel_x = -28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) "Bn" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/main_hall) "Bo" = (/obj/machinery/gateway{dir = 10},/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/main_hall) "Bp" = (/obj/machinery/gateway,/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/centcom/main_hall) @@ -1426,8 +1426,8 @@ "Bv" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "Bw" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "Bx" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"By" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"Bz" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) +"By" = (/obj/machinery/computer/secure_data,/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"Bz" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) "BA" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "BB" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "BC" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) @@ -2363,6 +2363,8 @@ "Tw" = (/mob/living/simple_animal/hostile/retaliate/goat{name = "Experiment 97d"},/turf/unsimulated/floor{icon_state = "grass0"; name = "grass"},/area/wizard_station) "Tx" = (/obj/item/weapon/caution,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Ty" = (/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"Tz" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) +"TA" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/main_hall) (1,1,1) = {" aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoalahajapaqarasatauavawaxayaaabacadaeafagahaaaiajakalamanaoagafajacadahakazaAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaAaBaCaDaEaFaGaHaIaJazaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaQaQaQaQaQaQaQaQaQaQaQaQaQaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaRaSaSaSaSaSaSaSaSaSaSaR @@ -2498,11 +2500,11 @@ aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbxwxxxyaP aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGvGvGaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGvGwbwbwbvHmTaPaPzEzFzGzEzFzFzHzIzJzFzKzLmTmTvHzMwbwbwPxfxezNxexfxezOzPwPzQxexAxexeyIyVyVzRyIzSyYzTyYzozpyYzwzxzyyYyIvKvKvKvKvKvKvKvKvKvJvKvKvKvKzCzCzDvKvKzUvKzVvKvKzVvKzCsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmj aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPzEzWzXzYzZAaAbAaAaAaAbAcAdvGvGvGwbwbwbwPzrzNxgxgxgxgxgxgwPAeAfxexeAgyIAhyVzRyIzSyYyYyYzozpyYzwzxzyyYyIvKvKvKvKvKvKvKvKvKvJAiyNvKvKvKvKvKAjvKsdzcAkAlzCAmvKzqsdyRyRsdvKvKsdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmj aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvGaPaPAnAoApAoAqAoAoAoAoAoAoAoArAsxxAswbwbwbwPxfxexfxexfxexfxexfAeAeAtAeAeyIyIyIyIyIzozozozozozpyYzwzxzyyYyIvJvJAuvJvJsdwdvKvKsdAvyNvKvKvKvKvKsdsdsdsdvJvJvJvJvJsdsdAwAwsdvKvKsdaPaPaPaPAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmj -aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHmTmTmTaPaPaPaPaPaPaPaPaPaPaPmTmTmTvHwbwbwbvGaPaPAyAzAAABzZACADACACACADAEAFvGvGvGwbwbwbwPxexfxexfxexfxexfxexfxexfxeAGAHyIyYyYyYzpzpzpzpzpyYyYyYyYyYyYyIAIAJvKAKALsdAMANAOsdsdAPsdsdvJAPvJsdAQAQAQARASATAUAVAQAQAQAwwdvKvKsdaPaPaPAxAxAWAWAWAWAWAWAXAXAXAWAWAWAWAXAXAXAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj -aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPAyzFAZAyzFzFzHzIzJzFBaBbmTmTvHwbwbwbwPxfxexfySAGySAGySxfxexfxexfySBcyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIvKvKvKvKvKsdvKvKvKvJvKvKAmsdvKvKvKsdAQAQAQARBeBfBgAVAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPBhaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj -aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHvHvHvHvHwvmTmTmTmTmTmTmTmTmTmTmTaPvGwbwbwbwPxexfxeBiBjBiBjBixexfxexfxexfxeyIzxyYzwzxzxzyyYyYzwzxzxzyyYzxyIvKvKvKvKvKsdvKvKvKvJBkBlBmsdvKvKvKsdAQAQAQBnBoBpBqBrAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmj -aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwPxfxexfyjxfxexfxSxfxexfxexfxexfyIBsyYzwzxzxzyyYyYzwzxzxzyyYBsyIvKBtBuBvBwsdvJBxvJsdByBzsdsdBABBBCsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWBDAxAxAxAYAYAYAxBEBEAxAYAYAYAxAxAxAxAYAYAYAxAxAYAYAYAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmj -aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHBFBFBFvHvHaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPvHvHBFBFBFvHvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHvHBFBFBFwPxexfxexfxexfxexfxexfwPwPBGBHwPyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIBIsdsdsdsdsdAQAQAQsdvJvJsdsdsdsdsdsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxBJAWAWAxAxBKBLBMBLBMBNBOBOBPBMBLBMBLBQBRBRBRBRBRBRBRBRBRBRAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmj +aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbwbwbvHmTmTmTaPaPaPaPaPaPaPaPaPaPaPmTmTmTvHwbwbwbvGaPaPAyAzAAABzZACADACACACADAEAFvGvGvGwbwbwbwPxexfxexfxexfxexfxexfxexfxeAGAHyIyYyYyYzpzpzpzpzpyYyYyYyYyYyYyIAIAJvKAKALsdAMANAOAwAwBkAwsdvJAPvJsdAQAQAQARASATAUAVAQAQAQAwwdvKvKsdaPaPaPAxAxAWAWAWAWAWAWAXAXAXAWAWAWAWAXAXAXAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj +aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPAyzFAZAyzFzFzHzIzJzFBaBbmTmTvHwbwbwbwPxfxexfySAGySAGySxfxexfxexfySBcyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIvKvKvKvKvKsdvKvKvKEaAQAQBlsdvKvKvKsdAQAQAQARBeBfBgAVAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPBhaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmj +aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHvHvHvHvHwvmTmTmTmTmTmTmTmTmTmTmTaPvGwbwbwbwPxexfxeBiBjBiBjBixexfxexfxexfxeyIzxyYzwzxzxzyyYyYzwzxzxzyyYzxyIvKvKvKvKvKsdvKvKvKEaBmBzBysdvKvKvKsdAQAQAQBnBoBpBqBrAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAWAYaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmj +aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbvGaPaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPaPvGwbwbwbvHmTaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGwbwbwbwPxfxexfyjxfxexfxSxfxexfxexfxexfyIBsyYzwzxzxzyyYyYzwzxzxzyyYBsyIvKBtBuBvBwsdvJBxvJAwTzTAAwsdBABBBCsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxAWAWAWBDAxAxAxAYAYAYAxBEBEAxAYAYAYAxAxAxAxAYAYAYAxAxAYAYAYAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmj +aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHBFBFBFvHvHaPmTaPaPaPaPaPaPaPaPaPaPaPmTaPvHvHBFBFBFvHvHaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHvHBFBFBFwPxexfxexfxexfxexfxexfwPwPBGBHwPyIBdyYyYyYyYyYyYyYyYyYyYyYyYBdyIBIsdsdsdsdsdAQAQAQAwEaEaAwsdsdsdsdsdAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxBJAWAWAxAxBKBLBMBLBMBNBOBOBPBMBLBMBLBQBRBRBRBRBRBRBRBRBRBRAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPmj aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbBSwbwbvHvHmTaPaPaPaPaPaPaPaPaPaPaPmTvHvHwbBTBUBVwbvHvHaPaPaPaPaPaPaPaPaPaPaPaPaPvHvHwbwbBUBVwPxfxexfwPBWAtwPwPxfxewPBXxfxeBYyIzxyYzwzxzxzyyYyYzwzxzxzyyYzxyIsdsdAQAQAQAQAQAQAQAQAQAQAQAwAwsdsdAwAQAQAQAQAQAQAQAQAQAQAQAwvKvKvKsdaPaPaPAxBJAWAWAxBKBZCaCaCaCaCbCcCcCdCaCaCaCbCeBQCfCfCfCfCfCfCfCfCfAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvHwbCgwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbChwbwbwavHvHaPaPaPaPaPaPaPaPaPaPaPvHvHwawbwbCiBVzNxexfxewPxexfxewPxexfwPCjxexfCkyIBsyYzwzxzxzyyYyYzwzxzxzyyYBsyIsdClAQAQAQAQAQAQAQAQAQAQAQClAwAwsdAwCmAQAQAQAQAQAQAQAQAQCmAwwdvKvKAxAxAxAxAxBJAWAWAYCnCoCcCcCcCcCcCcCcCcCcCcCcCcCpCnCqCqCqCqCqCqCqCqCqAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPvGvGwbCiwbwbwbwbvHvHvHvHvGvGvGvGvGvHvHvHvHwbwbwbCiBUCrwbwbwbvHvHvHvHvGvGvGvGvGvHvHvHvHwbwbwbwbBUwbzrxfxexfwPxfxeCswPxfxewPCtxfxeBYyIyICuCvCvCwyICxCxyICuCvCvCwyIyIAQAQAQAQCyCzCACACACBCCAQAQAQAQAwAwAwAwAwAwAwAQAQAQAwAwAwAwAwsdvKvKCDAWAWAWAxBJAWAWAYCECoCcCcCcCcCcCcCcCcCcCcCcCcCpCECfCfCfCfCfCfCfCfCfAxaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmdaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPmjmjmjmjmjaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP @@ -2621,3 +2623,4 @@ mdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmdmd aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP aPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaP "} + From 0148e78eda95258ea08cfcbc456be24ab1b4ddd1 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 13 Dec 2015 15:03:06 +1030 Subject: [PATCH 18/55] Removed targeting. --- code/_onclick/click.dm | 3 - code/_onclick/hud/hud.dm | 6 +- code/_onclick/hud/human.dm | 3 +- code/_onclick/hud/monkey.dm | 5 +- code/_onclick/hud/robot.dm | 4 +- code/_onclick/hud/screen_objects.dm | 35 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/modules/client/ui_style.dm | 2 + code/modules/clothing/spacesuits/rig/rig.dm | 1 - .../mob/living/carbon/human/update_icons.dm | 11 - .../modules/mob/living/silicon/robot/robot.dm | 8 - code/modules/mob/mob.dm | 8 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/projectiles/gun.dm | 17 +- code/modules/projectiles/targeting.dm | 407 ------------------ polaris.dme | 1 - 17 files changed, 33 insertions(+), 484 deletions(-) delete mode 100644 code/modules/projectiles/targeting.dm diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 797f0385d42..0ea5cc9265f 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -88,9 +88,6 @@ return throw_mode_off() - if(!istype(A, /obj/item/weapon/gun) && !isturf(A) && !istype(A, /obj/screen)) - last_target_click = world.time - var/obj/item/W = get_active_hand() if(W == A) // Handle attack_self diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5a9b45bfca3..5c12f86d7dd 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -310,7 +310,7 @@ datum/hud/New(mob/owner) else src.client.screen -= src.healths src.client.screen -= src.internals - src.client.screen -= src.gun_setting_icon + //src.client.screen -= src.gun_setting_icon //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. @@ -327,8 +327,8 @@ datum/hud/New(mob/owner) src.client.screen |= src.healths if(src.internals) src.client.screen |= src.internals - if(src.gun_setting_icon) - src.client.screen |= src.gun_setting_icon + //if(src.gun_setting_icon) + // src.client.screen |= src.gun_setting_icon src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index ab5d0f6a123..d75a5e23f07 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -337,6 +337,7 @@ mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") hud_elements |= mymob.zone_sel + /* //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) mymob.gun_setting_icon.icon = ui_style @@ -363,7 +364,7 @@ mymob.radio_use_icon.icon = ui_style mymob.radio_use_icon.color = ui_color mymob.radio_use_icon.alpha = ui_alpha - + */ mymob.client.screen = null diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index d24d9322a56..54afe01083e 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -250,11 +250,13 @@ mymob.zone_sel.overlays.Cut() mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") + /* //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) if (mymob.client) if (mymob.client.gun_mode) // If in aim mode, correct the sprite mymob.gun_setting_icon.set_dir(2) + for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons if (G.aim_targets) mymob.item_use_icon = new /obj/screen/gun/item(null) @@ -273,10 +275,11 @@ mymob.gun_run_icon.set_dir(1) src.adding += mymob.gun_run_icon src.adding += mymob.gun_move_icon + */ mymob.client.screen = null - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other return diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index eb31c7019b5..303e3cadba9 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -151,6 +151,7 @@ var/obj/screen/robot_inventory mymob.zone_sel.overlays.Cut() mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") + /* //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) if (mymob.client) @@ -174,10 +175,11 @@ var/obj/screen/robot_inventory mymob.gun_run_icon.set_dir(1) src.adding += mymob.gun_run_icon src.adding += mymob.gun_move_icon + */ mymob.client.screen = null - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon, robot_inventory) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, robot_inventory) //, mymob.gun_setting_icon, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1f30726c072..a384cb01407 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -95,38 +95,6 @@ usr.ClickOn(master) return 1 -/obj/screen/gun - name = "gun" - icon = 'icons/mob/screen1.dmi' - master = null - dir = 2 - - move - name = "Allow Walking" - icon_state = "no_walk0" - screen_loc = ui_gun2 - - run - name = "Allow Running" - icon_state = "no_run0" - screen_loc = ui_gun3 - - item - name = "Allow Item Use" - icon_state = "no_item0" - screen_loc = ui_gun1 - - mode - name = "Toggle Gun Mode" - icon_state = "gun0" - screen_loc = ui_gun_select - //dir = 1 - - radio - name = "Allow Radio Use" - icon_state = "no_radio0" - screen_loc = ui_gun4 - /obj/screen/zone_sel name = "damage zone" icon_state = "zone_sel" @@ -432,6 +400,7 @@ if(istype(usr, /mob/living/silicon/robot)) usr:toggle_module(3) + /* if("Allow Walking", "Disallow Walking") if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. return @@ -470,7 +439,7 @@ return usr.client.AllowTargetRadio() gun_click_time = world.time - + */ else return 0 return 1 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e0d7ddad3a0..d83d30432b1 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -949,7 +949,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1) if(tap) U.visible_message("\The [U] taps on \his PDA's screen.") - U.last_target_click = world.time + //U.last_target_click = world.time var/t = input(U, "Please enter message", P.name, null) as text t = sanitize(t) //t = readd_quotes(t) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index affde77733b..8922fad1e98 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -278,7 +278,7 @@ var/global/list/default_medbay_channels = list( if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact return 0 - M.last_target_radio = world.time // For the projectile targeting system + //M.last_target_radio = world.time // For the projectile targeting system if(!radio_connection) set_frequency(frequency) diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm index 12521a6a1eb..acc2a1512e3 100644 --- a/code/modules/client/ui_style.dm +++ b/code/modules/client/ui_style.dm @@ -35,11 +35,13 @@ //update UI var/list/icons = usr.hud_used.adding + usr.hud_used.other + usr.hud_used.hotkeybuttons icons.Add(usr.zone_sel) + /* icons.Add(usr.gun_setting_icon) icons.Add(usr.item_use_icon) icons.Add(usr.gun_move_icon) icons.Add(usr.gun_run_icon) icons.Add(usr.radio_use_icon) + */ var/icon/ic = all_ui_styles[UI_style_new] diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index b3d59aaf7d4..f123f17b55c 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -851,7 +851,6 @@ return 0 // AIs are a bit slower than regular and ignore move intent. - wearer.last_move_intent = world.time + ai_controlled_move_delay wearer_move_delay = world.time + ai_controlled_move_delay var/tickcomp = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d89268fe1b9..3e5731543c8 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -429,17 +429,6 @@ var/global/list/damage_icon_parts = list() overlays_standing[MUTATIONS_LAYER] = null if(update_icons) update_icons() -//Call when target overlay should be added/removed -/mob/living/carbon/human/update_targeted(var/update_icons=1) - if (targeted_by && target_locked) - overlays_standing[TARGETED_LAYER] = target_locked - else if (!targeted_by && target_locked) - qdel(target_locked) - if (!targeted_by) - overlays_standing[TARGETED_LAYER] = null - if(update_icons) update_icons() - - /* --------------------------------------- */ //For legacy support. /mob/living/carbon/human/regenerate_icons() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 93f9e409224..8507053e232 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -703,14 +703,6 @@ icon_state = module_sprites[icontype] return -//Call when target overlay should be added/removed -/mob/living/silicon/robot/update_targeted() - if(!targeted_by && target_locked) - qdel(target_locked) - updateicon() - if (targeted_by && target_locked) - overlays += target_locked - /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d26f5242624..57b5f974beb 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -37,10 +37,10 @@ pressure = null damageoverlay = null pain = null - item_use_icon = null - gun_move_icon = null - gun_run_icon = null - gun_setting_icon = null + //item_use_icon = null + //gun_move_icon = null + //gun_run_icon = null + //gun_setting_icon = null spell_masters = null zone_sel = null diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d8b8778f420..e946a9df41d 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -265,7 +265,7 @@ return 0 move_delay = world.time//set move delay - mob.last_move_intent = world.time + 10 + switch(mob.m_intent) if("run") if(mob.drowsyness > 0) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 733b086669b..3abac6c315d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -123,17 +123,20 @@ /obj/item/weapon/gun/afterattack(atom/A, mob/living/user, adjacent, params) if(adjacent) return //A is adjacent, is the user, or is on the user's person - //decide whether to aim or shoot normally - var/aiming = 0 + /* if(user && user.client && !(A in aim_targets)) if(user.client.gun_mode) aiming = PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. + return + */ - if (!aiming) - if(user && user.a_intent == I_HELP) //regardless of what happens, refuse to shoot if help intent is on - user << "\red You refrain from firing your [src] as your intent is set to help." - else - Fire(A,user,params) //Otherwise, fire normally. + if(user && user.a_intent == I_HELP) //regardless of what happens, refuse to shoot if help intent is on + user << "You refrain from firing your [src] as your intent is set to help." + else + Fire(A,user,params) //Otherwise, fire normally. + +/obj/item/weapon/gun/proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params) + return /obj/item/weapon/gun/attack(atom/A, mob/living/user, def_zone) if (A == user && user.zone_sel.selecting == "mouth" && !mouthshoot) diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm deleted file mode 100644 index de9e115b8ec..00000000000 --- a/code/modules/projectiles/targeting.dm +++ /dev/null @@ -1,407 +0,0 @@ -/obj/item/weapon/gun/verb/toggle_firerate() - set name = "Toggle Continue Aiming" - set category = "Object" - - keep_aim = !keep_aim - - if (keep_aim) - loc << "You will now continue firing when your target moves." - else - loc << "You will now only fire once, then lower your aim, when your target moves." - -/obj/item/weapon/gun/verb/lower_aim() - set name = "Lower Aim" - set category = "Object" - if(aim_targets) - stop_aim() - usr.visible_message(" \The [usr] lowers \the [src]...") - -//Removing the lock and the buttons. -/obj/item/weapon/gun/dropped(mob/user as mob) - stop_aim() - if(user && user.client) - user.client.remove_gun_icons() - return ..() - -/obj/item/weapon/gun/equipped(var/mob/user, var/slot) - if (slot != slot_l_hand && slot != slot_r_hand) - stop_aim() - if (user.client) - user.client.remove_gun_icons() - return ..() - -//Removes lock from all targets -/obj/item/weapon/gun/proc/stop_aim() - if(aim_targets) - for(var/mob/living/M in aim_targets) - if(M) - M.NotTargeted(src) //Untargeting people. - aim_targets = null - -//Compute how to fire..... -//Return 1 if a target was found, 0 otherwise. -/obj/item/weapon/gun/proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params) - //Lets not spam it. - if(lock_time > world.time - 2) return - - user.set_dir(get_cardinal_dir(src, A)) - if(isliving(A) && !(A in aim_targets)) - Aim(A) //Clicked a mob, aim at them - return 1 - - //Didn't click someone, check if there is anyone along that guntrace - var/mob/living/M = GunTrace(usr.x,usr.y,A.x,A.y,usr.z,usr) //Find dat mob. - if(isliving(M) && (M in view(user)) && !(M in aim_targets)) - Aim(M) //Aha! Aim at them! - return 1 - - return 0 - -//Aiming at the target mob. -/obj/item/weapon/gun/proc/Aim(var/mob/living/M) - if(!aim_targets || !(M in aim_targets)) - admin_attack_log(usr, M, "Pointed a [src] at [M]", "Had a [src] aimed at them, by [usr]", "aims a gun ([src]) (MODE: [src.mode_name]) at") - lock_time = world.time - if(aim_targets && !multi_aim) //If they're targeting someone and they have a non multi_aim weapon. - for(var/mob/living/L in aim_targets) - if(L) - L.NotTargeted(src) - aim_targets = null - usr.visible_message("[usr] turns \the [src] on [M]!") - else - usr.visible_message("[usr] aims \a [src] at [M]!") - M.Targeted(src) - -//HE MOVED, SHOOT HIM! -/obj/item/weapon/gun/proc/TargetActed(var/mob/living/T) - var/mob/living/M = loc - if(M == T) return - if(!istype(M)) return - if(src != M.get_active_hand()) - stop_aim() - return - - //reflex firing is disabled when help intent is set - if (M.a_intent == I_HELP) - M << "You refrain from firing your [src] as your intent is set to help." - return - - M.last_move_intent = world.time - var/firing_check = can_hit(T,usr) //0 if it cannot hit them, 1 if it is capable of hitting, and 2 if a special check is preventing it from firing. - if(firing_check > 0) - if(firing_check == 1) - Fire(T,usr, reflex = 1) - else if(!told_cant_shoot) - M << "They can't be hit from here!" - told_cant_shoot = 1 - spawn(30) - told_cant_shoot = 0 - - usr.set_dir(get_cardinal_dir(src, T)) - - if (!keep_aim) // If keep_aim is set to lower aim after one shot, untarget the target - T.NotTargeted(src) - -//Yay, math! - -#define SIGN(X) ((X<0)?-1:1) - -/proc/GunTrace(X1,Y1,X2,Y2,Z=1,exc_obj,PX1=16,PY1=16,PX2=16,PY2=16) - //bluh << "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z]." - var/turf/T - var/mob/living/M - if(X1==X2) - if(Y1==Y2) return 0 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(1) - T = locate(X1,Y1,Z) - if(!T) return 0 - M = locate() in T - if(M) return M - M = locate() in orange(1,T)-exc_obj - if(M) return M - Y1+=s - else - var - m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - signX = SIGN(X2-X1) - signY = SIGN(Y2-Y1) - if(X1= 5) - if(ismob(I.loc)) - I.loc << "You can only target 5 people at once!" - return - else - return - for(var/mob/living/K in viewers(usr)) - K << 'sound/weapons/TargetOn.ogg' - - if(!targeted_by) targeted_by = list() - targeted_by += I - I.lock_time = world.time + 20 //Target has 2 second to realize they're targeted and stop (or target the opponent). - src << "((Your character is being targeted. They have 2 seconds to stop any click or move actions. While targeted, they may \ - drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map objects (floors and walls are fine), their items \ - (other than a weapon to de-target), moving, or talking into a radio will result in being fired upon. The aggressor may also fire manually, \ - so try not to get on their bad side.))" - - if(targeted_by.len == 1) - spawn(0) - target_locked = image("icon" = 'icons/effects/Targeted.dmi', "icon_state" = "locking") - overlays += target_locked - spawn(0) - sleep(20) - if(target_locked) - target_locked = image("icon" = 'icons/effects/Targeted.dmi', "icon_state" = "locked") - update_targeted() - - //Adding the buttons to the controller person - var/mob/living/T = I.loc - if(T) - if(T.client) - T.client.add_gun_icons() - else - I.lower_aim() - return - if(iscarbon(src) && m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0) - src << "Your move intent is now set to walk, as your targeter permits it." //Self explanitory. - set_m_intent("walk") - - //Processing the aiming. Should be probably in separate object with process() but lasy. - while(targeted_by && T.client) - if(last_move_intent > I.lock_time + 10 && !T.client.target_can_move) //If target moved when not allowed to - I.TargetActed(src) - if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. - I.lock_time = world.time + 5 - I.lock_time = world.time + 5 - I.last_moved_mob = src - else if(last_move_intent > I.lock_time + 10 && !T.client.target_can_run && m_intent == "run") //If the target ran while targeted - I.TargetActed(src) - if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. - I.lock_time = world.time + 5 - I.lock_time = world.time + 5 - I.last_moved_mob = src - if(last_target_click > I.lock_time + 10 && !T.client.target_can_click) //If the target clicked the map to pick something up/shoot/etc - I.TargetActed(src) - if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. - I.lock_time = world.time + 5 - I.lock_time = world.time + 5 - I.last_moved_mob = src - if(last_target_radio > I.lock_time + 10 && !T.client.target_can_radio) - I.TargetActed(src) - if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. - I.lock_time = world.time + 5 - I.lock_time = world.time + 5 - I.last_moved_mob = src - sleep(1) - -/mob/living/proc/NotTargeted(var/obj/item/weapon/gun/I) - if(!I.silenced) - for(var/mob/living/M in viewers(src)) - M << 'sound/weapons/TargetOff.ogg' - targeted_by -= I - I.aim_targets.Remove(src) //De-target them - if(!I.aim_targets.len) - I.aim_targets = null - var/mob/living/T = I.loc //Remove the targeting icons - if(T && ismob(T) && !I.aim_targets && T.client) - T.client.remove_gun_icons() - if(!targeted_by.len) - qdel(target_locked) //Remove the overlay - targeted_by.Cut() - spawn(1) update_targeted() - -/mob/living/Move() - . = ..() - for(var/obj/item/weapon/gun/G in targeted_by) //Handle moving out of the gunner's view. - var/mob/living/M = G.loc - if(!(M in view(src))) - NotTargeted(G) - for(var/obj/item/weapon/gun/G in src) //Handle the gunner loosing sight of their target/s - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(M && !(M in view(src))) - M.NotTargeted(G) - -//If you move out of range, it isn't going to still stay locked on you any more. -/client/var - target_can_move = 0 - target_can_run = 0 - target_can_click = 0 - target_can_radio = 0 - gun_mode = 0 - -//These are called by the on-screen buttons, adjusting what the victim can and cannot do. -/client/proc/add_gun_icons() - if(!usr) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen += usr.item_use_icon - screen += usr.gun_move_icon - screen += usr.radio_use_icon - if (target_can_move) - screen += usr.gun_run_icon - - - -/client/proc/remove_gun_icons() - if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG - screen -= usr.item_use_icon - screen -= usr.gun_move_icon - screen -= usr.radio_use_icon - if (target_can_move) - screen -= usr.gun_run_icon - -/client/verb/ToggleGunMode() - set name = "Toggle Gun Mode" - set hidden = 1 - gun_mode = !gun_mode - if(gun_mode) - usr << "You will now take people captive." - else - usr << "You will now shoot where you target." - for(var/obj/item/weapon/gun/G in usr) - G.stop_aim() - remove_gun_icons() - if(usr.gun_setting_icon) - usr.gun_setting_icon.icon_state = "gun[gun_mode]" - - -/client/verb/AllowTargetMove() - set hidden=1 - - //Changing client's permissions - target_can_move = !target_can_move - if(target_can_move) - usr << "Target may now walk." - //usr.gun_run_icon = new /obj/screen/gun/run(null) //adding icon for running permission - screen += usr.gun_run_icon - else - usr << "Target may no longer move." - target_can_run = 0 - qdel(usr.gun_run_icon) //no need for icon for running permission - - //Updating walking permission button - if(usr.gun_move_icon) - usr.gun_move_icon.icon_state = "no_walk[target_can_move]" - usr.gun_move_icon.name = "[target_can_move ? "Disallow" : "Allow"] Walking" - - //Handling change for all the guns on client - for(var/obj/item/weapon/gun/G in usr) - G.lock_time = world.time + 5 - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(target_can_move) - M << "Your character may now walk at the discretion of their targeter." - if(!target_can_run) - M << "Your move intent is now set to walk, as your targeter permits it." - M.set_m_intent("walk") - else - M << "Your character will now be shot if they move." - -/mob/living/proc/set_m_intent(var/intent) - if (intent != "walk" && intent != "run") - return 0 - m_intent = intent - if(hud_used) - if (hud_used.move_intent) - hud_used.move_intent.icon_state = intent == "walk" ? "walking" : "running" - -client/verb/AllowTargetRun() - set hidden=1 - - //Changing client's permissions - target_can_run = !target_can_run - if(target_can_run) - usr << "Target may now run." - else - usr << "Target may no longer run." - - //Updating running permission button - if(usr.gun_run_icon) - usr.gun_run_icon.icon_state = "no_run[target_can_run]" - usr.gun_run_icon.name = "[target_can_run ? "Disallow" : "Allow"] Running" - - //Handling change for all the guns on client - for(var/obj/item/weapon/gun/G in src) - G.lock_time = world.time + 5 - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(target_can_run) - M << "Your character may now run at the discretion of their targeter." - else - M << "Your character will now be shot if they run." - -/client/verb/AllowTargetClick() - set hidden=1 - - //Changing client's permissions - target_can_click = !target_can_click - if(target_can_click) - usr << "Target may now use items." - else - usr << "Target may no longer use items." - - if(usr.item_use_icon) - usr.item_use_icon.icon_state = "no_item[target_can_click]" - usr.item_use_icon.name = "[target_can_click ? "Disallow" : "Allow"] Item Use" - - //Handling change for all the guns on client - for(var/obj/item/weapon/gun/G in src) - G.lock_time = world.time + 5 - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(target_can_click) - M << "Your character may now use items at the discretion of their targeter." - else - M << "Your character will now be shot if they use items." - -/client/verb/AllowTargetRadio() - set hidden=1 - - target_can_radio = !target_can_radio - if(target_can_radio) - usr << "Target may now use radio." - else - usr << "Target may no longer use radio." - - if(usr.radio_use_icon) - usr.radio_use_icon.icon_state = "no_radio[target_can_radio]" - usr.radio_use_icon.name = "[target_can_radio ? "Disallow" : "Allow"] Radio Use" - - //Handling change for all the guns on client - for(var/obj/item/weapon/gun/G in src) - G.lock_time = world.time + 5 - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(target_can_radio) - M << "Your character may now use the radio at the discretion of their targeter." - else - M << "Your character will now be shot if they use the radio." diff --git a/polaris.dme b/polaris.dme index 2acbed414ca..f0bd34d22a8 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1610,7 +1610,6 @@ #include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\targeting.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" #include "code\modules\projectiles\guns\alien.dm" From 6e8368ac4c17ecdd08c6437713ed605435d1063f Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 13 Dec 2015 17:22:27 +1030 Subject: [PATCH 19/55] Rewrote targeting. --- code/__defines/targeting.dm | 4 + code/_onclick/click.dm | 23 +- code/_onclick/hud/gun_mode.dm | 66 ++++ code/_onclick/hud/hud.dm | 6 +- code/_onclick/hud/human.dm | 11 +- code/_onclick/hud/monkey.dm | 285 ------------------ code/_onclick/hud/robot.dm | 28 +- code/_onclick/hud/screen_objects.dm | 43 --- code/game/objects/items/devices/PDA/PDA.dm | 1 - .../game/objects/items/devices/radio/radio.dm | 4 +- code/modules/client/ui_style.dm | 3 - .../clothing/under/accessories/holster.dm | 6 +- code/modules/mob/inventory.dm | 1 + .../mob/living/carbon/human/human_movement.dm | 2 + code/modules/mob/mob.dm | 11 +- code/modules/projectiles/gun.dm | 17 +- .../projectiles/targeting/targeting_client.dm | 12 + .../projectiles/targeting/targeting_gun.dm | 21 ++ .../projectiles/targeting/targeting_mob.dm | 44 +++ .../targeting/targeting_overlay.dm | 213 +++++++++++++ .../targeting/targeting_triggers.dm | 29 ++ code/modules/recycling/disposal.dm | 54 ++-- polaris.dme | 8 +- 23 files changed, 467 insertions(+), 425 deletions(-) create mode 100644 code/__defines/targeting.dm create mode 100644 code/_onclick/hud/gun_mode.dm delete mode 100644 code/_onclick/hud/monkey.dm create mode 100644 code/modules/projectiles/targeting/targeting_client.dm create mode 100644 code/modules/projectiles/targeting/targeting_gun.dm create mode 100644 code/modules/projectiles/targeting/targeting_mob.dm create mode 100644 code/modules/projectiles/targeting/targeting_overlay.dm create mode 100644 code/modules/projectiles/targeting/targeting_triggers.dm diff --git a/code/__defines/targeting.dm b/code/__defines/targeting.dm new file mode 100644 index 00000000000..4bbe7345920 --- /dev/null +++ b/code/__defines/targeting.dm @@ -0,0 +1,4 @@ +#define TARGET_CAN_MOVE 1 +#define TARGET_CAN_RUN 2 +#define TARGET_CAN_CLICK 4 +#define TARGET_CAN_RADIO 8 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0ea5cc9265f..42d815205ac 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -38,8 +38,10 @@ * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed */ /mob/proc/ClickOn(var/atom/A, var/params) + if(world.time <= next_click) // Hard check, before anything else, to avoid crashing return + next_click = world.time + 1 if(client.buildmode) @@ -49,19 +51,19 @@ var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["ctrl"]) CtrlShiftClickOn(A) - return + return 1 if(modifiers["middle"]) MiddleClickOn(A) - return + return 1 if(modifiers["shift"]) ShiftClickOn(A) - return + return 0 if(modifiers["alt"]) // alt and alt-gr (rightalt) AltClickOn(A) - return + return 1 if(modifiers["ctrl"]) CtrlClickOn(A) - return + return 1 if(stat || paralysis || stunned || weakened) return @@ -80,12 +82,12 @@ if(restrained()) setClickCooldown(10) RestrainedClickOn(A) - return + return 1 if(in_throw_mode) if(isturf(A) || isturf(A.loc)) throw_item(A) - return + return 1 throw_mode_off() var/obj/item/W = get_active_hand() @@ -96,7 +98,7 @@ update_inv_l_hand(0) else update_inv_r_hand(0) - return + return 1 //Atoms on your person // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. @@ -114,7 +116,7 @@ if(ismob(A)) // No instant mob attacking setClickCooldown(DEFAULT_ATTACK_COOLDOWN) UnarmedAttack(A, 1) - return + return 1 if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that return @@ -141,8 +143,7 @@ W.afterattack(A, src, 0, params) // 0: not Adjacent else RangedAttack(A, params) - - return + return 1 /mob/proc/setClickCooldown(var/timeout) next_move = max(world.time + timeout, next_move) diff --git a/code/_onclick/hud/gun_mode.dm b/code/_onclick/hud/gun_mode.dm new file mode 100644 index 00000000000..e5d1fbce37d --- /dev/null +++ b/code/_onclick/hud/gun_mode.dm @@ -0,0 +1,66 @@ +/obj/screen/gun + name = "gun" + icon = 'icons/mob/screen1.dmi' + master = null + dir = 2 + +/obj/screen/gun/Click(location, control, params) + if(!usr) + return + return 1 + +/obj/screen/gun/move + name = "Allow Movement" + icon_state = "no_walk0" + screen_loc = ui_gun2 + +/obj/screen/gun/move/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_MOVE) + return 1 + return 0 + +/obj/screen/gun/item + name = "Allow Item Use" + icon_state = "no_item0" + screen_loc = ui_gun1 + +/obj/screen/gun/item/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_CLICK) + return 1 + return 0 + +/obj/screen/gun/mode + name = "Toggle Gun Mode" + icon_state = "gun0" + screen_loc = ui_gun_select + +/obj/screen/gun/mode/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_active() + return 1 + return 0 + +/obj/screen/gun/radio + name = "Allow Radio Use" + icon_state = "no_radio0" + screen_loc = ui_gun4 + +/obj/screen/gun/radio/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_RADIO) + return 1 + return 0 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5c12f86d7dd..5a9b45bfca3 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -310,7 +310,7 @@ datum/hud/New(mob/owner) else src.client.screen -= src.healths src.client.screen -= src.internals - //src.client.screen -= src.gun_setting_icon + src.client.screen -= src.gun_setting_icon //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. @@ -327,8 +327,8 @@ datum/hud/New(mob/owner) src.client.screen |= src.healths if(src.internals) src.client.screen |= src.internals - //if(src.gun_setting_icon) - // src.client.screen |= src.gun_setting_icon + if(src.gun_setting_icon) + src.client.screen |= src.gun_setting_icon src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d75a5e23f07..2ee17dedced 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,5 +1,7 @@ -/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255, var/mob/living/carbon/human/target) +/mob/living/carbon/human/instantiate_hud(var/datum/hud/HUD, var/ui_style, var/ui_color, var/ui_alpha) + HUD.human_hud(ui_style, ui_color, ui_alpha, src) +/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255, var/mob/living/carbon/human/target) var/datum/hud_data/hud_data if(!istype(target)) hud_data = new() @@ -337,7 +339,6 @@ mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") hud_elements |= mymob.zone_sel - /* //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) mymob.gun_setting_icon.icon = ui_style @@ -355,16 +356,10 @@ mymob.gun_move_icon.color = ui_color mymob.gun_move_icon.alpha = ui_alpha - mymob.gun_run_icon = new /obj/screen/gun/run(null) - mymob.gun_run_icon.icon = ui_style - mymob.gun_run_icon.color = ui_color - mymob.gun_run_icon.alpha = ui_alpha - mymob.radio_use_icon = new /obj/screen/gun/radio(null) mymob.radio_use_icon.icon = ui_style mymob.radio_use_icon.color = ui_color mymob.radio_use_icon.alpha = ui_alpha - */ mymob.client.screen = null diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm deleted file mode 100644 index 54afe01083e..00000000000 --- a/code/_onclick/hud/monkey.dm +++ /dev/null @@ -1,285 +0,0 @@ -/datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255) - - src.adding = list() - src.other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = I_HELP - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = I_DISARM - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = I_GRAB - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = I_HURT - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - inv_box.icon_state = "r_hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - inv_box.icon_state = "l_hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.color = ui_color - using.alpha = ui_alpha - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - src.adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.color = ui_color - mymob.throw_icon.alpha = ui_alpha - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.color = ui_color - mymob.oxygen.alpha = ui_alpha - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.color = ui_color - mymob.pressure.alpha = ui_alpha - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.color = ui_color - mymob.toxin.alpha = ui_alpha - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.color = ui_color - mymob.internals.alpha = ui_alpha - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.color = ui_color - mymob.fire.alpha = ui_alpha - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.color = ui_color - mymob.bodytemp.alpha = ui_alpha - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.color = ui_color - mymob.healths.alpha = ui_alpha - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.color = ui_color - mymob.pullin.alpha = ui_alpha - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = ui_entire_screen - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.color = ui_color - mymob.zone_sel.alpha = ui_alpha - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - /* - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.set_dir(2) - - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.aim_targets) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.set_dir(1) - src.adding += mymob.item_use_icon - mymob.radio_use_icon = new /obj/screen/gun/radio(null) - if (mymob.client.target_can_radio) - mymob.radio_use_icon.set_dir(1) - src.adding += mymob.radio_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.set_dir(1) - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.set_dir(1) - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - */ - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 303e3cadba9..95f8f3c9d3a 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -151,35 +151,15 @@ var/obj/screen/robot_inventory mymob.zone_sel.overlays.Cut() mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - /* //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.set_dir(2) - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.aim_targets) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.set_dir(1) - src.adding += mymob.item_use_icon - mymob.radio_use_icon = new /obj/screen/gun/radio(null) - if (mymob.client.target_can_radio) - mymob.radio_use_icon.set_dir(1) - src.adding += mymob.radio_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.set_dir(1) - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.set_dir(1) - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - */ + mymob.item_use_icon = new /obj/screen/gun/item(null) + mymob.gun_move_icon = new /obj/screen/gun/move(null) + mymob.radio_use_icon = new /obj/screen/gun/radio(null) mymob.client.screen = null - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, robot_inventory) //, mymob.gun_setting_icon, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, robot_inventory, mymob.gun_setting_icon) mymob.client.screen += src.adding + src.other return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index a384cb01407..d0904aa4664 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -12,7 +12,6 @@ layer = 20.0 unacidable = 1 var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/gun_click_time = -100 //I'm lazy. /obj/screen/Destroy() master = null @@ -169,7 +168,6 @@ /obj/screen/Click(location, control, params) if(!usr) return 1 - switch(name) if("toggle") if(usr.hud_used.inventory_shown) @@ -399,47 +397,6 @@ if("module3") if(istype(usr, /mob/living/silicon/robot)) usr:toggle_module(3) - - /* - if("Allow Walking", "Disallow Walking") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetMove() - gun_click_time = world.time - - if("Allow Running", "Disallow Running") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetRun() - gun_click_time = world.time - - if("Allow Item Use", "Disallow Item Use") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetClick() - gun_click_time = world.time - - if("Toggle Gun Mode") - usr.client.ToggleGunMode() - - if("Allow Radio Use", "Disallow Radio Use") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetRadio() - gun_click_time = world.time - */ else return 0 return 1 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index d83d30432b1..a27dd2d84b3 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -949,7 +949,6 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1) if(tap) U.visible_message("\The [U] taps on \his PDA's screen.") - //U.last_target_click = world.time var/t = input(U, "Please enter message", P.name, null) as text t = sanitize(t) //t = readd_quotes(t) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 8922fad1e98..16c810a8a0c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -273,13 +273,13 @@ var/global/list/default_medbay_channels = list( // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return 0 + if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) + // Uncommenting this. To the above comment: // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact return 0 - //M.last_target_radio = world.time // For the projectile targeting system - if(!radio_connection) set_frequency(frequency) diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm index acc2a1512e3..2802d25e60b 100644 --- a/code/modules/client/ui_style.dm +++ b/code/modules/client/ui_style.dm @@ -35,13 +35,10 @@ //update UI var/list/icons = usr.hud_used.adding + usr.hud_used.other + usr.hud_used.hotkeybuttons icons.Add(usr.zone_sel) - /* icons.Add(usr.gun_setting_icon) icons.Add(usr.item_use_icon) icons.Add(usr.gun_move_icon) - icons.Add(usr.gun_run_icon) icons.Add(usr.radio_use_icon) - */ var/icon/ic = all_ui_styles[UI_style_new] diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 5d71a004203..9ba4ffa5e34 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -5,8 +5,8 @@ slot = "utility" var/obj/item/holstered = null -/obj/item/clothing/accessory/holster/proc/holster(obj/item/I, mob/user as mob) - if(holstered) +/obj/item/clothing/accessory/holster/proc/holster(var/obj/item/I, var/mob/living/user) + if(holstered && istype(user)) user << "There is already \a [holstered] holstered here!" return @@ -14,6 +14,8 @@ user << "[I] won't fit in [src]!" return + if(istype(user)) + user.stop_aiming(no_message=1) holstered = I user.drop_from_inventory(holstered) holstered.loc = src diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 7924bd21296..b2e8c3ca0e0 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -165,6 +165,7 @@ var/list/slot_equipment_priority = list( \ // Removes an item from inventory and places it in the target atom. // If canremove or other conditions need to be checked then use unEquip instead. /mob/proc/drop_from_inventory(var/obj/item/W, var/atom/Target = null) + if(W) if(!Target) Target = loc diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 29eff929dce..ca81defe0f9 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -49,6 +49,8 @@ if(shock_stage >= 10) tally += 3 + if(aiming && aiming.aiming_at) tally += 5 // Iron sights make you slower, it's a well-known fact. + if(FAT in src.mutations) tally += 1.5 if (bodytemperature < 283.222) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 57b5f974beb..d30e23765ee 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -37,10 +37,9 @@ pressure = null damageoverlay = null pain = null - //item_use_icon = null - //gun_move_icon = null - //gun_run_icon = null - //gun_setting_icon = null + item_use_icon = null + gun_move_icon = null + gun_setting_icon = null spell_masters = null zone_sel = null @@ -765,8 +764,8 @@ if(lying) density = 0 - drop_l_hand() - drop_r_hand() + if(l_hand) unEquip(l_hand) + if(r_hand) unEquip(r_hand) else density = initial(density) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 3abac6c315d..ee40394c78c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -107,7 +107,7 @@ if(process_projectile(P, user, user, pick("l_foot", "r_foot"))) handle_post_fire(user, user) user.visible_message( - "[user] shoots \himself in the foot with \the [src]!", + "\The [user] shoots \himself in the foot with \the [src]!", "You shoot yourself in the foot with \the [src]!" ) M.drop_item() @@ -123,21 +123,18 @@ /obj/item/weapon/gun/afterattack(atom/A, mob/living/user, adjacent, params) if(adjacent) return //A is adjacent, is the user, or is on the user's person - /* - if(user && user.client && !(A in aim_targets)) - if(user.client.gun_mode) - aiming = PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. - return - */ + if(!user.aiming) + user.aiming = new(user) + + if(user && user.client && user.aiming && user.aiming.active && user.aiming.aiming_at != A) + PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. + return if(user && user.a_intent == I_HELP) //regardless of what happens, refuse to shoot if help intent is on user << "You refrain from firing your [src] as your intent is set to help." else Fire(A,user,params) //Otherwise, fire normally. -/obj/item/weapon/gun/proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params) - return - /obj/item/weapon/gun/attack(atom/A, mob/living/user, def_zone) if (A == user && user.zone_sel.selecting == "mouth" && !mouthshoot) handle_suicide(user) diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm new file mode 100644 index 00000000000..42a0e3e6a1c --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -0,0 +1,12 @@ +//These are called by the on-screen buttons, adjusting what the victim can and cannot do. +/client/proc/add_gun_icons() + if(!usr) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. + screen |= usr.item_use_icon + screen |= usr.gun_move_icon + screen |= usr.radio_use_icon + +/client/proc/remove_gun_icons() + if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG + screen -= usr.item_use_icon + screen -= usr.gun_move_icon + screen -= usr.radio_use_icon diff --git a/code/modules/projectiles/targeting/targeting_gun.dm b/code/modules/projectiles/targeting/targeting_gun.dm new file mode 100644 index 00000000000..e2ef466255e --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_gun.dm @@ -0,0 +1,21 @@ +//Removing the lock and the buttons. +/obj/item/weapon/gun/dropped(var/mob/living/user) + if(istype(user)) + user.stop_aiming(src) + return ..() + +/obj/item/weapon/gun/equipped(var/mob/living/user, var/slot) + if(istype(user) && (slot != slot_l_hand && slot != slot_r_hand)) + user.stop_aiming(src) + return ..() + +//Compute how to fire..... +//Return 1 if a target was found, 0 otherwise. +/obj/item/weapon/gun/proc/PreFire(var/atom/A, var/mob/living/user, var/params) + if(!user.aiming) + user.aiming = new(user) + user.face_atom(A) + if(ismob(A) && user.aiming) + user.aiming.aim_at(A, src) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm new file mode 100644 index 00000000000..dfae47a604c --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -0,0 +1,44 @@ +/mob/living/var/obj/aiming_overlay/aiming +/mob/living/var/list/aimed = list() + +/mob/living/proc/stop_aiming(var/obj/item/thing, var/no_message = 0) + if(!aiming) + aiming = new(src) + if(thing && aiming.aiming_with != thing) + return + aiming.cancel_aiming(no_message) + +/mob/living/death(gibbed,deathmessage="seizes up and falls limp...") + if(..()) + stop_aiming(no_message=1) + +/mob/living/update_canmove() + ..() + if(lying) + stop_aiming(no_message=1) + +/mob/living/Weaken(amount) + stop_aiming(no_message=1) + ..() + +/mob/living/Destroy() + if(aiming) + qdel(aiming) + aiming = null + aimed.Cut() + return ..() + +/turf/Enter(var/mob/living/mover) + . = ..() + if(istype(mover)) + if(mover.aiming && mover.aiming.aiming_at) + mover.aiming.update_aiming() + if(mover.aimed.len) + mover.trigger_aiming(TARGET_CAN_MOVE) + +/mob/living/forceMove(var/atom/destination) + . = ..() + if(aiming && aiming.aiming_at) + aiming.update_aiming() + if(aimed.len) + trigger_aiming(TARGET_CAN_MOVE) diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm new file mode 100644 index 00000000000..e0a2885a857 --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -0,0 +1,213 @@ +/obj/aiming_overlay + name = "target indicator" + desc = "Stick 'em up!" + icon = 'icons/effects/Targeted.dmi' + icon_state = "locking" + anchored = 1 + density = 0 + opacity = 0 + layer = FLY_LAYER + simulated = 0 + + var/mob/living/aiming_at // Who are we currently targeting, if anyone? + var/obj/item/aiming_with // What are we targeting with? + var/mob/owner // Who do we belong to? + var/locked = 0 // Have we locked on? + var/lock_time = 0 // When -will- we lock on? + var/active = 0 // Is our owner intending to take hostages? + var/target_permissions = 0 // Permission bitflags. + +/obj/aiming_overlay/New(var/newowner) + ..() + owner = newowner + loc = null + +/obj/aiming_overlay/proc/toggle_permission(var/perm) + + if(target_permissions & perm) + target_permissions &= ~perm + else + target_permissions |= perm + + // Update HUD icons. + if(owner.gun_move_icon) + if(!(target_permissions & TARGET_CAN_MOVE)) + owner.gun_move_icon.icon_state = "no_walk0" + owner.gun_move_icon.name = "Allow Movement" + else + owner.gun_move_icon.icon_state = "no_walk1" + owner.gun_move_icon.name = "Disallow Movement" + + if(owner.item_use_icon) + if(!(target_permissions & TARGET_CAN_CLICK)) + owner.item_use_icon.icon_state = "no_item0" + owner.item_use_icon.name = "Allow Item Use" + else + owner.item_use_icon.icon_state = "no_item1" + owner.item_use_icon.name = "Disallow Item Use" + + if(owner.radio_use_icon) + if(!(target_permissions & TARGET_CAN_RADIO)) + owner.radio_use_icon.icon_state = "no_radio0" + owner.radio_use_icon.name = "Allow Radio Use" + else + owner.radio_use_icon.icon_state = "no_radio1" + owner.radio_use_icon.name = "Disallow Radio Use" + + var/message = "no longer permitted to " + var/use_span = "warning" + if(target_permissions & perm) + message = "now permitted to " + use_span = "notice" + + switch(perm) + if(TARGET_CAN_MOVE) + message += "move" + if(TARGET_CAN_CLICK) + message += "use items" + if(TARGET_CAN_RADIO) + message += "use a radio" + else + return + + owner << "[aiming_at ? "\The [aiming_at] is" : "Your targets are"] [message]." + if(aiming_at) + aiming_at << "You are [message]." + +/obj/aiming_overlay/process() + if(!owner) + qdel(src) + return + ..() + update_aiming() + +/obj/aiming_overlay/Destroy() + if(aiming_at) + aiming_at.aimed -= src + aiming_at = null + owner = null + aiming_with = null + processing_objects -= src + return ..() + +obj/aiming_overlay/proc/update_aiming_deferred() + set waitfor = 0 + sleep(0) + update_aiming() + +/obj/aiming_overlay/proc/update_aiming() + + if(!owner) + qdel(src) + return + + if(!aiming_at) + cancel_aiming() + return + + if(!locked && lock_time >= world.time) + locked = 1 + update_icon() + + var/cancel_aim = 1 + if(!(aiming_with in owner) || (owner.l_hand != aiming_with && owner.r_hand != aiming_with)) + owner << "You must keep hold of your weapon!" + else if(!aiming_at || !istype(aiming_at.loc, /turf)) + owner << "You have lost sight of your target!" + else if(owner.incapacitated() || owner.lying || owner.restrained()) + owner << "You must be conscious and standing to keep track of your target!" + else if(aiming_at.alpha == 0 || (aiming_at.invisibility > owner.see_invisible)) + owner << "Your target has become invisible!" + else if(get_dist(get_turf(owner), get_turf(aiming_at)) > 7) // !(owner in viewers(aiming_at, 7)) + owner << "Your target is too far away to track!" + else + cancel_aim = 0 + + forceMove(get_turf(aiming_at)) + + if(cancel_aim) + cancel_aiming() + return + + if(!owner.incapacitated() && owner.client) + spawn(0) + owner.set_dir(get_dir(get_turf(owner), get_turf(src))) + +/obj/aiming_overlay/proc/aim_at(var/mob/target, var/obj/thing) + + if(!owner) + return + + if(owner.incapacitated()) + owner << "You cannot aim a gun in your current state." + return + if(owner.lying) + owner << "You cannot aim a gun while prone." + return + if(owner.restrained()) + owner << "You cannot aim a gun while handcuffed." + return + + if(aiming_at) + if(aiming_at == target) + return + aiming_at.aimed -= src + owner.visible_message("\The [owner] turns \the [thing] on \the [target]!") + else + owner.visible_message("\The [owner] aims \the [thing] at \the [target]!") + + if(owner.client) + owner.client.add_gun_icons() + target << "You now have a gun pointed at you. No sudden moves!" + aiming_with = thing + aiming_at = target + if(istype(aiming_with, /obj/item/weapon/gun)) + playsound(get_turf(owner), 'sound/weapons/TargetOn.ogg', 50,1) + forceMove(get_turf(target)) + processing_objects |= src + + aiming_at.aimed |= src + toggle_active(1) + locked = 0 + update_icon() + lock_time = world.time + 35 + +/obj/aiming_overlay/update_icon() + if(locked) + icon_state = "locked" + else + icon_state = "locking" + +/obj/aiming_overlay/proc/toggle_active(var/force_state = null) + if(!isnull(force_state)) + if(active == force_state) + return + active = force_state + else + active = !active + + if(!active) + cancel_aiming() + + if(owner.client) + if(active) + owner << "You will now aim rather than fire." + owner.client.add_gun_icons() + else + owner << "You will no longer aim rather than fire." + owner.client.remove_gun_icons() + +/obj/aiming_overlay/proc/cancel_aiming(var/no_message = 0) + if(!aiming_with || !aiming_at) + return + if(istype(aiming_with, /obj/item/weapon/gun)) + playsound(get_turf(owner), 'sound/weapons/TargetOff.ogg', 50,1) + if(!no_message) + owner.visible_message("\The [owner] lowers \the [aiming_with].") + + aiming_with = null + aiming_at.aimed -= src + aiming_at = null + loc = null + processing_objects -= src + diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm new file mode 100644 index 00000000000..ea18fc3a708 --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -0,0 +1,29 @@ +/mob/living/proc/trigger_aiming(var/trigger_type) + if(!aimed.len) + return + for(var/obj/aiming_overlay/AO in aimed) + if(AO.aiming_at == src) + AO.update_aiming() + if(AO.aiming_at == src) + AO.trigger(trigger_type) + AO.update_aiming_deferred() + +/obj/aiming_overlay/proc/trigger(var/perm) + if(!owner || !aiming_with || !aiming_at || !locked) + return + if(perm && (target_permissions & perm)) + return + if(!owner.canClick()) + return + owner.setClickCooldown(5) // Spam prevention, essentially. + if(owner.a_intent == I_HELP) + owner << "You refrain from firing \the [aiming_with] as your intent is set to help." + return + owner.visible_message("\The [owner] pulls the trigger reflexively!") + var/obj/item/weapon/gun/G = aiming_with + if(istype(G)) + G.Fire(aiming_at, owner) + +/mob/living/ClickOn(var/atom/A, var/params) + . = ..() + trigger_aiming(TARGET_CAN_CLICK) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a11bf15a248..800482df64e 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -116,7 +116,7 @@ if (GM.client) GM.client.perspective = EYE_PERSPECTIVE GM.client.eye = src - GM.loc = src + GM.forceMove(src) for (var/mob/C in viewers(src)) C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3) qdel(G) @@ -132,7 +132,7 @@ user.drop_item() if(I) - I.loc = src + I.forceMove(src) user << "You place \the [I] into the [src]." for(var/mob/M in viewers(src)) @@ -177,7 +177,8 @@ if (target.client) target.client.perspective = EYE_PERSPECTIVE target.client.eye = src - target.loc = src + + target.forceMove(src) for (var/mob/C in viewers(src)) if(C == user) @@ -201,7 +202,7 @@ if (user.client) user.client.eye = user.client.mob user.client.perspective = MOB_PERSPECTIVE - user.loc = src.loc + user.forceMove(src.loc) update() return @@ -310,7 +311,7 @@ // eject the contents of the disposal unit /obj/machinery/disposal/proc/eject() for(var/atom/movable/AM in src) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(0) update() @@ -443,7 +444,7 @@ for(var/atom/movable/AM in H) target = get_offset_target_turf(src.loc, rand(5)-rand(5), rand(5)-rand(5)) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(0) if(!istype(AM,/mob/living/silicon/robot/drone)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z spawn(1) @@ -459,7 +460,7 @@ if(istype(I, /obj/item/projectile)) return if(prob(75)) - I.loc = src + I.forceMove(src) for(var/mob/M in viewers(src)) M.show_message("\The [I] lands in \the [src].", 3) else @@ -508,7 +509,7 @@ // now everything inside the disposal gets put into the holder // note AM since can contain mobs or objs for(var/atom/movable/AM in D) - AM.loc = src + AM.forceMove(src) if(istype(AM, /obj/structure/bigDelivery) && !hasmob) var/obj/structure/bigDelivery/T = AM src.destinationTag = T.sortTag @@ -528,7 +529,7 @@ D.expel(src) // no trunk connected, so expel immediately return - loc = D.trunk + forceMove(D.trunk) active = 1 set_dir(DOWN) spawn(1) @@ -585,7 +586,7 @@ // used when a a holder meets a stuck holder proc/merge(var/obj/structure/disposalholder/other) for(var/atom/movable/AM in other) - AM.loc = src // move everything in other holder to this one + AM.forceMove(src) // move everything in other holder to this one if(ismob(AM)) var/mob/M = AM if(M.client) // if a client mob, update eye to follow this holder @@ -671,7 +672,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) ..() @@ -702,9 +703,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -746,6 +747,7 @@ H.active = 0 H.loc = src return + if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T F.break_tile() @@ -760,7 +762,7 @@ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) if(H) for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(direction) spawn(1) if(AM) @@ -775,7 +777,7 @@ for(var/atom/movable/AM in H) target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) spawn(1) if(AM) @@ -808,7 +810,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) return @@ -929,7 +931,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) ..() @@ -990,7 +992,7 @@ if(nextdir == 12) T = GetAbove(src) if(!T) - H.loc = loc + H.forceMove(loc) return else for(var/obj/structure/disposalpipe/down/F in T) @@ -1006,9 +1008,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1040,7 +1042,7 @@ if(nextdir == 11) T = GetBelow(src) if(!T) - H.loc = src.loc + H.forceMove(src.loc) return else for(var/obj/structure/disposalpipe/up/F in T) @@ -1056,9 +1058,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1249,9 +1251,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1439,7 +1441,7 @@ if(H) for(var/atom/movable/AM in H) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(dir) if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z spawn(5) diff --git a/polaris.dme b/polaris.dme index f0bd34d22a8..d337865505d 100644 --- a/polaris.dme +++ b/polaris.dme @@ -31,6 +31,7 @@ #include "code\__defines\mobs.dm" #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm" +#include "code\__defines\targeting.dm" #include "code\__defines\turfs.dm" #include "code\_helpers\atmospherics.dm" #include "code\_helpers\datum_pool.dm" @@ -64,9 +65,9 @@ #include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\gun_mode.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\robot.dm" @@ -1640,6 +1641,11 @@ #include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\force.dm" #include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\targeting\targeting_client.dm" +#include "code\modules\projectiles\targeting\targeting_gun.dm" +#include "code\modules\projectiles\targeting\targeting_mob.dm" +#include "code\modules\projectiles\targeting\targeting_overlay.dm" +#include "code\modules\projectiles\targeting\targeting_triggers.dm" #include "code\modules\random_map\_random_map_setup.dm" #include "code\modules\random_map\random_map.dm" #include "code\modules\random_map\random_map_verbs.dm" From 33be12b35566d343fab3b1886e813aa43ae1ba99 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 16 Dec 2015 10:11:33 +1030 Subject: [PATCH 20/55] Changelog. --- html/changelogs/Zuhayr-aiming.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/Zuhayr-aiming.yml diff --git a/html/changelogs/Zuhayr-aiming.yml b/html/changelogs/Zuhayr-aiming.yml new file mode 100644 index 00000000000..88b4b7f3d54 --- /dev/null +++ b/html/changelogs/Zuhayr-aiming.yml @@ -0,0 +1,4 @@ +author: Zuhayr +delete-after: True +changes: + - tweak: "Aiming has been rewritten, keep an eye out for weird behavior." From b38a42c665f3f7d276f3f28869ff42f6abf99b71 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 16 Dec 2015 10:53:10 +1030 Subject: [PATCH 21/55] Compile fixes/port fixes. --- code/_onclick/hud/hud.dm | 2 -- code/modules/mob/living/simple_animal/simple_animal.dm | 8 -------- code/modules/projectiles/targeting/targeting_mob.dm | 8 ++++++++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5a9b45bfca3..a73779ef722 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -257,8 +257,6 @@ datum/hud/New(mob/owner) human_hud(ui_style, ui_color, ui_alpha, mymob) // Pass the player the UI style chosen in preferences else if(isrobot(mymob)) robot_hud() - else if(issmall(mymob)) - monkey_hud(ui_style, ui_color, ui_alpha) else if(isbrain(mymob)) brain_hud(ui_style) else if(isalien(mymob)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index acce1e39b19..a66f6b772cd 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -365,14 +365,6 @@ return (0) return 1 -//Call when target overlay should be added/removed -/mob/living/simple_animal/update_targeted() - if(!targeted_by && target_locked) - qdel(target_locked) - overlays = null - if (targeted_by && target_locked) - overlays += target_locked - /mob/living/simple_animal/say(var/message) var/verb = "says" if(speak_emote.len) diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index dfae47a604c..a89bbc2c9a5 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -42,3 +42,11 @@ aiming.update_aiming() if(aimed.len) trigger_aiming(TARGET_CAN_MOVE) + +/mob/living/proc/set_m_intent(var/intent) + if (intent != "walk" && intent != "run") + return 0 + m_intent = intent + if(hud_used) + if (hud_used.move_intent) + hud_used.move_intent.icon_state = intent == "walk" ? "walking" : "running" \ No newline at end of file From 8c6750e6563a6928425fc04b3f9f40357d7eb21f Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 16 Dec 2015 11:09:01 +1030 Subject: [PATCH 22/55] Removed minimum ages. --- code/game/jobs/job/assistant.dm | 2 -- code/game/jobs/job/captain.dm | 2 -- code/game/jobs/job/civilian.dm | 1 - code/game/jobs/job/engineering.dm | 1 - code/game/jobs/job/medical.dm | 1 - code/game/jobs/job/science.dm | 1 - 6 files changed, 8 deletions(-) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 2bb17313354..19a578b3553 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -12,8 +12,6 @@ access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident") - minimum_character_age = null - ideal_character_age = null /datum/job/assistant/equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 70b0dc75f48..5ac35742b2a 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -19,7 +19,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) minimal_player_age = 14 economic_modifier = 20 - minimum_character_age = 30 ideal_character_age = 70 // Old geezer captains ftw @@ -68,7 +67,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) req_admin_notify = 1 minimal_player_age = 10 economic_modifier = 10 - minimum_character_age = 23 ideal_character_age = 50 access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index e6a0a779b71..eea5534751d 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -101,7 +101,6 @@ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) - minimum_character_age = 25 ideal_character_age = 40 diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index ae57428972e..20a5c1e5d16 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -13,7 +13,6 @@ req_admin_notify = 1 economic_modifier = 10 - minimum_character_age = 35 ideal_character_age = 50 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 1bc4ead4803..35c2b4aa07a 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -20,7 +20,6 @@ access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) minimal_player_age = 10 - minimum_character_age = 35 ideal_character_age = 50 equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index cfa96d6af19..f5b1f4ed290 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -22,7 +22,6 @@ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) minimal_player_age = 14 - minimum_character_age = 35 ideal_character_age = 50 equip(var/mob/living/carbon/human/H) From e10393324df51d9f50b208e9c0e49c7d433ca89c Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Wed, 16 Dec 2015 02:28:19 +0100 Subject: [PATCH 23/55] No verbose cantouch check when not climbable --- code/game/objects/buckling.dm | 3 ++- code/game/objects/structures.dm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 93c2fd57bbb..02d85234ed7 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -56,7 +56,8 @@ user << "You can't buckle anyone in before the game starts." if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat || istype(user, /mob/living/silicon/pai)) return - + if(M == buckled_mob) + return if(istype(M, /mob/living/carbon/slime)) user << "The [M] is too squishy to buckle in." return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f8b9c37ae46..5b84455ac77 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -69,7 +69,7 @@ return ..() /obj/structure/proc/can_climb(var/mob/living/user, post_climb_check=0) - if (!can_touch(user) || !climbable || (!post_climb_check && (user in climbers))) + if (!climbable || !can_touch(user) || (!post_climb_check && (user in climbers))) return 0 if (!user.Adjacent(src)) From 3752d4432469cc6e2e33dfea2822b3ecf991dfb5 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 20:36:02 -0500 Subject: [PATCH 24/55] Removes ability to summon Narsie, replaced with a summon Hell rune. Spooky cult mobs nerfed. Manifested people no longer count for summoning Hell. --- code/game/gamemodes/cult/cult_structures.dm | 5 ++- code/game/gamemodes/cult/hell_universe.dm | 19 ++-------- code/game/gamemodes/cult/runes.dm | 20 ++++++++-- .../mob/living/simple_animal/hostile/bat.dm | 6 +-- .../living/simple_animal/hostile/creature.dm | 11 +++--- .../living/simple_animal/hostile/faithless.dm | 11 +++--- html/changelogs/neerti-narsie.yml | 38 +++++++++++++++++++ 7 files changed, 78 insertions(+), 32 deletions(-) create mode 100644 html/changelogs/neerti-narsie.yml diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 3a6c2c1b3cc..d6af1a27076 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -39,7 +39,7 @@ if(!isbroken) if(prob(1+ damage * 5)) user.visible_message( - "[user] smashed the pylon!", + "[user] smashed the pylon!", "You hit the pylon, and its crystal breaks apart!", "You hear a tinkle of crystal shards" ) @@ -137,6 +137,8 @@ var/mob/living/M = A + M << "Walking into \the [src] is probably a bad idea, you think." +/* if(M.stat != DEAD) if(M.transforming) return @@ -173,3 +175,4 @@ new_mob.key = M.key new_mob << "Your form morphs into that of a corgi." //Because we don't have cluwnes +*/ diff --git a/code/game/gamemodes/cult/hell_universe.dm b/code/game/gamemodes/cult/hell_universe.dm index e81a6a2673d..496af98ef8e 100644 --- a/code/game/gamemodes/cult/hell_universe.dm +++ b/code/game/gamemodes/cult/hell_universe.dm @@ -1,11 +1,8 @@ /* In short: - * Random area alarms - * All areas jammed - * Random gateways spawning hellmonsters (and turn people into cluwnes if ran into) - * Broken APCs/Fire Alarms - * Scary music + * Random gateways spawning hellmonsters + * Broken Fire Alarms * Random tiles changing to culty tiles. */ @@ -42,7 +39,7 @@ In short: // Apply changes when entering state /datum/universal_state/hell/OnEnter() set background = 1 - garbage_collector.garbage_collect = 0 +// garbage_collector.garbage_collect = 0 escape_list = get_area_turfs(locate(/area/hallway/secondary/exit)) @@ -50,8 +47,8 @@ In short: AreaSet() MiscSet() APCSet() - KillMobs() OverlayAndAmbientSet() + lightsout(0,0) runedec += 9000 //basically removing the rune cap @@ -83,13 +80,5 @@ In short: /datum/universal_state/hell/proc/APCSet() for (var/obj/machinery/power/apc/APC in machines) if (!(APC.stat & BROKEN) && !APC.is_critical) - APC.chargemode = 0 - if(APC.cell) - APC.cell.charge = 0 APC.emagged = 1 APC.queue_icon_update() - -/datum/universal_state/hell/proc/KillMobs() - for(var/mob/living/simple_animal/M in mob_list) - if(M && !M.client) - M.stat = DEAD diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3b2345c1be7..aafcd791e50 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -196,10 +196,24 @@ var/list/sacrificed = list() for(var/mob/M in range(1,src)) if(iscultist(M) && !M.stat) M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - cultists += 1 + if(istype(M, /mob/living/carbon/human/dummy)) //No manifest cheese. + continue + cultists.Add(M) if(cultists.len >= 9) - log_and_message_admins_many(cultists, "summoned Nar-sie.") - new /obj/singularity/narsie/large(src.loc) + if(!narsie_cometh)//so we don't initiate Hell more than one time. + world << "THE VEIL HAS BEEN SHATTERED!" + world << sound('sound/effects/wind/wind_5_1.ogg') + + SetUniversalState(/datum/universal_state/hell) + narsie_cometh = 1 + + spawn(10 SECONDS) + if(emergency_shuttle) + emergency_shuttle.call_evac() + emergency_shuttle.launch_time = 0 // Cannot recall + + log_and_message_admins_many(cultists, "summoned the end of days.") +// new /obj/singularity/narsie/large(src.loc) return else return fizzle() diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index 2bd3c8984a1..9ce3a08a280 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -16,9 +16,9 @@ maxHealth = 20 health = 20 - harm_intent_damage = 8 - melee_damage_lower = 10 - melee_damage_upper = 10 + harm_intent_damage = 10 + melee_damage_lower = 3 + melee_damage_upper = 3 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 3ae0876903f..af42c6ad2e3 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -6,14 +6,15 @@ icon_state = "otherthing" icon_living = "otherthing" icon_dead = "otherthing-dead" - health = 80 - maxHealth = 80 - melee_damage_lower = 25 - melee_damage_upper = 50 + health = 40 + maxHealth = 40 + melee_damage_lower = 5 + melee_damage_upper = 5 attacktext = "chomped" attack_sound = 'sound/weapons/bite.ogg' faction = "creature" - speed = 4 + speed = 8 + harm_intent_damage = 10 /mob/living/simple_animal/hostile/creature/cult faction = "cult" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 44d9c5d1ac4..7b96db183a8 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -9,13 +9,13 @@ response_help = "passes through" response_disarm = "shoves" response_harm = "hits" - speed = -1 - maxHealth = 80 - health = 80 + speed = 8 + maxHealth = 50 + health = 50 harm_intent_damage = 10 - melee_damage_lower = 15 - melee_damage_upper = 15 + melee_damage_lower = 5 + melee_damage_upper = 5 attacktext = "gripped" attack_sound = 'sound/hallucinations/growl1.ogg' @@ -50,6 +50,7 @@ /mob/living/simple_animal/hostile/faithless/cult faction = "cult" + supernatural = 1 /mob/living/simple_animal/hostile/faithless/cult/cultify() return diff --git a/html/changelogs/neerti-narsie.yml b/html/changelogs/neerti-narsie.yml new file mode 100644 index 00000000000..2a4de03b0a0 --- /dev/null +++ b/html/changelogs/neerti-narsie.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Neerti + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscdel: "The rune to summon Narsie has been changed. Narsie is no longer summoned, but Hell still comes." + - rscdel: "Spooky mobs spawned from spooky portals as a result of Hell coming have had their speed, health, and damage reduced." + - rscdel: "Manifested humans no longer count for summoning Hell." From 280844af6590bc61d993f985cb4f45336d982b2e Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 20:50:10 -0500 Subject: [PATCH 25/55] Update cult_structures.dm Deletes the commented out code. --- code/game/gamemodes/cult/cult_structures.dm | 38 --------------------- 1 file changed, 38 deletions(-) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index d6af1a27076..226df14bfbc 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -138,41 +138,3 @@ var/mob/living/M = A M << "Walking into \the [src] is probably a bad idea, you think." -/* - if(M.stat != DEAD) - if(M.transforming) - return - if(M.has_brain_worms()) - return //Borer stuff - RR - - if(iscultist(M)) return - if(!ishuman(M) && !isrobot(M)) return - - M.transforming = 1 - M.canmove = 0 - M.icon = null - M.overlays.len = 0 - M.invisibility = 101 - - if(istype(M, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/Robot = M - if(Robot.mmi) - qdel(Robot.mmi) - else - for(var/obj/item/W in M) - if(istype(W, /obj/item/weapon/implant)) - qdel(W) - continue - W.layer = initial(W.layer) - W.loc = M.loc - W.dropped(M) - - var/mob/living/new_mob = new /mob/living/simple_animal/corgi(A.loc) - new_mob.a_intent = I_HURT - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - - new_mob << "Your form morphs into that of a corgi." //Because we don't have cluwnes -*/ From 7df84a3cad7dab00b015ea1bba6606a5975ec462 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 21:10:22 -0500 Subject: [PATCH 26/55] Removes stray ..() in communicator.dm --- code/game/objects/items/devices/communicator/communicator.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 38a16e7ad16..096f8daab11 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -170,7 +170,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() exonet.make_address("communicator-[src.client]-[src.client.prefs.real_name]") else exonet.make_address("communicator-[key]-[src.real_name]") - ..() // Proc: Destroy() // Parameters: None From 33f85b8b88e2f4036c01e4fce2bebff6dee4583b Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 15 Dec 2015 22:25:49 -0500 Subject: [PATCH 27/55] Makes radiation medication not actually irradiate you worse. --- .../Chemistry-Reagents/Chemistry-Reagents-Medicine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 18e31ddc02d..1c4abbdfe83 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -344,7 +344,7 @@ scannable = 1 /datum/reagent/hyronalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.apply_effect(max(M.radiation - 30 * removed, 0), IRRADIATE, check_protection = 0) + M.radiation = max(M.radiation - 30 * removed, 0) /datum/reagent/arithrazine name = "Arithrazine" @@ -357,7 +357,7 @@ scannable = 1 /datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.apply_effect(max(M.radiation - 70 * removed, 0), IRRADIATE, check_protection = 0) + M.radiation = max(M.radiation - 70 * removed, 0) M.adjustToxLoss(-10 * removed) if(prob(60)) M.take_organ_damage(4 * removed, 0) From 1a5978f7f1dd038f851fd892485960d84186a849 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 16 Dec 2015 15:14:44 +1030 Subject: [PATCH 28/55] Fixes some overlay issues with aiming. --- code/modules/projectiles/targeting/targeting_overlay.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index e0a2885a857..8029b1c4592 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -1,5 +1,5 @@ /obj/aiming_overlay - name = "target indicator" + name = "" desc = "Stick 'em up!" icon = 'icons/effects/Targeted.dmi' icon_state = "locking" @@ -8,6 +8,7 @@ opacity = 0 layer = FLY_LAYER simulated = 0 + mouse_opacity = 0 var/mob/living/aiming_at // Who are we currently targeting, if anyone? var/obj/item/aiming_with // What are we targeting with? @@ -21,6 +22,7 @@ ..() owner = newowner loc = null + verbs.Cut() /obj/aiming_overlay/proc/toggle_permission(var/perm) From f2cc74d588bffb52e5e7e6b0010b202ad27b5285 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Dec 2015 09:48:22 +1030 Subject: [PATCH 29/55] # This is a combination of 2 commits. # The first commit's message is: Rewriting the mining turfs to reduce worldstart lag. # This is the 2nd commit message: Map cleanup. --- code/game/base_turf.dm | 6 +- code/game/mecha/equipment/tools/tools.dm | 13 - code/modules/mining/drilling/drill.dm | 6 +- code/modules/mining/mine_items.dm | 2 +- code/modules/mining/mine_turfs.dm | 642 ++++++++++------------ code/modules/random_map/automata/caves.dm | 32 +- code/world.dm | 4 +- icons/turf/flooring/asteroid.dmi | Bin 7065 -> 6976 bytes polaris.dme | 1 - 9 files changed, 322 insertions(+), 384 deletions(-) diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm index ead191c0e7e..c524a97ad09 100644 --- a/code/game/base_turf.dm +++ b/code/game/base_turf.dm @@ -1,8 +1,8 @@ // Returns the lowest turf available on a given Z-level, defaults to asteroid for Polaris. var/global/list/base_turf_by_z = list( - "1" = /turf/simulated/floor/asteroid, - "4" = /turf/simulated/floor/asteroid, - "5" = /turf/simulated/floor/asteroid + "1" = /turf/simulated/mineral/floor, + "4" = /turf/simulated/mineral/floor, + "5" = /turf/simulated/mineral/floor ) proc/get_base_turf(var/z) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 8dbefe9a55e..41f1ba44ef2 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -107,10 +107,6 @@ for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) ore.Move(ore_box) - else if(istype(target, /turf/simulated/floor/asteroid)) - for(var/turf/simulated/floor/asteroid/M in range(chassis,1)) - if(get_dir(chassis,M)&chassis.dir) - M.gets_dug() log_message("Drilled through [target]") if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo @@ -160,15 +156,6 @@ for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) ore.Move(ore_box) - else if(istype(target,/turf/simulated/floor/asteroid)) - for(var/turf/simulated/floor/asteroid/M in range(target,1)) - M.gets_dug() - log_message("Drilled through [target]") - if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo - if(ore_box) - for(var/obj/item/weapon/ore/ore in range(target,1)) - ore.Move(ore_box) else if(target.loc == C) log_message("Drilled through [target]") target.ex_act(2) diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 0f78a2785ae..440f1283e08 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -74,11 +74,7 @@ return //Drill through the flooring, if any. - if(istype(get_turf(src), /turf/simulated/floor/asteroid)) - var/turf/simulated/floor/asteroid/T = get_turf(src) - if(!T.dug) - T.gets_dug() - else if(istype(get_turf(src), /turf/simulated/floor)) + if(istype(get_turf(src), /turf/simulated/floor)) var/turf/simulated/floor/T = get_turf(src) T.ex_act(2.0) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f0c6f215f30..71d1d807bd7 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -235,7 +235,7 @@ var/obj/item/stack/flag/F = locate() in get_turf(src) var/turf/T = get_turf(src) - if(!T || !istype(T,/turf/simulated/floor/asteroid)) + if(!T || !istype(T,/turf/simulated/mineral)) user << "The flag won't stand up in this terrain." return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 03fadf92a58..f462dd3e310 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -5,7 +5,7 @@ icon_state = "rock-dark" /turf/simulated/mineral //wall piece - name = "Rock" + name = "rock" icon = 'icons/turf/walls.dmi' icon_state = "rock" oxygen = 0 @@ -14,11 +14,13 @@ density = 1 blocks_air = 1 temperature = T0C - var/mined_turf = /turf/simulated/floor/asteroid + var/ore/mineral + var/sand_dug var/mined_ore = 0 var/last_act = 0 var/emitter_blasts_taken = 0 // EMITTER MINING! Muhehe. + var/overlay_detail var/datum/geosample/geologic_data var/excavation_level = 0 @@ -28,26 +30,108 @@ var/excav_overlay = "" var/obj/item/weapon/last_find var/datum/artifact_find/artifact_find + var/ignore_mapgen has_resources = 1 -/turf/simulated/mineral/New() - spawn(0) - MineralSpread() - spawn(2) - updateMineralOverlays(1) +/turf/simulated/mineral/ignore_mapgen + ignore_mapgen = 1 -/turf/simulated/mineral/proc/updateMineralOverlays(var/update_neighbors) - var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST) - for(var/direction in step_overlays) - var/turf/turf_to_check = get_step(src,step_overlays[direction]) - if(update_neighbors && istype(turf_to_check,/turf/simulated/floor/asteroid)) - var/turf/simulated/floor/asteroid/T = turf_to_check - T.updateMineralOverlays() - else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) - turf_to_check.overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") +/turf/simulated/mineral/floor + name = "sand" + icon = 'icons/turf/flooring/asteroid.dmi' + icon_state = "asteroid" + density = 0 + opacity = 0 + +/turf/simulated/mineral/floor/ignore_mapgen + ignore_mapgen = 1 + +/turf/simulated/mineral/proc/make_floor() + if(!density && !opacity) + return + density = 0 + opacity = 0 + update_icon() + reconsider_lights() + +/turf/simulated/mineral/proc/make_wall() + if(density && opacity) + return + density = 1 + opacity = 1 + update_icon() + reconsider_lights() + +/turf/simulated/mineral/Entered(atom/movable/M as mob|obj) + . = ..() + if(istype(M,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = M + if(R.module) + if(istype(R.module_state_1,/obj/item/weapon/storage/bag/ore)) + attackby(R.module_state_1,R) + else if(istype(R.module_state_2,/obj/item/weapon/storage/bag/ore)) + attackby(R.module_state_2,R) + else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore)) + attackby(R.module_state_3,R) + else + return + +/turf/simulated/mineral/initialize() + if(prob(20)) + overlay_detail = "asteroid[rand(0,9)]" + if(density) + spawn(0) + MineralSpread() + update_icon(1) + +/turf/simulated/mineral/update_icon(var/update_neighbors) + + overlays.Cut() + var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) + + if(density) + if(mineral) + name = "[mineral.display_name] deposit" + else + name = "rock" + + icon = 'icons/turf/walls.dmi' + icon_state = "rock" + + for(var/direction in step_overlays) + var/turf/T = get_step(src,step_overlays[direction]) + if(istype(T) && !T.density) + T.overlays += image('icons/turf/walls.dmi', "rock_side", dir = turn(step_overlays[direction], 180)) + else + + name = "sand" + icon = 'icons/turf/flooring/asteroid.dmi' + icon_state = "asteroid" + + if(sand_dug) + overlays += image('icons/turf/flooring/asteroid.dmi', "dug_overlay") + + for(var/direction in step_overlays) + if(istype(get_step(src, step_overlays[direction]), /turf/space)) + overlays += image('icons/turf/flooring/asteroid.dmi', "asteroid_edges", dir = step_overlays[direction]) + else + var/turf/simulated/mineral/M = get_step(src, step_overlays[direction]) + if(istype(M) && M.density) + overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[direction]) + + if(overlay_detail) + overlays |= image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail) + + if(update_neighbors) + var/list/all_step_directions = list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST) + for(var/direction in all_step_directions) + if(istype(get_step(src, direction), /turf/simulated/mineral)) + var/turf/simulated/mineral/M = get_step(src, direction) + M.update_icon() /turf/simulated/mineral/ex_act(severity) + switch(severity) if(2.0) if (prob(70)) @@ -62,13 +146,17 @@ // Emitter blasts if(istype(Proj, /obj/item/projectile/beam/emitter)) emitter_blasts_taken++ - if(emitter_blasts_taken > 2) // 3 blasts per tile mined_ore = 1 GetDrilled() /turf/simulated/mineral/Bumped(AM) + . = ..() + + if(!density) + return . + if(istype(AM,/mob/living/carbon/human)) var/mob/living/carbon/human/H = AM if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) @@ -91,7 +179,7 @@ for(var/trydir in cardinal) if(prob(mineral.spread_chance)) var/turf/simulated/mineral/target_turf = get_step(src, trydir) - if(istype(target_turf) && !target_turf.mineral) + if(istype(target_turf) && target_turf.density && !target_turf.mineral) target_turf.mineral = mineral target_turf.UpdateMineral() target_turf.MineralSpread() @@ -99,143 +187,185 @@ /turf/simulated/mineral/proc/UpdateMineral() clear_ore_effects() - if(!mineral) - name = "\improper Rock" - icon_state = "rock" - return - name = "\improper [mineral.display_name] deposit" - new /obj/effect/mineral(src, mineral) + if(mineral) + new /obj/effect/mineral(src, mineral) + update_icon() //Not even going to touch this pile of spaghetti /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return - if (istype(W, /obj/item/device/core_sampler)) - geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) - return + if(!density) - if (istype(W, /obj/item/device/depth_scanner)) - var/obj/item/device/depth_scanner/C = W - C.scan_atom(user, src) - return + var/list/usable_tools = list( + /obj/item/weapon/shovel, + /obj/item/weapon/pickaxe/diamonddrill, + /obj/item/weapon/pickaxe/drill, + /obj/item/weapon/pickaxe/borgdrill + ) - if (istype(W, /obj/item/device/measuring_tape)) - var/obj/item/device/measuring_tape/P = W - user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") - if(do_after(user,25)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." - return + var/valid_tool + for(var/valid_type in usable_tools) + if(istype(W,valid_type)) + valid_tool = 1 + break - if (istype(W, /obj/item/weapon/pickaxe)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return - - var/obj/item/weapon/pickaxe/P = W - if(last_act + P.digspeed > world.time)//prevents message spam - return - last_act = world.time - - playsound(user, P.drill_sound, 20, 1) - - //handle any archaeological finds we might uncover - var/fail_message - if(finds && finds.len) - var/datum/find/F = finds[1] - if(excavation_level + P.excavation_amount > F.excavation_required) - //Chance to destroy / extract any finds here - fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" - - user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." - - if(fail_message && prob(90)) - if(prob(25)) - excavate_find(5, finds[1]) - else if(prob(50)) - finds.Remove(finds[1]) - if(prob(50)) - artifact_debris() - - if(do_after(user,P.digspeed)) - user << "\blue You finish [P.drill_verb] the rock." - - if(finds && finds.len) - var/datum/find/F = finds[1] - if(round(excavation_level + P.excavation_amount) == F.excavation_required) - //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them - if(excavation_level + P.excavation_amount > F.excavation_required) - //if you can get slightly over, perfect extraction - excavate_find(100, F) - else - excavate_find(80, F) - - else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) - //just pull the surrounding rock out - excavate_find(0, F) - - if( excavation_level + P.excavation_amount >= 100 ) - //if players have been excavating this turf, leave some rocky debris behind - var/obj/structure/boulder/B - if(artifact_find) - if( excavation_level > 0 || prob(15) ) - //boulder with an artifact inside - B = new(src) - if(artifact_find) - B.artifact_find = artifact_find - else - artifact_debris(1) - else if(prob(15)) - //empty boulder - B = new(src) - - if(B) - GetDrilled(0) - else - GetDrilled(1) + if(valid_tool) + if (sand_dug) + user << "This area has already been dug." return - excavation_level += P.excavation_amount + var/turf/T = user.loc + if (!(istype(T))) + return - //archaeo overlays - if(!archaeo_overlay && finds && finds.len) - var/datum/find/F = finds[1] - if(F.excavation_required <= excavation_level + F.view_range) - archaeo_overlay = "overlay_archaeo[rand(1,3)]" - overlays += archaeo_overlay + user << "You start digging." + playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1) - //there's got to be a better way to do this - var/update_excav_overlay = 0 - if(excavation_level >= 75) - if(excavation_level - P.excavation_amount < 75) - update_excav_overlay = 1 - else if(excavation_level >= 50) - if(excavation_level - P.excavation_amount < 50) - update_excav_overlay = 1 - else if(excavation_level >= 25) - if(excavation_level - P.excavation_amount < 25) - update_excav_overlay = 1 + if(!do_after(user,40)) return - //update overlays displaying excavation level - if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) - var/excav_quadrant = round(excavation_level / 25) + 1 - excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" - overlays += excav_overlay - - //drop some rocks - next_rock += P.excavation_amount * 10 - while(next_rock > 100) - next_rock -= 100 - var/obj/item/weapon/ore/O = new(src) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data + user << "You dug a hole." + GetDrilled() + else if(istype(W,/obj/item/weapon/storage/bag/ore)) + var/obj/item/weapon/storage/bag/ore/S = W + if(S.collection_mode) + for(var/obj/item/weapon/ore/O in contents) + O.attackby(W,user) + return + else if(istype(W,/obj/item/weapon/storage/bag/fossils)) + var/obj/item/weapon/storage/bag/fossils/S = W + if(S.collection_mode) + for(var/obj/item/weapon/fossil/F in contents) + F.attackby(W,user) + return else - return attack_hand(user) + if (istype(W, /obj/item/device/core_sampler)) + geologic_data.UpdateNearbyArtifactInfo(src) + var/obj/item/device/core_sampler/C = W + C.sample_item(src, user) + return + + if (istype(W, /obj/item/device/depth_scanner)) + var/obj/item/device/depth_scanner/C = W + C.scan_atom(user, src) + return + + if (istype(W, /obj/item/device/measuring_tape)) + var/obj/item/device/measuring_tape/P = W + user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") + if(do_after(user,25)) + user << "\icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." + return + + if (istype(W, /obj/item/weapon/pickaxe)) + var/turf/T = user.loc + if (!( istype(T, /turf) )) + return + + var/obj/item/weapon/pickaxe/P = W + if(last_act + P.digspeed > world.time)//prevents message spam + return + last_act = world.time + + playsound(user, P.drill_sound, 20, 1) + + //handle any archaeological finds we might uncover + var/fail_message + if(finds && finds.len) + var/datum/find/F = finds[1] + if(excavation_level + P.excavation_amount > F.excavation_required) + //Chance to destroy / extract any finds here + fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" + + user << "You start [P.drill_verb][fail_message ? fail_message : ""]." + + if(fail_message && prob(90)) + if(prob(25)) + excavate_find(5, finds[1]) + else if(prob(50)) + finds.Remove(finds[1]) + if(prob(50)) + artifact_debris() + + if(do_after(user,P.digspeed)) + user << "You finish [P.drill_verb] \the [src]." + + if(finds && finds.len) + var/datum/find/F = finds[1] + if(round(excavation_level + P.excavation_amount) == F.excavation_required) + //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them + if(excavation_level + P.excavation_amount > F.excavation_required) + //if you can get slightly over, perfect extraction + excavate_find(100, F) + else + excavate_find(80, F) + + else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) + //just pull the surrounding rock out + excavate_find(0, F) + + if( excavation_level + P.excavation_amount >= 100 ) + //if players have been excavating this turf, leave some rocky debris behind + var/obj/structure/boulder/B + if(artifact_find) + if( excavation_level > 0 || prob(15) ) + //boulder with an artifact inside + B = new(src) + if(artifact_find) + B.artifact_find = artifact_find + else + artifact_debris(1) + else if(prob(15)) + //empty boulder + B = new(src) + + if(B) + GetDrilled(0) + else + GetDrilled(1) + return + + excavation_level += P.excavation_amount + + //archaeo overlays + if(!archaeo_overlay && finds && finds.len) + var/datum/find/F = finds[1] + if(F.excavation_required <= excavation_level + F.view_range) + archaeo_overlay = "overlay_archaeo[rand(1,3)]" + overlays += archaeo_overlay + + //there's got to be a better way to do this + var/update_excav_overlay = 0 + if(excavation_level >= 75) + if(excavation_level - P.excavation_amount < 75) + update_excav_overlay = 1 + else if(excavation_level >= 50) + if(excavation_level - P.excavation_amount < 50) + update_excav_overlay = 1 + else if(excavation_level >= 25) + if(excavation_level - P.excavation_amount < 25) + update_excav_overlay = 1 + + //update overlays displaying excavation level + if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) + var/excav_quadrant = round(excavation_level / 25) + 1 + excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" + overlays += excav_overlay + + //drop some rocks + next_rock += P.excavation_amount * 10 + while(next_rock > 100) + next_rock -= 100 + var/obj/item/weapon/ore/O = new(src) + geologic_data.UpdateNearbyArtifactInfo(src) + O.geologic_data = geologic_data + return + + return attack_hand(user) /turf/simulated/mineral/proc/clear_ore_effects() for(var/obj/effect/mineral/M in contents) @@ -244,7 +374,6 @@ /turf/simulated/mineral/proc/DropMineral() if(!mineral) return - clear_ore_effects() var/obj/item/weapon/ore/O = new mineral.ore (src) if(istype(O)) @@ -253,7 +382,15 @@ return O /turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0) - //var/destroyed = 0 //used for breaking strange rocks + + if(!density) + if(!sand_dug) + sand_dug = 1 + for(var/i=0;i<(rand(3)+2);i++) + new/obj/item/weapon/ore/glass(src) + update_icon() + return + if (mineral && mineral.result_amount) //if the turf has already been excavated, some of it's ore has been removed @@ -267,7 +404,7 @@ if(prob(50)) pain = 1 for(var/mob/living/M in range(src, 200)) - M << "[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" + M << "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" if(pain) flick("pain",M.pain) if(prob(50)) @@ -278,25 +415,17 @@ M.Stun(5) M.apply_effect(25, IRRADIATE) - - var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) - - //Add some rubble, you did just clear out a big chunk of rock. - - var/turf/simulated/floor/asteroid/N = ChangeTurf(mined_turf) - // Kill and update the space overlays around us. + var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) for(var/direction in step_overlays) var/turf/space/T = get_step(src, step_overlays[direction]) if(istype(T)) T.overlays.Cut() for(var/next_direction in step_overlays) if(istype(get_step(T, step_overlays[next_direction]),/turf/simulated/mineral)) - T.overlays += image('icons/turf/walls.dmi', "rock_side_[next_direction]") + T.overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[next_direction]) - if(istype(N)) - N.overlay_detail = "asteroid[rand(0,9)]" - N.updateMineralOverlays(1) + make_floor() /turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) //with skill and luck, players can cleanly extract finds @@ -311,7 +440,7 @@ //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens //yuck - var/display_name = "something" + var/display_name = "Something" if(!X) X = last_find if(X) @@ -322,12 +451,11 @@ var/obj/effect/suspension_field/S = locate() in src if(!S || S.field_type != get_responsive_reagent(F.find_type)) if(X) - visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") + visible_message("\The [pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") qdel(X) finds.Remove(F) - /turf/simulated/mineral/proc/artifact_debris(var/severity = 0) //cael's patented random limited drop componentized loot system! //sky's patented not-fucking-retarded overhaul! @@ -336,152 +464,24 @@ for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2)) switch(rand(1,7)) if(1) - var/obj/item/stack/rods/R = new(src) - R.amount = rand(5,25) - + new /obj/item/stack/rods(src, rand(5,25)) if(2) - var/obj/item/stack/material/plasteel/R = new(src) - R.amount = rand(5,25) - + new /obj/item/stack/material/plasteel(src, rand(5,25)) if(3) - var/obj/item/stack/material/steel/R = new(src) - R.amount = rand(5,25) - + new /obj/item/stack/material/steel(src, rand(5,25)) if(4) - var/obj/item/stack/material/plasteel/R = new(src) - R.amount = rand(5,25) - + new /obj/item/stack/material/plasteel(src, rand(5,25)) if(5) - var/quantity = rand(1,3) - for(var/i=0, iConstructing support lattice ..." - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - new /obj/structure/lattice(get_turf(src)) +/turf/simulated/mineral/proc/make_ore(var/rare_ore) + if(mineral) return else if(istype(W, /obj/item/stack/tile/floor)) @@ -500,55 +500,9 @@ return else - ..(W,user) - return - -/turf/simulated/floor/asteroid/proc/gets_dug() - - if(dug) - return - - for(var/i=0;i<(rand(3)+2);i++) - new/obj/item/weapon/ore/glass(src) - - dug = 1 - icon_state = "asteroid_dug" - return - -/turf/simulated/floor/asteroid/proc/updateMineralOverlays(var/update_neighbors) - - overlays.Cut() - - var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) - for(var/direction in step_overlays) - - if(istype(get_step(src, step_overlays[direction]), /turf/space)) - overlays += image('icons/turf/floors.dmi', "asteroid_edge_[direction]") - - if(istype(get_step(src, step_overlays[direction]), /turf/simulated/mineral)) - overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") - - //todo cache - if(overlay_detail) overlays |= image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail) - - if(update_neighbors) - var/list/all_step_directions = list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST) - for(var/direction in all_step_directions) - var/turf/simulated/floor/asteroid/A - if(istype(get_step(src, direction), /turf/simulated/floor/asteroid)) - A = get_step(src, direction) - A.updateMineralOverlays() - -/turf/simulated/floor/asteroid/Entered(atom/movable/M as mob|obj) - ..() - if(istype(M,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = M - if(R.module) - if(istype(R.module_state_1,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_1,R) - else if(istype(R.module_state_2,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_2,R) - else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_3,R) - else - return \ No newline at end of file + mineral_name = pickweight(list("Uranium" = 5, "Platinum" = 5, "Iron" = 35, "Coal" = 35, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Phoron" = 10)) + mineral_name = lowertext(mineral_name) + if(mineral_name && (mineral_name in ore_data)) + mineral = ore_data[mineral_name] + UpdateMineral() + update_icon() diff --git a/code/modules/random_map/automata/caves.dm b/code/modules/random_map/automata/caves.dm index fe959c72b52..30e6f1376a5 100644 --- a/code/modules/random_map/automata/caves.dm +++ b/code/modules/random_map/automata/caves.dm @@ -1,23 +1,10 @@ /datum/random_map/automata/cave_system iterations = 5 descriptor = "moon caves" - wall_type = /turf/simulated/mineral - floor_type = /turf/simulated/floor/asteroid - target_turf_type = /turf/unsimulated/mask - var/mineral_sparse = /turf/simulated/mineral/random - var/mineral_rich = /turf/simulated/mineral/random/high_chance var/list/ore_turfs = list() /datum/random_map/automata/cave_system/get_appropriate_path(var/value) - switch(value) - if(DOOR_CHAR) - return mineral_sparse - if(EMPTY_CHAR) - return mineral_rich - if(FLOOR_CHAR) - return floor_type - if(WALL_CHAR) - return wall_type + return /datum/random_map/automata/cave_system/get_map_char(var/value) switch(value) @@ -50,3 +37,20 @@ map[check_cell] = EMPTY_CHAR // Rare mineral block. ore_count-- return 1 + +/datum/random_map/automata/cave_system/apply_to_turf(var/x,var/y) + var/current_cell = get_map_cell(x,y) + if(!current_cell) + return 0 + var/turf/simulated/mineral/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) + if(istype(T) && !T.ignore_mapgen) + if(map[current_cell] == FLOOR_CHAR) + T.make_floor() + else + T.make_wall() + if(map[current_cell] == DOOR_CHAR) + T.make_ore() + else if(map[current_cell] == EMPTY_CHAR) + T.make_ore(1) + get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y)) + return T \ No newline at end of file diff --git a/code/world.dm b/code/world.dm index 2b5d541f747..a046f2e0599 100644 --- a/code/world.dm +++ b/code/world.dm @@ -91,9 +91,7 @@ var/global/datum/global_init/init = new () // Update all turfs to ensure everything looks good post-generation. Yes, // it's brute-forcey, but frankly the alternative is a mine turf rewrite. for(var/turf/simulated/mineral/M in world) // Ugh. - M.updateMineralOverlays() - for(var/turf/simulated/floor/asteroid/M in world) // Uuuuuugh. - M.updateMineralOverlays() + M.update_icon() // Create autolathe recipes, as above. populate_lathe_recipes() diff --git a/icons/turf/flooring/asteroid.dmi b/icons/turf/flooring/asteroid.dmi index 075241ce87b8282f9d88efa5985404df26aa007f..b561b8d8dca22e3754f9794e253d00b1b16328da 100644 GIT binary patch literal 6976 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 Dl%vb& diff --git a/polaris.dme b/polaris.dme index d337865505d..85b53114e91 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1659,7 +1659,6 @@ #include "code\modules\random_map\mazes\maze.dm" #include "code\modules\random_map\mazes\maze_cell.dm" #include "code\modules\random_map\noise\desert.dm" -#include "code\modules\random_map\noise\magma.dm" #include "code\modules\random_map\noise\noise.dm" #include "code\modules\random_map\noise\ore.dm" #include "code\modules\random_map\noise\tundra.dm" From 8ebb7c5b5fc02bbfa4bf4a6f3d8011dc69e0ba18 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Dec 2015 09:48:22 +1030 Subject: [PATCH 30/55] Rewriting the mining turfs to reduce worldstart lag. --- code/game/objects/items/weapons/RCD.dm | 2 +- code/game/objects/structures/lattice.dm | 2 +- code/global.dm | 2 +- code/modules/mining/mine_turfs.dm | 79 +++++++--------- icons/turf/flooring/asteroid.dmi | Bin 6976 -> 7227 bytes icons/turf/walls.dmi | Bin 25185 -> 25112 bytes maps/polaris-1.dmm | 119 ++++++++++++------------ maps/polaris-4.dmm | 18 ++-- maps/polaris-5.dmm | 90 +++++++++--------- 9 files changed, 150 insertions(+), 162 deletions(-) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 6ca739046f0..66251f79e5c 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -104,7 +104,7 @@ build_cost = 1 build_type = "floor" build_turf = /turf/simulated/floor/airless - else if(!deconstruct && istype(T,/turf/simulated/floor/asteroid)) + else if(!deconstruct && istype(T,/turf/simulated/mineral/floor)) build_cost = 1 build_type = "floor" build_turf = /turf/simulated/floor/plating diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 4de2b9b502f..93d61e1602d 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -11,7 +11,7 @@ /obj/structure/lattice/New() //turf/simulated/floor/asteroid ..() ///// Z-Level Stuff - if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/floor/asteroid))) + if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/mineral/floor))) ///// Z-Level Stuff qdel(src) for(var/obj/structure/lattice/LAT in src.loc) diff --git a/code/global.dm b/code/global.dm index a05211c443b..daa26e30dee 100644 --- a/code/global.dm +++ b/code/global.dm @@ -42,7 +42,7 @@ var/round_progressing = 1 //Set to 1 to enable it. var/destroy_floor_override = 1 //Below is the path of turf used in place of space tiles. -var/destroy_floor_override_path = /turf/simulated/floor/asteroid +var/destroy_floor_override_path = /turf/simulated/mineral/floor //A list of z-levels to apply the override to. This is so z-levels like tcomms work as they did before. var/list/destroy_floor_override_z_levels = list(1,4,5) //Some areas you may want to not turn into the override path you made above, like space or the solars. diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index f462dd3e310..cfc46861630 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -1,3 +1,5 @@ +var/list/mining_overlay_cache = list() + /**********************Mineral deposits**************************/ /turf/unsimulated/mineral name = "impassable rock" @@ -68,13 +70,8 @@ if(istype(M,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = M if(R.module) - if(istype(R.module_state_1,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_1,R) - else if(istype(R.module_state_2,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_2,R) - else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore)) - attackby(R.module_state_3,R) - else + for(var/obj/item/weapon/storage/bag/ore/O in list(R.module_state_1, R.module_state_2, R.module_state_3)) + attackby(O, R) return /turf/simulated/mineral/initialize() @@ -88,7 +85,6 @@ /turf/simulated/mineral/update_icon(var/update_neighbors) overlays.Cut() - var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) if(density) if(mineral) @@ -99,10 +95,13 @@ icon = 'icons/turf/walls.dmi' icon_state = "rock" - for(var/direction in step_overlays) - var/turf/T = get_step(src,step_overlays[direction]) + for(var/direction in cardinal) + var/turf/T = get_step(src,direction) if(istype(T) && !T.density) - T.overlays += image('icons/turf/walls.dmi', "rock_side", dir = turn(step_overlays[direction], 180)) + var/place_dir = turn(direction, 180) + if(!mining_overlay_cache["rock_side_[place_dir]"]) + mining_overlay_cache["rock_side_[place_dir]"] = image('icons/turf/walls.dmi', "rock_side", dir = place_dir) + T.overlays += mining_overlay_cache["rock_side_[place_dir]"] else name = "sand" @@ -110,22 +109,30 @@ icon_state = "asteroid" if(sand_dug) - overlays += image('icons/turf/flooring/asteroid.dmi', "dug_overlay") + if(!mining_overlay_cache["dug_overlay"]) + mining_overlay_cache["dug_overlay"] = image('icons/turf/flooring/asteroid.dmi', "dug_overlay") + overlays += mining_overlay_cache["dug_overlay"] - for(var/direction in step_overlays) - if(istype(get_step(src, step_overlays[direction]), /turf/space)) - overlays += image('icons/turf/flooring/asteroid.dmi', "asteroid_edges", dir = step_overlays[direction]) + for(var/direction in cardinal) + if(istype(get_step(src, direction), /turf/space)) + if(!mining_overlay_cache["asteroid_edge_[direction]"]) + mining_overlay_cache["asteroid_edge_[direction]"] = image('icons/turf/flooring/asteroid.dmi', "asteroid_edges", dir = direction) + overlays += mining_overlay_cache["asteroid_edge_[direction]"] else - var/turf/simulated/mineral/M = get_step(src, step_overlays[direction]) + var/turf/simulated/mineral/M = get_step(src, direction) if(istype(M) && M.density) - overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[direction]) + if(!mining_overlay_cache["rock_side_[direction]"]) + mining_overlay_cache["rock_side_[direction]"] = image('icons/turf/walls.dmi', "rock_side", dir = direction) + overlays += mining_overlay_cache["rock_side_[direction]"] if(overlay_detail) - overlays |= image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail) + + if(!mining_overlay_cache["decal_[overlay_detail]"]) + mining_overlay_cache["decal_[overlay_detail]"] = image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail) + overlays += mining_overlay_cache["decal_[overlay_detail]"] if(update_neighbors) - var/list/all_step_directions = list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST) - for(var/direction in all_step_directions) + for(var/direction in alldirs) if(istype(get_step(src, direction), /turf/simulated/mineral)) var/turf/simulated/mineral/M = get_step(src, direction) M.update_icon() @@ -415,17 +422,8 @@ M.Stun(5) M.apply_effect(25, IRRADIATE) - // Kill and update the space overlays around us. - var/list/step_overlays = list("n" = NORTH, "s" = SOUTH, "e" = EAST, "w" = WEST) - for(var/direction in step_overlays) - var/turf/space/T = get_step(src, step_overlays[direction]) - if(istype(T)) - T.overlays.Cut() - for(var/next_direction in step_overlays) - if(istype(get_step(T, step_overlays[next_direction]),/turf/simulated/mineral)) - T.overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[next_direction]) - make_floor() + update_icon() /turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) //with skill and luck, players can cleanly extract finds @@ -484,24 +482,13 @@ if(mineral) return - else if(istype(W, /obj/item/stack/tile/floor)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - var/obj/item/stack/tile/floor/S = W - if (S.get_amount() < 1) - return - qdel(L) - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - ChangeTurf(/turf/simulated/floor) - S.use(1) - return - else - user << "The plating is going to need some support." - return + var/mineral_name + if(rare_ore) + mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "iron" = 20, "coal" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) else - mineral_name = pickweight(list("Uranium" = 5, "Platinum" = 5, "Iron" = 35, "Coal" = 35, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Phoron" = 10)) - mineral_name = lowertext(mineral_name) + mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "iron" = 35, "coal" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) + if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] UpdateMineral() diff --git a/icons/turf/flooring/asteroid.dmi b/icons/turf/flooring/asteroid.dmi index b561b8d8dca22e3754f9794e253d00b1b16328da..8f483105368b0e4cb0ec0c671310252591e26208 100644 GIT binary patch literal 7227 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

+

16 December 2015

+

HarpyEagle updated:

+
    +
  • Fixed a couple of bugs causing phoron gas fires to burn cooler and slower than they were supposed to.
  • +
  • Merc bombs are now appropriately explosive again. Same goes for bombs made by toxins.
  • +
+

Hubblenaut updated:

+
    +
  • Mobs on help intent will not push others that aren't.
  • +
  • Adds tape for atmospherics.
  • +
  • Tape graphics and algorithm changes. Looks a lot more appealing now.
  • +
  • Starting and ending tape on the same turf will connect it to all surrounding walls/windows.
  • +
  • Lifting a part of the tape will lift an entire tape section.
  • +
  • Mobs on help intent do stop for tape.
  • +
  • Crumpled tape does not affect tape breaking behavior anymore.
  • +
  • Fixes vending machines not adding stored goods when maintenance panel is closed.
  • +
  • Doors do only buzz once on failed closing attempt.
  • +
+

Neerti updated:

+
    +
  • Adds NanoUI for communicators, the ability for communicators to call other communicators on the station, the ability for station-bound people to call ghosts, and for ghosts to toggle their visibility to communicators on or off in character preferences (defaults to off). Communicators can now also support more than one call at the same time, for both ghosts and normal communicators.
  • +
  • Adds new machine to telecomms, the Exonet node. It is very basic in terms of functionality, but certain services can be selectively disabled from it, such as newscaster updates, communicators, or external PDA messages. Adds methods for building and deconstructing Exonet nodes.
  • +
  • Adds framework for a fake-networking system called EPv2 that communicators will now use, and perhaps other machines will in the future, for good or for evil.
  • +
  • Changeling Spacearmor reduced in protective ability.
  • +
  • Cryogenic String and Delayed Toxic Sting now have a three minute cooldown upon stinging someone.
  • +
  • Cryotoxin, the chemical used in Cryogenic String, is 25% less potent now.
  • +
  • The rune to summon Narsie has been changed. Narsie is no longer summoned, but Hell still comes.
  • +
  • Spooky mobs spawned from spooky portals as a result of Hell coming have had their speed, health, and damage reduced.
  • +
  • Manifested humans no longer count for summoning Hell.
  • +
+

Zuhayr updated:

+
    +
  • Aiming has been rewritten, keep an eye out for weird behavior.
  • +
  • Removed the detective scanner and associated machinery.
  • +
  • Added a microscope, machine forensic scanner, etc. from Aurora forensics.
  • +
+

06 December 2015

Datraen updated: