From 2308c11caa3baf1d2b89eced5dc94a765819f9a3 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Wed, 29 Mar 2017 11:29:14 -0400 Subject: [PATCH 001/100] Gaining Vanguard will remove existing stuns --- code/datums/status_effects/buffs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 918df017562..bacddc14907 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -72,6 +72,8 @@ add_logs(owner, null, "gained Vanguard stun immunity") owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!") owner.visible_message("[owner] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.") + owner.SetStunned(0, FALSE) + owner.SetWeakened(0) progbar = new(owner, duration, owner) progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0)) progbar.update(duration - world.time) From 69a07b5ecff25c89085aea0e65a05ba0a459e6d2 Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Thu, 27 Apr 2017 22:10:51 +1000 Subject: [PATCH 002/100] persistent investigate and game logs separated by round ID --- code/__HELPERS/_logging.dm | 37 +++++----- code/_globalvars/logging.dm | 20 +++--- code/controllers/configuration.dm | 38 ++++------ code/controllers/subsystem/blackbox.dm | 16 +---- code/game/gamemodes/game_mode.dm | 1 - code/modules/admin/IsBanned.dm | 2 +- code/modules/admin/admin_investigate.dm | 48 +++---------- code/modules/admin/admin_ranks.dm | 4 +- code/modules/admin/admin_verbs.dm | 21 +----- code/modules/admin/verbs/getlogs.dm | 71 ++----------------- code/modules/client/client_procs.dm | 17 +++-- code/modules/error_handler/error_handler.dm | 7 +- .../kitchen_machinery/gibber.dm | 2 +- code/world.dm | 43 ++++++----- config/config.txt | 6 -- 15 files changed, 102 insertions(+), 231 deletions(-) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 2785ba896fb..a2a878211a0 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -20,13 +20,13 @@ /proc/log_admin(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.diary << "\[[time_stamp()]]ADMIN: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]" //Items using this proc are stripped from public logs - use with caution /proc/log_admin_private(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.diary << "\[[time_stamp()]]ADMINPRIVATE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]" /proc/log_adminsay(text) if (config.log_adminchat) @@ -38,67 +38,64 @@ /proc/log_game(text) if (config.log_game) - GLOB.diary << "\[[time_stamp()]]GAME: [text]" + GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]" /proc/log_vote(text) if (config.log_vote) - GLOB.diary << "\[[time_stamp()]]VOTE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]" /proc/log_access(text) if (config.log_access) - GLOB.diary << "\[[time_stamp()]]ACCESS: [text]" + GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]" /proc/log_say(text) if (config.log_say) - GLOB.diary << "\[[time_stamp()]]SAY: [text]" + GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]" /proc/log_prayer(text) if (config.log_prayer) - GLOB.diary << "\[[time_stamp()]]PRAY: [text]" + GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]" /proc/log_law(text) if (config.log_law) - GLOB.diary << "\[[time_stamp()]]LAW: [text]" + GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]" /proc/log_ooc(text) if (config.log_ooc) - GLOB.diary << "\[[time_stamp()]]OOC: [text]" + GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]" /proc/log_whisper(text) if (config.log_whisper) - GLOB.diary << "\[[time_stamp()]]WHISPER: [text]" + GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]" /proc/log_emote(text) if (config.log_emote) - GLOB.diary << "\[[time_stamp()]]EMOTE: [text]" + GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]" /proc/log_attack(text) if (config.log_attack) - GLOB.diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]" + GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]" /proc/log_pda(text) if (config.log_pda) - GLOB.diary << "\[[time_stamp()]]PDA: [text]" + GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]" /proc/log_comment(text) if (config.log_pda) //reusing the PDA option because I really don't think news comments are worth a config option - GLOB.diary << "\[[time_stamp()]]COMMENT: [text]" + GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]" /proc/log_chat(text) if (config.log_pda) - GLOB.diary << "\[[time_stamp()]]CHAT: [text]" + GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]" /proc/log_sql(text) if(config.sql_enabled) - GLOB.diary << "\[[time_stamp()]]SQL: [text]" + GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]" //This replaces world.log so it displays both in DD and the file /proc/log_world(text) - if(config && config.log_runtimes) - world.log = GLOB.runtime_diary - world.log << text - world.log = null + GLOB.world_runtime_log << text world.log << text // Helper procs for building detailed log lines diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index ff17a1d72b4..c2f0efba451 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -1,11 +1,15 @@ -GLOBAL_VAR(diary) -GLOBAL_PROTECT(diary) -GLOBAL_VAR(runtime_diary) -GLOBAL_PROTECT(runtime_diary) -GLOBAL_VAR(diaryofmeanpeople) -GLOBAL_PROTECT(diaryofmeanpeople) -GLOBAL_VAR(href_logfile) -GLOBAL_PROTECT(href_logfile) +GLOBAL_VAR(log_directory) +GLOBAL_PROTECT(log_directory) +GLOBAL_VAR(world_game_log) +GLOBAL_PROTECT(world_game_log) +GLOBAL_VAR(world_runtime_log) +GLOBAL_PROTECT(world_runtime_log) +GLOBAL_VAR(world_attack_log) +GLOBAL_PROTECT(world_attack_log) +GLOBAL_VAR(world_href_log) +GLOBAL_PROTECT(world_href_log) +GLOBAL_VAR(round_id) +GLOBAL_PROTECT(round_id) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f0f39e68255..cb4416e2983 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -43,10 +43,8 @@ var/log_attack = 0 // log attack messages var/log_adminchat = 0 // log admin chat messages var/log_pda = 0 // log pda messages - var/log_hrefs = 0 // log all links clicked in-game. Could be used for debugging and tracking down exploits var/log_twitter = 0 // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. var/log_world_topic = 0 // log all world.Topic() calls - var/log_runtimes = FALSE // log runtimes into a file var/sql_enabled = 0 // for sql switching var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour var/allow_vote_restart = 0 // allow votes to restart @@ -271,7 +269,7 @@ if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once - GLOB.diary << "Adding game mode [M.name] ([M.config_tag]) to configuration." + GLOB.world_game_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." modes += M.config_tag mode_names[M.config_tag] = M.name probabilities[M.config_tag] = M.probability @@ -360,8 +358,6 @@ log_adminchat = 1 if("log_pda") log_pda = 1 - if("log_hrefs") - log_hrefs = 1 if("log_twitter") log_twitter = 1 if("log_world_topic") @@ -495,12 +491,6 @@ ipintel_save_bad = text2num(value) if("aggressive_changelog") aggressive_changelog = 1 - if("log_runtimes") - log_runtimes = TRUE - var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log") - if(GLOB.runtime_diary != newlog) - world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log" - GLOB.runtime_diary = newlog if("autoconvert_notes") autoconvert_notes = 1 if("allow_webclient") @@ -544,7 +534,7 @@ if("error_msg_delay") error_msg_delay = text2num(value) else - GLOB.diary << "Unknown setting in configuration: '[name]'" + GLOB.world_game_log << "Unknown setting in configuration: '[name]'" else if(type == "game_options") switch(name) @@ -607,13 +597,13 @@ if(mode_name in modes) continuous[mode_name] = 1 else - GLOB.diary << "Unknown continuous configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown continuous configuration definition: [mode_name]." if("midround_antag") var/mode_name = lowertext(value) if(mode_name in modes) midround_antag[mode_name] = 1 else - GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown midround antagonist configuration definition: [mode_name]." if("midround_antag_time_check") midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -629,9 +619,9 @@ if(mode_name in modes) min_pop[mode_name] = text2num(mode_value) else - GLOB.diary << "Unknown minimum population configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown minimum population configuration definition: [mode_name]." else - GLOB.diary << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." + GLOB.world_game_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." if("max_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -643,9 +633,9 @@ if(mode_name in modes) max_pop[mode_name] = text2num(mode_value) else - GLOB.diary << "Unknown maximum population configuration definition: [mode_name]." + GLOB.world_game_log << "Unknown maximum population configuration definition: [mode_name]." else - GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." + GLOB.world_game_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." if("shuttle_refuel_delay") shuttle_refuel_delay = text2num(value) if("show_game_type_odds") @@ -673,9 +663,9 @@ if(prob_name in modes) probabilities[prob_name] = text2num(prob_value) else - GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]." + GLOB.world_game_log << "Unknown game mode probability configuration definition: [prob_name]." else - GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]." + GLOB.world_game_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 @@ -722,7 +712,7 @@ // Value is in the form "LAWID,NUMBER" var/list/L = splittext(value, ",") if(L.len != 2) - GLOB.diary << "Invalid LAW_WEIGHT: " + t + GLOB.world_game_log << "Invalid LAW_WEIGHT: " + t continue var/lawid = L[1] var/weight = text2num(L[2]) @@ -777,7 +767,7 @@ if("mice_roundstart") mice_roundstart = text2num(value) else - GLOB.diary << "Unknown setting in configuration: '[name]'" + GLOB.world_game_log << "Unknown setting in configuration: '[name]'" fps = round(fps) if(fps <= 0) @@ -831,7 +821,7 @@ maplist[currentmap.map_name] = currentmap currentmap = null else - GLOB.diary << "Unknown command in map vote config: '[command]'" + GLOB.world_game_log << "Unknown command in map vote config: '[command]'" /datum/configuration/proc/loadsql(filename) @@ -875,7 +865,7 @@ if("feedback_tableprefix") global.sqlfdbktableprefix = value else - GLOB.diary << "Unknown setting in configuration: '[name]'" + GLOB.world_game_log << "Unknown setting in configuration: '[name]'" /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index bac949b0465..3febc7581c7 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -41,7 +41,7 @@ SUBSYSTEM_DEF(blackbox) msg_service = SSblackbox.msg_service msg_cargo = SSblackbox.msg_cargo msg_other = SSblackbox.msg_other - + feedback = SSblackbox.feedback //no touchie @@ -84,25 +84,13 @@ SUBSYSTEM_DEF(blackbox) if (!SSdbcore.Connect()) return - var/round_id - - var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") - if(!query_feedback_max_id.Execute()) - return - while (query_feedback_max_id.NextRow()) - round_id = query_feedback_max_id.item[1] - - if (!isnum(round_id)) - round_id = text2num(round_id) - round_id++ - var/sqlrowlist = "" for (var/datum/feedback_variable/FV in feedback) if (sqlrowlist != "") sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error - sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" + sqlrowlist += "(null, Now(), [GLOB.round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")" if (sqlrowlist == "") return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f1144afc13d..fa93dbf61cf 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -85,7 +85,6 @@ SSblackbox.set_details("game_mode","[SSticker.mode]") if(GLOB.revdata.commit) SSblackbox.set_details("revision","[GLOB.revdata.commit]") - SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]") if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 5970b6f37e5..d6e2b8d1b66 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -63,7 +63,7 @@ if(!SSdbcore.Connect()) log_world("Ban database connection failure. Key [ckeytext] not checked") - GLOB.diary << "Ban database connection failure. Key [ckeytext] not checked" + GLOB.world_game_log << "Ban database connection failure. Key [ckeytext] not checked" return var/ipquery = "" diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index f1951a2c71a..d3a86027bb0 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -1,50 +1,20 @@ -//By Carnwennan - -//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game. -//lists and variables are great. However, they have several major flaws: -//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches. -//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that -//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine! -#define INVESTIGATE_DIR "data/investigate/" - -//SYSTEM -/proc/investigate_subject2file(subject) - return file("[INVESTIGATE_DIR][subject].html") - -/proc/investigate_reset() - if(fdel(INVESTIGATE_DIR)) - return 1 - return 0 - -/atom/proc/investigate_log(message, subject) - if(!message) - return - var/F = investigate_subject2file(subject) - if(!F) +atom/proc/investigate_log(message, subject) + if(!message || !subject) return + var/F = file("[GLOB.log_directory]/[subject].html") F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" -//ADMINVERBS /client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") ) set name = "Investigate" set category = "Admin" if(!holder) return switch(subject) - if("singulo", "wires", "telesci", "gravity", "records", "cargo", "supermatter", "atmos", "botany") //general one-round-only stuff - var/F = investigate_subject2file(subject) - if(!F) - to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return - src << browse(F,"window=investigate[subject];size=800x300") - if("hrefs") //persistent logs and stuff - if(GLOB.href_logfile) - src << browse(GLOB.href_logfile,"window=investigate[subject];size=800x300") - else if(!config.log_hrefs) - to_chat(src, "Href logging is off and no logfile was found.") - return - else - to_chat(src, "No href logfile was found.") - return if("notes, memos, watchlist") browse_messages() + else + var/F = file("[GLOB.log_directory]/[subject].html") + if(!fexists(F)) + to_chat(src, "No [subject] logfile was found.") + return + src << browse(F,"window=investigate[subject];size=800x300") \ No newline at end of file diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index bf7b9dcb1ae..8356f693c69 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -127,7 +127,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") - GLOB.diary << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + GLOB.world_game_log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." config.admin_legacy_system = 1 load_admin_ranks() return @@ -202,7 +202,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admins(). Reverting to legacy system.") - GLOB.diary << "Failed to connect to database in load_admins(). Reverting to legacy system." + GLOB.world_game_log << "Failed to connect to database in load_admins(). Reverting to legacy system." config.admin_legacy_system = 1 load_admins() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a32a37b046d..becffa0ec3b 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -42,16 +42,14 @@ GLOBAL_LIST_INIT(admin_verbs_admin, AVerbsAdmin()) /datum/admins/proc/set_admin_notice,/*announcement all clients see when joining the server.*/ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/toggle_view_range, /*changes how far we can see*/ - /datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/ + /datum/admins/proc/view_txt_log, /*shows the server log (world_game_log) for today*/ /datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/ /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/ /client/proc/check_antagonists, /*shows all antags*/ /datum/admins/proc/access_news_network, /*allows access of newscasters*/ - /client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/ - /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ - /client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/ + /client/proc/getserverlog, /*allows us to fetch server logs (world_game_log) for other days*/ /client/proc/jumptocoord, /*we ghost and jump to a coordinate*/ /client/proc/Getmob, /*teleports a mob to our location*/ /client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/ @@ -114,7 +112,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer()) /datum/admins/proc/end_round, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, - /client/proc/toggle_log_hrefs, /client/proc/everyone_random, /datum/admins/proc/toggleAI, /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ @@ -219,7 +216,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) /datum/admins/proc/restart, /datum/admins/proc/delay, /datum/admins/proc/toggleaban, - /client/proc/toggle_log_hrefs, /client/proc/everyone_random, /datum/admins/proc/toggleAI, /client/proc/restart_controller, @@ -634,19 +630,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable()) togglebuildmode(src.mob) SSblackbox.add_details("admin_verb","Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/toggle_log_hrefs() - set name = "Toggle href logging" - set category = "Server" - if(!holder) - return - if(config) - if(config.log_hrefs) - config.log_hrefs = 0 - to_chat(src, "Stopped logging hrefs") - else - config.log_hrefs = 1 - to_chat(src, "Started logging hrefs") - /client/proc/check_ai_laws() set name = "Check AI Laws" set category = "Admin" diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index c3438f15564..fe3fe61b3fc 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -1,62 +1,3 @@ -/* - HOW DO I LOG RUNTIMES? - Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) - navigate the popup window to the data/logs/runtimes/ folder from where your tgstation .dmb is located. - (you may have to make this folder yourself) - - OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you - start a world. Just remember to repeat these steps with a new name when you update to a new revision! - - Save it with the name of the revision your server uses (e.g. r3459.txt). - Game Masters will now be able to grant access any runtime logs you have archived this way! - This will allow us to gather information on bugs across multiple servers and make maintaining the TG - codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! -*/ - - -//This proc allows Game Masters to grant a client access to the .getruntimelog verb -//Permissions expire at the end of each round. -//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that -//you trust access. Also, it may be wise to ensure that they are not going to play in the current round. -/client/proc/giveruntimelog() - set name = ".giveruntimelog" - set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder." - set category = null - - if(!src.holder) - to_chat(src, "Only Admins may use this command.") - return - - var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients - if(!istype(target,/client)) - to_chat(src, "Error: giveruntimelog(): Client not found.") - return - - target.verbs |= /client/proc/getruntimelog - to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.") - return - - -//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon. -//It works similarly to show-server-log. -/client/proc/getruntimelog() - set name = ".getruntimelog" - set desc = "Retrieve any session logfiles saved by dreamdeamon." - set category = null - - var/path = browse_files("data/logs/runtimes/") - if(!path) - return - - if(file_spam_check()) - return - - message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp(file(path)) - to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") - return - - //This proc allows download of past server logs saved within the data/logs/ folder. //It works similarly to show-server-log. /client/proc/getserverlog() @@ -83,10 +24,10 @@ /datum/admins/proc/view_txt_log() set category = "Admin" set name = "Show Server Log" - set desc = "Shows today's server log." + set desc = "Shows server log for this round." - if(fexists("[GLOB.diary]")) - src << ftp(GLOB.diary) + if(fexists("[GLOB.world_game_log]")) + src << ftp(GLOB.world_game_log) else to_chat(src, "Server log not found, try using .getserverlog.") return @@ -97,10 +38,10 @@ /datum/admins/proc/view_atk_log() set category = "Admin" set name = "Show Server Attack Log" - set desc = "Shows today's server attack log." + set desc = "Shows server attack log for this round." - if(fexists("[GLOB.diaryofmeanpeople]")) - src << ftp(GLOB.diaryofmeanpeople) + if(fexists("[GLOB.world_attack_log]")) + src << ftp(GLOB.world_attack_log) else to_chat(src, "Server attack log not found, try using .getserverlog.") return diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index b2be9a1b219..a49af4cfa6f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -70,8 +70,7 @@ return //Logs all hrefs - if(config && config.log_hrefs && GLOB.href_logfile) - GLOB.href_logfile << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" // Admin PM if(href_list["priv_msg"]) @@ -270,13 +269,13 @@ GLOBAL_LIST(external_rsc_urls) set_client_age_from_db() var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below. if (isnum(cached_player_age) && cached_player_age == -1) //first connection - player_age = 0 + player_age = 0 if(!IsGuestKey(key) && SSdbcore.IsConnected()) findJoinDate() sync_client_with_db(tdata) - - + + if (isnum(cached_player_age) && cached_player_age == -1) //first connection if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins)) log_access("Failed Login: [key] - New account attempting to connect during panic bunker") @@ -295,7 +294,7 @@ GLOBAL_LIST(external_rsc_urls) send2irc_adminless_only("New-user", "[key_name(src)] is connecting for the first time!") else if (isnum(cached_player_age) && cached_player_age < config.notify_new_player_age) message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age==1?"":"s")]") - + get_message_output("watchlist entry", ckey) check_ip_intel() @@ -340,7 +339,7 @@ GLOBAL_LIST(external_rsc_urls) adminGreet(1) holder.owner = null GLOB.admins -= src - + if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. if(!GLOB.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. var/cheesy_message = pick( @@ -357,9 +356,9 @@ GLOBAL_LIST(external_rsc_urls) "What happened? Where has everyone gone?",\ "Forever alone :("\ ) - + send2irc("Server", "[cheesy_message] (No admins online)") - + GLOB.ahelp_tickets.ClientLogout(src) GLOB.directory -= ckey GLOB.clients -= src diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index b48dd40e093..e2cce14db39 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -6,7 +6,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(!istype(E)) //Something threw an unusual exception log_world("\[[time_stamp()]] Uncaught exception: [E]") return ..() - + var/static/list/error_last_seen = list() var/static/list/error_cooldown = list() /* Error_cooldown items will either be positive(cooldown time) or negative(silenced error) If negative, starts at -1, and goes down by 1 each time that error gets skipped*/ @@ -107,9 +107,8 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if (split[i] != "") split[i] = "\[[time2text(world.timeofday,"hh:mm:ss")]\][split[i]]" E.desc = jointext(split, "\n") - if(config && config.log_runtimes) - world.log = GLOB.runtime_diary - ..(E) + world.log = GLOB.world_runtime_log + ..(E) world.log = null diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index a4d9a32d3d2..9ff92839d16 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -31,7 +31,7 @@ break if(!input_plate) - GLOB.diary << "a [src] didn't find an input plate." + GLOB.world_game_log << "a [src] didn't find an input plate." return /obj/machinery/gibber/autogibber/Bumped(atom/A) diff --git a/code/world.dm b/code/world.dm index 5602e62aff7..547ce53efc0 100644 --- a/code/world.dm +++ b/code/world.dm @@ -25,17 +25,32 @@ else external_rsc_urls.Cut(i,i+1) #endif - //logs - var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") - GLOB.href_logfile = file("data/logs/[date_string] hrefs.htm") - GLOB.diary = file("data/logs/[date_string].log") - GLOB.diaryofmeanpeople = file("data/logs/[date_string] Attack.log") - GLOB.diary << "\n\nStarting up. [time_stamp()]\n---------------------" - GLOB.diaryofmeanpeople << "\n\nStarting up. [time_stamp()]\n---------------------" + config = new + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") + var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), MAX(round_id)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]") + query_feedback_create_round.Execute() + var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]") + query_feedback_max_id.Execute() + if(query_feedback_max_id.NextRow()) + GLOB.round_id = query_feedback_max_id.item[1] + GLOB.log_directory += "[GLOB.round_id]" + else + log_world("Your server failed to establish a connection with the database.") + if(!GLOB.round_id) + GLOB.log_directory += "[time_stamp()]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") + GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" + GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" + GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - config = new GLOB.revdata.DownloadPRDetails() load_mode() load_motd() @@ -43,17 +58,9 @@ if(config.usewhitelist) load_whitelist() LoadBans() - investigate_reset() GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - if(config.sql_enabled) - if(!SSdbcore.Connect()) - log_world("Your server failed to establish a connection with the database.") - else - log_world("Database connection established.") - - GLOB.data_core = new /datum/datacore() Master.Initialize(10, FALSE) @@ -61,7 +68,7 @@ #define IRC_STATUS_THROTTLE 50 /world/Topic(T, addr, master, key) if(config && config.log_world_topic) - GLOB.diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" + GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" var/list/input = params2list(T) var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) @@ -253,7 +260,7 @@ if(Lines.len) if(Lines[1]) GLOB.master_mode = Lines[1] - GLOB.diary << "Saved mode is '[GLOB.master_mode]'" + GLOB.world_game_log << "Saved mode is '[GLOB.master_mode]'" /world/proc/save_mode(the_mode) var/F = file("data/mode.txt") diff --git a/config/config.txt b/config/config.txt index 8d27987e998..07cd2c1f874 100644 --- a/config/config.txt +++ b/config/config.txt @@ -71,9 +71,6 @@ LOG_PRAYER ## log lawchanges LOG_LAW -## log all Topic() calls (for use by coders in tracking down Topic issues) -# LOG_HREFS - ## log all world.Topic() calls # LOG_WORLD_TOPIC @@ -272,9 +269,6 @@ PANIC_SERVER_NAME [Put the name here] ## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog #AGGRESSIVE_CHANGELOG -## Uncomment to have the game log runtimes to the log folder. (Note: this disables normal output in dd/ds, so it should be left off for testing. -#LOG_RUNTIMES - ## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes AUTOCONVERT_NOTES From e1215371b936d88be60f2d4a6cd22524468f5d68 Mon Sep 17 00:00:00 2001 From: Robustin Date: Fri, 28 Apr 2017 14:47:39 -0400 Subject: [PATCH 003/100] Update _defines.dm --- code/_onclick/hud/_defines.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 1f004f31ac3..e189a2c7858 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -21,7 +21,7 @@ #define ui_inventory "WEST:6,SOUTH:5" //Middle left indicators -#define ui_lingchemdisplay "WEST:6,CENTER-1:15" +#define ui_lingchemdisplay "WEST,CENTER-1:15" #define ui_lingstingdisplay "WEST:6,CENTER-3:11" #define ui_crafting "12:-10,1:5" #define ui_building "12:-10,1:21" @@ -103,12 +103,13 @@ #define ui_health "EAST-1:28,CENTER-1:15" #define ui_internal "EAST-1:28,CENTER:17" -//borgs and aliens -#define ui_alien_nightvision "EAST-1:28,CENTER:17" +//borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. -#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15" -#define ui_alien_queen_finder "EAST-1:28,CENTER-3:15" + +//aliens +#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. +#define ui_alienplasmadisplay "EAST,CENTER-2:15" +#define ui_alien_queen_finder "EAST,CENTER-3:15" // AI From 786bd82576f98984dac7cb8cdb8a4977cb8e74bc Mon Sep 17 00:00:00 2001 From: XDTM Date: Sat, 29 Apr 2017 11:57:56 +0200 Subject: [PATCH 004/100] Makes the Talisman of Horrors ranged --- code/game/gamemodes/cult/ritual.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 843d16592a9..ce4abced722 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -133,7 +133,7 @@ This file contains the arcane tome files. text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \ be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.

" - text += "Talisman of Horrors
The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.

" + text += "Talisman of Horrors
The Talisman of Horror, unlike other talismans, can be applied at range, without the victim noticing. It will cause the victim to have severe hallucinations after a short while.

" text += "Talisman of Shackling
The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.

" diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 2876e80373b..8ffd0d3faef 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -309,9 +309,9 @@ invocation = "Lo'Nab Na'Dm!" creation_time = 80 -/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user) - if(iscultist(user)) - to_chat(user, "You disturb [target] with visons of the end!") +/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user) + if(iscultist(user) && (get_dist(user, target) < 7)) + to_chat(user, "You disturb [target] with visions of madness!") if(iscarbon(target)) var/mob/living/carbon/H = target H.reagents.add_reagent("mindbreaker", 25) From 7eb24185d9bd60857b168095afb89dfe70fc0290 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone Date: Sun, 30 Apr 2017 01:00:25 -0400 Subject: [PATCH 005/100] sneaky... --- code/game/gamemodes/gang/gang_pen.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 0e01532190b..b29c33b2a24 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -11,7 +11,7 @@ ..() last_used = world.time -/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user) +/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = 1) if(!istype(M)) return if(ishuman(M) && ishuman(user) && M.stat != DEAD) From a11e513ee2d48b9cfa889a982d272d25a86f8a23 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone Date: Sun, 30 Apr 2017 03:35:22 -0400 Subject: [PATCH 006/100] 1 > TRUE --- code/game/gamemodes/gang/gang_pen.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index b29c33b2a24..621d40cc458 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -11,7 +11,7 @@ ..() last_used = world.time -/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = 1) +/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE) if(!istype(M)) return if(ishuman(M) && ishuman(user) && M.stat != DEAD) From f98decf0e2230aa271c39b65c3b2e0cd97874de9 Mon Sep 17 00:00:00 2001 From: XDTM Date: Mon, 1 May 2017 00:26:02 +0200 Subject: [PATCH 007/100] Less --- code/game/gamemodes/cult/talisman.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 8ffd0d3faef..d2e1fcaf108 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -314,7 +314,7 @@ to_chat(user, "You disturb [target] with visions of madness!") if(iscarbon(target)) var/mob/living/carbon/H = target - H.reagents.add_reagent("mindbreaker", 25) + H.reagents.add_reagent("mindbreaker", 12) if(is_servant_of_ratvar(target)) to_chat(target, "You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.") target.emote("scream") From dbdf2a7e3e9855caae3ec0082f6a8a1fc68b2cd3 Mon Sep 17 00:00:00 2001 From: Lzimann Date: Sun, 30 Apr 2017 23:53:00 -0300 Subject: [PATCH 008/100] Fixes cult datum giving the action button to the mind instead of mob. Also fixes trying to replace the mind instead of the body when the player is jobbaned. --- code/datums/antagonists/datum_clockcult.dm | 2 +- code/datums/antagonists/datum_cult.dm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index ba18e76f020..85ff6f89302 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -16,7 +16,7 @@ if(!istype(current)) return if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) + addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) if(issilicon(current)) var/mob/living/silicon/S = owner diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 69c98497822..264fca9da35 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -10,20 +10,20 @@ if(!owner) return if(jobban_isbanned(owner.current, ROLE_CULTIST)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_CULTIST, ROLE_CULTIST), 0) + addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) /datum/antagonist/cult/apply_innate_effects() . = ..() owner.current.faction |= "cult" owner.current.verbs += /mob/living/proc/cult_help - communion.Grant(owner) + communion.Grant(owner.current) /datum/antagonist/cult/remove_innate_effects() . = ..() owner.current.faction -= "cult" owner.current.verbs -= /mob/living/proc/cult_help - + communion.Remove(owner.current) /datum/antagonist/cult/on_removal() . = ..() From 653863f5d2b79f127fb345ca2e8ea59e0f725056 Mon Sep 17 00:00:00 2001 From: Lzimann Date: Mon, 1 May 2017 00:19:01 -0300 Subject: [PATCH 009/100] Mob override --- code/datums/antagonists/datum_cult.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 264fca9da35..4f45570b6e8 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -13,13 +13,13 @@ addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) -/datum/antagonist/cult/apply_innate_effects() +/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() owner.current.faction |= "cult" owner.current.verbs += /mob/living/proc/cult_help communion.Grant(owner.current) -/datum/antagonist/cult/remove_innate_effects() +/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) . = ..() owner.current.faction -= "cult" owner.current.verbs -= /mob/living/proc/cult_help @@ -30,4 +30,4 @@ to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) - owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") \ No newline at end of file + owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") From b252232454144cdf6624e23d3224bb63c8ef9487 Mon Sep 17 00:00:00 2001 From: Lzimann Date: Mon, 1 May 2017 01:56:22 -0300 Subject: [PATCH 010/100] Mob override 2 --- code/datums/antagonists/datum_cult.dm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 4f45570b6e8..e6db2392419 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -15,15 +15,21 @@ /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() - owner.current.faction |= "cult" - owner.current.verbs += /mob/living/proc/cult_help - communion.Grant(owner.current) + var/mob/living/current = owner.current + if(mob_override) + current = mob_override + current.faction |= "cult" + current.verbs += /mob/living/proc/cult_help + communion.Grant(current) /datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) . = ..() - owner.current.faction -= "cult" - owner.current.verbs -= /mob/living/proc/cult_help - communion.Remove(owner.current) + var/mob/living/current = owner.current + if(mob_override) + current = mob_override + current.faction -= "cult" + current.verbs -= /mob/living/proc/cult_help + communion.Remove(current) /datum/antagonist/cult/on_removal() . = ..() From db7b29035130e264efeb2a143927819abc0626cc Mon Sep 17 00:00:00 2001 From: swindly Date: Mon, 1 May 2017 09:34:42 -0400 Subject: [PATCH 011/100] changes mercury and lithium (#26731) --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0b388ee7b42..b38d39e1392 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -658,7 +658,7 @@ taste_mult = 0 // apparently tasteless. /datum/reagent/mercury/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) @@ -738,7 +738,7 @@ taste_description = "metal" /datum/reagent/lithium/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) From 89c5e5628806b113ff5627edf5ef4bd193fef49e Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 06:34:43 -0700 Subject: [PATCH 012/100] Automatic changelog generation for PR #26731 [ci skip] --- html/changelogs/AutoChangeLog-pr-26731.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26731.yml diff --git a/html/changelogs/AutoChangeLog-pr-26731.yml b/html/changelogs/AutoChangeLog-pr-26731.yml new file mode 100644 index 00000000000..c55c645e6e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26731.yml @@ -0,0 +1,4 @@ +author: "Swindly" +delete-after: True +changes: + - tweak: "Mercury and Lithium make people move when not in space instead of when in space." From 20ac81d9a55fbaf224d5823a3b492d8e1bbf2f46 Mon Sep 17 00:00:00 2001 From: Really-Good-Soda-Flavor Date: Mon, 1 May 2017 09:35:18 -0400 Subject: [PATCH 013/100] A bunch of sparks to do_sparks (#26728) * A bunch of sparks to do_sparks * Whoops! --- code/modules/mining/machine_redemption.dm | 4 +--- code/modules/mining/machine_vending.dm | 4 +--- code/modules/mob/living/carbon/carbon_defense.dm | 4 +--- code/modules/mob/living/simple_animal/bot/bot.dm | 8 ++------ code/modules/mob/living/simple_animal/bot/cleanbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/ed209bot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/floorbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/medbot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/mulebot.dm | 4 +--- code/modules/mob/living/simple_animal/bot/secbot.dm | 4 +--- code/modules/mob/living/simple_animal/hostile/hivebot.dm | 4 +--- code/modules/power/apc.dm | 8 ++------ code/modules/power/cable.dm | 4 +--- 13 files changed, 15 insertions(+), 45 deletions(-) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index db0b400fdaa..9b6e638df69 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -273,9 +273,7 @@ return /obj/machinery/mineral/ore_redemption/ex_act(severity, target) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) ..() //empty the redemption machine by stacks of at most max_amount (50 at this time) size diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 0d651518b75..34cff303246 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -193,9 +193,7 @@ qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) if(prob(50 / severity) && severity < 3) qdel(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 7963273e6db..5651ed66b05 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -119,9 +119,7 @@ visible_message("The [M.name] has shocked [src]!", \ "The [M.name] has shocked [src]!") - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) var/power = M.powerlevel + rand(0,3) Weaken(power) if(stuttering < power) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 62575dd69c5..856179afc01 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -287,17 +287,13 @@ to_chat(user, "The welder must be on for this task!") else if(W.force) //if force is non-zero - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) ..() /mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj) if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) if(prob(75) && Proj.damage > 0) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return ..() /mob/living/simple_animal/bot/emp_act(severity) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 4c5c2c14c53..190e6a7db4f 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -259,9 +259,7 @@ if(prob(50)) new /obj/item/bodypart/l_arm/robot(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /obj/machinery/bot_core/cleanbot diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 8c96a70cc0e..07ea0d7b5dd 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -390,9 +390,7 @@ Auto Patrol[]"}, if(lasercolor == "r") new /obj/item/clothing/suit/redtag(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c8208e7a3b4..fe2b08e777c 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -381,9 +381,7 @@ var/obj/item/stack/tile/plasteel/T = new (Tsec) T.amount = 1 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /obj/machinery/bot_core/floorbot diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index f1629296a7c..426c928af74 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -530,9 +530,7 @@ if(emagged && prob(25)) playsound(loc, 'sound/voice/minsult.ogg', 50, 0) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..() /mob/living/simple_animal/bot/medbot/proc/declare(crit_patient) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 30c2c4e9a9a..bdf4277438d 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -719,9 +719,7 @@ cell.update_icon() cell = null - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 1315793eeda..cba9e446ecd 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -397,9 +397,7 @@ Auto Patrol: []"}, if(prob(50)) new /obj/item/bodypart/l_arm/robot(Tsec) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) new /obj/effect/decal/cleanable/oil(loc) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 7c751f70f4d..43290b860d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -53,7 +53,5 @@ ranged = 1 /mob/living/simple_animal/hostile/hivebot/death(gibbed) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) ..(1) \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 46332854887..6c6a088644a 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -497,9 +497,7 @@ var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return C.use(10) to_chat(user, "You add cables to the APC frame.") @@ -1181,9 +1179,7 @@ /obj/machinery/power/apc/proc/shock(mob/user, prb) if(!prob(prb)) return 0 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) if(isalien(user)) return 0 if(electrocute_mob(user, src, src, 1, TRUE)) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4f4c6e4d1f0..d160d69daa7 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -156,9 +156,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!prob(prb)) return 0 if (electrocute_mob(user, powernet, src, siemens_coeff)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return 1 else return 0 From a9b6cb216c55d77592de0ef678ceac71fdb13dad Mon Sep 17 00:00:00 2001 From: MMMiracles Date: Mon, 1 May 2017 09:35:48 -0400 Subject: [PATCH 014/100] Cerestation Tweaks MKV (#26730) * tweak the tweaker * bridges 2.0 * rdoffice * missing wire --- _maps/map_files/Cerestation/cerestation.dmm | 12862 ++++++++++++------ 1 file changed, 8937 insertions(+), 3925 deletions(-) diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm index cf2c5614634..23fc961f770 100644 --- a/_maps/map_files/Cerestation/cerestation.dmm +++ b/_maps/map_files/Cerestation/cerestation.dmm @@ -1922,9 +1922,6 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/vault{ baseturf = /turf/open/floor/plating/asteroid/airless; dir = 8 @@ -1948,14 +1945,12 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/structure/cable/orange{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/vault{ baseturf = /turf/open/floor/plating/asteroid/airless; dir = 8 @@ -3744,11 +3739,15 @@ }, /area/ai_monitored/security/armory) "ahq" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 8; + layer = 2.4; + on = 1 }, -/turf/open/floor/plating/asteroid, -/area/security/transfer) +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) "ahr" = ( /obj/structure/cable/orange{ d1 = 1; @@ -4531,20 +4530,13 @@ }, /area/security/transfer) "aiQ" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Security Transfer Range APC"; - pixel_x = 0; - pixel_y = 24 +/obj/structure/chair{ + dir = 4 }, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/turf/open/floor/plating/astplate{ +/turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/security/transfer) +/area/security/prison) "aiR" = ( /obj/structure/rack, /obj/item/weapon/pickaxe/mini, @@ -4952,10 +4944,13 @@ }, /area/security/transfer) "ajJ" = ( -/turf/open/floor/plating/astplate{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/security/transfer) +/area/security/prison) "ajK" = ( /obj/structure/rack, /obj/item/weapon/shovel, @@ -5360,20 +5355,35 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/door/airlock/security{ + name = "Interrogation Room"; + req_access_txt = "0"; + req_one_access_txt = "38;2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"akC" = ( +/obj/machinery/light/small, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 8; + icon_state = "1-8" }, /turf/open/floor/plating/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, /area/security/transfer) -"akC" = ( -/obj/machinery/light/small, -/turf/open/floor/plating/asteroid, -/area/security/transfer) "akD" = ( /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/asteroid, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless; + icon_plating = "asteroid_dug"; + icon_state = "asteroid_dug"; + name = "ditch" + }, /area/security/transfer) "akE" = ( /obj/structure/disposalpipe/segment, @@ -5719,15 +5729,35 @@ d2 = 2; icon_state = "1-2" }, -/turf/open/floor/plating{ +/obj/structure/cable/orange{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/security/transfer) +/area/security/prison) "alm" = ( -/turf/closed/wall/r_wall{ +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/machinery/camera{ + c_tag = "Brig Cells North 2" + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/security/transfer) +/area/security/prison) "aln" = ( /obj/structure/mineral_door/iron{ name = "Transfer Center" @@ -5928,30 +5958,40 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/door/airlock/security{ - name = "Inmate Transfer Facility"; - req_access_txt = "2" - }, -/turf/open/floor/plating{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/security/transfer) +/area/security/prison) "alL" = ( /obj/machinery/light/small{ dir = 8 }, /obj/item/weapon/ore/glass, -/turf/open/floor/plating/asteroid, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless; + icon_plating = "asteroid_dug"; + icon_state = "asteroid_dug"; + name = "ditch" + }, /area/security/transfer) "alM" = ( /obj/item/weapon/shovel, -/turf/open/floor/plating/astplate{ - baseturf = /turf/open/floor/plating/asteroid/airless +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless; + icon_plating = "asteroid_dug"; + icon_state = "asteroid_dug"; + name = "ditch" }, /area/security/transfer) "alN" = ( /obj/item/weapon/ore/glass, -/turf/open/floor/plating/asteroid, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless; + icon_plating = "asteroid_dug"; + icon_state = "asteroid_dug"; + name = "ditch" + }, /area/security/transfer) "alO" = ( /obj/structure/closet/emcloset, @@ -6391,9 +6431,6 @@ }, /area/security/prison) "amA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/cable/orange{ d1 = 1; d2 = 4; @@ -6404,6 +6441,7 @@ d2 = 8; icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -6414,20 +6452,15 @@ d2 = 4; icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /obj/structure/cable/orange{ d1 = 2; d2 = 8; icon_state = "2-8" }, -/obj/machinery/camera{ - c_tag = "Brig Cells North 2" - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -9004,32 +9037,34 @@ }, /obj/structure/grille, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "ary" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "arz" = ( /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Command-Service Bridge" + }) "arA" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"arB" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 4"; + dir = 8; + network = list("SS13") }, /turf/open/floor/engine, -/area/space) -"arB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/grille, -/turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "arC" = ( /turf/closed/wall{ baseturf = /turf/open/floor/plating/asteroid/airless @@ -15851,6 +15886,10 @@ req_one_access_txt = "19;41" }, /obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/preopen{ + id = "bridge"; + name = "Emergency Blast Door" + }, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -15881,6 +15920,10 @@ req_one_access_txt = "19;41" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/preopen{ + id = "bridge"; + name = "Emergency Blast Door" + }, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -17888,7 +17931,6 @@ pixel_x = 5; pixel_y = 3 }, -/obj/item/weapon/stamp, /obj/item/device/radio/intercom{ broadcasting = 0; name = "Station Intercom (General)"; @@ -17896,6 +17938,7 @@ }, /obj/item/stack/packageWrap, /obj/item/device/destTagger, +/obj/item/weapon/stamp, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -22499,8 +22542,13 @@ icon_state = "1-4" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aPn" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -22514,8 +22562,13 @@ pixel_x = 0 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aPo" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -22533,7 +22586,9 @@ }, /obj/structure/grille, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aPp" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -22545,25 +22600,31 @@ }, /obj/structure/grille, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aPq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"aPr" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/structure/grille, -/turf/open/space, -/area/space) -"aPr" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 1 }, -/obj/structure/grille, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aPs" = ( /obj/structure/grille, /obj/machinery/door/firedoor, @@ -23762,11 +23823,10 @@ }, /area/hallway/primary/fore) "aQS" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "aQT" = ( /obj/structure/window/reinforced{ dir = 1 @@ -23788,15 +23848,22 @@ /turf/open/floor/engine, /area/space) "aQV" = ( -/obj/machinery/door/airlock/glass, -/turf/open/floor/plasteel/neutral/corner{ - tag = "icon-neutralcorner (NORTH)"; - icon_state = "neutralcorner"; - dir = 1; - baseturf = /turf/open/floor/plating/asteroid/airless +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/hallway/primary/fore) +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aQW" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -23805,13 +23872,10 @@ }, /area/hallway/primary/fore) "aQX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/structure/cable/orange{ - d1 = 1; - d2 = 4; - icon_state = "1-4" + d1 = 4; + d2 = 8; + icon_state = "4-8" }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; @@ -24994,9 +25058,10 @@ }, /area/hallway/primary/fore) "aSQ" = ( -/obj/structure/window/reinforced, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "aSR" = ( /obj/machinery/door/airlock/glass, /turf/open/floor/plasteel/neutral/corner{ @@ -25440,8 +25505,11 @@ dir = 6 }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aTD" = ( /obj/structure/window/reinforced{ dir = 1 @@ -25451,8 +25519,11 @@ dir = 4 }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aTE" = ( /obj/structure/window/reinforced{ dir = 1 @@ -25463,7 +25534,9 @@ }, /obj/structure/grille, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) "aTF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/atmos{ @@ -27380,6 +27453,9 @@ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -27850,16 +27926,27 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Service Bridge" + }) "aXD" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ dir = 8 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Service Bridge" + }) "aXE" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, @@ -27910,8 +27997,13 @@ dir = 10 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aXJ" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -27926,8 +28018,14 @@ dir = 6 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aXK" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -28036,8 +28134,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Service Bridge" + }) "aXT" = ( /obj/structure/cable{ d1 = 1; @@ -28076,8 +28179,13 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aXY" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -28091,8 +28199,14 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aXZ" = ( /obj/machinery/power/solar_control{ id = "foresolar"; @@ -28416,8 +28530,13 @@ dir = 10 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "aYy" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -28425,8 +28544,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "aYz" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -28440,8 +28564,13 @@ icon_state = "1-2" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "aYA" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -28652,17 +28781,14 @@ name = "Civilian Asteroid" }) "aYU" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Medbay-Cargo Bridge"; - dir = 4; - icon_state = "camera" - }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "aYV" = ( /obj/machinery/conveyor/auto{ tag = "icon-conveyor0 (EAST)"; @@ -29061,8 +29187,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Service Bridge" + }) "aZN" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, @@ -29137,8 +29268,13 @@ dir = 9 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aZU" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -29153,8 +29289,14 @@ dir = 5 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "aZV" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -29212,6 +29354,9 @@ /area/hallway/primary/port) "bac" = ( /obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -29363,8 +29508,13 @@ icon_state = "1-8" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "bat" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -29410,6 +29560,12 @@ }, /area/hallway/primary/port) "bay" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -29746,6 +29902,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -29942,6 +30101,9 @@ pixel_x = -32 }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -30496,6 +30658,12 @@ pixel_x = 29; pixel_y = 0 }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (EAST)"; icon_state = "neutralcorner"; @@ -30571,6 +30739,9 @@ pixel_x = -24 }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -31180,6 +31351,11 @@ d2 = 8; icon_state = "2-8" }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -32150,6 +32326,9 @@ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -33966,6 +34145,9 @@ dir = 8; icon_state = "pipe-c" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -34487,6 +34669,12 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -34496,6 +34684,12 @@ dir = 1; on = 1 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -37957,6 +38151,12 @@ icon_state = "camera"; network = list("SS13") }, +/obj/machinery/button/door{ + id = "cmooffice"; + name = "Office Emergency Lockdown"; + pixel_x = 0; + pixel_y = -24 + }, /mob/living/simple_animal/pet/cat/Runtime, /turf/open/floor/plasteel/barber{ baseturf = /turf/open/floor/plating/asteroid/airless @@ -38438,8 +38638,13 @@ dir = 5 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bpN" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -38453,8 +38658,13 @@ dir = 4 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bpO" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -38467,8 +38677,13 @@ dir = 9 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bpP" = ( /obj/machinery/light{ dir = 4 @@ -38551,8 +38766,13 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bpW" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -38569,8 +38789,13 @@ dir = 4 }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bpX" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, @@ -38587,8 +38812,13 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bpY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -38635,6 +38865,9 @@ /obj/structure/window/reinforced/fulltile, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmooffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -41048,15 +41281,24 @@ /turf/open/floor/engine, /area/space) "btW" = ( -/obj/structure/window/reinforced, -/obj/machinery/camera{ - c_tag = "Service-Engineering Bridge 2"; - dir = 1 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "btX" = ( /obj/machinery/door/airlock/glass, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41069,6 +41311,12 @@ pixel_x = 0; pixel_y = -29 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41077,6 +41325,12 @@ /area/hallway/primary/central) "btZ" = ( /obj/machinery/light, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41087,6 +41341,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41104,6 +41364,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41112,6 +41378,12 @@ /area/hallway/primary/central) "buc" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -41122,6 +41394,12 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -41136,6 +41414,11 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -41309,12 +41592,24 @@ dir = 2; icon_state = "pipe-c" }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, /area/hallway/primary/central) "bur" = ( /obj/machinery/light, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -41325,24 +41620,39 @@ pixel_x = 0; pixel_y = -29 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, /area/hallway/primary/central) "but" = ( /obj/machinery/door/airlock/glass, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, /area/hallway/primary/central) "buu" = ( -/obj/structure/window/reinforced, -/obj/machinery/camera{ - c_tag = "Medbay-Engineering Bridge"; - dir = 1 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "buv" = ( /obj/machinery/door/airlock/glass, /turf/open/floor/plasteel/neutral/corner{ @@ -41849,19 +42159,19 @@ dir = 6 }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/floor/plating/asteroid/airless, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bvv" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/grille, -/turf/open/space, -/area/space) +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bvw" = ( /obj/structure/window/reinforced{ dir = 1 @@ -41871,8 +42181,11 @@ dir = 10 }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "bvx" = ( /obj/machinery/door/airlock/maintenance{ name = "External Airlock Access"; @@ -42199,8 +42512,11 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bvW" = ( /obj/structure/window/reinforced{ dir = 1 @@ -42213,8 +42529,11 @@ dir = 4 }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bvX" = ( /obj/structure/window/reinforced{ dir = 1 @@ -42228,8 +42547,11 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "bvY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -53296,6 +53618,9 @@ icon_state = "0-4" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -53313,6 +53638,9 @@ icon_state = "4-8"; pixel_x = 0 }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -53338,6 +53666,9 @@ icon_state = "4-8"; pixel_x = 0 }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -53359,6 +53690,9 @@ icon_state = "0-8" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -54299,6 +54633,13 @@ pixel_y = 8; req_access_txt = "10;11" }, +/obj/machinery/button/door{ + id = "ceoffice"; + name = "Office Emergency Lockdown"; + pixel_x = -24; + pixel_y = -8; + req_access_txt = "10;11" + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -55644,6 +55985,7 @@ /area/atmos) "bSJ" = ( /obj/machinery/computer/apc_control, +/obj/machinery/light, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -55665,6 +56007,11 @@ /area/crew_quarters/chief) "bSL" = ( /obj/machinery/suit_storage_unit/ce, +/obj/machinery/airalarm{ + dir = 1; + icon_state = "alarm0"; + pixel_y = -22 + }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -58987,8 +59334,13 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "bYM" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -59004,8 +59356,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "bYN" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -59290,8 +59647,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "bZo" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -59305,8 +59667,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "bZp" = ( /obj/machinery/light{ dir = 8 @@ -61264,17 +61631,10 @@ name = "Central Asteroid Maintenance" }) "cdj" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/obj/machinery/camera{ - c_tag = "Docking-Medbay Bridge"; - dir = 8; - network = list("SS13") - }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "cdk" = ( /obj/structure/disposalpipe/junction{ icon_state = "pipe-j2"; @@ -61528,6 +61888,12 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -62223,6 +62589,12 @@ dir = 4; pixel_x = 24 }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -62678,21 +63050,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/turf/open/floor/plating/airless/astplate{ - baseturf = /turf/open/floor/plating/asteroid/airless - }, -/area/mine/unexplored{ - name = "Civilian Asteroid" - }) -"cfO" = ( +/obj/structure/grille, /obj/structure/window/reinforced{ dir = 8 }, +/turf/open/floor/plating/airless/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"cfO" = ( /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/port) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "cfP" = ( /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; @@ -62700,16 +63075,20 @@ }, /area/hallway/primary/port) "cfQ" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/port) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "cfR" = ( /obj/structure/window/reinforced{ dir = 8 @@ -62722,11 +63101,15 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/floor/plating/airless/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Civilian Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "cfS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -62768,8 +63151,13 @@ icon_state = "pipe-c" }, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "cfV" = ( /obj/structure/lattice/catwalk, /obj/structure/window/reinforced{ @@ -62785,8 +63173,13 @@ }, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "cfW" = ( /obj/structure/table, /obj/item/toy/figure/clown, @@ -62837,11 +63230,15 @@ pixel_x = 0 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/floor/plating/airless/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Civilian Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "cgb" = ( /obj/structure/window/reinforced{ @@ -62853,11 +63250,15 @@ d2 = 2; icon_state = "1-2" }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/floor/plating/airless/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Civilian Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "cgc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -62972,9 +63373,6 @@ name = "Port Asteroid Maintenance" }) "cgp" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, /obj/machinery/light{ dir = 8 }, @@ -62982,7 +63380,9 @@ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/port) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "cgq" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -63083,6 +63483,9 @@ icon_state = "tube1"; dir = 4 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -63167,6 +63570,9 @@ pixel_x = 28; pixel_y = 0 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -63224,26 +63630,24 @@ name = "Research Asteroid" }) "cgT" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating/airless/astplate{ +/turf/closed/wall/r_wall{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Research Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "cgU" = ( -/obj/structure/window/reinforced{ +/obj/machinery/light/small{ dir = 8 }, /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/aft) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "cgV" = ( /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; @@ -63251,36 +63655,31 @@ }, /area/hallway/primary/aft) "cgW" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, +/obj/structure/disposalpipe/segment, /obj/machinery/camera{ c_tag = "Service-Research Bridge"; dir = 9; icon_state = "camera" }, -/obj/structure/disposalpipe/segment, /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/aft) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "cgX" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, -/turf/open/floor/plating/airless/astplate{ +/turf/closed/wall/r_wall{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Research Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "cgY" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -63324,16 +63723,14 @@ name = "Aft Asteroid Maintenance" }) "chd" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/engine{ baseturf = /turf/open/floor/plating/asteroid/airless; name = "reinforced floor" }, -/area/hallway/primary/aft) +/area/construction/hallway{ + name = "Service-Science Bridge" + }) "che" = ( /obj/machinery/power/solar{ id = "portsolar"; @@ -63507,6 +63904,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -64193,11 +64595,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/open/floor/plating/airless/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Research Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "ciE" = ( /obj/structure/window/reinforced{ @@ -64211,11 +64617,15 @@ d2 = 4; icon_state = "1-4" }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4 + }, /turf/open/floor/plating/airless/astplate{ baseturf = /turf/open/floor/plating/asteroid/airless }, -/area/mine/unexplored{ - name = "Research Asteroid" +/area/construction/hallway{ + name = "Service-Science Bridge" }) "ciF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -68698,8 +69108,13 @@ /obj/structure/lattice/catwalk, /obj/structure/window/reinforced, /obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "cqD" = ( /turf/closed/wall{ baseturf = /turf/open/floor/plating/asteroid/airless @@ -69557,6 +69972,11 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/open/floor/plasteel/neutral/side{ baseturf = /turf/open/floor/plating/asteroid/airless; dir = 1; @@ -70509,6 +70929,12 @@ dir = 1; pixel_y = -24 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -70521,6 +70947,12 @@ dir = 4; icon_state = "pipe-c" }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -70532,6 +70964,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/plasteel/neutral/corner{ icon_state = "neutralcorner"; dir = 8; @@ -70539,44 +70977,50 @@ }, /area/hallway/primary/aft) "ctA" = ( -/obj/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/camera{ c_tag = "Research-Docking Bridge 1"; dir = 1; icon_state = "camera"; network = list("SS13") }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "ctB" = ( -/obj/structure/window/reinforced, -/obj/machinery/camera{ - c_tag = "Research-Docking Bridge 2"; - dir = 1; - icon_state = "camera"; - network = list("SS13") - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/power/apc{ + dir = 2; + name = "Science-Docking Bridge APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "ctC" = ( -/obj/structure/window/reinforced, -/obj/machinery/camera{ - c_tag = "Research-Docking Bridge 3"; - dir = 1; - icon_state = "camera"; - network = list("SS13") - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "ctD" = ( /obj/machinery/door/airlock/glass, /obj/structure/disposalpipe/segment{ @@ -70978,8 +71422,11 @@ /obj/structure/lattice/catwalk, /obj/structure/girder, /obj/structure/grille, +/obj/structure/window/reinforced, /turf/open/space, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "cul" = ( /obj/machinery/status_display{ density = 0; @@ -75746,6 +76193,9 @@ /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -75755,6 +76205,9 @@ /obj/structure/window/reinforced/fulltile, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -75773,6 +76226,9 @@ /obj/structure/window/reinforced/fulltile, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rdoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -76682,6 +77138,7 @@ icon_state = "camera"; network = list("SS13") }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/plasteel/whitepurple/side{ tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; @@ -76730,6 +77187,7 @@ /obj/machinery/newscaster/security_unit{ pixel_x = -28 }, +/obj/machinery/recharger, /turf/open/floor/plasteel/red/side{ icon_state = "red"; dir = 8; @@ -83054,7 +83512,9 @@ "cPD" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) "cPE" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/engine, @@ -83142,12 +83602,11 @@ /turf/open/floor/engine, /area/space) "cPT" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) "cPU" = ( /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless @@ -83339,6 +83798,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (EAST)"; icon_state = "neutralcorner"; @@ -83358,6 +83823,9 @@ "cQC" = ( /obj/machinery/door/airlock/glass, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -83414,6 +83882,9 @@ /area/hallway/primary/central) "cQJ" = ( /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -83846,14 +84317,13 @@ }, /area/hallway/primary/starboard) "cRM" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) "cRN" = ( /obj/structure/window/reinforced{ dir = 1 @@ -84231,7 +84701,9 @@ dir = 4 }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) "cSD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84805,6 +85277,12 @@ dir = 4; icon_state = "pipe-c" }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -84821,6 +85299,12 @@ "cTX" = ( /obj/machinery/door/airlock/glass, /obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, /turf/open/floor/plasteel/neutral/corner{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -85064,12 +85548,19 @@ }, /area/teleporter) "cUy" = ( -/obj/structure/window/reinforced, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) "cUz" = ( /obj/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -87179,6 +87670,10 @@ req_one_access = null; req_one_access_txt = "0" }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge"; + name = "Emergency Blast Door" + }, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -87192,6 +87687,10 @@ req_one_access = null; req_one_access_txt = "0" }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge"; + name = "Emergency Blast Door" + }, /turf/open/floor/plasteel/black{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -87277,6 +87776,9 @@ /obj/structure/window/reinforced/fulltile, /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "qmoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -87294,6 +87796,9 @@ "cZQ" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/grille, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "qmoffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -87530,6 +88035,11 @@ /area/quartermaster/qm) "dap" = ( /obj/structure/closet/secure_closet/quartermaster, +/obj/machinery/button/door{ + id = "qmoffice"; + name = "Office Emergency Lockdown"; + pixel_x = -24 + }, /turf/open/floor/plasteel/brown{ tag = "icon-brown (WEST)"; icon_state = "brown"; @@ -88359,6 +88869,9 @@ icon_state = "alarm0"; pixel_x = -22 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/neutral/corner{ tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; @@ -90292,6 +90805,9 @@ /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "cmooffice" + }, /turf/open/floor/plating{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -91711,7 +92227,6 @@ }, /obj/item/weapon/stamp/ce, /obj/item/weapon/pen, -/obj/machinery/light, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -91722,10 +92237,8 @@ d2 = 4; icon_state = "1-4" }, -/obj/machinery/airalarm{ - dir = 1; - icon_state = "alarm0"; - pixel_y = -22 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel/neutral{ baseturf = /turf/open/floor/plating/asteroid/airless @@ -92435,17 +92948,13 @@ name = "Central Asteroid Maintenance" }) "djU" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/obj/machinery/camera{ - c_tag = "Docking-Medbay Bridge 2"; - dir = 8; - network = list("SS13") +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/engine, -/area/space) +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) "djV" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -93766,6 +94275,12 @@ scrub_N2O = 0; scrub_Toxins = 0 }, +/obj/machinery/button/door{ + id = "rdoffice"; + name = "Office Emergency Lockdown"; + pixel_x = -24; + pixel_y = -8 + }, /turf/open/floor/plasteel/cafeteria{ baseturf = /turf/open/floor/plating/asteroid/airless }, @@ -94369,10 +94884,10 @@ /obj/structure/disposaloutlet{ dir = 8 }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, /obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/space, /area/space) "dnB" = ( @@ -96655,6 +97170,4503 @@ }, /turf/closed/wall/r_wall, /area/maintenance/incinerator) +"dsd" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Armory APC"; + pixel_x = 0; + pixel_y = 24 + }, +/obj/structure/cable/orange{ + d2 = 4; + icon_state = "0-4" + }, +/obj/structure/rack, +/obj/item/weapon/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/weapon/reagent_containers/glass/bottle/morphine, +/turf/open/floor/plasteel/darkred/side{ + icon_state = "darkred"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/ai_monitored/security/armory) +"dse" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/rack, +/obj/item/weapon/storage/lockbox/loyalty, +/obj/item/weapon/storage/box/trackimp, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/darkred/side{ + icon_state = "darkred"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/ai_monitored/security/armory) +"dsf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/ai_monitored/security/armory) +"dsg" = ( +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access_txt = "3" + }, +/obj/effect/spawner/lootdrop/armory_contraband{ + loot = list(/obj/item/weapon/gun/ballistic/automatic/pistol = 5, /obj/item/weapon/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/weapon/gun/ballistic/revolver/mateba, /obj/item/weapon/gun/ballistic/automatic/pistol/deagle, /obj/item/weapon/storage/box/syndie_kit/throwing_weapons = 3) + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/ai_monitored/security/armory) +"dsh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsi" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsj" = ( +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsk" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsl" = ( +/obj/machinery/camera{ + c_tag = "Security Interrogation"; + dir = 9; + icon_state = "camera"; + network = list("SS13"); + tag = "null" + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsn" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dso" = ( +/obj/structure/table/wood, +/obj/item/device/flashlight/lamp, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsp" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsq" = ( +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dss" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dst" = ( +/obj/structure/table/wood, +/obj/item/device/taperecorder, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsu" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsv" = ( +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/black{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsB" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door_timer{ + id = "Cell 8"; + name = "Cell 8"; + pixel_x = 32; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsC" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Security Transfer Range APC"; + pixel_x = 0; + pixel_y = 24 + }, +/obj/structure/cable/orange{ + d2 = 4; + icon_state = "0-4" + }, +/turf/open/floor/plating/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsD" = ( +/obj/structure/cable/orange{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/open/floor/plating/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsE" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/orange{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsF" = ( +/obj/structure/mineral_door/iron{ + name = "Transfer Center" + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plating/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsG" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door_timer{ + id = "Cell 7"; + name = "Cell 7"; + pixel_x = 32; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsH" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/orange{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/prison) +"dsI" = ( +/obj/machinery/door/airlock/security{ + name = "Inmate Transfer Facility"; + req_access_txt = "2" + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsJ" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsK" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsL" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsM" = ( +/obj/structure/cable/orange{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/open/floor/plating/astplate{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/security/transfer) +"dsN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/firedoor, +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/crew_quarters/chief) +"dsO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/glass_engineering{ + name = "Chief Engineer's Office"; + req_access_txt = "56" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/crew_quarters/chief) +"dsP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/firedoor, +/obj/structure/grille, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "ceoffice" + }, +/turf/open/floor/plating{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/crew_quarters/chief) +"dsQ" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 4"; + dir = 8; + network = list("SS13") + }, +/turf/open/space, +/area/space) +"dsR" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 1"; + dir = 8; + network = list("SS13") + }, +/turf/open/space, +/area/space) +"dsS" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 2"; + network = list("SS13") + }, +/turf/open/space, +/area/space) +"dsT" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 3"; + network = list("SS13") + }, +/turf/open/space, +/area/space) +"dsU" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge Ceneter"; + dir = 1 + }, +/turf/open/space, +/area/space) +"dsV" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dsW" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dsX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dsY" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dsZ" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dta" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtc" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtd" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dte" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtf" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dth" = ( +/obj/machinery/camera{ + c_tag = "Command-Service Bridge"; + dir = 4; + icon_state = "camera" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dti" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtj" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtl" = ( +/obj/machinery/camera{ + c_tag = "Command-Engineering Bridge"; + dir = 8; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtn" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dto" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtp" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtq" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dts" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/power/apc{ + dir = 8; + name = "Medical-Cargo Bridge APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtt" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtu" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtv" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtx" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "Command-Service Bridge APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4"; + d2 = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dty" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtz" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtA" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtD" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtE" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtF" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtH" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtI" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtK" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtL" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtN" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtO" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtR" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dtS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dtU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Medbay-Cargo Bridge"; + dir = 4; + icon_state = "camera" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtW" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtX" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtY" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dtZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dua" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dub" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"duc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dud" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"due" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"duf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dug" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"duh" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dui" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"duj" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"duk" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/port) +"dul" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/open/floor/plasteel/neutral{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dum" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dun" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dup" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dur" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dus" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dut" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"duu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"duv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dux" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duB" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"duC" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"duD" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"duE" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duF" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duG" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duH" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duI" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duJ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duK" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duL" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duM" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duN" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duO" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duP" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duQ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duR" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duS" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duT" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duU" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duV" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duW" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duX" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duY" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"duZ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dva" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvb" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvc" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvd" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dve" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvf" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvg" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvh" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvi" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvj" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvk" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvl" = ( +/obj/machinery/camera{ + c_tag = "Service-Engineering Bridge 1"; + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvm" = ( +/obj/machinery/power/apc{ + dir = 2; + name = "Service-Engineering Bridge APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvn" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvo" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvp" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvq" = ( +/obj/machinery/camera{ + c_tag = "Service-Engineering Bridge 2"; + dir = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvr" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvs" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvt" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvu" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvv" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvw" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dvx" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvy" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvz" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvA" = ( +/obj/machinery/camera{ + c_tag = "Medbay-Engineering Bridge"; + dir = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvB" = ( +/obj/machinery/power/apc{ + dir = 2; + name = "Engineering-Medical Bridge APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvC" = ( +/obj/machinery/camera{ + c_tag = "Medbay-Engineering Bridge 2"; + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dvD" = ( +/turf/closed/wall{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvE" = ( +/turf/closed/wall{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvF" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvG" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvH" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvI" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvJ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvK" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvL" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvM" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvN" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvO" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvP" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvQ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvR" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvS" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvT" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvU" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvV" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvW" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvX" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvY" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dvZ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Service-Engineering Bridge" + }) +"dwa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dwb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dwc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Engineering-Medical Bridge" + }) +"dwd" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwe" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwf" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwg" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwh" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwi" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwj" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwk" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwl" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwm" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwn" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwo" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwq" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwr" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dws" = ( +/obj/machinery/camera{ + c_tag = "Docking-Medbay Bridge"; + dir = 8; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwu" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwv" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dww" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwx" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwy" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "Docking-Medical Bridge APC"; + pixel_x = 24; + pixel_y = 0 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwE" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwF" = ( +/obj/machinery/camera{ + c_tag = "Docking-Medbay Bridge 2"; + dir = 8; + network = list("SS13") + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dwH" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwM" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwN" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/starboard) +"dwO" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwP" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwQ" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwR" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwS" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwT" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwU" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwV" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwW" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwX" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwY" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dwZ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxa" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxb" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxc" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxd" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxe" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxf" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxg" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxh" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxi" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxj" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxk" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxl" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxm" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxn" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxo" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxp" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxq" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxr" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxs" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxt" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxu" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxv" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxw" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxx" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxy" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxz" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxA" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxB" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxC" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxD" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxE" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxF" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxG" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxH" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxI" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxJ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxK" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxL" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxM" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxN" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxO" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxP" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxQ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxR" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxS" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxT" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxU" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxV" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxW" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxX" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxY" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dxZ" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dya" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyb" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyc" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyd" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dye" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyf" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyg" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyh" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyi" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyj" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyk" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyl" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dym" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyn" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyo" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyp" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyq" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyr" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dys" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyt" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyu" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyv" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyw" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyx" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyy" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyz" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyA" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyB" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyC" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyD" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyE" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyF" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyG" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyH" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyI" = ( +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyJ" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/aft) +"dyK" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/aft) +"dyL" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + icon_state = "neutralcorner"; + dir = 8; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/aft) +"dyM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research-Docking Bridge 5"; + dir = 1; + icon_state = "camera"; + network = list("SS13") + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research-Docking Bridge 2"; + dir = 1; + icon_state = "camera"; + network = list("SS13") + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research-Docking Bridge 3"; + dir = 1; + icon_state = "camera"; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dyZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dza" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Research-Docking Bridge 4"; + dir = 1; + icon_state = "camera"; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzb" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzc" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzd" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dze" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzf" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzg" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzh" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzi" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzj" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dzk" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"dzl" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"dzm" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"dzn" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/space, +/area/space) +"dzo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/structure/grille, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzp" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzx" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzG" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzN" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzP" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzQ" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 1"; + dir = 8; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzS" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzU" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzV" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dzZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAf" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAi" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAm" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAp" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAz" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/grille, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAA" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 2"; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAB" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 3"; + network = list("SS13") + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAC" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Cargo-AI-Command Bridge APC"; + pixel_y = 24 + }, +/obj/structure/cable/orange{ + d2 = 4; + icon_state = "0-4" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAD" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAE" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAF" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAG" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAH" = ( +/obj/machinery/camera{ + c_tag = "Core-Command-Cargo Bridge 3"; + network = list("SS13") + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAI" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAJ" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAK" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAL" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAM" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAN" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAO" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAP" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAQ" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (NORTH)"; + icon_state = "neutralcorner"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/fore) +"dAR" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (NORTH)"; + icon_state = "neutralcorner"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/fore) +"dAS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (NORTH)"; + icon_state = "neutralcorner"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/fore) +"dAT" = ( +/obj/effect/landmark/lightsout, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAU" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAV" = ( +/obj/machinery/light/small, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAW" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAX" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAY" = ( +/obj/machinery/light/small, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dAZ" = ( +/obj/machinery/light, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBa" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBb" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBc" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBd" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBe" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBf" = ( +/turf/closed/wall/r_wall, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBg" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/turf/open/space, +/area/construction/hallway{ + name = "Cargo-AI-Command Bridge" + }) +"dBh" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBi" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBj" = ( +/obj/effect/landmark/lightsout, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Service Bridge" + }) +"dBk" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBl" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "Command-Engineering Bridge APC"; + pixel_x = 24; + pixel_y = 0 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1; + d2 = 2 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBm" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBn" = ( +/obj/effect/landmark/lightsout, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Medical-Cargo Bridge" + }) +"dBo" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBp" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBq" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBr" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBs" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBt" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBu" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Command-Engineering Bridge" + }) +"dBv" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (EAST)"; + icon_state = "neutralcorner"; + dir = 4; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dBw" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (EAST)"; + icon_state = "neutralcorner"; + dir = 4; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dBx" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (EAST)"; + icon_state = "neutralcorner"; + dir = 4; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dBy" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (EAST)"; + icon_state = "neutralcorner"; + dir = 4; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dBz" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (EAST)"; + icon_state = "neutralcorner"; + dir = 4; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/central) +"dBA" = ( +/obj/effect/landmark/lightsout, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Docking-Medical Bridge" + }) +"dBB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"dBC" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/power/apc{ + dir = 4; + name = "Service-Science Bridge APC"; + pixel_x = 23; + pixel_y = 2 + }, +/obj/structure/cable, +/turf/open/floor/engine{ + baseturf = /turf/open/floor/plating/asteroid/airless; + name = "reinforced floor" + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"dBD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/closed/wall/r_wall{ + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"dBE" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/engine{ + baseturf = /turf/open/floor/plating/asteroid/airless; + name = "reinforced floor" + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"dBF" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/engine{ + baseturf = /turf/open/floor/plating/asteroid/airless; + name = "reinforced floor" + }, +/area/construction/hallway{ + name = "Service-Science Bridge" + }) +"dBG" = ( +/obj/effect/landmark/lightsout, +/turf/open/floor/engine, +/area/construction/hallway{ + name = "Science-Docking Bridge" + }) +"dBH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/neutral/corner{ + tag = "icon-neutralcorner (NORTH)"; + icon_state = "neutralcorner"; + dir = 1; + baseturf = /turf/open/floor/plating/asteroid/airless + }, +/area/hallway/primary/fore) (1,1,1) = {" aaa @@ -108308,7 +113320,7 @@ abE aaa aaa aaa -aaa +cKF aaa aaa aaa @@ -109523,11 +114535,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -109780,11 +114792,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -110037,11 +115049,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -110294,11 +115306,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -110551,11 +115563,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -110808,11 +115820,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC aaa @@ -110879,18 +115891,18 @@ aLm aXC aXS aXS +dsX aXS aXS aXS +dsX +aXS +aXS +dsX aXS aXS aXS -aXS -aXS -aXS -aXS -aXS -aXS +dsX aXS aXS aZM @@ -110964,16 +115976,16 @@ cfN cga cga cga +dBB +cga +cga +dBB +cga +cga +dBB cga cga cga -cgT -cgT -cgT -cgT -cgT -cgT -cgT ciD cjg cjg @@ -111065,11 +116077,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa abC abE @@ -111133,24 +116145,24 @@ aSU aVB aSU aSR -ary -ary -ary -ary -ary -ary -ary -ary -aYI -ary -ary -ary -ary -ary -ary -ary -ary -ary +dsV +dsV +dsV +dsV +dsV +dsV +dsV +dth +dsV +dsV +dtx +dsV +dsV +dsV +dsV +dsV +dsV +dsV baa baw baY @@ -111225,13 +116237,13 @@ cgp cfO cfO cgU -cgU -cgU -cgU -cgU -cgU -cgU -cgU +cfO +cfO +cgp +cfO +cfO +cfO +cfO cjh cjF cjF @@ -111390,24 +116402,24 @@ aRD aRD aRD aRP -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz +dsV +dsV +dsV +dsV +dsV +dsV +dsV +dsV +dBj +dsV +dty +dsV +dsV +dsV +dsV +dsV +dsV +dsV bab bax baZ @@ -111474,21 +116486,21 @@ bTq bax bax bab -cfP -cfP -cfP -cfP -cfP -cfP -cfP -cgV -cgV -cgV -cgV -cgV -cgV -cgV -cgV +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO +cfO cji cjG cjG @@ -111591,7 +116603,7 @@ abE abW acH acH -abW +acO acO acO acO @@ -111647,26 +116659,26 @@ aSN aSN aSN aSP -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA +dsV +dsV +dsV +dsY +dsV +dsV +dsV +dti +dsV +dsV +dtz +dtG +dtG +dtG +dtQ +dtG +dtG +dtG bac -bay +duk bba bbA bbA @@ -111735,17 +116747,17 @@ cfQ cfQ cfQ cfQ -cfQ -cfQ -cfQ +dBC +dBE +dBE cgW -chd -chd -cho -chd -chd -chd -chd +dBE +dBE +dBE +dBE +dBE +dBE +dBE cjj cTY ckn @@ -111848,7 +116860,7 @@ abE abW acH acH -abW +acO acO acO acO @@ -111907,18 +116919,18 @@ aLm aXD aXD aXD +dsZ aXD aXD aXD +dsZ +aXD +aXD +dsZ aXD aXD aXD -aXD -aXD -aXD -aXD -aXD -aXD +dsZ aXD aXD aXD @@ -111992,16 +117004,16 @@ cfR cgb cgb cgb +dBD +cgb +cgb +dBD +cgb +cgb +dBD cgb cgb cgb -cgX -cgX -cgX -cgX -cgX -cgX -cgX ciE cjg cjg @@ -112105,7 +117117,6 @@ abE abW acH acH -abW acO acO adF @@ -112114,6 +117125,7 @@ aeB aeB aeB aeB +aeB agr doX doZ @@ -112362,10 +117374,10 @@ abW abW abW abW -abW acO acO -adG +dsd +aec aeb aeC aeY @@ -112610,7 +117622,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa abE @@ -112619,15 +117631,15 @@ abW abW abW abW -abW acO acO -adH +dse aec aeD aeD aeD aeD +aeD agt acO acO @@ -112867,7 +117879,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa abE @@ -112876,10 +117888,10 @@ abE abW abW abW -abW acO acO adI +dsf aed aeE aeZ @@ -113124,7 +118136,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa abE @@ -113133,12 +118145,12 @@ abE abW abW abW -abW acO acO adJ aee aeF +aeD afa afu afO @@ -113381,7 +118393,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa abE @@ -113390,12 +118402,12 @@ abE abW abW abW -abW acO acO adK aef aef +aee afb aee afP @@ -113647,10 +118659,10 @@ abE abW abW abW -abW acO acO -adL +adM +aef aef aef aef @@ -113904,12 +118916,12 @@ abE abW abW abW -abW acO acO adM aeg aeG +dsg afc afv aeG @@ -114161,7 +119173,6 @@ abE abW abW abW -abW acO acO doV @@ -114173,6 +119184,7 @@ acO acO acO acO +acO afr afr afr @@ -114418,7 +119430,6 @@ abE abW abW acH -acH acO acO acO @@ -114428,20 +119439,21 @@ acO acO acO acO -acO -acO -aiO -ajI +afr +afr +afr +dsr +dsm akB all alK amA ant +apr +apr aol apr apr -apr -aol asV apr apr @@ -114684,22 +119696,22 @@ abW abW abW abW -abW -agy -agy -aiP -ajJ -ajJ -alm afr +dsh +dsm +dss +ajJ +akt +alm +dsA amB -anp -aom -aps +dsB aqg anp -aom -asW +dsE +dsG +dsH +anp aqg anp aom @@ -114941,13 +119953,11 @@ abW abW abW abW -abW -agy -agz -aiQ -agA -ajJ -ajJ +afr +dsi +dsn +dsn +dsx afr amC anu @@ -114957,6 +119967,8 @@ amC ard aon alH +dsI +alH amC avf aon @@ -115198,13 +120210,11 @@ acH acH abW abW -abW -afR -afR -agA -agA -agA -agA +afr +dsj +dso +dst +dsx afr amD ann @@ -115214,6 +120224,8 @@ amD ann aoo alH +dsJ +alH amD ann aoo @@ -115454,14 +120466,12 @@ acH acH acH abW -acH -acH -afR -afR -agy -ajJ -agA -agA +abW +afr +dsk +dsp +dsp +dsz afr amE anv @@ -115471,6 +120481,8 @@ aqh ann ann alH +dsJ +alH auc ann ann @@ -115711,14 +120723,12 @@ acH acH acH abW -acH -acH -acH -afR -agz +abW +afr +dsl +dsj +dsj ahq -agA -agA afr amF anw @@ -115728,6 +120738,8 @@ aqi anw asb alH +aiP +alH aud anw awt @@ -115968,14 +120980,7 @@ abW acH acH acH -acH -afR -agy -agy -agA -agA -agA -agA +abW afr afr afr @@ -115990,6 +120995,13 @@ afr afr afr afr +dsL +afr +afr +afr +afr +afr +afr afr afr afr @@ -116225,23 +121237,23 @@ abW acH acH acH -afR +abW +abW +abW +abW +abW +abW +abW +agy +agy +agy +agy +agy agy agA agA -agA -agA -ajJ -agA +aiP agy -agy -agy -agy -agy -agy -agy -adZ -adZ adZ adZ adZ @@ -116482,26 +121494,26 @@ abW acH acH acH -afR -agz -ahq -agA -agA -agA -agA +acH +acH +acH +acH +acH +acH +acH agy aig agy +agz +dsC +agz +aiO +ajI +dsM agy -agA -agA -agy -agy -afS -afS -afS -afV -afV +adZ +adZ +adZ adZ adZ azY @@ -116739,28 +121751,28 @@ abW abW abW acH -afR -agA -agA -aie -agA -agA -akC -agz +acH +acH +acH +acH +acH +acH +acH +agy alL akD amG -amG -alN -agA +aiP +agz +dsF agy -afV -asX -aue -avg -afS -axD -afS +agy +agy +adZ +adZ +adZ +adZ +adZ azY aBs aCi @@ -116996,28 +122008,28 @@ abW abW abW acH -afR -agA -agA -agA -agA -agA -akD -aln +acH +acH +acH +acH +acH +acH +acH +agy alM amG anx -amG -amG +dsD +ajI akC agz -afV -aym -auf -aym afS -akp -aOF +afS +afS +afV +afV +axD +afS cJJ aBt aCj @@ -117253,13 +122265,13 @@ abW abW abW acH -afR -agy -agA -aif -aiR -ajK -agy +acH +acH +acH +acH +acH +acH +abW agy alN alN @@ -117269,11 +122281,11 @@ agA afR afR afV -asY -aym -cYZ -akH -axE +asX +aue +avg +afS +akp ayA azY aBu @@ -117340,9 +122352,9 @@ aZm bon bpM cRM -arz -arz -bvm +duE +duE +dvD bwV byz bzM @@ -117511,25 +122523,25 @@ abW abW acH acH -agy -agy -aig +abW +abW +acH +acH +acH +acH afR afR afR afR +aiR +ajK afR -afR -afR -afR -agy -afR -aez -afV -afV -afV -afV +acH afV +aym +auf +aym +afS akp cYo cJK @@ -117597,9 +122609,9 @@ bjB arw bpN cRM -arz -arz -bvm +duE +duE +dvD bwW bvm aZn @@ -117768,26 +122780,26 @@ abW abW abW abW -adZ -adZ -adZ -aez -aez -aez -aez -aez -aez -aez -aez -adZ -adZ -aez -adZ -aez -aez -adZ -afS -akp +abW +abW +abW +acH +acH +acH +acH +acH +acH +acH +acH +abW +abW +acH +afV +asY +aym +cYZ +akH +axE cZm cJK aBs @@ -117854,8 +122866,8 @@ aaa arw bpN cRM -arz -aSQ +duE +duE bvu bwX bjB @@ -118039,9 +123051,9 @@ aez aez aez aez -aez afV -afS +afV +afV afV afV cZj @@ -118109,10 +123121,10 @@ aaa aaa aaa arw -bpN -cRM -arz -aSQ +dum +duv +duE +duE bvv arw aaa @@ -118368,9 +123380,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -118625,9 +123637,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -118882,9 +123894,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -119139,9 +124151,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -119394,10 +124406,10 @@ aaa aaa aaa arw -bpN -cRM -arz -aSQ +dum +duv +duE +dvl bvv arw aaa @@ -119653,9 +124665,9 @@ aaa arw bpN cRM -arz -btV -bvv +duE +duE +dvF arw aaa aaa @@ -119910,9 +124922,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -120167,9 +125179,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -120424,9 +125436,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -120679,10 +125691,10 @@ aaa aaa aaa arw -bpN -cRM -arz -aSQ +dum +dux +duE +duE bvv arw aaa @@ -120938,9 +125950,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -121195,9 +126207,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -121452,9 +126464,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +duE +dvF arw aaa aaa @@ -121707,10 +126719,10 @@ aaa aaa aaa arw -bpN -cRM -arz -aSQ +dum +dux +duE +dvm bvv arw aaa @@ -121956,7 +126968,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa abC @@ -121966,9 +126978,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aaa @@ -122223,9 +127235,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aaa @@ -122480,9 +127492,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aaa @@ -122737,9 +127749,9 @@ aaa arw bpN cRM -arz -btW -bvv +duE +dvn +dvF arw aaa aaa @@ -122810,8 +127822,8 @@ cph cpM cqB crL -cjG -ctv +csz +dyJ cUn cjU ckB @@ -122992,10 +128004,10 @@ aaa aaa aaa arw -bpN -cRM -arz -aSQ +dum +duv +duE +dvq bvv arw aaa @@ -123251,9 +128263,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aaa @@ -123263,24 +128275,24 @@ bAd byQ bEj dpl -dpm +dpl dpn dpo dpp dpq dpr -dps -dpt +dpr +dpr +dpu +dpr +dpr +dpu +dpr +dpr +dpr +dpr +dpu dpu -dpv -dpw -dpx -dpy -dpz -dpB -dpD -dpF -dpH caf bBN bBN @@ -123325,7 +128337,7 @@ cpO cmY cjF cjG -ctv +dyK cUn cjU dlF @@ -123508,9 +128520,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aaa @@ -123582,7 +128594,7 @@ cpP cmY cjF cjG -ctv +dyK cUn cgN dlG @@ -123765,9 +128777,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aaa aZt @@ -124022,9 +129034,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aZt aZt @@ -124053,8 +129065,8 @@ bYp bXG bOM cbr -dpN -dpP +dpJ +dpL cMH byS cbr @@ -124277,10 +129289,10 @@ aZf aZf aaa arw -bpN -cRM -arz -aSQ +dum +duv +duE +dvn bvv arw aZt @@ -124311,8 +129323,8 @@ bXG bOM byS dfU -dpQ -dpS +dpJ +dpL byS cbr dgD @@ -124351,8 +129363,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk cgN @@ -124536,9 +129548,9 @@ aaa arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aZf aZt @@ -124570,9 +129582,9 @@ bAd diS djs dpT -dpW -dpY -dqa +dpp +dpq +dpL cMH cMH byS @@ -124608,9 +129620,9 @@ aaa aaa arw cqC -aQS -arz -dlz +dwX +dwX +cUy cuk cgN cgN @@ -124793,9 +129805,9 @@ aZf arw bpN cRM -arz -aSQ -bvv +duE +dvn +dvF arw aZf aZt @@ -124865,8 +129877,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -125050,8 +130062,8 @@ aZf boo bpO cRM -arz -aSQ +duE +dvn bvw bwY aZf @@ -125086,7 +130098,7 @@ cMV cbr byS cbr -dqc +dqb djm bAd aZt @@ -125122,8 +130134,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -125343,7 +130355,7 @@ cbr dgD cNc dht -dqd +dqb djO byS aZH @@ -125378,11 +130390,11 @@ aaa aaa aaa arw -cqC -aQS -arz -cUy -cuk +dwO +dxb +dwX +dyM +dwO aaa aaa aXR @@ -125565,7 +130577,7 @@ boq cQD cSs baO -bhM +dvr bal cKO bal @@ -125600,7 +130612,7 @@ cMW cbr cMH bAd -dqe +dqb djP djl aZH @@ -125636,8 +130648,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -125822,7 +130834,7 @@ bor cQW baN baO -bhM +dvr bal bwZ bal @@ -125857,7 +130869,7 @@ bOM bOM bOM byS -dqf +dqb bAe cMH aZH @@ -125893,8 +130905,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -126114,13 +131126,13 @@ cbi cbi bOM dge -dqg +dqb +dqr +dqr +dqs +dqs +dqr dqr -dqJ -dqR -dqZ -drh -drp aaa aaa aaa @@ -126150,8 +131162,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -126371,13 +131383,13 @@ cbj cbP bOM dfU -dqh +dqb dqs dqK dqS dra dri -drq +dqr aaa aaa aaa @@ -126407,8 +131419,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -126593,7 +131605,7 @@ bcY cQW baN baO -bhM +dvr bal bxa bcp @@ -126628,18 +131640,18 @@ cbi cbi bOM cbr -dqi -dqt +dqb +dqr +dqL dqL -dqT drb drj drr drx drD -drJ -drP -drV +drD +drD +drD drZ aaa aaa @@ -126663,11 +131675,11 @@ aaa aaa aaa arw -cqC -aQS -arz +dwO +dxg +dwX ctA -cuk +dwO abC abC aXR @@ -126892,10 +131904,10 @@ dqU drc drk drs -dry -drE +drs +drs drK -drQ +drO arw arw aaa @@ -126921,8 +131933,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -127143,17 +132155,17 @@ cbk bOM cbr dqk -dqv +dqr dqN dqV drd drl drt drz -drF +drt drL -drR -drW +drO +drO dsa aaa aaa @@ -127178,8 +132190,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -127399,8 +132411,8 @@ cbl cbQ bOM cbr -dql -dqw +dqk +dqs dqO dqW dre @@ -127435,8 +132447,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -127657,18 +132669,18 @@ cbk bOM cbr dqm -dqx +dqs dqP dqX drf drn drv drB -drH +drv drN -drT -drY -dsc +drO +drO +dsa aaa aaa aaa @@ -127692,8 +132704,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk abC @@ -127913,17 +132925,17 @@ bOM bOM bOM cbr -dqn -dqy -dqQ -dqY -drg -dro -drw -drC -drI +dqk +dqr +dqr +dqr +dqs +dqr +drs +drs +drs +drO drO -drU arw arw aaa @@ -127948,11 +132960,11 @@ aaa aaa aaa arw -cqC -aQS -arz +dwO +dxb +dwX cUy -cuk +dwO aaa aaa aXR @@ -128170,7 +133182,7 @@ cbm cbm bOM djs -dqo +dqk dgE byS aZH @@ -128206,8 +133218,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -128463,8 +133475,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -128720,8 +133732,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -128976,11 +133988,11 @@ aaa aaa aaa arw -cqC -aQS -arz -cUy -cuk +dwO +dxg +dwX +dyN +dwO aaa aaa aXR @@ -129199,7 +134211,7 @@ cbo bOM djG bAd -dqB +dqk bBN aZH aZt @@ -129234,10 +134246,10 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy -cuk +cqC aaa aaa aXR @@ -129440,7 +134452,7 @@ bOZ dhQ did div -bTM +dsN bUM bVM bRs @@ -129456,7 +134468,7 @@ cbS bOM bAd byS -dqC +dqk byS aZH aZH @@ -129491,8 +134503,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -129697,7 +134709,7 @@ dhF bQz die diw -bTM +dsO bUN bJx bTH @@ -129713,7 +134725,7 @@ cbo bOM bAd cMH -dqD +dqk byS aZH aZH @@ -129748,8 +134760,8 @@ aaa aaa arw cqC -aQS -arz +dwX +dwX cUy cuk aaa @@ -129954,7 +134966,7 @@ bPb dhS dif bSM -bTM +dsP bUO bVN bWA @@ -129970,7 +134982,7 @@ bOM bOM bAd bAd -dqE +dqk bBN aZH aZH @@ -130004,11 +135016,11 @@ aaa aaa aaa arw -cqC -aQS -arz +dwO +dxb +dwX ctB -cuk +dwO abC abC aXR @@ -130154,18 +135166,18 @@ aLm aXI aXX aXX +dta aXX aXX aXX +dta +aXX +aXX +dta aXX aXX aXX -aXX -aXX -aXX -aXX -aXX -aXX +dta aXX aXX aZT @@ -130227,7 +135239,7 @@ byS bAd byS cbr -dqF +dqk bBN aZH aZH @@ -130262,9 +135274,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dBG +dyO cuk aaa aaa @@ -130408,24 +135420,24 @@ aSU aSU aSU aSR -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary +dsW +dsW +dsW +dBh +dsW +dsW +dsW +dBi +dsW +dsW +dBi +dsW +dsW +dsW +dBh +dsW +dsW +dsW ban baN cQE @@ -130484,7 +135496,7 @@ djv byS bPt byP -dqG +dqk djk aZH aZt @@ -130519,9 +135531,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -130730,18 +135742,18 @@ bUR bVQ bWD dpA -dpC -dpE -dpG -dpI +dpA +dpA +dpA +dpA dpK -dpO -dpR +dpA +dpA dpU djw byP byP -dqH +dqk cMH aZH aZt @@ -130776,10 +135788,10 @@ aaa aaa arw cqC -aQS -arz -cUy -cuk +dwX +dwX +dyO +cqC aaa aaa aXR @@ -130922,31 +135934,31 @@ aSN aSN aSN aSP -arA -arA -arA -arA -arA -arA -arA -arA -aYK -arA -arA -arA -arA -arA -arA -arA -arA -arA -bap +dsW +dsW +dsW +dsW +dsW +dsW +dsW +dtl +dsW +dsW +dBl +dBm +dBm +dBm +dBm +dBm +dBm +dBm +dBv cQA -baP -baP +dBw +dBw bcq -baP -baP +dBw +dBz bek baP bfX @@ -130996,8 +136008,8 @@ cbr byP dpV dpX -dpZ -dqq +dpX +dpX dqI byS aZH @@ -131032,11 +136044,11 @@ aaa aaa aaa arw -cqC -aQS -arz -cUy -cuk +dwO +dxg +dwX +dyO +dwO abC abC aXR @@ -131182,18 +136194,18 @@ aLm aXJ aXY aXY +dtb aXY aXY aXY +dtb +aXY +aXY +dtb aXY aXY aXY -aXY -aXY -aXY -aXY -aXY -aXY +dtb aXY aXY aZU @@ -131290,9 +136302,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -131547,9 +136559,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -131804,9 +136816,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -132060,11 +137072,11 @@ aaa aaa aaa arw -cqC -aQS -arz -cUy -cuk +dwO +dxb +dwX +dyV +dwO aaa aaa aXR @@ -132318,9 +137330,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -132575,9 +137587,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -132832,9 +137844,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -133089,9 +138101,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk abC abC @@ -133345,11 +138357,11 @@ aaa aaa aaa arw -cqC -aQS -arz -ctC -cuk +dwO +dxg +dwX +dyO +dwO aaa aaa aXR @@ -133603,9 +138615,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -133860,9 +138872,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -134117,9 +139129,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk abC abC @@ -134374,9 +139386,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -134630,11 +139642,11 @@ aaa aaa aaa arw -cqC -aQS -arz -cUy -cuk +dwO +dxb +dwX +dza +dwO aaa aaa aXR @@ -134817,7 +139829,7 @@ boB bal baP cSv -bhP +dvu bvU bxw cbr @@ -134888,9 +139900,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -135145,9 +140157,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aaa @@ -135402,9 +140414,9 @@ aaa aaa arw cqC -aQS -arz -dlA +dwX +dwX +dyO cuk aaa aXR @@ -135476,37 +140488,37 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aaf -aeh -aeh -aeh -aeh -aeh -aeh -aaa -aaa -ahT -ajS -ahT +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +abC aaa aaa aaa @@ -135520,8 +140532,8 @@ aaa aaa abC aaa -aaa -aaa +cKF +cKF aaa aaa aaa @@ -135588,7 +140600,7 @@ boE bal baP cSv -bhP +dvu bal bxz byS @@ -135659,9 +140671,9 @@ aaa aaa arw cqC -aQS -arz -cUy +dwX +dwX +dyO cuk aaa aXR @@ -135748,28 +140760,28 @@ aaa aaa aaa aaa -aaf -aaf -adg -adg -adg -adg -adg +aaa +aaa aaf aaf aaf -adg -adg -adg -adg -ajT +aeh +aeh +aeh +aeh +aeh +aeh +aaa +aaa ahT -aaa -aaa -aaa -aaa -aaa -aaa +ajS +ahT +cKF +cKF +cKF +cKF +cKF +cKF aaa aaa aaa @@ -135777,9 +140789,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa abW @@ -135845,7 +140857,7 @@ boF bal brr cSv -bhP +dvu bal bxA cMH @@ -136002,25 +141014,25 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaf +aaf +adg +adg +adg +adg +adg aaf aaf aaf -aaf -aaf -adg -adt -adt -adt adg adg adg adg -adg -adt -adt -adt ajT -aae +ahT aaa aaa aaa @@ -136034,9 +141046,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa abW @@ -136050,9 +141062,9 @@ abW aaa aOu aPm -aQS -arz -aSQ +ary +ary +ary aTC aUB aaa @@ -136256,28 +141268,27 @@ aaa aaa aaa aaa -aae -aae -aae -aae -aae -aae -aae -aae +aaa +aaa +aaa +aaf +aaf +aaf +aaf +aaf adg adt -adN -aei -aeH adt -afz adt -agV -ahJ -aip +adg +adg +adg +adg +adg adt -ajU -aae +adt +adt +ajT aae aaa aaa @@ -136289,11 +141300,12 @@ aaa aaa aaa aaa +aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -136307,9 +141319,9 @@ abW aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -136359,7 +141371,7 @@ boH bpV aQS cSC -aSQ +dvx bvV bxB aZt @@ -136508,9 +141520,9 @@ aaa aaa aaa aaa -aaf -aaf -aaf +aaa +aaa +aaa aaa aaa aae @@ -136523,19 +141535,19 @@ aae aae adg adt -adO -aej -aeI -afd -afA -afd -agW -ahK -aiq +adN +aei +aeH adt -ajT +afz +adt +agV +ahJ +aip +adt +ajU +aae aae -aaf aaa aaa aaa @@ -136548,9 +141560,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -136564,9 +141576,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -136616,7 +141628,7 @@ arw bpW aQS cSC -aSQ +dvx bvW arw aZt @@ -136764,12 +141776,12 @@ aaa aaa aaa aaa +aaa aaf aaf -aae -aae -aae -aae +aaf +aaa +aaa aae aae aae @@ -136779,22 +141791,22 @@ aae aae aae adg -adu adt +adO +aej +aeI +afd +afA +afd +agW +ahK +aiq adt -adt -adt -afB -afX -adt -adt -adt -aje ajT -aaf -aaf -aaf aae +aaf +aaa +aaa aaa aaa aaa @@ -136805,9 +141817,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -136821,9 +141833,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -136873,7 +141885,7 @@ arw bpW aQS cSC -aSQ +dvx bvW arw aZt @@ -137020,15 +142032,15 @@ aaa aaa aaa aaa -aae -aae -aae -aae -aae -aae -aae -aae +aaa aaf +aaf +aae +aae +aae +aae +aae +aae aae aae aae @@ -137036,23 +142048,23 @@ aae aae aae adg -adv -adP -aek -aeJ -afe -afC -afd -afd -ahL -air -ajf +adu +adt +adt +adt +adt +afB +afX +adt +adt +adt +aje ajT aaf aaf aaf aae -aaf +aaa aaa aaa aaa @@ -137062,9 +142074,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -137077,11 +142089,11 @@ aaa aaa aaa arw -aPn -aQS -arz -aSQ -aTD +dAj +dAA +ary +dAU +dBa arw aaa aaa @@ -137127,11 +142139,11 @@ aaa abC aaa arw -bpW -aQS +dus +duB cSC -aSQ -bvW +dvA +dwa arw aZt aZt @@ -137276,7 +142288,7 @@ aaa aaa aaa aaa -aaf +aaa aae aae aae @@ -137286,28 +142298,28 @@ aae aae aae aaf -aaf -aaf -aaf -aaf -aaf -aaf -adg -adg -adQ -ael -aeK -adS -afD -adS -adt -ahM -ais +aae +aae +aae +aae +aae +aae adg +adv +adP +aek +aeJ +afe +afC +afd +afd +ahL +air +ajf ajT -aae aaf -aae +aaf +aaf aae aaf aaa @@ -137319,9 +142331,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -137335,9 +142347,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -137387,7 +142399,7 @@ arw bpW aQS cSC -buu +dvx bvW arw aaa @@ -137534,39 +142546,38 @@ aaa aaa aaa aaf +aae +aae +aae +aae +aae +aae +aae +aae +aaf +aaf aaf aaf -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal -aal aaf aaf aaf adg -adR -aem -aeL -adS -afE -adS -adt -adt -adt adg -ajV -aae -aae -aae +adQ +ael +aeK +adS +afD +adS +adt +ahM +ais +adg +ajT aae aaf +aae +aae aaf aaa aaa @@ -137574,6 +142585,15 @@ aaa aaa aaa aaa +aaa +abC +aaa +cKF +cKF +cKF +aaa +aaa +aaa abC aaa aaa @@ -137581,20 +142601,12 @@ aaa aaa aaa aaa -aaa -abC -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cKF arw aPn -aQT -arz -aSQ +ary +ary +ary aTD arw aaa @@ -137644,7 +142656,7 @@ arw bpW aQS cSC -aSQ +dvx bvW arw aaa @@ -137792,8 +142804,7 @@ aaa aaa aaf aaf -aal -aal +aaf aal aal aal @@ -137807,17 +142818,18 @@ aal aal aaf aaf -adw +aaf +adg +adR +aem +aeL adS +afE adS -adS -adS -afF -adS -adS -adS -adS -adw +adt +adt +adt +adg ajV aae aae @@ -137825,7 +142837,7 @@ aae aae aaf aaf -aaf +aaa aaa aaa aaa @@ -137833,9 +142845,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -137849,9 +142861,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -137901,7 +142913,7 @@ arw bpW aQS cSC -aSQ +dvx bvW arw aaa @@ -138051,35 +143063,35 @@ aaf aaf aal aal -aau -aax -aax -abl -aax -abM -aax -aax -aaw +aal +aal +aal +aal +aal +aal +aal +aal aal aal aal aaf +aaf adw -adT -aen -aeM adS -afG -afY -agX -ahN -ait +adS +adS +adS +afF +adS +adS +adS +adS adw ajV aae aae -aaf -aaf +aae +aae aaf aaf aaf @@ -138090,9 +143102,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -138106,9 +143118,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -138158,7 +143170,7 @@ arw bpW aQS cSC -aSQ +dvx bvW arw aaa @@ -138303,34 +143315,34 @@ aaa aaa aaa aaa -aae -aae -aae +aaa +aaf +aaf aal aal -aav +aau aax -aaw -aaw -abx aax +abl +aax +abM aax aax aaw -acL -cJi aal aal aal -adU -aeo +aaf +adw +adT +aen aeM -aff -aeM -afZ -agY -aeM -aiu +adS +afG +afY +agX +ahN +ait adw ajV aae @@ -138347,9 +143359,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -138362,11 +143374,11 @@ aaa aaa aaa arw -aPn -aQS -arz -aSQ -aTD +dAj +ary +ary +dAV +dBa arw aaa aaa @@ -138412,11 +143424,11 @@ aaa abC aaa arw -bpW -aQS +dus +duC cSC -aSQ -bvW +dvB +dwa arw aaa aaa @@ -138565,36 +143577,36 @@ aae aae aal aal -aaw -aaE -aaS -cJk -aaX -abN -abZ -acn -acu +aav aax aaw +aaw +abx +aax +aax +aax +aaw +acL +cJi aal aal aal -aal -aal -aal -aal -aal -aga -agZ -ahO -aiv +adU +aeo +aeM +aff +aeM +afZ +agY +aeM +aiu adw -ajW -akI -akI -akI -akI -akI +ajV +aae +aae +aaf +aaf +aaf aaf aaf aaa @@ -138604,9 +143616,9 @@ aaa aaa abC aaa -aaa -aaa -aaa +cKF +cKF +cKF aaa aaa aaa @@ -138620,9 +143632,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -138672,7 +143684,7 @@ arw bpW aQS cSC -aSQ +aQS bvW arw aaa @@ -138821,39 +143833,39 @@ aae aae aae aal -cJi +aal aaw -aaF -aaT -aax -aby +aaE +aaS +cJk aaX -aca +abN +abZ +acn +acu aax -acv -aax -dnz +aaw aal -adh -adx -adh -adh -adh -adh aal -agb -aha -ahP -aiw +aal +aal +aal +aal +aal +aal +aga +agZ +ahO +aiv adw -ajX -akJ -akJ -akJ -amY +ajW akI akI akI +akI +akI +aaf +aaf aaa aaa aaa @@ -138862,8 +143874,8 @@ aaa abC aaa aaa -aaa -aaa +cKF +cKF aaa aaa aaa @@ -138877,9 +143889,9 @@ aaa aaa arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -138929,7 +143941,7 @@ arw bpW aQS cSC -aSQ +aQS bvW arw aaa @@ -139078,65 +144090,65 @@ aae aae aae aal -aal +cJi +aaw +aaF +aaT aax -aaG -aaU -abm -abm -abO +aby aaX +aca aax acv aax -aau +dnz aal -cJi +adh +adx +adh +adh +adh +adh aal -aal -aal -aal -cJi -aal -agc -ahb -aeM -aix +agb +aha +ahP +aiw adw -ajY -akK -als -als -amZ -anJ -aoO -apK -aqI -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw +ajX +akJ +akJ +akJ +amY +akI +akI +akI +cKF +cKF +cKF +cKF +cKF +abC +cKF +cKF +cKF +cKF +cKF +cKF +cKF +abC +cKF +cKF +cKF +cKF +cKF +cKF +cKF arw aPn -aQS -arz -aSQ +ary +ary +ary aTD arw aaa @@ -139186,7 +144198,7 @@ arw bpW aQS cSC -aSQ +aQS bvW arw aaa @@ -139337,63 +144349,63 @@ aae aal aal aax -aaH -aaS -abn -aaS -abP -aax +aaG +aaU +abm +abm +abO aaX -acw aax -acP +acv +aax +aau aal -aaw -ady -adV -aaw -ady -aaw +cJi aal -agd -ahc +aal +aal +aal +cJi +aal +agc +ahb +aeM +aix adw -adw -adw -agk -akL -akI -akI -akI -akI -akI -akI -akI -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -arx -aPo -aQS -arz -aSQ +ajY +akK +als +als +amZ +anJ +aoO +apK +baR +aqI +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +aPn +ary +ary +ary aTD arw abC @@ -139443,7 +144455,7 @@ arw bpW aQS cSC -dfN +aQS bvW arw aaa @@ -139593,65 +144605,65 @@ aae aae aal aal -aaw -aaI -aaS -aaS -aaS +aax aaH -aaE aaS -acx -abZ -abZ -acR -adi -adi -adi -adi -aeN -adi -acR -age -ahd -ahQ -aiy -ajg -ahQ -akM -alt -alt -ana -alt -alt -apL -aqJ +abn +aaS +abP +aax +aaX +acw +aax +acP +aal +aaw +ady +adV +aaw +ady +aaw +aal +agd +ahc +adw +adw +adw +agk +akL +akI +akI +akI +akI +akI +akI +akI +dzo +dzq +dzq +dzq +dzw +dzq +dzq +dzq +dzw +dzq +dzq +dzq +dzw +dzq +dzq +dzq +dzw +dzq +dzq +dzq +dzq +dAl +dAB ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -arz -arz -aSQ -aTD +dAU +dBa arw aaa aaa @@ -139697,11 +144709,11 @@ aaa abC aaa arw -bpW -aQS +dus +duB cSC -aSQ -bvW +dvC +dwa arw aaa aaa @@ -139850,67 +144862,67 @@ aae aae aal aal -aay -aaJ -aaV +aaw +aaI aaS -abz -abQ -acb -aco -acy -acK -abm -acS -adj -adz -adj -aep -aeO -adj -acS -agf -ahe -agk -aiz -ajh -agk -akN -alu -amc -anb -amc -amc -apM -aqK -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -dbJ +aaS +aaS +aaH +aaE +aaS +acx +abZ +abZ +acR +adi +adi +adi +adi +aeN +adi +acR +age +ahd +ahQ +aiy +ajg +ahQ +akM +alt +alt +ana +alt +alt +apL +aqJ +ary +ary +ary +ary +dzx +ary +ary +ary +dzG +ary +ary +ary +dzx +ary +ary +ary +dzG +ary +ary +ary +ary +dzx +ary +ary +ary aTD arw -aaa +cKF aaa aaa aaa @@ -139957,7 +144969,7 @@ arw bpW aQS cSC -aSQ +aQS bvW arw aaa @@ -140107,64 +145119,64 @@ aae aae aal aal -aaw -aaK -aaW +aay +aaJ +aaV aaS -aaS -aaw -aaE -aaS -acz -acc -acc -acT -adk -adA -adk -adk -adk -adk -acT -agg -ahf -ahR -aiA -aji -ahR -akO -alv -amd -anc -anK -amd -amd -aqL -arA -arA -arA -arA -arA -axa -arA -arA -arA -arA -arA -arA -arA -arA -arA -aJo -arA -arA -arA -arA -arA -arA -arz -arz -aSQ +abz +abQ +acb +aco +acy +acK +abm +acS +adj +adz +adj +aep +aeO +adj +acS +agf +ahe +agk +aiz +ajh +agk +akN +alu +amc +anb +amc +amc +apM +aqK +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +dAT +ary aTD arw aaa @@ -140214,7 +145226,7 @@ arw bpW aQS cSC -aSQ +aQS bvW arw aaa @@ -140364,64 +145376,64 @@ aae aae aal aal -aax aaw +aaK +aaW aaS -abo aaS -abR -aax -aaX -acA -aax -acP -aal -adl -adB aaw -aaw -adB -adl -aal -agh -ahg -agk -agk -agk -agk -akP -akI -akI -akI -akI -akI -akI -akI +aaE +aaS +acz +acc +acc +acT +adk +adA +adk +adk +adk +adk +acT +agg +ahf +ahR +aiA +aji +ahR +akO +alv +amd +anc +anK +amd +amd +aqL +ary +ary +ary +ary arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -arB -aPp -aQS -arz -aSQ +ary +ary +ary +ary +ary +ary +ary +dzQ +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary +ary aTD arw aaa @@ -140471,7 +145483,7 @@ boI bpX aQS cSC -aSQ +aQS bvX bxC aaa @@ -140623,63 +145635,63 @@ aal aal aax aaw -aaX -aaw -aaw -aaw -aaX +aaS +abo +aaS +abR aax -acB +aaX +acA aax -aau +acP aal +adl +adB +aaw +aaw +adB +adl aal -aal -aal -aal -aal -aal -aal -agi -ahh -ahS -aiB +agh +ahg agk -ajZ -akQ -alw -ame -ame -anL -aoP -apN -aqM -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw +agk +agk +agk +akP +akI +akI +akI +akI +akI +akI +akI +dzp +dzp +dzp +dzp +dzy +dzp +dzp +dzp +dzy +dzp +dzp +dzp +dzy +dzp +dzp +dzp +dzy +dzp +dzp +dzp +dzp aPq -aQS -arz -aSQ -aTD +dAC +ary +dAU +dBa arw aaa aaa @@ -140877,65 +145889,65 @@ aae aae aae aal -cJi -aaw -aaF -aaT +aal aax -aby +aaw +aaX +aaw +aaw +aaw aaX -aca aax acB aax -aaw +aau aal -adh -adh -adh -aeq -adh -adh aal -agj -ahi -cYe +aal +aal +aal +aal +aal +aal +agi +ahh +ahS aiB agk -ajX -akJ -akJ -akJ -akJ -akI -akI -akI -abC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abC -aaa -aaa -aaa +ajZ +akQ +alw +ame +ame +anL +aoP +apN +dzn +aqM arw -aPq -aQS -arz -aSQ +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +dAn +dAD +ary +ary aTD arw aaa @@ -141130,43 +146142,43 @@ aaa aaa aaa aaa -aaf -aaf -aaf -aal +aae +aae +aae aal +cJi aaw -aaE -aaS -cJk +aaF +aaT +aax +aby aaX -abS -acc -acp -acC +aca +aax +acB aax aaw aal +adh +adh +adh +aeq +adh +adh aal -aal -aal -aal -aal -aal -aal +agj +ahi +cYe +aiB agk -agk -agk -agk -agk -ajW +ajX +akJ +akJ +akJ +akJ akI akI akI -akI -akI -aaf -aaa abC aaa aaa @@ -141189,10 +146201,10 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -141387,42 +146399,50 @@ aaa aaa aaa aaa +aaf +aaf +aaf +aal +aal +aaw +aaE +aaS +cJk +aaX +abS +acc +acp +acC +aax +aaw +aal +aal +aal +aal +aal +aal +aal +aal +agk +agk +agk +agk +agk +ajW +akI +akI +akI +akI +akI +aaf aaa -aaf -aaf -aal -aal -aaz -aax -aaw -aaw -abA -aax -aax -aax -aaw -acL -cJi -aal -aal -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -ajV -aaf -aaf -aaf -aaf -aaf -aaf +abC +aaa +aaa +aaa +aaa +aaa +cKF aaa abC aaa @@ -141432,24 +146452,16 @@ aaa aaa aaa aaa -abC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cKF abC aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -141649,25 +146661,25 @@ aaf aaf aal aal -aau -aaL +aaz aax -abp -aax -abM -aax -aaL aaw -aal +aaw +abA +aax +aax +aax +aaw +acL +cJi aal aal aaf aaf -aae -aae -aae -aae -aae +aaf +aaf +aaf +aaf aaf aaf aaf @@ -141703,10 +146715,10 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -141906,18 +146918,18 @@ aaf aaf aal aal +aau +aaL +aax +abp +aax +abM +aax +aaL +aaw aal aal aal -aal -aal -aal -aal -aal -aal -aal -aal -aaf aaf aaf aae @@ -141960,11 +146972,11 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ -aTD +dAr +dAH +ary +dAV +dBa arw aaa aaa @@ -142159,7 +147171,6 @@ aaa aaa aaa aaa -aaa aaf aaf aal @@ -142173,24 +147184,25 @@ aal aal aal aal +aal +aal +aaf +aaf +aaf +aae +aae +aae +aae +aae aaf aaf aaf aaf -aae -aae -aae -aae -aae -aae -aae -aae -aae aaf ajV aaf -aae -aae +aaf +aaf aaf aaf aaf @@ -142215,12 +147227,12 @@ aaa abC aaa aaa -aaa +cKF arw -aPq -aQU -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -142419,15 +147431,17 @@ aaa aaa aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf +aal +aal +aal +aal +aal +aal +aal +aal +aal +aal +aal aaf aaf aaf @@ -142438,8 +147452,6 @@ aae aae aae aae -aaf -aae aae aae aae @@ -142450,7 +147462,7 @@ aae aae aaf aaf -aaa +aaf aaa abC aaa @@ -142462,22 +147474,22 @@ aaa aaa abC aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF +cKF +cKF abC aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -142677,18 +147689,18 @@ aaa aaf aaf aaf -aae -aae -aae -aae -aae aaf aaf aaf aaf -aae -aae -aae +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf aae aae aae @@ -142703,10 +147715,10 @@ aae aaf ajV aaf +aae +aae +aaf aaf -aaa -aaa -aaa aaa aaa abC @@ -142731,10 +147743,10 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -142931,11 +147943,6 @@ aaa aaa aaa aaa -aaa -aaa -aaf -aaf -aaf aaf aaf aaf @@ -142944,7 +147951,10 @@ aae aae aae aae -aae +aaf +aaf +aaf +aaf aae aae aae @@ -142955,11 +147965,13 @@ aae aae aae aaf +aae +aae +aae +aae aaf +ajV aaf -ahT -aka -ahT aaf aaa aaa @@ -142988,10 +148000,10 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -143071,17 +148083,17 @@ bYL bZn bZn bZn +dwp bZn bZn bZn bZn +dwp bZn bZn bZn bZn -bZn -bZn -bZn +dwp bZn bZn bZn @@ -143190,11 +148202,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +aaf +aaf +aaf +aaf +aaf aaf aae aae @@ -143215,9 +148227,9 @@ aaf aaf aaf ahT -akb +aka ahT -aaa +aaf aaa aaa aaa @@ -143245,19 +148257,19 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ -aTD +dAr +dAD +ary +dAU +dBa arw aaa aaa -aaa -aaa -alx -alx -alx +cKF +cKF +cKF +cKF +cKF aaa aaa aaa @@ -143324,25 +148336,25 @@ bVU buw bXj buv -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary -ary +dwd +dwd +dwd +dwd +dwq +dwd +dwd +dwd +dwd +dwx +dwd +dwd +dwd +dwd +dwq +dwd +dwd +dwd +dwd buv bXj buw @@ -143452,7 +148464,7 @@ aaa aaa aaa aaa -aaa +aaf aae aae aae @@ -143470,26 +148482,26 @@ aae aae aaf aaf +aaf +ahT +akb +ahT +aaa +aaa +aaa +aaa aaa aaa abC -aaa -aaa -aaa -aaa -aaa -aaa -alx -alF -alx -alx -alx -alx -alx -aaa -aaa +cKF +cKF +cKF +cKF +cKF +cKF +cKF abC -aaa +cKF aaa aaa aaa @@ -143502,16 +148514,16 @@ aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa aaa aaa -alx +aaa alx alx alx @@ -143581,25 +148593,25 @@ bbs bbs bbs baU -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz +dwd +dwd +dwd +dwd +dwd +dwd +dwd +dwd +dwd +dBA +dwd +dwd +dwd +dwd +dwd +dwd +dwd +dwd +dwd baU bbs cgk @@ -143710,13 +148722,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aae +aae +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -143725,44 +148739,42 @@ aae aae aaf aaf -aaf -ahT -abC -abC -abC +dzk +dzk +dzk abC aaa aaa aaa aaa +aaa +alx +alF alx alx alx alx alx -and -and -alx -alx -alx +aaa +aaa abC aaa aaa -alx -alx -alx -alx -alx +aaa +aaa +aaa +aaa +aaa aaa abC aaa aaa aaa arw -aPq -aQS -arz -aSQ +dAn +dAD +ary +ary aTD arw aaa @@ -143771,14 +148783,14 @@ aaa alx alx alx -alF -abC -abC -abC -abC -abC -abC -abC +alx +cKF +cKF +cKF +cKF +cKF +cKF +cKF abC aYG abC @@ -143838,34 +148850,34 @@ bSZ bSZ bSZ bYb -arA -arA -arA -arA -arA -cdj -arA -arA -arA -arA -arA -arA -arA -djU -arA -arA -arA -arA -arA -bYb -bSZ -bSZ -bSZ +dwd +dwd +dwd +dwd +dws +dwd +dwd +dwd +dwd +dwy +dwA +dwA +dwA +dwA +dwF +dwA +dwA +dwA +dwA +dwH +dwI +dwI +dwI cgA cgJ -bSZ -bRQ -cLb +dwI +dwM +dwN chu bkA bkA @@ -143988,54 +149000,54 @@ aaa aaa abC abC +aaa +aaa +aaa +aaa +alx +alx +alx +alx +alx +and +and +alx +alx +alx +abC +aaa +aaa +alx +alx +alx +alx +alx +aaa abC aaa aaa aaa +arw +dAn +dAD +ary +ary +aTD +arw +aaa +aaa +aaa alx alx -and alx -and -and -and -alx -alx -and alF -alx -and -and -alx -alx -alx -alx -aaa abC -aaa -aaa -aaa -aOv -aPr -aQS -arz -aSQ -aTE -aUC -aaa -aaa -akR -alx -alx -alx -alx -aaa -aaa -aaa -aaa -aaa -aaa -aaa +abC +abC +abC +abC +abC +abC abC aYG abC @@ -144099,17 +149111,17 @@ bYM bZo bZo bZo +dwt bZo bZo bZo bZo +dwt bZo bZo bZo bZo -bZo -bZo -bZo +dwt bZo bZo bZo @@ -144244,53 +149256,53 @@ aaa aaa aaa abC +abC +abC aaa -abC -abC +aaa +aaa +alx +alx +and +alx +and +and +and +alx +alx +and alF alx +and +and alx -and -and -afV -afV -afS -aez -afV -adZ -aez -afV -afV -aez -aez alx -and -and alx alx aaa -aaa -aaa -aKo -aOw -aKo -aQV -aRP -aSR -aLm -aUD -aLm -akR +abC +cKF +cKF +cKF +aOv +dAz +dAD +ary +ary +dBg +aUC +cKF +cKF akR alx alx alx alx -alx -alx -aaa -aaa -aaa +cKF +cKF +cKF +cKF +cKF aaa aaa abC @@ -144502,46 +149514,46 @@ aaa aaa abC aaa -aaa -aaa +abC +abC +alF alx alx and -aez +and +afV +afV +afS aez afV -aqH -afq -apx -cZd -cYm -aiS -azp -amb -aBV adZ +aez afV afV aez +aez +alx +and +and alx alx -alx -akR -akR +aaa +aaa +aaa aKo -aOx +aOw aKo aQW -aRD -aSS +aRP +aSR aLm -aUE +aUD aLm +akR +akR alx alx alx -and -and alx alx alx @@ -144759,54 +149771,54 @@ aaa aaa abC aaa -akR +aaa +aaa +alx alx and -and aez -afS +aez afV -aoQ +aqH afq -akq -alQ -akq -akq -akp -cYo -akp -cYl -akp +apx +cZd +cYm +aiS +azp amb -cYj +aBV +adZ +afV +afV aez -and -and +alx +alx +alx +akR +akR aKo -aLo -aLo +aOx aKo -aOy -aKo -aQW +dAQ aRD -aST -aLm -aUF -aLm +aSS aLm +aUE aLm alx +alx +alx and and alx alx alx -alx -alx aaa aaa -abC +aaa +aaa +aaa abC aYG abC @@ -145015,57 +150027,57 @@ aaa aaa aaa abC -akR +aaa akR alx and and aez -apO -aoR -ahr -ahr -ahr -cYY -avL -ahr -ahr -azq -cYY -ahr -ahr -aEj afS afV +aoQ +afq +akq +alQ +akq +akq +akp +cYo +akp +cYl +akp +amb +cYj aez -aez +and +and aKo -aLp -aMq -aNr -aOz -aPs -aQW +aLo +aLo +aKo +aOy +aKo +dAQ aRD -aSU +aST +aLm +aUF +aLm aLm -aUG -aVj -aVD aLm alx and -aXa -aXb -aXa -aXa -aYi +and +alx +alx +alx +alx alx aaa -aaa +cKF abC -aYF -aYH +abC +aYG abC aaa aaa @@ -145270,59 +150282,59 @@ aaa aaa aaa aaa -ajj -akc -anQ -dnE -ajn +aaa +abC +akR +akR +alx +and +and aez +apO +aoR +ahr +ahr +ahr +cYY +avL +ahr +ahr +azq +cYY +ahr +ahr +aEj afS afV -afq -anC -arC -arC -arC -arC -arC -arC -arC -arC -arC -arC -afq -anC -afS -adZ -aIf -adZ +aez +aez aKo -aLq -aMr -aNs -aOA -aPt -aQX +aLp +aMq +aNr +aOz +aPs +dAQ aRD -aSV +aSU aLm -aUH -aVk -aVE +aUG +aVj +aVD aLm -afV -afV +alx +and +aXa +aXb +aXa aXa -aXt -aXL -aXZ -aYi -aYi aYi +alx +aaa +aaa abC -abC -aYG -abC +aYF +aYH abC aaa aaa @@ -145527,60 +150539,60 @@ aaa aaa aaa aaa -ajk -alE -akd -dnF +ajj +akc +anQ +dnE ajn -ajn -aUW -aoQ -aoR -aqN -arC -asx -atB -asx -atC -atC -axN -azr -asx -arC -aqH -aEk -amb -akp -cZB +aez afS -aKp -aLr -aMs -aNt -aOB -aPu -aQY -aRF -aSW -cKe -aUI -aVl -aVF +afV +afq +anC +arC +arC +arC +arC +arC +arC +arC +arC +arC +arC +afq +anC +afS +adZ +aIf +adZ +aKo +aLq +aMr +aNs +aOA +aPt +dAS +aRD +aSV aLm -ajt -aqH -aXb -aXu -aXM -aYa -aYj -aYr -aYj -aYn -aYn -aYH +aUH +aVk +aVE +aLm +afV +afV +aXa +aXt +aXL +aXZ +aYi +aYi +aYi +abC +abC +aYG +abC abC -aaa aaa aaa aaa @@ -145784,58 +150796,58 @@ aaa aaa aaa aaa -ajl -ake -akS -aly -amf -ane -alr +ajk +alE +akd +dnF +ajn +ajn +aUW +aoQ aoR -apP -afV +aqN arC -asy -atC asx +atB asx -axb atC atC -aAH +axN +azr +asx arC +aqH +aEk +amb +akp +cZB afS -amI -aCr -aCr -aCr -aBA -aKo -aKo -aKo -aKo -aKo -aKo -aQZ -aRQ -aSX +aKp +aLr +aMs +aNt +aOB +aPu +aQY +aRF +aSW +cKe +aUI +aVl +aVF aLm -aUJ -aVe -aVG -aLm -alR -aWQ -aXc -aXv -aXN -aYb -aYi -aYi -aYi -abC -abC -abC +ajt +aqH +aXb +aXu +aXM +aYa +aYj +aYr +aYj +aYn +aYn +aYH abC abC abC @@ -146041,59 +151053,59 @@ aaa aaa aaa aaa -cJr -akf -akT +ajl +ake +akS aly -amg -ajn -anM -aoS -cYC -adZ -arC -asz -atD -auF -avM -atC -axO -atC -aAI -arC -adZ -afS +amf +ane +alr +aoR +apP afV -aiS -dad -dan -day +arC +asy +atC +asx +asx +axb +atC +atC +aAH +arC +afS +amI +aCr +aCr aCr aBA -cYl -dam +aKo +aKo +aKo +aKo +aKo +aKo +aQZ +aRQ +aSX aLm -aRa -aRK -aSY +aUJ +aVe +aVG aLm -aUK -aVf -aVH -aLm -aqH -anC -aXb -aXb -aXa -aXb +alR +aWQ +aXc +aXv +aXN +aYb aYi -alx -aaa -aaa -aaa -aaa -aaa +aYi +aYi +abC +abC +abC +abC aaa aaa aaa @@ -146298,53 +151310,53 @@ aaa aaa aaa aaa -ajl -akg -akU +cJr +akf +akT aly -amh +amg ajn -anN -aoT -adZ +anM +aoS +cYC adZ arC -asx +asz +atD +auF +avM atC -auG -avN -auG -axP axO +atC aAI arC adZ -adZ -cZM -cZM -cZM -cZM -cZM -cZM -anC +afS +afV +aiS +dad +dan +day +aCr +aBA cYl -afS -aPl -aRb -aRR -aSZ -aTF -aUL +dam aLm +aRa +aRK +aSY aLm +aUK +aVf +aVH aLm -aoR -apu -afS -alx -alx -alx -alx +aqH +anC +aXb +aXb +aXa +aXb +aYi alx aaa aaa @@ -146361,19 +151373,19 @@ aaa aaa aaa aaa -aaa +cKF bbq bbq bbq -baS -baS -baS -baS -baS -baS +bbq +bbq +bbq +bbq +bbq +cKp big bja -bjS +bjP deo blC dpb @@ -146556,52 +151568,52 @@ aaa aaa aaa ajl -akf +akg akU -alz -ami +aly +amh ajn -ajn -anV -anV -anV -arC -arC -arC -auH -avO -auH -arC -arC -aAJ -arC -anV -anV -cZM -cZV -daf -dap -daA -cZM -amI -ahr -aOo -aPv -aRc -aRS -aTa -aLm -aLm -aLm +anN +aoT adZ adZ +arC +asx +atC +auG +avN +auG +axP +axO +aAI +arC +adZ +adZ +cZM +cZM +cZM +cZM +cZM +cZM anC -afq -aLm -aLm +cYl +afS +aPl +aRb +aRR +aSZ +aTF +aUL aLm aLm aLm +aoR +apu +afS +alx +alx +alx +alx alx aaa aaa @@ -146621,16 +151633,16 @@ aaa aaa bbq bbq -bbo +bbq +baS +baS +baS +baS baS -bdG -bew -bfl -bgl baS big bja -bjP +bjS dew bkD bkD @@ -146815,51 +151827,50 @@ aaa ajl akf akU -alA -amh -anf +alz +ami ajn -aoU -cYD -aqO -arD -asA -atE -auI -avP -auI -axQ -azs -aAK -aBW -aCU -aEl -cZO -cZW -dag -daq -daB +ajn +anV +anV +anV +arC +arC +arC +auH +avO +auH +arC +arC +aAJ +arC +anV +anV cZM -daQ -aUW -avh -aPw -aRd -aRD -aTb +cZV +daf +dap +daA +cZM +amI +ahr +aOo +aPv +aRc +aRS +aTa +aLm +aLm aLm adZ adZ -adZ -aWh -apu -aez +anC +afq +aLm +aLm +aLm aLm -aMo -aMn -aYc aLm -alx alx aaa aaa @@ -146878,16 +151889,17 @@ aaa aaa aaa bbq +bbq bbo baS -bdH -bex -bex -bgm -bgY -bih -bjc -bjR +bdG +bew +bfl +bgl +baS +big +bja +bjP bkD blD bmC @@ -147069,55 +152081,55 @@ aaa aaa aaa aaa -cJs +ajl akf akU -aly -amj -ang -anO -aoV -apQ -apQ -arE -arE -cLT -arE -avQ -apQ -apQ -azt -aAL -aBX -cZA -aEn -cZP -cZX -dah -dar -daC +alA +amh +anf +ajn +aoU +cYD +aqO +arD +asA +atE +auI +avP +auI +axQ +azs +aAK +aBW +aCU +aEl +cZO +cZW +dag +daq +daB cZM -afV -aez -afV +daQ +aUW +avh +aPw +aRd +aRD +aTb aLm -aRe -aRT -aTc -aPv -aUM -ahr -ahr +adZ +adZ +adZ +aWh apu -afV aez aLm -aNp -aNp -aYd -aLm -aLm +aMo +aMn +aYc aLm +alx +alx aaa aaa aaa @@ -147134,17 +152146,17 @@ aaa aaa aaa aaa +bbq +bbo baS -baS -baS -bdI -bey -bey -bgn -baS -big -bbs -bjP +bdH +bex +bex +bgm +bgY +bih +bjc +bjR bkD blE bmD @@ -147326,82 +152338,82 @@ aaa aaa aaa aaa -ajl -akh -akV -alB -amk -anh -anP -aoW -aoW -aoW -arF -arF -aoW -arF -avR -aoU -aoU -aoU -aoU +cJs +akf +akU +aly +amj +ang +anO +aoV +apQ +apQ +arE +arE +cLT +arE +avQ +apQ +apQ +azt +aAL aBX -aoU +cZA aEn -cZQ +cZP cZX -dai -das -daD -anV -anV -anV -anV -anV -aRd -aRD -aTa -aPw -alr -aqH -aoy -afK +dah +dar +daC +cZM +afV +aez +afV +aLm +aRe +aRT +aTc +aPv +aUM +ahr +ahr +apu afV aez aLm -aXw -aXO -aXO -aYk -aYs -aYv -aYw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -arw -bar -baR -baR -bbR -bcv -bbR -bdJ -ber -ber -bgo +aNp +aNp +aYd +aLm +aLm +aLm +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +aaa +aaa baS -bii -bjd -bjT +baS +baS +bdI +bey +bey +bgn +baS +big +bja +bjP bkD blF bmE @@ -147583,82 +152595,82 @@ aaa aaa aaa aaa -ajm -aki -akW -alC -alD -ani -ajn +ajl +akh +akV +alB +amk +anh +anP +aoW +aoW +aoW +arF +arF +aoW +arF +avR aoU aoU -aqP -arG -asB -atF -asG -avS -axc -aoW -aoW -aoW -aBY -azy -cZI -cZR -cZZ -daj -dat -daE +aoU +aoU +aBX +aoU +aEn +cZQ +cZX +dai +das +daD anV -aMt -aNu -aOC -aPx -aRf -aRU +anV +anV +anV +anV +aRd +aRD aTa +aPw +alr +aqH +aoy +afK +afV +aez aLm -aLm -aLm -aLm -aLm -aLm -aLm -aLm -aXx -cKe -aLm -aLm -aLm -aLm -aYx -aYz -aYz -aYz -aYz -aYz -aYz -aYz -aYz -aYz -aYz -aYz -aYz -bas +aXw +aXO +aXO +aYk +aYs +aYv +aYw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +arw +bar +baR +baR +bbR +bcv +bbR +bdJ +ber +ber +bgo baS -baS -baS -baS -baS -baS -baS -baS -cKp -baS -bij -bbs -bjU +bii +bjd +bjT bkD bkD bkD @@ -147840,82 +152852,82 @@ aaa aaa aaa aaa -ajn -akj -ajn +ajm +aki +akW +alC alD -aml -anj +ani ajn aoU aoU -aoY -arH -asC +aqP +arG +asB +atF +asG +avS +axc +aoW +aoW +aoW +aBY +azy +cZI +cZR +cZZ +daj +dat +daE anV -auJ -avT -aoY -aoU -aoU -aAM -anV -aCW -aEn -anV -anV -anV -anV -anV -anV -aMu -aoU -aoU -aBX -aRg -aRD -aTd -aTG -aUN -aTG -aTG -aWi -aTG -aWR -dbP -aXy -aTG -aTG -aYl -aYt -cPO -cPT -cPT -cPT -cPT -cPT -cPT -aYU -cPT -cPT -cPT -cPT -cPT -cPT -cPT -cQC -bbr -cQJ -bcw -cQJ -cQJ -cQJ -bfm -cQJ -cQJ -bik -bbs -bjP +aMt +aNu +aOC +aPx +aRf +aRU +aTa +aLm +aLm +aLm +aLm +aLm +aLm +aLm +aLm +aXx +cKe +aLm +aLm +aLm +aLm +aYx +aYz +aYz +aYz +dtr +aYz +aYz +aYz +aYz +dtr +aYz +aYz +aYz +bas +baS +baS +baS +baS +baS +baS +baS +baS +cKp +baS +bij +bja +bjU bkD blG bmF @@ -148097,81 +153109,81 @@ aaa aaa aaa aaa -aaa -aaa -ajn -ajn ajn +akj ajn +alD +aml +anj ajn aoU aoU aoY -arI -arM -aoY -arM -arI -aoY -axR -azv -aAN +arH +asC anV -aCX -aEo -aBW -aHf -aIg -aJp -aKq -aLs -aMv +auJ +avT +aoY +aoU +aoU +aAM +anV +aCW +aEn +anV +anV +anV +anV +anV +anV +aMu aoU aoU aBX aRg -aRV -aTe aRD -aUO -aRD -aRD -aWj -aRD -aTS -aRD -aRD -aRD -aRD -aYm -aRD -aRP -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -arz -baU -bbs -bbT -bbs -bbs -bbs -bbs -bfn -bbs -bbs -bil -cKz +aTd +aTG +aUN +aTG +aTG +aWi +dBH +aWR +dbP +aXy +aTG +aTG +aYl +aYt +cPO +cPT +cPT +cPT +cPT +dts +aYU +aYU +aYU +aYU +dtV +aYU +aYU +aYU +aYU +cQC +bbr +cQJ +bcw +cQJ +cQJ +cQJ +bfm +cQJ +cQJ +bik +dul bjP bkD blE @@ -148356,80 +153368,80 @@ aaa aaa aaa aaa -aaa -akR -akR -akR +ajn +ajn +ajn +ajn +ajn +aoU +aoU +aoY +arI +arM +aoY +arM +arI +aoY +axR +azv +aAN anV -aoY -aoY -aoY -arH -asD -aoY -auK -avT -aoY -aoY -aoY -aoY -anV -aCY -aEp -aFJ -aHg -aIh -aoU -aEn -aoY -aMw +aCX +aEo +aBW +aHf +aIg +aJp +aKq +aLs +aMv aoU aoU -aPy -aRh -aRW -aTf -aTH -aUP -aVm -aVI -aWk -aWE -aWS -aXd -aQN -aXP -aQN -aQN -aQN -aQR -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -arA -baV -bbt -bbU -bcx -bdd -bdd -bez -bfo -bdd -bdd -bim -bcx -bjV +aBX +aRg +aRV +aTe +aRD +aUO +aRD +aRD +aWj +aRD +aTS +aRD +aRD +aRD +aRD +aYm +aRD +aRP +dtd +dtd +dtd +dtd +dtd +dtd +dBn +dtd +dtd +dtd +dtd +dtd +dtd +dtd +baU +bbs +bbT +bbs +bbs +bbs +bbs +bfn +bbs +bbs +bil +cKz +bjP bkD blF bmE @@ -148614,79 +153626,79 @@ aaa aaa aaa aaa -aaa -aaa -abC -arw -aoZ -aoZ -aoZ -arJ -asE -aoZ -auL -avU -aoZ -aoZ -aoZ -aaa +akR +akR +akR anV -aCZ -aEq -aFK -aHh +aoY +aoY +aoY +arH +asD +aoY +auK +avT +aoY +aoY +aoY +aoY +anV +aCY +aEp +aFJ +aHg +aIh aoU -aoU -aKr -aLt -aMx +aEn +aoY +aMw aoU aoU aPy -aPy -aRX -aTg -aTI -anV -aLm -aLm -aWl -aPJ -aPl -aLm -aLm -aLm -aLm -aLm -aLm -aLm -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -aYy -baS -baS -baS -baS -baS -bdK -baS -baS -baS -bgZ -bin -baS -bjW +aRh +aRW +aTf +aTH +aUP +aVm +aVI +aWk +aWE +aWS +aXd +aQN +aXP +aQN +aQN +aQN +aQR +dtd +dtd +dtd +dtd +dtu +dtd +dtd +dtd +dtd +dtu +dtd +dtd +dtd +dtd +baV +bbt +bbU +bcx +bdd +bdd +bez +bfo +bdd +bdd +bim +bcx +bjV bjW bjW bjW @@ -148876,73 +153888,73 @@ aaa abC arw aoZ -apR -apR -apR -apR -atG -apR -apR -apR -axS aoZ -aAO -aoY -aDa -aEr -aBY -aHi -aoU -aoU -aKs -aoY -aMy -aoU -aoU -aoU -aoU -aRY -azA -aTJ +aoZ +arJ +asE +aoZ +auL +avU +aoZ +aoZ +aoZ +aaa +anV +aCZ +aEq +aFK +aHh +aoU +aoU +aKr +aLt +aMx +aoU +aoU +aPy +aPy +aRX +aTg +aTI anV -alx aLm -aWm -aPI -aUR -dbQ -aXz aLm -alx -alx -alx -aaa -aaa -abC -aaa -aaa -aaa -aaa -abC -aaa -aaa -aaa -aaa -abC -aaa -aaa -baW -baW -bbo -bbo -bbq -bbq -bbq -bbq -bgs -bha -bio -bje +aWl +aPJ +aPl +aLm +aLm +aLm +aLm +aLm +aLm +aLm +aYy +aYy +aYy +aYy +dtv +aYy +aYy +aYy +aYy +dtv +aYy +aYy +aYy +aYy +baS +baS +baS +baS +baS +bdK +baS +baS +baS +bgZ +bin +baS bjW bkE blH @@ -149137,38 +154149,38 @@ apR apR apR apR +atG apR apR apR -apR -apR -azw -aAP +axS +aoZ +aAO aoY -aCW -aEs -anV -aHj -aIi -azy -aKt +aDa +aEr aBY -aMz -aoW -aoW -aoW -aoW -aRZ -cOC +aHi +aoU +aoU +aKs +aoY +aMy +aoU +aoU +aoU +aoU +aRY +azA aTJ anV alx aLm -aWn -aOl -daW -aXe -aXA +aWm +aPI +aUR +dbQ +aXz aLm alx alx @@ -149190,16 +154202,16 @@ aaa aaa baW baW -baW +bbo bbo bbq bbq bbq bbq -bgp -bhb -ddo -bjf +bgs +bha +bio +bje bjW bkF blI @@ -149405,46 +154417,46 @@ aoY aCW aEs anV -aHk -aCW -aJq -aKu -aLu -aMA -aoU -aoU -aoU -aoU -aRY -apb +aHj +aIi +azy +aKt +aBY +aMz +aoW +aoW +aoW +aoW +aRZ +cOC aTJ anV alx aLm -aMg -aWF -aWT -aXf -aNF +aWn +aOl +daW +aXe +aXA aLm alx alx alx -alx -aXR -aXR -aXR aaa -aXR -aXR -aXR -aXR aaa -aXR -aXR -aXR -aXR -aXR +abC +aaa +aaa +aaa +aaa +abC +aaa +aaa +aaa +aaa +abC +aaa +aaa baW baW baW @@ -149659,49 +154671,49 @@ apR azw aAP aoY -aDb -aEt -anV -aHl aCW +aEs +anV +aHk +aCW +aJq +aKu +aLu +aMA aoU -aKv -aoY -aMB -aNv -aOD -aPz -aRi -aSa -aTh -aTK +aoU +aoU +aoU +aRY +apb +aTJ anV alx aLm -aLm -aLm -aLm -aLm -aLm +aMg +aWF +aWT +aXf +aNF aLm alx alx alx alx +aXR +aXR +aXR aaa +aXR +aXR +aXR +aXR aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aXR +aXR +aXR +aXR +aXR baW baW baW @@ -149912,35 +154924,35 @@ apR apR apR apR -axS -aoZ -aAQ +apR +azw +aAP aoY +aDb +aEt +anV +aHl aCW -aEs -anV -aHm -aCW -aJr -aKw -anV -anV -anV -anV -aPA -anV -aSb -avk -anV +aoU +aKv +aoY +aMB +aNv +aOD +aPz +aRi +aSa +aTh +aTK anV alx -and -and -alx -alx -alx -alx -alx +aLm +aLm +aLm +aLm +aLm +aLm +aLm alx alx alx @@ -150161,45 +155173,45 @@ aaa abC arw aoZ +apR +apR +apR +apR +apR +apR +apR +apR +axS aoZ -aoZ -arK -arK -aoZ -auM -arK -aoZ -aoZ -aoZ -aaa -anV -aCZ +aAQ +aoY +aCW aEs anV -aHn +aHm aCW -aoU -daF +aJr +aKw +anV +anV +anV +anV +aPA +anV +aSb +avk +anV anV -aez -aez -adZ -afV -akp -aSc -cOD -cZB -afS -alx -alx -alx -and alx and and -and -and -and +alx +alx +alx +alx +alx +alx +alx alx alx alx @@ -150411,54 +155423,54 @@ aaa aaa aaa aaa -dnA aaa -akR -akR -akR +aaa +aaa +aaa +abC +arw +aoZ +aoZ +aoZ +arK +arK +aoZ +auM +arK +aoZ +aoZ +aoZ +aaa anV -aoY -aoY -aoY -arL -asF -aoY -asF -arL -aoY -aoY -aoY -aoY -anV -aCY +aCZ aEs anV -aHo +aHn aCW aoU -aKx +daF anV aez aez adZ -afS -cYt -cYK -aiS -afS afV +akp +aSc +cOD +cZB +afS +alx +alx +alx and -and -and +alx and and and and and alx -and -and -and +alx alx alx aaa @@ -150668,42 +155680,42 @@ aaa aaa aaa aaa -dnB -dnD -dnD -dnD -dnD -anT -aoX -aoU -aoY -arM -arM -aoY -arM -arM -aoY -axT -azx -aAR +dnA +aaa +akR +akR +akR anV -aCX +aoY +aoY +aoY +arL +asF +aoY +asF +arL +aoY +aoY +aoY +aoY +anV +aCY aEs anV -aHp -aIj -aJs -aKy -aHp +aHo +aCW +aoU +aKx +anV aez aez +adZ afS -cYm -cYu -akp -akp -cYg +cYt +cYK +aiS afS +afV and and and @@ -150725,7 +155737,7 @@ aaa aaa aaa aaa -aaa +cKF aaa aaa aaa @@ -150925,50 +155937,50 @@ aaa aaa aaa aaa -dnC -akR -akR -akR -alx -anU -apa +dnB +dnD +dnD +dnD +dnD +anT +aoX aoU aoY -arL -arL +arM +arM aoY -arL -arL +arM +arM aoY -aoU -aoU -aAM +axT +azx +aAR anV -aDc +aCX aEs -aFL -aHq -aIk -aJt -aKz +anV +aHp +aIj +aJs +aKy aHp aez aez -aez -cYj +afS +cYm cYu -aXh +akp +akp +cYg afS -adZ -afS -aez -aez -afV -aez and and -alx -alx +and +and +and +and +and +and alx and and @@ -151182,54 +156194,54 @@ aaa aaa aaa aaa -aaa +dnC +akR akR akR alx -alx +anU +apa +aoU +aoY +arL +arL +aoY +arL +arL +aoY +aoU +aoU +aAM anV -apb -aoU -aoU -aoU -asG -atH -aoW -aoW -aoW -aoW -azy -aoW -aBY -aDd +aDc aEs -aFM +aFL aHq -aIl -aJu -aKA +aIk +aJt +aKz aHp -adZ aez aez -apx -cOz -afV +aez +cYj +cYu +aXh +afS adZ afS +aez +aez afV -afS -aWo -afK -afV -afS -afS -afV -alx -alx +aez +and +and alx alx alx +and +and +and alx aaa aaa @@ -151445,48 +156457,48 @@ akR alx alx anV -apc -apS -apS -arN -arN -cLU -arN -arN -apS -apS -azz -apS -aBZ -aDe -aEu -aFN +apb +aoU +aoU +aoU +asG +atH +aoW +aoW +aoW +aoW +azy +aoW +aBY +aDd +aEs +aFM aHq -aIm +aIl aJu -aKB +aKA aHp adZ +aez +aez +apx +cOz afV -afV -alR -amK -alS -afV -akp -akp -akp -akq -avh -awu -alr -aOF +adZ afS afV afS +aWo +afK afV -akR -akR +afS +afS +afV +alx +alx +alx +alx +alx akR aaa aaa @@ -151698,50 +156710,50 @@ aaa aaa aaa akR -alx +akR alx alx anV -apd -aoU -aoU -arO -arO -aoU -arO -arO -aoU -axU -azA -aoU -aBX -aoU -aEn -aFO +apc +apS +apS +arN +arN +cLU +arN +arN +apS +apS +azz +apS +aBZ +aDe +aEu +aFN aHq aIm aJu -aKC +aKB aHp -aHp -aNw -afS -alS -amK -akp -aOH -akp -akp -cYl -akp -afp +adZ afV +afV +alR +amK +alS +afV +akp +akp +akp akq -akp +avh +awu +alr +aOF afS -akp -akp -ajo +afV +afS +afV akR akR aaa @@ -151955,52 +156967,52 @@ aaa aaa aaa akR -akR +alx alx alx anV -ape -ape -aqQ -arP -asH -atI -auN -cZe -apQ -axV -azB -aAS -aBW -aDf -aEv -aFP +apd +aoU +aoU +arO +arO +aoU +arO +arO +aoU +axU +azA +aoU +aBX +aoU +aEn +aFO aHq -aIn -aJv -aKD -cNU -cOb -cOf -aOE -cOs -cYK -afS -afV -afV -afV -aez -afS -afV +aIm +aJu +aKC +aHp +aHp +aNw afS +alS +amK akp -aXg +aOH akp akp +cYl +akp +afp +afV +akq +akp +afS +akp akp ajo -aaa -aaa +akR +akR aaa aaa aaa @@ -152211,49 +157223,49 @@ aaa aaa aaa aaa -aaa akR akR -ank -ank -apf -apf -aqR -ank -ank -ank -ank -ank -ank -ank -azC -ank -ank +alx +alx anV -anV -anV -aHp -aHp -aHp -aHp -aHp -aHp -cYn -aCr -apu -dbk +ape +ape +aqQ +arP +asH +atI +auN +cZe +apQ +axV +azB +aAS +aBW +aDf +aEv +aFP +aHq +aIn +aJv +aKD +cNU +cOb +cOf +aOE +cOs +cYK afS -alx -and -and -and -alx -alx +afV +afV +afV +aez +afS +afV afS akp -aXh -afV -aXQ +aXg +akp +akp akp ajo aaa @@ -152469,49 +157481,49 @@ aaa aaa aaa aaa -aaa -aaa +akR +akR ank -anW -apg -apT -aqS -aph ank -atJ -atJ -avV -axd -axW -azD -aAT +apf +apf +aqR ank -adZ +ank +ank +ank +ank +ank +ank +azC +ank +ank +anV +anV +anV +aHp +aHp +aHp +aHp +aHp +aHp +cYn +aCr +apu +dbk afS -afV -adZ -adZ -aJw -aCr -day -aCr -aNx -aus -afq -afV -aez alx and and and -and +alx alx afS -aRj -aXi -afS -ala -ajr +akp +aXh +afV +aXQ +akp ajo aaa aaa @@ -152729,69 +157741,69 @@ aaa aaa aaa ank -anX +anW +apg +apT +aqS aph -apU -aqT -arQ -asI -atK -auO -auO -auO -avW -azE -avW ank -cZB -cYl -aoR -ahr -aqj -apu -akq -alS -akp -aNy -afS +atJ +atJ +avV +axd +axW +azD +aAT +ank adZ +afS +afV +adZ +adZ +aJw +aCr +day +aCr +aNx +aus +afq +afV aez -and alx and and and and alx -afV -afV -afV -afV -afV -afV -afV -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -bbp +afS +aRj +aXi +afS +ala +ajr +ajo +aaa +aaa +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +bbo bbo bbq bgp @@ -152983,72 +157995,72 @@ aaa aaa aaa aaa -akR -akR +aaa +aaa ank -anY -api -apV -apV -apV -asJ -atL -atL -avX -atL -atL -azF -aAU +anX +aph +apU +aqT +arQ +asI +atK +auO +auO +auO +avW +azE +avW ank -aDg -auE +cZB +cYl +aoR +ahr +aqj apu -aqH -afq -afq -aKE -adZ +akq +alS +akp +aNy +afS adZ +aez +and +alx +and +and +and +and +alx afV -adZ -alx -alx -alx -alx -and -and -and -and -alx -alx -akR -akR -alx -alx -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -baW +afV +afV +afV +afV +afV +afV +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +bbp bbo bbq bbq @@ -153241,29 +158253,32 @@ aaa aaa aaa akR -alx +akR ank -anZ -apj -apW -aqU -arR +anY +api +apV +apV +apV +asJ +atL +atL +avX +atL +atL +azF +aAU ank -atM -auP -avW -avW -axX -azG -aAV -ank -afK -aUW -aoy -apx -anN +aDg +auE +apu +aqH +afq +afq +aKE +adZ +adZ afV -afS adZ alx alx @@ -153273,15 +158288,12 @@ and and and and -and -and -and +alx alx akR akR -akR -akR -akR +alx +alx aaa aaa aaa @@ -153496,31 +158508,31 @@ aaa aaa aaa aaa -akR +aaa akR alx ank +anZ +apj +apW +aqU +arR ank +atM +auP +avW +avW +axX +azG +aAV ank -ank -ank -ank -ank -ank -auQ -avY -auQ -ank -ank -ank -ank +afK +aUW +aoy +apx +anN afV afS -afS -adZ -adZ -adZ -adZ adZ alx alx @@ -153534,7 +158546,7 @@ and and and alx -alx +akR akR akR akR @@ -153754,46 +158766,46 @@ aaa aaa aaa akR +akR +alx +ank +ank +ank +ank +ank +ank +ank +ank +auQ +avY +auQ +ank +ank +ank +ank +afV +afS +afS +adZ +adZ +adZ +adZ +adZ alx alx alx alx -alx +and +and +and +and +and +and +and alx alx akR akR -atN -auR -avW -avW -atN -akR -akR -alx -alx -and -and -and -alx -alx -alx -alx -and -and -and -and -and -and -and -and -alx -alx -alx -alx -alx -alx -alx akR akR aaa @@ -154010,32 +159022,32 @@ aaa aaa aaa aaa -aaa -alF akR -alF alx alx alx alx -aaa +alx +alx +alx +akR akR atN -auS +auR +avW avW -axe atN -aaa akR akR alx +alx and and and -and -and -and -and +alx +alx +alx +alx and and and @@ -154051,8 +159063,8 @@ alx alx alx alx -alx -alx +akR +akR aaa aaa aaa @@ -154268,48 +159280,48 @@ aaa aaa aaa aaa -abC -aaa -abC -aaa -aaa -aaa -aaa -aaa -aaa -atN -atN -avZ -atN -atN -aaa +alF +akR +alF +alx +alx +alx +alx aaa akR -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx -alx +atN +auS +avW +axe +atN aaa +akR +akR +alx +and +and +and +and +and +and +and +and +and +and +and +and +and +and +and +alx +alx +alx +alx +alx +alx +alx +alx +alx aaa aaa aaa @@ -154533,19 +159545,19 @@ aaa aaa aaa aaa -asK -asK -asL -awa -asL -asK -asK -aaa -aaa -aaa -aaa +aaa +atN +atN +avZ +atN +atN aaa aaa +akR +alx +alx +alx +alx alx alx alx @@ -154791,11 +159803,11 @@ aaa aaa aaa asK -atO -auT -auT -auU -axY +asK +asL +awa +asL +asK asK aaa aaa @@ -154803,52 +159815,52 @@ aaa aaa aaa aaa +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx +alx aaa aaa aaa aaa -alx -alx -alx -alx -alx -and -alx -alx -alx -and -alx -alF -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -abC -bbp +aaa +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +cKF +bbo bbo bbq bgs @@ -155047,16 +160059,13 @@ aaa aaa aaa aaa -asL -atP -auU +asK +atO +auT auT auU -axZ -azH -aaa -aaa -aaa +axY +asK aaa aaa aaa @@ -155072,41 +160081,44 @@ alx alx alx alx +and alx alx alx +and alx -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bbo +alF +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +abC +bbp bbq bgp bit @@ -155304,14 +160316,13 @@ aaa aaa aaa aaa -asK -atQ -auT +asL +atP +auU auT auU -aya -asK -aaa +axZ +azH aaa aaa aaa @@ -155329,6 +160340,11 @@ alx alx alx alx +alx +alx +alx +alx +alx aaa aaa aaa @@ -155338,10 +160354,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aac aab aaa aaa @@ -155562,11 +160574,11 @@ aaa aaa aaa asK -asK -asL -awb -asL -asK +atQ +auT +auT +auU +aya asK aaa aaa @@ -155577,9 +160589,15 @@ aaa aaa aaa aad -aab -aab -aab +aaa +aaa +aaa +aaa +aaa +alx +alx +alx +alx aaa aaa aaa @@ -155592,13 +160610,7 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa +aac aaa aac aad @@ -155818,13 +160830,13 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +asK +asK +asL +awb +asL +asK +asK aaa aaa aaa @@ -155853,7 +160865,7 @@ aaa aaa aaa aaa -aaa +aab aaa aaa aab From 583fbe68f1b42e164ef9cc5a3e9b4be39d020933 Mon Sep 17 00:00:00 2001 From: FantasticFwoosh Date: Mon, 1 May 2017 14:36:56 +0100 Subject: [PATCH 015/100] Fixes the 'stuffed legion' recipie (#26735) * Fixes stuffed legion food crafting No longer relies on a null object for crafting, now uses appropriate indeterminate legion soul * Delete food.dmi * Fixes typo for Stuffed Legion Fixes a typo with "stuffed legion" food not having a appropriate underscore like in the code "stuffed_legion" --- .../recipes/tablecraft/recipes_misc.dm | 2 +- icons/obj/food/food.dmi | Bin 51075 -> 51075 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 6d14d132540..708f49628ab 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -264,7 +264,7 @@ time = 40 reqs = list( /obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1, - /obj/item/weapon/legion_skull = 1, + /obj/item/organ/hivelord_core/legion = 1, /datum/reagent/consumable/ketchup = 2, /datum/reagent/consumable/capsaicin = 2 ) diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index c0af32afea9b848042cea80a4f0b5b864bda79ce..c4713bd08688afc0a55ac8fb50dccf354a665018 100644 GIT binary patch delta 29 lcmZqfXKwCi-tdN*(QWcu=5UT%K}j3qelNed*@wmaFaWrs4F~`L delta 29 lcmZqfXKwCi-tdN*(Pi>m=5UVWElEWix8L8q*@wmaFaWj!4ATGr From 5ae33dd81c30bbdea8d2e2c68801e07d5826e0c2 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 06:36:58 -0700 Subject: [PATCH 016/100] Automatic changelog generation for PR #26735 [ci skip] --- html/changelogs/AutoChangeLog-pr-26735.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26735.yml diff --git a/html/changelogs/AutoChangeLog-pr-26735.yml b/html/changelogs/AutoChangeLog-pr-26735.yml new file mode 100644 index 00000000000..16311e93ff9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26735.yml @@ -0,0 +1,5 @@ +author: "Moonlighting Mac says" +delete-after: True +changes: + - bugfix: "Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish \"Stuffed Legion\" out of exotic ingredients from Lavaland." + - experiment: "After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm." From 9856a1d4297c0e4af0b422e41f4b4eea9fa429e7 Mon Sep 17 00:00:00 2001 From: 4dplanner <3combined@gmail.com> Date: Mon, 1 May 2017 14:38:32 +0100 Subject: [PATCH 017/100] Makes surplus crates less likely to contain implants (#26737) * Makes surplus crates less likely to contain implants * Style points --- code/modules/uplink/uplink_item.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 3d1a8018333..d80a8e21b3c 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -1100,6 +1100,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. // Implants /datum/uplink_item/implants category = "Implants" + surplus = 50 /datum/uplink_item/implants/freedom name = "Freedom Implant" From e77c27c33141370fb96e3fb97c10098440bb184c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 06:38:34 -0700 Subject: [PATCH 018/100] Automatic changelog generation for PR #26737 [ci skip] --- html/changelogs/AutoChangeLog-pr-26737.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26737.yml diff --git a/html/changelogs/AutoChangeLog-pr-26737.yml b/html/changelogs/AutoChangeLog-pr-26737.yml new file mode 100644 index 00000000000..d850f9c42c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26737.yml @@ -0,0 +1,4 @@ +author: "4dplanner" +delete-after: True +changes: + - tweak: "Syndicate surplus crates now contain fewer implants" From 0e61b297affa200bdbe976c7b3c0a02078d7b996 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 09:04:20 -0700 Subject: [PATCH 019/100] Automatic changelog generation for PR #26729 [ci skip] --- html/changelogs/AutoChangeLog-pr-26729.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26729.yml diff --git a/html/changelogs/AutoChangeLog-pr-26729.yml b/html/changelogs/AutoChangeLog-pr-26729.yml new file mode 100644 index 00000000000..c209d1af546 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26729.yml @@ -0,0 +1,4 @@ +author: "Cobby" +delete-after: True +changes: + - balance: "The Gang pen is now stealthy. Stab away!" From 6f02fdf354310619e8153b138b2a647fdad5a9ca Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 09:06:56 -0700 Subject: [PATCH 020/100] Automatic changelog generation for PR #25603 [ci skip] --- html/changelogs/AutoChangeLog-pr-25603.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25603.yml diff --git a/html/changelogs/AutoChangeLog-pr-25603.yml b/html/changelogs/AutoChangeLog-pr-25603.yml new file mode 100644 index 00000000000..6c917057bc5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25603.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Gaining Vanguard, such as from the Linked Vanguard scripture, will remove existing stuns." From d6c8ce6d9e3f8af5e51dedf9ccac20d71b229b87 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 12:37:07 -0400 Subject: [PATCH 021/100] Port SM shards to initialize (#26740) --- code/modules/power/supermatter/supermatter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index fee8859de49..4b48d198575 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -127,7 +127,7 @@ /obj/machinery/power/supermatter_shard/make_frozen_visual() return -/obj/machinery/power/supermatter_shard/New() +/obj/machinery/power/supermatter_shard/Initialize() . = ..() countdown = new(src) countdown.start() From 0c1620d32cead359a42033c044e8b4d5aa5e3e83 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 12:37:39 -0400 Subject: [PATCH 022/100] Fixes Ahelp queing (#26739) --- code/modules/admin/verbs/adminhelp.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 235a9fd2961..db32b8b600e 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -485,6 +485,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") current_ticket.Close() + if(!(/client/verb/adminhelp in verbs)) + to_chat(usr, "Nice try!") + return + new /datum/admin_help(msg, src, FALSE) //admin proc From b732c9723a82f3a37d413d1068bf75cccec0f5be Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 1 May 2017 12:38:22 -0400 Subject: [PATCH 023/100] Small fixes to spatial gateways (#26738) * Small fixes to spatial gateways * this too --- .../clock_effects/spatial_gateway.dm | 13 +++---- .../clock_structures/clockwork_obelisk.dm | 39 +++++++++++-------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index f376410124c..1c49d366930 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -15,9 +15,8 @@ var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one var/timerid -/obj/effect/clockwork/spatial_gateway/New() - ..() - update_light() +/obj/effect/clockwork/spatial_gateway/Initialize() + . = ..() addtimer(CALLBACK(src, .proc/check_setup), 1) /obj/effect/clockwork/spatial_gateway/Destroy() @@ -99,12 +98,12 @@ if(severity == 1 && uses) uses = 0 visible_message("[src] is disrupted!") - animate(src, alpha = 0, transform = matrix()*2, time = 10) + animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW) deltimer(timerid) timerid = QDEL_IN(src, 10) linked_gateway.uses = 0 linked_gateway.visible_message("[linked_gateway] is disrupted!") - animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10) + animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW) deltimer(linked_gateway.timerid) linked_gateway.timerid = QDEL_IN(linked_gateway, 10) return TRUE @@ -131,9 +130,9 @@ playsound(src, 'sound/effects/EMPulse.ogg', 50, 1) playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1) transform = matrix() * 1.5 - animate(src, transform = matrix() / 1.5, time = 10) + animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW) linked_gateway.transform = matrix() * 1.5 - animate(linked_gateway, transform = matrix() / 1.5, time = 10) + animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW) A.forceMove(get_turf(linked_gateway)) if(!no_cost) uses = max(0, uses - 1) diff --git a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm index c32bcb0b4b7..2bebb4c9a5c 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/clockwork_obelisk.dm @@ -44,45 +44,50 @@ /obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user) if(!is_servant_of_ratvar(user) || total_accessable_power() < hierophant_cost || !anchored) - to_chat(user, "You place your hand on the obelisk, but it doesn't react.") + to_chat(user, "You place your hand on [src], but it doesn't react.") return - var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spatial Gateway","Cancel") + var/choice = alert(user,"You place your hand on [src]...",,"Hierophant Broadcast","Spatial Gateway","Cancel") switch(choice) if("Hierophant Broadcast") if(active) - to_chat(user, "The obelisk is sustaining a gateway and cannot broadcast!") + to_chat(user, "[src] is sustaining a gateway and cannot broadcast!") return if(!user.can_speak_vocal()) - to_chat(user, "You cannot speak through the obelisk!") + to_chat(user, "You cannot speak through [src]!") return var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "") if(!is_servant_of_ratvar(user) || !input || !user.canUseTopic(src, !issilicon(user))) return + if(anchored) + to_chat(user, "[src] is no longer secured!") + return FALSE if(active) - to_chat(user, "The obelisk is sustaining a gateway and cannot broadcast!") - return - if(!try_use_power(hierophant_cost)) - to_chat(user, "The obelisk lacks the power to broadcast!") + to_chat(user, "[src] is sustaining a gateway and cannot broadcast!") return if(!user.can_speak_vocal()) - to_chat(user, "You cannot speak through the obelisk!") + to_chat(user, "You cannot speak through [src]!") + return + if(!try_use_power(hierophant_cost)) + to_chat(user, "[src] lacks the power to broadcast!") return clockwork_say(user, text2ratvar("Hierophant Broadcast, activate! [html_decode(input)]")) titled_hierophant_message(user, input, "big_brass", "large_brass") if("Spatial Gateway") if(active) - to_chat(user, "The obelisk is already sustaining a gateway!") - return - if(!try_use_power(gateway_cost)) - to_chat(user, "The obelisk lacks the power to open a gateway!") + to_chat(user, "[src] is already sustaining a gateway!") return if(!user.can_speak_vocal()) to_chat(user, "You need to be able to speak to open a gateway!") return - if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1) && !active) - clockwork_say(user, text2ratvar("Spatial Gateway, activate!")) - else - return_power(gateway_cost) + if(!try_use_power(gateway_cost)) + to_chat(user, "[src] lacks the power to open a gateway!") + return + if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1)) + process() + if(!active) + clockwork_say(user, text2ratvar("Spatial Gateway, activate!")) + return + return_power(gateway_cost) //if we didn't return above, ie, successfully create a gateway, we give the power back /obj/structure/destructible/clockwork/powered/clockwork_obelisk/process() if(!anchored) From abf59e153f27c9e71edca4513fe2cdba6c43ea17 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 12:51:10 -0400 Subject: [PATCH 024/100] Moves tips from config to strings tree (#26722) * Moves tips and deadmin names from config to strings tree * Just the tip --- code/controllers/subsystem/ticker.dm | 4 ++-- {config => strings}/sillytips.txt | 0 {config => strings}/tips.txt | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {config => strings}/sillytips.txt (100%) rename {config => strings}/tips.txt (100%) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 868d7d27e89..e1c751ce550 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -604,8 +604,8 @@ SUBSYSTEM_DEF(ticker) if(selected_tip) m = selected_tip else - var/list/randomtips = world.file2list("config/tips.txt") - var/list/memetips = world.file2list("config/sillytips.txt") + var/list/randomtips = world.file2list("strings/tips.txt") + var/list/memetips = world.file2list("strings/sillytips.txt") if(randomtips.len && prob(95)) m = pick(randomtips) else if(memetips.len) diff --git a/config/sillytips.txt b/strings/sillytips.txt similarity index 100% rename from config/sillytips.txt rename to strings/sillytips.txt diff --git a/config/tips.txt b/strings/tips.txt similarity index 100% rename from config/tips.txt rename to strings/tips.txt From b3f587409dc2bdc8b641d7c6d8337ce4bda20df4 Mon Sep 17 00:00:00 2001 From: Profakos Date: Mon, 1 May 2017 18:53:37 +0200 Subject: [PATCH 025/100] Ore redemption machine cleanup (#26708) * Ore redemption machine uses material containers * ORM won't send messages when empty * QDEL_NULL for datums, and removes some unused lists --- code/modules/mining/machine_processing.dm | 4 +- code/modules/mining/machine_redemption.dm | 210 ++++++++++++---------- 2 files changed, 113 insertions(+), 101 deletions(-) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 38c900d31e7..32eb964de8e 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -71,7 +71,6 @@ var/selected_material = MAT_METAL var/selected_alloy = null var/datum/research/files - var/list/categories = list("Alloys") /obj/machinery/mineral/processing_unit/Initialize() . = ..() @@ -81,7 +80,8 @@ /obj/machinery/mineral/processing_unit/Destroy() CONSOLE = null - qdel(materials) + QDEL_NULL(materials) + QDEL_NULL(files) return ..() /obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 9b6e638df69..d93bcb50286 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -12,9 +12,6 @@ output_dir = SOUTH req_access = list(GLOB.access_mineral_storeroom) var/req_access_reclaim = GLOB.access_mining_station - var/stk_types = list() - var/stk_amt = list() - var/stack_list = list() //Key: Type. Value: Instance of type. var/obj/item/weapon/card/id/inserted_id var/points = 0 var/ore_pickup_rate = 15 @@ -24,11 +21,20 @@ speed_process = 1 var/message_sent = FALSE var/list/ore_buffer = list() + var/datum/material_container/materials + var/datum/research/files -/obj/machinery/mineral/ore_redemption/New() - ..() +/obj/machinery/mineral/ore_redemption/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new B.apply_default_parts(src) + materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY) + files = new /datum/research/smelter(src) + +/obj/machinery/mineral/ore_redemption/Destroy() + QDEL_NULL(materials) + QDEL_NULL(files) + return ..() /obj/item/weapon/circuitboard/machine/ore_redemption name = "Ore Redemption (Machine Board)" @@ -55,35 +61,67 @@ point_upgrade = point_upgrade_temp sheet_per_ore = sheet_per_ore_temp -/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O) - var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O) - if(processed_sheet) - var/obj/item/stack/sheet/s - if(!stack_list[processed_sheet]) - s = new processed_sheet(src, FALSE) - s.amount = 0 - stack_list[processed_sheet] = s - s = stack_list[processed_sheet] - s.amount += sheet_per_ore //Stack the sheets - ore_buffer -= O - qdel(O) //... garbage collect +/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/weapon/ore/O) + + ore_buffer -= O + + if(O && O.refined_type) + points += O.points * point_upgrade + + var/material_amount = materials.get_item_material_amount(O) + + if(!material_amount) + qdel(O) //no materials, incinerate it + + else if(!materials.has_space(material_amount)) //if there is no space, eject it + unload_mineral(O) + + else + materials.insert_item(O) //insert it + qdel(O) + +/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D) + if(D.make_reagents.len) + return 0 + + var/build_amount = 1 + + for(var/mat_id in D.materials) + var/M = D.materials[mat_id] + var/datum/material/redemption_mat = materials.materials[mat_id] + + if(!M || !redemption_mat) + return 0 + + build_amount = min(build_amount, round(redemption_mat.amount / M)) + + return build_amount /obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process) var/current_amount = 0 for(var/ore in ores_to_process) if(current_amount >= ore_pickup_rate) break - process_sheet(ore) + smelt_ore(ore) /obj/machinery/mineral/ore_redemption/proc/send_console_message() - if(z != ZLEVEL_STATION || !LAZYLEN(stack_list)) + if(z != ZLEVEL_STATION) return message_sent = TRUE var/area/A = get_area(src) var/msg = "Now available in [A]:
" - for(var/s in stack_list) - var/obj/item/stack/sheet/sheet = stack_list[s] - msg += "[capitalize(sheet.name)]: [sheet.amount] sheets
" + + var/has_minerals = FALSE + + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT + if(mineral_amount) + has_minerals = TRUE + msg += "[capitalize(M.name)]: [mineral_amount] sheets
" + + if(!has_minerals) + return for(var/obj/machinery/requests_console/D in GLOB.allConsoles) if(D.receive_ore_updates) @@ -144,15 +182,8 @@ return ..() /obj/machinery/mineral/ore_redemption/on_deconstruction() - empty_content() - -/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O) - if(O && O.refined_type) - var/obj/item/stack/sheet/M = O.refined_type - points += O.points * point_upgrade - return M - qdel(O)//No refined type? Purge it. - return + materials.retrieve_all() + ..() /obj/machinery/mineral/ore_redemption/attack_hand(mob/user) if(..()) @@ -169,30 +200,26 @@ else dat += "No ID inserted. Insert ID.

" - for(var/O in stack_list) - var/obj/item/stack/sheet/s = stack_list[O] - if(s.amount) - dat += "[capitalize(s.name)]: [s.amount] Release
" + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + if(M.amount) + var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT + dat += "[capitalize(M.name)]: [sheet_amount] " + if(sheet_amount >= 1) + dat += "Release
" + else + dat += "Release
" - var/obj/item/stack/sheet/metalstack - if(/obj/item/stack/sheet/metal in stack_list) - metalstack = stack_list[/obj/item/stack/sheet/metal] + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] + if(can_smelt_alloy(D)) + dat += "[D.name]: Smelt
" + else + dat += "[D.name]: Smelt
" - var/obj/item/stack/sheet/plasmastack - if((/obj/item/stack/sheet/mineral/plasma in stack_list)) - plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] + dat += "
Mineral Value List:
[get_ore_values()]
" - var/obj/item/stack/sheet/mineral/titaniumstack - if((/obj/item/stack/sheet/mineral/titanium in stack_list)) - titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium] - - if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount)) - dat += "Plasteel Alloy (Metal + Plasma): Smelt
" - if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount)) - dat += "Plastitanium Alloy (Titanium + Plasma): Smelt
" - dat += "
Mineral Value List:
[get_ore_values()]
" - - var/datum/browser/popup = new(user, "console_stacking_machine", "Ore Redemption Machine", 400, 500) + var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500) popup.set_content(dat) popup.open() return @@ -228,45 +255,43 @@ else to_chat(usr, "Not a valid ID!") if(href_list["release"]) - if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user. - if(!(text2path(href_list["release"]) in stack_list)) + if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user + var/mat_id = href_list["release"] + if(!materials.materials[mat_id]) return - var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])] - var/obj/item/stack/sheet/out = new inp.type(src, 0, FALSE) + + var/datum/material/mat = materials.materials[mat_id] + var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT + + if(!stored_amount) + return + var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num - out.amount = round(min(desired,50,inp.amount)) - if(out.amount >= 1) - inp.amount -= out.amount - unload_mineral(out) - if(inp.amount < 1) - stack_list -= text2path(href_list["release"]) - qdel(inp) + var/sheets_to_remove = round(min(desired,50,stored_amount)) + + var/out = get_step(src, output_dir) + materials.retrieve_sheets(sheets_to_remove, mat_id, out) + else to_chat(usr, "Required access not found.") - if(href_list["alloytype1"] && href_list["alloytype2"] && href_list["alloytypeout"]) - var/alloytype1 = text2path(href_list["alloytype1"]) - var/alloytype2 = text2path(href_list["alloytype2"]) - var/alloytypeout = text2path(href_list["alloytypeout"]) - if(check_access(inserted_id) || allowed(usr)) - if(!(alloytype1 in stack_list)) - return - if(!(alloytype2 in stack_list)) - return - var/obj/item/stack/sheet/stack1 = stack_list[alloytype1] - var/obj/item/stack/sheet/stack2 = stack_list[alloytype2] + + if(href_list["alloy"]) + var/alloy_id = href_list["alloy"] + var/datum/design/alloy = files.FindDesignByID(alloy_id) + if((check_access(inserted_id) || allowed(usr)) && alloy) var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num - var/obj/item/stack/sheet/alloyout = new alloytypeout - alloyout.amount = round(min(desired,50,stack1.amount,stack2.amount)) - if(alloyout.amount >= 1) - stack1.amount -= alloyout.amount - stack2.amount -= alloyout.amount - unload_mineral(alloyout) - if(stack1.amount < 1) - stack_list -= stack1 - qdel(stack1) - if(stack2.amount < 1) - stack_list -= stack2 - qdel(stack2) + var/smelt_amount = can_smelt_alloy(alloy) + var/amount = round(min(desired,50,smelt_amount)) + materials.use_amount(alloy.materials, amount) + + var/output = new alloy.build_path(src) + if(istype(output, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/mineral/produced_alloy = output + produced_alloy.amount = amount + unload_mineral(produced_alloy) + else + unload_mineral(output) + else to_chat(usr, "Required access not found.") updateUsrDialog() @@ -276,19 +301,6 @@ do_sparks(5, TRUE, src) ..() -//empty the redemption machine by stacks of at most max_amount (50 at this time) size -/obj/machinery/mineral/ore_redemption/proc/empty_content() - var/obj/item/stack/sheet/s - - for(var/O in stack_list) - s = stack_list[O] - while(s.amount > s.max_amount) - new s.type(loc,s.max_amount) - s.use(s.max_amount) - s.forceMove(get_turf(src)) - s.layer = initial(s.layer) - s.plane = initial(s.plane) - /obj/machinery/mineral/ore_redemption/power_change() ..() update_icon() From f35fa9f2d3972cd8eaecd772f1e8e428257c0530 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 13:46:30 -0400 Subject: [PATCH 026/100] PR announcement spam prevention (#24002) * PR announcement spam prevention * Use the payload * Update world.dm * Update world.dm --- code/world.dm | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/code/world.dm b/code/world.dm index 34e3265fcad..8898c7ce060 100644 --- a/code/world.dm +++ b/code/world.dm @@ -134,11 +134,7 @@ if(!key_valid) return "Bad Key" else -#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time - for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - to_chat(C, "PR: [input["announce"]]") -#undef CHAT_PULLR + AnnouncePR(input["announce"], json_decode(input["payload"])) else if("crossmessage" in input) if(!key_valid) @@ -174,7 +170,27 @@ else if("server_hop" in input) show_server_hop_transfer_screen(input["server_hop"]) +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + +#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time + for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) + C << "PR: [announcement]" +#undef CHAT_PULLR + #define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return; + /world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) if (reason == 1) //special reboot, do none of the normal stuff if (usr) @@ -315,4 +331,4 @@ status = s /world/proc/has_round_started() - return SSticker.HasRoundStarted() \ No newline at end of file + return SSticker.HasRoundStarted() From 4a8fcdd395de3c3700543ec24fcd9fff31d17eef Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 1 May 2017 13:48:55 -0400 Subject: [PATCH 027/100] Belligerent now prevents you from running even between chants (#25458) * quick! * Belligerent now prevents you from running even between chants * one fuckup and git turns into a screaming hellspace populated only by pain * glob * seven seconds of pain --- code/__DEFINES/status_effects.dm | 1 + code/datums/status_effects/buffs.dm | 5 ++ code/datums/status_effects/debuffs.dm | 47 ++++++++++++++++++ code/datums/status_effects/gas.dm | 1 + code/datums/status_effects/status_effect.dm | 6 +-- .../clock_items/wraith_spectacles.dm | 1 + .../clock_scriptures/scripture_drivers.dm | 15 +----- .../ratvar_the_clockwork_justicar.dm | 2 +- icons/mob/screen_alert.dmi | Bin 83184 -> 84140 bytes 9 files changed, 60 insertions(+), 18 deletions(-) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index bc5816dbb91..0bfbe31fb14 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -31,5 +31,6 @@ ///////////// #define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark +#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run #define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath. diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 3f261c79919..7b00a17e41c 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -13,6 +13,7 @@ /datum/status_effect/shadow_mend/on_apply() owner.visible_message("Violet light wraps around [owner]'s body!", "Violet light wraps around your body!") playsound(owner, 'sound/magic/Teleport_app.ogg', 50, 1) + return ..() /datum/status_effect/shadow_mend/tick() owner.adjustBruteLoss(-15) @@ -77,6 +78,7 @@ progbar = new(owner, duration, owner) progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0)) progbar.update(duration - world.time) + return ..() /datum/status_effect/vanguard_shield/tick() progbar.update(duration - world.time) @@ -129,6 +131,7 @@ animate(owner, color = oldcolor, time = 150, easing = EASE_IN) addtimer(CALLBACK(owner, /atom/proc/update_atom_colour), 150) playsound(owner, 'sound/magic/Ethereal_Enter.ogg', 50, 1) + return ..() /datum/status_effect/inathneqs_endowment/on_remove() add_logs(owner, null, "lost Inath-neq's invulnerability") @@ -180,6 +183,7 @@ /datum/status_effect/his_grace/on_apply() add_logs(owner, null, "gained His Grace's stun immunity") owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!") + return ..() /datum/status_effect/his_grace/tick() bloodlust = 0 @@ -213,6 +217,7 @@ /datum/status_effect/wish_granters_gift/on_apply() to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...") + return ..() /datum/status_effect/wish_granters_gift/on_remove() owner.revive(full_heal = 1, admin_revive = 1) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f78a3ae522a..8eec853047b 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -29,3 +29,50 @@ owner.adjustBruteLoss(0.1) owner.adjustFireLoss(0.1) owner.adjustToxLoss(0.2, TRUE, TRUE) + +/datum/status_effect/belligerent + id = "belligerent" + duration = 70 + tick_interval = 0 //tick as fast as possible + status_type = STATUS_EFFECT_REPLACE + alert_type = /obj/screen/alert/status_effect/belligerent + var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run + var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists + +/obj/screen/alert/status_effect/belligerent + name = "Belligerent" + desc = "Kneel, her-eti'c." + icon_state = "belligerent" + alerttooltipstyle = "clockcult" + +/datum/status_effect/belligerent/on_apply() + return do_movement_toggle(TRUE) + +/datum/status_effect/belligerent/tick() + if(!do_movement_toggle()) + qdel(src) + +/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage) + var/number_legs = owner.get_num_legs() + if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.null_rod_check() && number_legs) + if(force_damage || owner.m_intent != MOVE_INTENT_WALK) + if(GLOB.ratvar_awakens) + owner.Weaken(1) + if(iscultist(owner)) + owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "l_leg") + owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "r_leg") + else + owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "l_leg") + owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "r_leg") + if(owner.m_intent != MOVE_INTENT_WALK) + if(!iscultist(owner)) + to_chat(owner, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!") + else //Cultists take extra burn damage + to_chat(owner, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!") + owner.toggle_move_intent() + return TRUE + return FALSE + +/datum/status_effect/belligerent/on_remove() + if(owner.m_intent == MOVE_INTENT_WALK) + owner.toggle_move_intent() diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index c2c070dbece..ff92b67978c 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -16,6 +16,7 @@ cube = icon('icons/effects/freeze.dmi', "ice_cube") owner.add_overlay(cube) owner.update_canmove() + return ..() /datum/status_effect/freon/tick() owner.update_canmove() diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 51b4f8fc5f8..74a18536832 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -30,10 +30,9 @@ /datum/status_effect/proc/start_ticking() if(!src) return - if(!owner) + if(!owner || !on_apply()) qdel(src) return - on_apply() if(duration != -1) duration = world.time + initial(duration) tick_interval = world.time + initial(tick_interval) @@ -52,7 +51,8 @@ if(duration != -1 && duration < world.time) qdel(src) -/datum/status_effect/proc/on_apply() //Called whenever the buff is applied. +/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself. + return TRUE /datum/status_effect/proc/tick() //Called every tick. /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted diff --git a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm index 1b6c80af734..6d17fe4e74f 100644 --- a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm +++ b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm @@ -129,6 +129,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner apply_eye_damage(H) + return ..() /datum/status_effect/wraith_spectacles/tick() if(!ishuman(owner)) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 023cd50dd13..2e822199d3f 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -17,23 +17,10 @@ sort_priority = 1 quickbind = TRUE quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant.
Maximum 15 chants." - var/noncultist_damage = 2 //damage per chant to noncultists - var/cultist_damage = 8 //damage per chant to non-walking cultists /datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number) for(var/mob/living/carbon/C in hearers(7, invoker)) - var/number_legs = C.get_num_legs() - if(!is_servant_of_ratvar(C) && !C.null_rod_check() && number_legs) //you have legs right - C.apply_damage(noncultist_damage * 0.5, BURN, "l_leg") - C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg") - if(C.m_intent != MOVE_INTENT_WALK) - if(!iscultist(C)) - to_chat(C, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!") - else //Cultists take extra burn damage - to_chat(C, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!") - C.apply_damage(cultist_damage * 0.5, BURN, "l_leg") - C.apply_damage(cultist_damage * 0.5, BURN, "r_leg") - C.toggle_move_intent() + C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index 614a22a6f5c..0529b67ffdd 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -77,7 +77,7 @@ if(!prey && LAZYLEN(meals)) prey = pick(meals) to_chat(prey, "\"You will do, heretic.\"\n\ - ") + You feel something massive turn its crushing focus to you...") prey << 'sound/effects/ratvar_reveal.ogg' else if((!istype(prey, /obj/singularity/narsie) && prob(10) && LAZYLEN(meals) > 1) || prey.z != z || !(prey in meals)) diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 5858925d86cd131511a027fcfa768fe8b3c89a8b..46666cdd5fc8446bf51d51f4051e7d2151d18602 100644 GIT binary patch delta 31098 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 Haq#~E(_^Ju delta 30134 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 Date: Mon, 1 May 2017 10:48:56 -0700 Subject: [PATCH 028/100] Automatic changelog generation for PR #25458 [ci skip] --- html/changelogs/AutoChangeLog-pr-25458.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25458.yml diff --git a/html/changelogs/AutoChangeLog-pr-25458.yml b/html/changelogs/AutoChangeLog-pr-25458.yml new file mode 100644 index 00000000000..9f58df768f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25458.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Belligerent now prevents you from running for 7 seconds after every chant." + - rscdel: "However, you no longer remain walking after Belligerent's effect fades." From 82c20c0bc6e5884000fd488188f8fbd62eac5abb Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 1 May 2017 13:50:01 -0400 Subject: [PATCH 029/100] Clockcult component generation will automatically focus on components needed to activate the Ark (#25596) * Clockcult component generation will focus on components needed to activate the Ark * I=/=i * whoops --- code/_onclick/hud/alert.dm | 1 + .../clock_helpers/component_helpers.dm | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9c8fe9750a9..b376706a42b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -393,6 +393,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." textlist += "
" else textlist += "Seconds until Ratvar's arrival: [G.get_arrival_text(TRUE)]
" + break if(unconverted_ais_exist) if(unconverted_ais_exist > 1) textlist += "[unconverted_ais_exist] unconverted AIs exist!
" diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm index e3c456460c0..120ed0ff601 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm @@ -22,6 +22,12 @@ else for(var/i in GLOB.clockwork_component_cache) .[i] = max(MAX_COMPONENTS_BEFORE_RAND - LOWER_PROB_PER_COMPONENT*GLOB.clockwork_component_cache[i], 1) + for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in GLOB.all_clockwork_objects) + if(G.still_needs_components()) + for(var/i in G.required_components) + if(!G.required_components[i]) + . -= i + break . = pickweight(.) //returns a component name from a component id @@ -37,6 +43,8 @@ return "Replicant Alloy" if(HIEROPHANT_ANSIBLE) return "Hierophant Ansible" + else + return null //returns a component acronym from a component id /proc/get_component_acronym(id) @@ -51,6 +59,8 @@ return "RA" if(HIEROPHANT_ANSIBLE) return "HA" + else + return null //returns a component id from a component name /proc/get_component_id(name) @@ -65,6 +75,8 @@ return REPLICANT_ALLOY if("Hierophant Ansible") return HIEROPHANT_ANSIBLE + else + return null //returns a component spanclass from a component id /proc/get_component_span(id) @@ -121,6 +133,8 @@ return /obj/effect/overlay/temp/ratvar/component/alloy if(HIEROPHANT_ANSIBLE) return /obj/effect/overlay/temp/ratvar/component/ansible + else + return null //returns a type for a component from a component id /proc/get_component_type(id) @@ -134,4 +148,6 @@ if(REPLICANT_ALLOY) return /obj/item/clockwork/component/replicant_alloy if(HIEROPHANT_ANSIBLE) - return /obj/item/clockwork/component/hierophant_ansible \ No newline at end of file + return /obj/item/clockwork/component/hierophant_ansible + else + return null \ No newline at end of file From c3897b8f3ce1b8cee4897de4092569762836a970 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 10:50:03 -0700 Subject: [PATCH 030/100] Automatic changelog generation for PR #25596 [ci skip] --- html/changelogs/AutoChangeLog-pr-25596.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25596.yml diff --git a/html/changelogs/AutoChangeLog-pr-25596.yml b/html/changelogs/AutoChangeLog-pr-25596.yml new file mode 100644 index 00000000000..3967efa494c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25596.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Clockcult component generation will automatically focus on components needed to activate the Ark if it exists." From 1ed59144bc6763e4b9a3a8a109239239f386395e Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 13:52:49 -0400 Subject: [PATCH 031/100] Holocalls (#25743) * Port holopads to Initialize * Small optimization * Holocalls * What dunc said * Revert "What dunc said" This reverts commit dd9f26762aab86c3ce981fd7deab700299d4ed94. --- code/datums/holocall.dm | 154 +++++++++ code/game/machinery/hologram.dm | 294 +++++++++++++----- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- tgstation.dme | 1 + 4 files changed, 376 insertions(+), 75 deletions(-) create mode 100644 code/datums/holocall.dm diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm new file mode 100644 index 00000000000..0153e414145 --- /dev/null +++ b/code/datums/holocall.dm @@ -0,0 +1,154 @@ +#define HOLOPAD_MAX_DIAL_TIME 200 + +/mob/camera/aiEye/remote/holo/setLoc() + . = ..() + var/obj/machinery/holopad/H = origin + H.move_hologram(eye_user, loc) + +//this datum manages it's own references + +/datum/holocall + var/mob/living/user //the one that called + var/obj/machinery/holopad/calling_holopad //the one that sent the call + var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null) + var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered + + var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected + var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected + + var/call_start_time + +//creates a holocall made by `caller` from `calling_pad` to `callees` +/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees) + call_start_time = world.time + user = caller + calling_pad.outgoing_call = src + calling_holopad = calling_pad + dialed_holopads = list() + + for(var/I in callees) + var/obj/machinery/holopad/H = I + if(!QDELETED(H) && H.is_operational()) + dialed_holopads += H + LAZYADD(H.holo_calls, src) + + if(!dialed_holopads.len) + calling_pad.say("Connection failure.") + qdel(src) + + testing("Holocall started") + +//cleans up ALL references :) +/datum/holocall/Destroy() + QDEL_NULL(eye) + + user.reset_perspective() + + user = null + hologram.HC = null + hologram = null + calling_holopad.outgoing_call = null + + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + LAZYREMOVE(H.holo_calls, src) + dialed_holopads.Cut() + + if(calling_holopad) + calling_holopad.SetLightsAndPower() + calling_holopad = null + if(connected_holopad) + connected_holopad.SetLightsAndPower() + connected_holopad = null + + testing("Holocall destroyed") + + return ..() + +//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection +/datum/holocall/proc/Disconnect(obj/machinery/holopad/H) + testing("Holocall disconnect") + if(H == connected_holopad) + calling_holopad.say("[usr] disconnected.") + else if(H == calling_holopad && connected_holopad) + connected_holopad.say("[usr] disconnected.") + + ConnectionFailure(H, TRUE) + +//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored. +/datum/holocall/proc/ConnectionFailure(obj/machinery/holopad/H, graceful = FALSE) + testing("Holocall connection failure: graceful [graceful]") + if(H == connected_holopad || H == calling_holopad) + if(!graceful) + calling_holopad.say("Connection failure.") + qdel(src) + return + + LAZYREMOVE(H.holo_calls, src) + dialed_holopads -= H + if(!dialed_holopads.len) + if(graceful) + calling_holopad.say("Call rejected.") + testing("No recipients, terminating") + qdel(src) + +//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored +/datum/holocall/proc/Answer(obj/machinery/holopad/H) + testing("Holocall answer") + if(H == calling_holopad) + CRASH("How cute, a holopad tried to answer itself.") + + if(!(H in dialed_holopads)) + return + + if(connected_holopad) + CRASH("Multi-connection holocall") + + connected_holopad = H + for(var/I in dialed_holopads) + if(I == H) + continue + var/obj/machinery/holopad/Holo = I + LAZYREMOVE(Holo.holo_calls, src) + dialed_holopads -= Holo + + if(!Check()) + return + + hologram = H.activate_holo(user) + hologram.HC = src + + //eyeobj code is horrid, this is the best copypasta I could make + eye = new + eye.origin = H + eye.eye_initialized = TRUE + eye.eye_user = user + eye.name = "Camera Eye ([user.name])" + user.remote_control = eye + user.reset_perspective(eye) + eye.setLoc(H.loc) + +//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise +/datum/holocall/proc/Check() + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + if(!H.is_operational()) + ConnectionFailure(H) + + if(QDELETED(src)) + return FALSE + + . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc + + if(.) + if(connected_holopad) + . = !QDELETED(connected_holopad) && connected_holopad.is_operational() + else + . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME) + if(!.) + calling_holopad.say("No answer recieved.") + calling_holopad.temp = "" + + if(!.) + testing("Holocall Check fail") + qdel(src) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ae55fdf4ae8..0a819ee7e66 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -26,14 +26,13 @@ Possible to do for anyone motivated enough: #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 -#define RANGE_BASED 4 -#define AREA_BASED 6 +GLOBAL_LIST_EMPTY(holopads) #define HOLOPAD_MODE RANGE_BASED /obj/machinery/holopad - name = "\improper AI holopad" - desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." + name = "Holopad" + desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" layer = LOW_OBJ_LAYER flags = HEAR @@ -44,21 +43,32 @@ Possible to do for anyone motivated enough: obj_integrity = 300 max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) - var/list/masters = list()//List of AIs that use the holopad + var/list/masters = list()//List of living mobs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. var/temp = "" + var/list/holo_calls //array of /datum/holocalls + var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs + var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging var/static/list/holopads = list() -/obj/machinery/holopad/New() +/obj/machinery/holopad/Initialize() ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null) B.apply_default_parts(src) holopads += src /obj/machinery/holopad/Destroy() - for (var/mob/living/silicon/ai/master in masters) - clear_holo(master) + if(outgoing_call) + LAZYADD(holo_calls, outgoing_call) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + HC.ConnectionFailure(src) + LAZYCLEARLIST(holo_calls) + + for (var/I in masters) + clear_holo(I) holopads -= src return ..() @@ -91,20 +101,58 @@ Possible to do for anyone motivated enough: return return ..() +/obj/machinery/holopad/proc/CheckCallClose() + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(usr == HC.eye) + HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad + return TRUE + return FALSE + +/obj/machinery/holopad/Click(location,control,params) + if(!CheckCallClose()) + return ..() + /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) - interact(user) + if(!CheckCallClose()) + interact(user) /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return - if(user.stat || !is_operational()) + + if(outgoing_call || user.incapacitated() || !is_operational()) return + user.set_machine(src) var/dat if(temp) dat = temp else - dat = "
request an AI's presence." + dat = "Request an AI's presence.
" + dat += "Call another holopad.
" + + if(LAZYLEN(holo_calls)) + dat += "=====================================================
" + + var/one_answered_call = FALSE + var/one_unanswered_call = FALSE + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + dat += "Answer call from [get_area(HC.calling_holopad)].
" + one_unanswered_call = TRUE + else + one_answered_call = TRUE + + if(one_answered_call && one_unanswered_call) + dat += "=====================================================
" + //we loop twice for formatting + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src) + dat += "Disconnect call from [HC.user].
" + var/datum/browser/popup = new(user, "holopad", name, 300, 130) popup.set_content(dat) @@ -112,7 +160,10 @@ Possible to do for anyone motivated enough: popup.open() /obj/machinery/holopad/Topic(href, href_list) - if(..() || !is_operational()) + if(..() || isAI(usr)) + return + add_fingerprint(usr) + if(!is_operational()) return if (href_list["AIrequest"]) if(last_request + 200 < world.time) @@ -120,7 +171,7 @@ Possible to do for anyone motivated enough: temp = "You requested an AI's presence.
" temp += "Main Menu" var/area/area = get_area(src) - for(var/mob/living/silicon/ai/AI in GLOB.living_mob_list) + for(var/mob/living/silicon/ai/AI in GLOB.silicon_mobs) if(!AI.client) continue to_chat(AI, "Your presence is requested at \the [area].") @@ -128,12 +179,49 @@ Possible to do for anyone motivated enough: temp = "A request for AI presence was already sent recently.
" temp += "Main Menu" - else if(href_list["mainmenu"]) + else if(href_list["Holocall"]) + if(outgoing_call) + return + + temp = "You must stand on the holopad to make a call!
" + temp += "Main Menu" + if(usr.loc == loc) + var/list/callnames = list() + for(var/I in holopads) + var/area/A = get_area(I) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) + + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return + + if(usr.loc == loc) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) + + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) + call_to_connect.Answer(src) temp = "" - updateDialog() - add_fingerprint(usr) + else if(href_list["disconnectcall"]) + var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) + if(!QDELETED(call_to_disconnect)) + call_to_disconnect.Disconnect(src) + temp = "" + else if(href_list["mainmenu"]) + temp = "" + if(outgoing_call) + outgoing_call.Disconnect() + + updateDialog() + +//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -148,39 +236,75 @@ Possible to do for anyone motivated enough: clear_holo(user) /obj/machinery/holopad/process() - if(masters.len)//If there is a hologram. - for (var/mob/living/silicon/ai/master in masters) - if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. - if(!(stat & NOPOWER))//If the machine has power. - if(HOLOPAD_MODE == RANGE_BASED) - if(get_dist(master.eyeobj, src) <= holo_range) - return TRUE - else - var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, master.eyeobj) - if(get_dist(pad_close, master.eyeobj) <= holo_range) - var/obj/effect/overlay/holo_pad_hologram/h = masters[master] - unset_holo(master) - pad_close.set_holo(master, h) - return TRUE + for(var/I in masters) + var/mob/living/master = I + var/mob/living/silicon/ai/AI = master + if(!istype(AI)) + AI = null - else if (HOLOPAD_MODE == AREA_BASED) + if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(is_operational())//If the machine has power. + if(AI) //ais are range based + if(get_dist(AI.eyeobj, src) <= holo_range) + continue + else + var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) + if(get_dist(pad_close, AI.eyeobj) <= holo_range) + var/obj/effect/overlay/holo_pad_hologram/h = masters[master] + unset_holo(master) + pad_close.set_holo(master, h) + continue + else + continue + clear_holo(master)//If not, we want to get rid of the hologram. - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) + if(outgoing_call) + outgoing_call.Check() - if(eye_area in holo_area.related) - return TRUE + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + HC.Answer(src) + break + if(outgoing_call) + HC.Disconnect(src)//can't answer calls while calling + else + playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! - clear_holo(master)//If not, we want to get rid of the hologram. - return TRUE +/obj/machinery/holopad/proc/activate_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(!istype(AI)) + AI = null -/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user) - if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it - if (istype(user.current, /obj/machinery/holopad)) + if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it + if (AI && istype(AI.current, /obj/machinery/holopad)) to_chat(user, "ERROR: \black Image feed in progress.") return - create_holo(user)//Create one. - src.visible_message("A holographic image of [user] flicks to life right before your eyes!") + + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + if(AI) + Hologram.icon = AI.holo_icon + else //make it like real life + Hologram.icon = user.icon + Hologram.icon_state = user.icon_state + Hologram.copy_overlays(user, TRUE) + //codersprite some holo effects here + Hologram.alpha = 100 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.Impersonation = user + + Hologram.languages = user.languages + Hologram.mouse_opacity = 0//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = 1//So space wind cannot drag it. + Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + + set_holo(user, Hologram) + visible_message("A holographic image of [user] flicks to life right before your eyes!") + + return Hologram else to_chat(user, "ERROR: \black Unable to project hologram.") @@ -191,59 +315,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ for(var/mob/living/silicon/ai/master in masters) if(masters[master] && speaker != master) master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src && speaker != HC.hologram) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) + + if(outgoing_call && speaker == outgoing_call.user) + outgoing_call.hologram.say(raw_message) -/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) - var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. - h.icon = A.holo_icon - h.mouse_opacity = 0//So you can't click on it. - h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - h.anchored = 1//So space wind cannot drag it. - h.name = "[A.name] (Hologram)"//If someone decides to right click. - h.set_light(2) //hologram lighting - set_holo(A, h) +/obj/machinery/holopad/proc/SetLightsAndPower() + var/total_users = masters.len + LAZYLEN(holo_calls) + use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users + if(total_users) + set_light(2) + icon_state = "holopad1" + else + set_light(0) + icon_state = "holopad0" + +/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) + masters[user] = h + var/mob/living/silicon/ai/AI = user + if(istype(AI)) + AI.current = src + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) - masters[A] = h - set_light(2) // pad lighting - icon_state = "holopad1" - A.current = src - use_power += HOLOGRAM_POWER_USAGE - return TRUE - -/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/clear_holo(mob/living/user) qdel(masters[user]) // Get rid of user's hologram unset_holo(user) return TRUE -/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) - if(user.current == src) - user.current = null +/obj/machinery/holopad/proc/unset_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(istype(AI) && AI.current == src) + AI.current = null masters -= user // Discard AI from the list of those who use holopad - use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage - if (!masters.len) // If no users left - set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) - icon_state = "holopad0" - use_power = HOLOPAD_PASSIVE_POWER_USAGE + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) if(masters[user]) - step_to(masters[user], user.eyeobj) var/obj/effect/overlay/holo_pad_hologram/H = masters[user] - H.loc = get_turf(user.eyeobj) + step_to(H, new_turf) + H.loc = new_turf + var/area/holo_area = get_area(src) + var/area/eye_area = new_turf.loc + + if(!(eye_area in holo_area.related)) + clear_holo(user) return TRUE +/obj/effect/overlay/holo_pad_hologram + var/mob/living/Impersonation + var/datum/holocall/HC + +/obj/effect/overlay/holo_pad_hologram/Destroy() + Impersonation = null + if(HC) + HC.Disconnect(HC.calling_holopad) + return ..() + /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) return 1 +/obj/effect/overlay/holo_pad_hologram/examine(mob/user) + if(Impersonation) + return Impersonation.examine(user) + return ..() + /obj/item/weapon/circuitboard/machine/holopad name = "AI Holopad (Machine Board)" build_path = /obj/machinery/holopad origin_tech = "programming=1" req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) -#undef RANGE_BASED -#undef AREA_BASED #undef HOLOPAD_PASSIVE_POWER_USAGE -#undef HOLOGRAM_POWER_USAGE +#undef HOLOGRAM_POWER_USAGE \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 263ccab4352..11091d97181 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -28,7 +28,7 @@ //Holopad if(istype(ai.current, /obj/machinery/holopad)) var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai) + H.move_hologram(ai, T) /mob/camera/aiEye/Move() return 0 diff --git a/tgstation.dme b/tgstation.dme index e745664084e..d8a1b779610 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -215,6 +215,7 @@ #include "code\datums\dog_fashion.dm" #include "code\datums\emotes.dm" #include "code\datums\forced_movement.dm" +#include "code\datums\holocall.dm" #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\martial.dm" From c46a91f856f83d7fed75cff33ad21cb05e953163 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 10:52:50 -0700 Subject: [PATCH 032/100] Automatic changelog generation for PR #25743 [ci skip] --- html/changelogs/AutoChangeLog-pr-25743.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25743.yml diff --git a/html/changelogs/AutoChangeLog-pr-25743.yml b/html/changelogs/AutoChangeLog-pr-25743.yml new file mode 100644 index 00000000000..97ec1e44784 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25743.yml @@ -0,0 +1,4 @@ +author: "Cyberboss" +delete-after: True +changes: + - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" From 02c9cb5df04fea8d64f2aa73a084b30b1ee1b668 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Mon, 1 May 2017 13:54:44 -0400 Subject: [PATCH 033/100] Saline-glucose changes (#26556) * Refactors saline glucose solution to work as temporary blood instead of increasing blood regeneration. * Prevents salglu from replacing all of your blood * Added terrible deadly overdose effects * consumption rate is probably fine as is, really --- .../chemistry/reagents/medicine_reagents.dm | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index aa913ba8f0a..500147d2334 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -288,30 +288,43 @@ /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." reagent_state = LIQUID color = "#DCDCDC" metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 taste_description = "sweetness and salt" + var/last_added = 0 + var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M) + if(last_added) + M.blood_volume -= last_added + last_added = 0 + if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. + var/amount_to_add = min(M.blood_volume, volume*5) + var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) + last_added = new_blood_level - M.blood_volume + M.blood_volume = new_blood_level if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.blood_volume += 0.2 . = 1 ..() -/datum/reagent/medicine/salglu_solution/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(ishuman(M) && method == INJECT) - var/mob/living/carbon/human/H = M - if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) - var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute. - efficiency = Clamp(efficiency, 0.1, 0.75) - //As it's designed for an IV drip, make large injections not as effective as repeated small injections. - H.blood_volume += round(efficiency * min(5,reac_volume), 0.1) +/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) + if(prob(3)) + to_chat(M, "You feel salty.") + holder.add_reagent("sodiumchloride", 1) + holder.remove_reagent("salglu_solution", 0.5) + else if(prob(3)) + to_chat(M, "You feel sweet.") + holder.add_reagent("sugar", 1) + holder.remove_reagent("salglu_solution", 0.5) + if(prob(33)) + M.adjustBruteLoss(0.5*REM, 0) + M.adjustFireLoss(0.5*REM, 0) + . = 1 ..() /datum/reagent/medicine/mine_salve From 1955724e2897a9eb81b25dd8725361aa221a7bda Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 10:54:45 -0700 Subject: [PATCH 034/100] Automatic changelog generation for PR #26556 [ci skip] --- html/changelogs/AutoChangeLog-pr-26556.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26556.yml diff --git a/html/changelogs/AutoChangeLog-pr-26556.yml b/html/changelogs/AutoChangeLog-pr-26556.yml new file mode 100644 index 00000000000..68fca1b6ac7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26556.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - tweak: "Saline glucose now acts as temporary blood instead of increasing blood regeneration" From 9d0185c023e48e056789e612d0fcf35456874127 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 13:55:58 -0400 Subject: [PATCH 035/100] Allows admins to pass parameters to New() (#26613) * /proc/print_single_line(list/L) * Admin datum/New parameters * Fixes --- code/__HELPERS/_lists.dm | 12 ++++++++++ code/modules/admin/admin.dm | 25 ++++++++++++++++++-- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/verbs/debug.dm | 4 ++-- code/modules/admin/verbs/modifyvariables.dm | 26 ++++++++++++++++++--- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index e66d528a5af..9ff38a3477a 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -488,3 +488,15 @@ L1[key] += other_value else L1[key] = other_value + +/proc/print_single_line(list/L) + . = "list(" + for(var/I in 1 to L.len) + var/key = L[I] + . += "[key]" + var/val = L[key] + if(!isnull(val)) + . += " => [val]" + if(I < L.len) + . += ", " + . += ")" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e8803868fef..1f7dca59b35 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -610,20 +610,41 @@ set desc = "(atom path) Spawn an atom" set name = "Spawn" + return spawn_atom_impl(object, FALSE) + +/datum/admins/proc/spawn_atom_adv(object as text) + set category = "Debug" + set desc = "(atom path) Spawn an atom with New() parameters" + set name = "Advanced Spawn" + + return spawn_atom_impl(object, TRUE) + + +/datum/admins/proc/spawn_atom_impl(object, params) if(!check_rights(R_SPAWN)) return var/chosen = pick_closest_path(object) if(!chosen) return + + var/list/arguments if(ispath(chosen,/turf)) var/turf/T = get_turf(usr.loc) T.ChangeTurf(chosen) else - var/atom/A = new chosen(usr.loc) + if(params) + arguments = usr.client.get_callproc_args(TRUE) + + if(!usr) + return + + arguments = list(usr.loc) + arguments + + var/atom/A = new chosen(arglist(arguments)) A.admin_spawned = TRUE - log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] spawned [chosen] at [COORD(usr)][LAZYLEN(arguments) > 1 ? " with parameters [print_single_line(arguments)]": ""]") SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ae547140404..13314afeb2f 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/smite )) GLOBAL_PROTECT(admin_verbs_spawn) -GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character)) +GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/datum/admins/proc/spawn_atom_adv,/client/proc/respawn_character)) GLOBAL_PROTECT(admin_verbs_server) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /world/proc/AVerbsServer() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 1ee98d15557..1b099a9e0a5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -145,8 +145,8 @@ GLOBAL_PROTECT(AdminProcCallCount) -/client/proc/get_callproc_args() - var/argnum = input("Number of arguments","Number:",0) as num|null +/client/proc/get_callproc_args(is_atom_new = FALSE) + var/argnum = input("Number of arguments[is_atom_new ? " (Excluding loc)" : ""]","Number:",0) as num|null if(isnull(argnum)) return diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 94d955bdd0c..c4a4d249e99 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -213,7 +213,14 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + + var/list/arguments + if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes") + arguments = get_callproc_args(FALSE) + else + arguments = list() + + .["value"] = new type(arglist(arguments)) if (VV_NEW_DATUM) var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) @@ -221,7 +228,13 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + var/list/arguments + if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes") + arguments = get_callproc_args(FALSE) + else + arguments = list() + + .["value"] = new type(arglist(arguments)) if (VV_NEW_TYPE) var/type = current_value @@ -237,7 +250,14 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + + var/list/arguments + if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes") + arguments = get_callproc_args(FALSE); + else + arguments = list() + + .["value"] = new type(arglist(arguments)) if (VV_NEW_LIST) From 7cb80075568a51ce6d1c123a4d3b9af08531fa1b Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Wed, 12 Apr 2017 20:21:41 +0100 Subject: [PATCH 036/100] Changes /obj/machinery to have atom/movable occupants Currently `occupant` in /obj/machinery is a /mob/living type. I have changed it to /atom/movable, and made a type cache to determine what to "look for" when `close_machine()` is called. This means that machines can have non-mob occupants. I have some design ideas for this, but that's after the freeze. --- .../abduction/machinery/experiment.dm | 13 ++-- code/game/machinery/Sleeper.dm | 40 +++++----- code/game/machinery/cloning.dm | 74 ++++++++++++------- code/game/machinery/computer/cloning.dm | 7 +- code/game/machinery/dna_scanner.dm | 9 ++- code/game/machinery/gulag_teleporter.dm | 7 +- code/game/machinery/machinery.dm | 33 ++++++--- code/game/machinery/suit_storage_unit.dm | 17 +++-- .../items/weapons/implants/implantchair.dm | 7 +- code/modules/VR/vr_sleeper.dm | 5 +- .../components/unary_devices/cryo.dm | 41 +++++----- .../kitchen_machinery/gibber.dm | 11 +-- 12 files changed, 155 insertions(+), 109 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 193aecd9cea..ab486dfa048 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -111,12 +111,13 @@ else dat += "Experiment " - if(!occupant) + if(!isliving(occupant)) dat += "

Machine Unoccupied

" else dat += "

Subject Status :

" dat += "[occupant.name] => " - switch(occupant.stat) + var/mob/living/mob_occupant = occupant + switch(mob_occupant.stat) if(0) dat += "Conscious" if(1) @@ -146,9 +147,11 @@ if(href_list["close"]) close_machine() return - if(occupant && occupant.stat != DEAD) - if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"]) + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + if(mob_occupant.stat != DEAD) + if(href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"]) updateUsrDialog() add_fingerprint(usr) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 817f7f682ab..79262494846 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -79,7 +79,8 @@ /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) ..(user) - if(occupant && occupant.stat != DEAD) + var/mob/living/mob_occupant = occupant + if(mob_occupant && mob_occupant.stat != DEAD) to_chat(occupant, "You feel cool air surround you. You go numb as your senses turn inward.") /obj/machinery/sleeper/emp_act(severity) @@ -128,21 +129,22 @@ data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) data["occupant"] = list() - if(occupant) - data["occupant"]["name"] = occupant.name - data["occupant"]["stat"] = occupant.stat - data["occupant"]["health"] = occupant.health - data["occupant"]["maxHealth"] = occupant.maxHealth + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat + data["occupant"]["health"] = mob_occupant.health + data["occupant"]["maxHealth"] = mob_occupant.maxHealth data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["occupant"]["bruteLoss"] = occupant.getBruteLoss() - data["occupant"]["oxyLoss"] = occupant.getOxyLoss() - data["occupant"]["toxLoss"] = occupant.getToxLoss() - data["occupant"]["fireLoss"] = occupant.getFireLoss() - data["occupant"]["cloneLoss"] = occupant.getCloneLoss() - data["occupant"]["brainLoss"] = occupant.getBrainLoss() + data["occupant"]["bruteLoss"] = mob_occupant.getBruteLoss() + data["occupant"]["oxyLoss"] = mob_occupant.getOxyLoss() + data["occupant"]["toxLoss"] = mob_occupant.getToxLoss() + data["occupant"]["fireLoss"] = mob_occupant.getFireLoss() + data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss() + data["occupant"]["brainLoss"] = mob_occupant.getBrainLoss() data["occupant"]["reagents"] = list() if(occupant.reagents.reagent_list.len) - for(var/datum/reagent/R in occupant.reagents.reagent_list) + for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) return data @@ -158,9 +160,10 @@ . = TRUE if("inject") var/chem = params["chem"] - if(!is_operational() || !occupant) + if(!is_operational() || !isliving(occupant)) return - if(occupant.health < min_health && chem != "epinephrine") + var/mob/living/mob_occupant = occupant + if(mob_occupant.health < min_health && chem != "epinephrine") return if(inject_chem(chem)) . = TRUE @@ -177,10 +180,11 @@ return TRUE /obj/machinery/sleeper/proc/chem_allowed(chem) - if(!occupant) + if(!isliving(occupant)) return - var/amount = occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency - var/occ_health = occupant.health > min_health || chem == "epinephrine" + var/mob/living/mob_occupant = occupant + var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency + var/occ_health = mob_occupant.health > min_health || chem == "epinephrine" return amount && occ_health /obj/machinery/sleeper/proc/reset_chem_buttons() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2eb3f18af81..27bbcac4f89 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -123,8 +123,10 @@ ..() if(mess) to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") - if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD)) - to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") + if(is_operational() && isliving(occupant)) + var/mob/living/mob_occupant = occupant + if(mob_occupant.stat != DEAD) + to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") /obj/machinery/clonepod/return_air() // We want to simulate the clone not being in contact with @@ -136,7 +138,10 @@ return GM /obj/machinery/clonepod/proc/get_completion() - . = (100 * ((occupant.health + 100) / (heal_level + 100))) + . = FALSE + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + . = (100 * ((mob_occupant.health + 100) / (heal_level + 100))) /obj/machinery/clonepod/attack_ai(mob/user) return examine(user) @@ -223,25 +228,26 @@ //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() + var/mob/living/mob_occupant = occupant if(!is_operational()) //Autoeject if power is lost if (occupant) go_out() connected_message("Clone Ejected: Loss of power.") - else if((occupant) && (occupant.loc == src)) - if((occupant.stat == DEAD) || (occupant.suiciding) || occupant.hellbound) //Autoeject corpses and suiciding dudes. + else if(isliving(mob_occupant) && (mob_occupant.loc == src)) + if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") - SPEAK("The cloning of [occupant.real_name] has been \ + SPEAK("The cloning of [mob_occupant.real_name] has been \ aborted due to unrecoverable tissue failure.") go_out() - else if(occupant.cloneloss > (100 - heal_level)) - occupant.Paralyse(4) + else if(mob_occupant.cloneloss > (100 - heal_level)) + mob_occupant.Paralyse(4) //Slowly get that clone healed and finished. - occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier)) - var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss() + mob_occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier)) + var/progress = CLONE_INITIAL_DAMAGE - mob_occupant.getCloneLoss() // To avoid the default cloner making incomplete clones progress += (100 - MINIMUM_HEAL_LEVEL) var/milestone = CLONE_INITIAL_DAMAGE / flesh_number @@ -252,24 +258,24 @@ var/obj/item/I = pick_n_take(unattached_flesh) if(isorgan(I)) var/obj/item/organ/O = I - O.Insert(occupant) + O.Insert(mob_occupant) else if(isbodypart(I)) var/obj/item/bodypart/BP = I - BP.attach_limb(occupant) + BP.attach_limb(mob_occupant) //Premature clones may have brain damage. - occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier)) + mob_occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier)) check_brine() use_power(7500) //This might need tweaking. - else if((occupant.cloneloss <= (100 - heal_level))) + else if((mob_occupant.cloneloss <= (100 - heal_level))) connected_message("Cloning Process Complete.") - SPEAK("The cloning cycle of [occupant.real_name] is complete.") + SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") go_out() - else if ((!occupant) || (occupant.loc != src)) + else if ((!isliving(mob_occupant)) || (mob_occupant.loc != src)) occupant = null if (!mess && !panel_open) icon_state = "pod_0" @@ -313,6 +319,7 @@ to_chat(user, "Error: Pod has no occupant.") return else + var/mob/living/mob_occupant connected_message("Authorized Ejection") SPEAK("An authorized ejection of [clonemind.name] has occurred.") to_chat(user, "You force an emergency ejection. ") @@ -347,22 +354,26 @@ icon_state = "pod_0" return - if(!occupant) + if(!isliving(occupant)) return + var/mob/living/mob_occupant = occupant + if(grab_ghost_when == CLONER_MATURE_CLONE) - occupant.grab_ghost() + mob_occupant.grab_ghost() to_chat(occupant, "There is a bright flash!
You feel like a new being.
") - occupant.flash_act() + mob_occupant.flash_act() var/turf/T = get_turf(src) occupant.forceMove(T) icon_state = "pod_0" - occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. + mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. + occupant = null /obj/machinery/clonepod/proc/malfunction() - if(occupant) + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant connected_message("Critical Error!") SPEAK("Critical error! Please contact a Thinktronic Systems \ technician, as your warranty may be affected.") @@ -370,23 +381,30 @@ for(var/obj/item/O in unattached_flesh) qdel(O) icon_state = "pod_g" - if(occupant.mind != clonemind) - clonemind.transfer_to(occupant) - occupant.grab_ghost() // We really just want to make you suffer. - flash_color(occupant, flash_color="#960000", flash_time=100) - to_chat(occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.
") + if(mob_occupant.mind != clonemind) + clonemind.transfer_to(mob_occupant) + mob_occupant.grab_ghost() // We really just want to make you suffer. + flash_color(mob_occupant, flash_color="#960000", flash_time=100) + to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.
") playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0) - occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) - QDEL_IN(occupant, 40) + mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + QDEL_IN(mob_occupant, 40) /obj/machinery/clonepod/relaymove(mob/user) if(user.stat == CONSCIOUS) go_out() /obj/machinery/clonepod/emp_act(severity) +<<<<<<< HEAD if((occupant || mess) && prob(100/(severity*efficiency))) connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0)) +======= + if(isliving(occupant) && prob(100/(severity*efficiency))) + var/mob/living/mob_occupant = occupant + connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) + SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0)) +>>>>>>> Changes /obj/machinery to have atom/movable occupants go_out() ..() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 5c16861932c..a2ecc87352a 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -189,14 +189,15 @@ dat += "

Scanner Functions

" dat += "
" - if (!src.scanner.occupant) + if (!isliving(scanner.occupant)) dat += "Scanner Unoccupied" else if(loading) dat += "[src.scanner.occupant] => Scanning..." else - if (src.scanner.occupant.ckey != scantemp_ckey) + var/mob/living/mob_occupant = scanner.occupant + if (mob_occupant.ckey != scantemp_ckey) scantemp = "Ready to Scan" - scantemp_ckey = src.scanner.occupant.ckey + scantemp_ckey = mob_occupant.ckey dat += "[src.scanner.occupant] => [scantemp]" dat += "
" diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index af59f63888d..462934f3f88 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -105,13 +105,14 @@ ..() // search for ghosts, if the corpse is empty and the scanner is connected to a cloner - if(occupant) + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) - if(!occupant.suiciding && !(occupant.disabilities & NOCLONE) && !occupant.hellbound) - occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) + if(!mob_occupant.suiciding && !(mob_occupant.disabilities & NOCLONE) && !mob_occupant.hellbound) + mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) var/obj/machinery/computer/scan_consolenew/console for(dir in list(NORTH,EAST,SOUTH,WEST)) @@ -157,4 +158,4 @@ if(..(user,1,0)) //don't set the machine, since there's no dialog return - toggle_open(user) \ No newline at end of file + toggle_open(user) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 92a550b17cf..5979abdc29e 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -136,13 +136,14 @@ The console is located at computer/gulag_teleporter.dm /obj/machinery/gulag_teleporter/proc/strip_occupant() if(linked_reclaimer) linked_reclaimer.stored_items[occupant] = list() - for(var/obj/item/W in occupant) - if(!is_type_in_typecache(W, required_items) && occupant.temporarilyRemoveItemFromInventory(W)) + var/mob/living/mob_occupant = occupant + for(var/obj/item/W in mob_occupant) + if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W)) if(istype(W, /obj/item/weapon/restraints/handcuffs)) W.forceMove(get_turf(src)) continue if(linked_reclaimer) - linked_reclaimer.stored_items[occupant] += W + linked_reclaimer.stored_items[mob_occupant] += W linked_reclaimer.contents += W W.forceMove(linked_reclaimer) else diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 6cd8e75798f..96b0029134d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -1,8 +1,8 @@ /* Overview: - Used to create objects that need a per step proc call. Default definition of 'New()' + Used to create objects that need a per step proc call. Default definition of 'Initialize()' stores a reference to src machine in global 'machines list'. Default definition - of 'Del' removes reference to src machine in global 'machines list'. + of 'Destroy' removes reference to src machine in global 'machines list'. Class Variables: use_power (num) @@ -44,7 +44,7 @@ Class Variables: EMPED:16 -- temporary broken by EMP pulse Class Procs: - New() 'game/machinery/machine.dm' + Initialize() 'game/machinery/machine.dm' Destroy() 'game/machinery/machine.dm' @@ -118,14 +118,15 @@ Class Procs: var/panel_open = 0 var/state_open = 0 var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures. - var/mob/living/occupant = null + var/list/occupant_typecache = list(/mob/living) // turned into typecache in Initialize + var/atom/movable/occupant = null var/unsecuring_tool = /obj/item/weapon/wrench var/interact_open = 0 // Can the machine be interacted with when in maint/when the panel is open. var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/speed_process = 0 // Process as fast as possible? /obj/machinery/Initialize() - if (!armor) + if(!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) . = ..() GLOB.machines += src @@ -135,6 +136,8 @@ Class Procs: START_PROCESSING(SSfastprocess, src) power_change() + occupant_typecache = typecacheof(occupant_typecache) + /obj/machinery/Destroy() GLOB.machines.Remove(src) if(!speed_process) @@ -176,16 +179,24 @@ Class Procs: L.update_canmove() occupant = null -/obj/machinery/proc/close_machine(mob/living/target = null) +/obj/machinery/proc/close_machine(atom/movable/target = null) state_open = 0 density = 1 if(!target) - for(var/mob/living/carbon/C in loc) - if(C.buckled || C.has_buckled_mobs()) + for(var/am in loc) + if(!is_type_in_typecache(am, occupant_typecache)) continue - else - target = C - if(target && !target.buckled && !target.has_buckled_mobs()) + var/atom/movable/AM = am + if(AM.has_buckled_mobs()) + continue + if(isliving(AM)) + var/mob/living/L = am + if(L.buckled) + continue + target = am + + var/mob/living/mobtarget = target + if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled)) occupant = target target.forceMove(src) updateUsrDialog() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 5db4276333f..2f0eab165b7 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -211,13 +211,13 @@ uv = TRUE locked = TRUE update_icon() - if(occupant) + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant if(uv_super) - occupant.adjustFireLoss(rand(20, 36)) + mob_occupant.adjustFireLoss(rand(20, 36)) else - occupant.adjustFireLoss(rand(10, 16)) - if(iscarbon(occupant)) - occupant.emote("scream") + mob_occupant.adjustFireLoss(rand(10, 16)) + mob_occupant.emote("scream") addtimer(CALLBACK(src, .proc/cook), 50) else uv_cycles = initial(uv_cycles) @@ -368,14 +368,15 @@ else if(!helmet && !mask && !suit && !storage && !occupant) return else - if(occupant) - to_chat(occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!") + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!") cook() . = TRUE if("dispense") if(!state_open) return - + var/static/list/valid_items = list("helmet", "suit", "mask", "storage") var/item_name = params["item"] if(item_name in valid_items) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 733ba725909..69920450cce 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -41,9 +41,10 @@ data["open"] = state_open data["occupant"] = list() - if(occupant) - data["occupant"]["name"] = occupant.name - data["occupant"]["stat"] = occupant.stat + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + data["occupant"]["name"] = mob_occupant.name + data["occupant"]["stat"] = mob_occupant.stat data["special_name"] = special ? special_name : null data["ready_implants"] = ready_implants diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 9411917c39a..b5f25520846 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -92,11 +92,12 @@ return switch(action) if("vr_connect") - if(ishuman(occupant) && occupant.mind) + var/mob/living/carbon/human/human_occupant = occupant + if(ishuman(occupant) && human_occupant.mind) to_chat(occupant, "Transfering to virtual reality...") if(vr_human) vr_human.revert_to_reality(FALSE, FALSE) - occupant.mind.transfer_to(vr_human) + human_occupant.mind.transfer_to(vr_human) vr_human.real_me = occupant to_chat(vr_human, "Transfer successful! you are now playing as [vr_human] in VR!") SStgui.close_user_uis(vr_human, src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c601d1601d7..93a26de0f67 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -110,8 +110,9 @@ return var/datum/gas_mixture/air1 = AIR1 var/turf/T = get_turf(src) - if(occupant) - if(occupant.health >= 100) // Don't bother with fully healed people. + if(isliving(occupant)) + var/mob/living/mob_occupant + if(mob_occupant.health >= 100) // Don't bother with fully healed people. on = FALSE update_icon() playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. @@ -120,15 +121,15 @@ radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language()) open_machine() return - else if(occupant.stat == DEAD) // We don't bother with dead people. + else if(mob_occupant.stat == DEAD) // We don't bother with dead people. return if(autoeject) // Eject if configured. open_machine() return if(air1.gases.len) - if(occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic. - occupant.Sleeping((occupant.bodytemperature / sleep_factor) * 100) - occupant.Paralyse((occupant.bodytemperature / paralyze_factor) * 100) + if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic. + mob_occupant.Sleeping((mob_occupant.bodytemperature / sleep_factor) * 100) + mob_occupant.Paralyse((mob_occupant.bodytemperature / paralyze_factor) * 100) if(beaker) if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic. @@ -148,20 +149,21 @@ on = FALSE update_icon() return - if(occupant) + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant var/cold_protection = 0 var/mob/living/carbon/human/H = occupant if(istype(H)) cold_protection = H.get_cold_protection(air1.temperature) - var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. + var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \ * temperature_delta * \ (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB) - occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB) + mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB) air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic. @@ -253,17 +255,18 @@ data["autoEject"] = autoeject var/list/occupantData = list() - if(occupant) - occupantData["name"] = occupant.name - occupantData["stat"] = occupant.stat - occupantData["health"] = occupant.health - occupantData["maxHealth"] = occupant.maxHealth + if(isliving(occupant)) + var/mob/living/mob_occupant = occupant + occupantData["name"] = mob_occupant.name + occupantData["stat"] = mob_occupant.stat + occupantData["health"] = mob_occupant.health + occupantData["maxHealth"] = mob_occupant.maxHealth occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD - occupantData["bruteLoss"] = occupant.getBruteLoss() - occupantData["oxyLoss"] = occupant.getOxyLoss() - occupantData["toxLoss"] = occupant.getToxLoss() - occupantData["fireLoss"] = occupant.getFireLoss() - occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["bruteLoss"] = mob_occupant.getBruteLoss() + occupantData["oxyLoss"] = mob_occupant.getOxyLoss() + occupantData["toxLoss"] = mob_occupant.getToxLoss() + occupantData["fireLoss"] = mob_occupant.getFireLoss() + occupantData["bodyTemperature"] = mob_occupant.bodytemperature data["occupant"] = occupantData diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index a4d9a32d3d2..3af1973f240 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -168,13 +168,14 @@ var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - var/sourcename = src.occupant.real_name + var/mob/living/mob_occupant = occupant + var/sourcename = mob_occupant.real_name var/sourcejob if(ishuman(occupant)) var/mob/living/carbon/human/gibee = occupant sourcejob = gibee.job - var/sourcenutriment = src.occupant.nutrition / 15 - var/sourcetotalreagents = src.occupant.reagents.total_volume + var/sourcenutriment = mob_occupant.nutrition / 15 + var/sourcetotalreagents = mob_occupant.reagents.total_volume var/gibtype = /obj/effect/decal/cleanable/blood/gibs var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human var/typeofskin = /obj/item/stack/sheet/animalhide/human @@ -212,8 +213,8 @@ allskin = newskin add_logs(user, occupant, "gibbed") - src.occupant.death(1) - src.occupant.ghostize() + mob_occupant.death(1) + mob_occupant.ghostize() qdel(src.occupant) spawn(src.gibtime) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) From 564ee21d42bcdc4875c1390e77ba996008703ebb Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Sat, 22 Apr 2017 12:41:08 +0100 Subject: [PATCH 037/100] Removal of checks I --- .../abduction/machinery/experiment.dm | 10 +++--- code/game/machinery/Sleeper.dm | 13 +++---- code/game/machinery/cloning.dm | 36 ++++++++----------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index ab486dfa048..8f3dfb7ac3c 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -111,18 +111,18 @@ else dat += "Experiment " - if(!isliving(occupant)) + if(!occupant) dat += "

Machine Unoccupied

" else dat += "

Subject Status :

" dat += "[occupant.name] => " var/mob/living/mob_occupant = occupant switch(mob_occupant.stat) - if(0) + if(CONSCIOUS) dat += "Conscious" - if(1) + if(UNCONSCIOUS) dat += "Unconscious" - else + else // DEAD dat += "Deceased" dat += "
" dat += "[flash]" @@ -147,7 +147,7 @@ if(href_list["close"]) close_machine() return - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant if(mob_occupant.stat != DEAD) if(href_list["experiment"]) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 79262494846..cad4bb6e8e0 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -129,8 +129,8 @@ data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) data["occupant"] = list() - if(isliving(occupant)) - var/mob/living/mob_occupant = occupant + var/mob/living/mob_occupant = occupant + if(mob_occupant) data["occupant"]["name"] = mob_occupant.name data["occupant"]["stat"] = mob_occupant.stat data["occupant"]["health"] = mob_occupant.health @@ -151,6 +151,8 @@ /obj/machinery/sleeper/ui_act(action, params) if(..()) return + var/mob/living/mob_occupant = occupant + switch(action) if("door") if(state_open) @@ -160,9 +162,8 @@ . = TRUE if("inject") var/chem = params["chem"] - if(!is_operational() || !isliving(occupant)) + if(!is_operational() || mob_occupant) return - var/mob/living/mob_occupant = occupant if(mob_occupant.health < min_health && chem != "epinephrine") return if(inject_chem(chem)) @@ -180,9 +181,9 @@ return TRUE /obj/machinery/sleeper/proc/chem_allowed(chem) - if(!isliving(occupant)) - return var/mob/living/mob_occupant = occupant + if(!mob_occupant) + return var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency var/occ_health = mob_occupant.health > min_health || chem == "epinephrine" return amount && occ_health diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 27bbcac4f89..a27ee04e606 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -121,10 +121,10 @@ /obj/machinery/clonepod/examine(mob/user) ..() + var/mob/living/mob_occupant = occupant if(mess) to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") - if(is_operational() && isliving(occupant)) - var/mob/living/mob_occupant = occupant + if(is_operational() && mob_occupant) if(mob_occupant.stat != DEAD) to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") @@ -139,8 +139,8 @@ /obj/machinery/clonepod/proc/get_completion() . = FALSE - if(isliving(occupant)) - var/mob/living/mob_occupant = occupant + var/mob/living/mob_occupant = occupant + if(mob_occupant) . = (100 * ((mob_occupant.health + 100) / (heal_level + 100))) /obj/machinery/clonepod/attack_ai(mob/user) @@ -231,11 +231,11 @@ var/mob/living/mob_occupant = occupant if(!is_operational()) //Autoeject if power is lost - if (occupant) + if(mob_occupant) go_out() connected_message("Clone Ejected: Loss of power.") - else if(isliving(mob_occupant) && (mob_occupant.loc == src)) + else if(mob_occupant && (mob_occupant.loc == src)) if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. connected_message("Clone Rejected: Deceased.") SPEAK("The cloning of [mob_occupant.real_name] has been \ @@ -275,7 +275,7 @@ SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") go_out() - else if ((!isliving(mob_occupant)) || (mob_occupant.loc != src)) + else if (!mob_occupant || mob_occupant.loc != src) occupant = null if (!mess && !panel_open) icon_state = "pod_0" @@ -311,15 +311,15 @@ to_chat(user, "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-") return + var/mob/living/mob_occupant = occupant if(W.GetID()) if(!check_access(W)) to_chat(user, "Access Denied.") return - if(!(occupant || mess)) + if(!(mob_occupant || mess)) to_chat(user, "Error: Pod has no occupant.") return else - var/mob/living/mob_occupant connected_message("Authorized Ejection") SPEAK("An authorized ejection of [clonemind.name] has occurred.") to_chat(user, "You force an emergency ejection. ") @@ -346,6 +346,7 @@ /obj/machinery/clonepod/proc/go_out() countdown.stop() + var/mob/living/mob_occupant = occupant if(mess) //Clean that mess and dump those gibs! mess = FALSE @@ -354,10 +355,9 @@ icon_state = "pod_0" return - if(!isliving(occupant)) + if(!mob_occupant) return - var/mob/living/mob_occupant = occupant if(grab_ghost_when == CLONER_MATURE_CLONE) mob_occupant.grab_ghost() @@ -372,8 +372,8 @@ occupant = null /obj/machinery/clonepod/proc/malfunction() - if(isliving(occupant)) - var/mob/living/mob_occupant = occupant + var/mob/living/mob_occupant = occupant + if(mob_occupant) connected_message("Critical Error!") SPEAK("Critical error! Please contact a Thinktronic Systems \ technician, as your warranty may be affected.") @@ -395,16 +395,10 @@ go_out() /obj/machinery/clonepod/emp_act(severity) -<<<<<<< HEAD - if((occupant || mess) && prob(100/(severity*efficiency))) - connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) - SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [clonemind.name] prematurely." ,0)) -======= - if(isliving(occupant) && prob(100/(severity*efficiency))) - var/mob/living/mob_occupant = occupant + var/mob/living/mob_occupant = occupant + if(mob_occupant && prob(100/(severity*efficiency))) connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0)) ->>>>>>> Changes /obj/machinery to have atom/movable occupants go_out() ..() From 44991e125ac1ec1f5db02b1756dcba518ad665e4 Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Sat, 22 Apr 2017 18:20:35 +0100 Subject: [PATCH 038/100] Removal of checks II - VR sleepers are human only. --- code/game/machinery/computer/cloning.dm | 15 ++++++++------- code/game/machinery/dna_scanner.dm | 4 ++-- code/game/machinery/suit_storage_unit.dm | 4 ++-- .../items/weapons/implants/implantchair.dm | 2 +- code/modules/VR/vr_sleeper.dm | 3 ++- .../machinery/components/unary_devices/cryo.dm | 8 ++++---- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index a2ecc87352a..bdb2044f407 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -186,22 +186,23 @@ // Scanner if (!isnull(src.scanner)) + var/mob/living/scanner_occupant = scanner.occupant + dat += "

Scanner Functions

" dat += "
" - if (!isliving(scanner.occupant)) + if(!scanner_occupant) dat += "Scanner Unoccupied" else if(loading) - dat += "[src.scanner.occupant] => Scanning..." + dat += "[scanner_occupant] => Scanning..." else - var/mob/living/mob_occupant = scanner.occupant - if (mob_occupant.ckey != scantemp_ckey) + if(scanner_occupant.ckey != scantemp_ckey) scantemp = "Ready to Scan" - scantemp_ckey = mob_occupant.ckey - dat += "[src.scanner.occupant] => [scantemp]" + scantemp_ckey = scanner_occupant.ckey + dat += "[scanner_occupant] => [scantemp]" dat += "
" - if (src.scanner.occupant) + if(scanner_occupant) dat += "Start Scan" dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" else diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 462934f3f88..d572b3e9dc1 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -105,8 +105,8 @@ ..() // search for ghosts, if the corpse is empty and the scanner is connected to a cloner - if(isliving(occupant)) - var/mob/living/mob_occupant = occupant + var/mob/living/mob_occupant = occupant + if(mob_occupant) if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 2f0eab165b7..f64f7617367 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -211,7 +211,7 @@ uv = TRUE locked = TRUE update_icon() - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant if(uv_super) mob_occupant.adjustFireLoss(rand(20, 36)) @@ -368,7 +368,7 @@ else if(!helmet && !mask && !suit && !storage && !occupant) return else - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!") cook() diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 69920450cce..2cc1e7824fb 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -41,7 +41,7 @@ data["open"] = state_open data["occupant"] = list() - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant data["occupant"]["name"] = mob_occupant.name data["occupant"]["stat"] = mob_occupant.stat diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index b5f25520846..bba253a9da6 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -9,6 +9,7 @@ icon_state = "sleeper" state_open = TRUE anchored = TRUE + occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize var/you_die_in_the_game_you_die_for_real = FALSE var/datum/effect_system/spark_spread/sparks var/mob/living/carbon/human/virtual_reality/vr_human @@ -93,7 +94,7 @@ switch(action) if("vr_connect") var/mob/living/carbon/human/human_occupant = occupant - if(ishuman(occupant) && human_occupant.mind) + if(human_occupant && human_occupant.mind) to_chat(occupant, "Transfering to virtual reality...") if(vr_human) vr_human.revert_to_reality(FALSE, FALSE) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 93a26de0f67..40f9781fdbd 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -110,8 +110,8 @@ return var/datum/gas_mixture/air1 = AIR1 var/turf/T = get_turf(src) - if(isliving(occupant)) - var/mob/living/mob_occupant + if(occupant) + var/mob/living/mob_occupant = occupant if(mob_occupant.health >= 100) // Don't bother with fully healed people. on = FALSE update_icon() @@ -149,7 +149,7 @@ on = FALSE update_icon() return - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant var/cold_protection = 0 var/mob/living/carbon/human/H = occupant @@ -255,7 +255,7 @@ data["autoEject"] = autoeject var/list/occupantData = list() - if(isliving(occupant)) + if(occupant) var/mob/living/mob_occupant = occupant occupantData["name"] = mob_occupant.name occupantData["stat"] = mob_occupant.stat From ad6f0c818c78f6d97ea28df75d0707fce3982b63 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Mon, 1 May 2017 14:05:06 -0400 Subject: [PATCH 039/100] Subsystem change for the SM and TEG and slight QoL (#26477) * Port * Why the fuck did I think fixing merge conflicts with the web editor was a good idea. The 2 minute before sleep commit * Remove from subsystem on destroy * Woops --- code/modules/power/generator.dm | 45 +++++++++++++------ code/modules/power/supermatter/supermatter.dm | 5 ++- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index f3bbc205663..cfe0c8eb397 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -33,6 +33,7 @@ cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) connect_to_network() + SSair.atmos_machinery += src if(cold_circ) switch(cold_dir) @@ -54,7 +55,10 @@ stat |= BROKEN update_icon() - + +/obj/machinery/power/generator/Destroy() + SSair.atmos_machinery -= src + return ..() /obj/machinery/power/generator/update_icon() @@ -63,21 +67,20 @@ else cut_overlays() - if(lastgenlev != 0) - add_overlay("teg-op[lastgenlev]") + var/L = min(round(lastgenlev/100000),11) + if(L != 0) + add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q -/obj/machinery/power/generator/process() +/obj/machinery/power/generator/process_atmos() if(!cold_circ || !hot_circ) return - lastgen = 0 - if(powernet) //to_chat(world, "cold_circ and hot_circ pass") @@ -104,7 +107,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency + lastgen += energy_transfer*efficiency //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") @@ -113,7 +116,7 @@ //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - add_avail(lastgen) + //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed if(hot_air) @@ -123,15 +126,23 @@ if(cold_air) var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1 cold_circ_air1.merge(cold_air) + + update_icon() - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" - if((genlev != lastgenlev) || (circ != lastcirc)) - lastgenlev = genlev + if(circ != lastcirc) lastcirc = circ update_icon() src.updateDialog() + +/obj/machinery/power/generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + ..() /obj/machinery/power/generator/attack_hand(mob/user) if(..()) @@ -150,9 +161,15 @@ var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2 t += "
" - - t += "Output: [round(lastgen)] W" - + + var/displaygen = lastgenlev + if(displaygen < 1000000) //less than a MW + displaygen /= 1000 + t += "Output: [round(displaygen,0.01)] kW" + else + displaygen /= 1000000 + t += "Output: [round(displaygen,0.01)] MW" + t += "
" t += "Cold loop
" diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 4b48d198575..a580b63e552 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -129,6 +129,7 @@ /obj/machinery/power/supermatter_shard/Initialize() . = ..() + SSair.atmos_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -139,6 +140,7 @@ /obj/machinery/power/supermatter_shard/Destroy() investigate_log("has been destroyed.", "supermatter") + SSair.atmos_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) @@ -181,7 +183,7 @@ E.energy = power qdel(src) -/obj/machinery/power/supermatter_shard/process() +/obj/machinery/power/supermatter_shard/process_atmos() var/turf/T = loc if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity. @@ -296,6 +298,7 @@ if(produces_gas) env.merge(removed) + air_update_turf() for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) From 88cc53e0a6a0c5ae3b8aa601d65a9ce1bfa447de Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 11:05:08 -0700 Subject: [PATCH 040/100] Automatic changelog generation for PR #26477 [ci skip] --- html/changelogs/AutoChangeLog-pr-26477.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26477.yml diff --git a/html/changelogs/AutoChangeLog-pr-26477.yml b/html/changelogs/AutoChangeLog-pr-26477.yml new file mode 100644 index 00000000000..8848bcb4508 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26477.yml @@ -0,0 +1,7 @@ +author: "ninjanomnom" +delete-after: True +changes: + - tweak: "TEG displays power in kw or MW now" + - tweak: "TEG power bar only maxes over 1MW now" + - experiment: "Moves TEG to SSair" + - experiment: "Moves SM to SSair" From e3fac8694d393117318c146fd6422631fdab3d2a Mon Sep 17 00:00:00 2001 From: bagil Date: Mon, 1 May 2017 18:10:00 +0000 Subject: [PATCH 041/100] Automatic changelog compile, [ci skip] --- html/changelog.html | 41 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 37 +++++++++++++++++++ html/changelogs/AutoChangeLog-pr-25458.yml | 5 --- html/changelogs/AutoChangeLog-pr-25596.yml | 4 --- html/changelogs/AutoChangeLog-pr-25603.yml | 4 --- html/changelogs/AutoChangeLog-pr-25743.yml | 4 --- html/changelogs/AutoChangeLog-pr-26477.yml | 7 ---- html/changelogs/AutoChangeLog-pr-26556.yml | 4 --- html/changelogs/AutoChangeLog-pr-26725.yml | 5 --- html/changelogs/AutoChangeLog-pr-26729.yml | 4 --- html/changelogs/AutoChangeLog-pr-26731.yml | 4 --- html/changelogs/AutoChangeLog-pr-26735.yml | 5 --- html/changelogs/AutoChangeLog-pr-26737.yml | 4 --- 13 files changed, 78 insertions(+), 50 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25458.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-25596.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-25603.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-25743.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26477.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26556.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26725.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26729.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26731.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26735.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26737.yml diff --git a/html/changelog.html b/html/changelog.html index c7b35fb731e..c54a4d14534 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,11 +56,52 @@ -->

01 May 2017

+

4dplanner updated:

+
    +
  • Syndicate surplus crates now contain fewer implants
  • +

Bawhoppen updated:

  • Deep storage space ruin has been readded.
  • Space Cola machines now stock bottles of water.
+

Cobby updated:

+
    +
  • The Gang pen is now stealthy. Stab away!
  • +
+

Cyberboss updated:

+
    +
  • You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends
  • +
+

Joan updated:

+
    +
  • Belligerent now prevents you from running for 7 seconds after every chant.
  • +
  • However, you no longer remain walking after Belligerent's effect fades.
  • +
  • Clockcult component generation will automatically focus on components needed to activate the Ark if it exists.
  • +
  • Gaining Vanguard, such as from the Linked Vanguard scripture, will remove existing stuns.
  • +
  • Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second.
  • +
  • Sigils of Transmission can be charged with brass at a rate of 250W per sheet.
  • +
+

Moonlighting Mac says updated:

+
    +
  • Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients from Lavaland.
  • +
  • After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm.
  • +
+

QualityVan updated:

+
    +
  • Saline glucose now acts as temporary blood instead of increasing blood regeneration
  • +
+

Swindly updated:

+
    +
  • Mercury and Lithium make people move when not in space instead of when in space.
  • +
+

ninjanomnom updated:

+
    +
  • TEG displays power in kw or MW now
  • +
  • TEG power bar only maxes over 1MW now
  • +
  • Moves TEG to SSair
  • +
  • Moves SM to SSair
  • +

30 April 2017

QualityVan updated:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 32e3b4b3e3c..7344a9b8d73 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10774,6 +10774,43 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: The Bank Machine in the vault now uses the radio to announce unauthorized withdrawals, rather than an endless stream of loud announcements. 2017-05-01: + 4dplanner: + - tweak: Syndicate surplus crates now contain fewer implants Bawhoppen: - rscadd: Deep storage space ruin has been readded. - rscadd: Space Cola machines now stock bottles of water. + Cobby: + - balance: The Gang pen is now stealthy. Stab away! + Cyberboss: + - rscadd: You can now make holocalls! Simply stand on a pad, bring up the menu, + and select the holopad you wish to call. Remain still until someone answers. + When they do, you'll be able to act just like an AI hologram until the call + ends + Joan: + - rscadd: Belligerent now prevents you from running for 7 seconds after every chant. + - rscdel: However, you no longer remain walking after Belligerent's effect fades. + - rscadd: Clockcult component generation will automatically focus on components + needed to activate the Ark if it exists. + - rscadd: Gaining Vanguard, such as from the Linked Vanguard scripture, will remove + existing stuns. + - rscadd: Proselytizers can now charge from Sigils of Transmission at a rate of + 1000W per second. + - rscadd: Sigils of Transmission can be charged with brass at a rate of 250W per + sheet. + Moonlighting Mac says: + - bugfix: Due to a clerical error in the chef's cookbooks now being resolved, you + can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients + from Lavaland. + - experiment: After being found again you will now be able to enjoy its special + blend of flavors with your tastebuds. Mmm. + QualityVan: + - tweak: Saline glucose now acts as temporary blood instead of increasing blood + regeneration + Swindly: + - tweak: Mercury and Lithium make people move when not in space instead of when + in space. + ninjanomnom: + - tweak: TEG displays power in kw or MW now + - tweak: TEG power bar only maxes over 1MW now + - experiment: Moves TEG to SSair + - experiment: Moves SM to SSair diff --git a/html/changelogs/AutoChangeLog-pr-25458.yml b/html/changelogs/AutoChangeLog-pr-25458.yml deleted file mode 100644 index 9f58df768f3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25458.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Belligerent now prevents you from running for 7 seconds after every chant." - - rscdel: "However, you no longer remain walking after Belligerent's effect fades." diff --git a/html/changelogs/AutoChangeLog-pr-25596.yml b/html/changelogs/AutoChangeLog-pr-25596.yml deleted file mode 100644 index 3967efa494c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25596.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Clockcult component generation will automatically focus on components needed to activate the Ark if it exists." diff --git a/html/changelogs/AutoChangeLog-pr-25603.yml b/html/changelogs/AutoChangeLog-pr-25603.yml deleted file mode 100644 index 6c917057bc5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25603.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Gaining Vanguard, such as from the Linked Vanguard scripture, will remove existing stuns." diff --git a/html/changelogs/AutoChangeLog-pr-25743.yml b/html/changelogs/AutoChangeLog-pr-25743.yml deleted file mode 100644 index 97ec1e44784..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25743.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cyberboss" -delete-after: True -changes: - - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" diff --git a/html/changelogs/AutoChangeLog-pr-26477.yml b/html/changelogs/AutoChangeLog-pr-26477.yml deleted file mode 100644 index 8848bcb4508..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26477.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - tweak: "TEG displays power in kw or MW now" - - tweak: "TEG power bar only maxes over 1MW now" - - experiment: "Moves TEG to SSair" - - experiment: "Moves SM to SSair" diff --git a/html/changelogs/AutoChangeLog-pr-26556.yml b/html/changelogs/AutoChangeLog-pr-26556.yml deleted file mode 100644 index 68fca1b6ac7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26556.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - tweak: "Saline glucose now acts as temporary blood instead of increasing blood regeneration" diff --git a/html/changelogs/AutoChangeLog-pr-26725.yml b/html/changelogs/AutoChangeLog-pr-26725.yml deleted file mode 100644 index 73c6fac7664..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26725.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second." - - rscadd: "Sigils of Transmission can be charged with brass at a rate of 250W per sheet." diff --git a/html/changelogs/AutoChangeLog-pr-26729.yml b/html/changelogs/AutoChangeLog-pr-26729.yml deleted file mode 100644 index c209d1af546..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26729.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cobby" -delete-after: True -changes: - - balance: "The Gang pen is now stealthy. Stab away!" diff --git a/html/changelogs/AutoChangeLog-pr-26731.yml b/html/changelogs/AutoChangeLog-pr-26731.yml deleted file mode 100644 index c55c645e6e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26731.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swindly" -delete-after: True -changes: - - tweak: "Mercury and Lithium make people move when not in space instead of when in space." diff --git a/html/changelogs/AutoChangeLog-pr-26735.yml b/html/changelogs/AutoChangeLog-pr-26735.yml deleted file mode 100644 index 16311e93ff9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26735.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Moonlighting Mac says" -delete-after: True -changes: - - bugfix: "Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish \"Stuffed Legion\" out of exotic ingredients from Lavaland." - - experiment: "After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm." diff --git a/html/changelogs/AutoChangeLog-pr-26737.yml b/html/changelogs/AutoChangeLog-pr-26737.yml deleted file mode 100644 index d850f9c42c8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26737.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "4dplanner" -delete-after: True -changes: - - tweak: "Syndicate surplus crates now contain fewer implants" From bc2dcce865ca3959940662153c81acbbb2105c2b Mon Sep 17 00:00:00 2001 From: XDTM Date: Mon, 1 May 2017 20:38:46 +0200 Subject: [PATCH 042/100] Fixes alien eggs --- code/game/objects/structures/aliens.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d46136a9aeb..6212133b129 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -298,7 +298,7 @@ else for(var/mob/M in range(1,src)) if(CanHug(M)) - child.Attach(M) + child.Leap(M) break /obj/structure/alien/egg/obj_break(damage_flag) From 574c3dd19bd73ce4e8ca46505598a8b824dbe163 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 14:43:17 -0400 Subject: [PATCH 043/100] Fixes atom spawning --- code/modules/admin/admin.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1f7dca59b35..6b1d0e36f6d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -610,17 +610,17 @@ set desc = "(atom path) Spawn an atom" set name = "Spawn" - return spawn_atom_impl(object, FALSE) + return usr.client.spawn_atom_impl(object, FALSE) /datum/admins/proc/spawn_atom_adv(object as text) set category = "Debug" set desc = "(atom path) Spawn an atom with New() parameters" set name = "Advanced Spawn" - return spawn_atom_impl(object, TRUE) + return usr.client.spawn_atom_impl(object, TRUE) -/datum/admins/proc/spawn_atom_impl(object, params) +/client/proc/spawn_atom_impl(object, params) if(!check_rights(R_SPAWN)) return From 87927677c1e6096a1074a6922cbd389f2bf6de15 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 044/100] Revert "Automatic changelog compile, [ci skip]" This reverts commit e3fac8694d393117318c146fd6422631fdab3d2a. --- html/changelogs/AutoChangeLog-pr-25458.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-25596.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-25743.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-26477.yml | 7 +++++++ html/changelogs/AutoChangeLog-pr-26556.yml | 4 ++++ 5 files changed, 24 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25458.yml create mode 100644 html/changelogs/AutoChangeLog-pr-25596.yml create mode 100644 html/changelogs/AutoChangeLog-pr-25743.yml create mode 100644 html/changelogs/AutoChangeLog-pr-26477.yml create mode 100644 html/changelogs/AutoChangeLog-pr-26556.yml diff --git a/html/changelogs/AutoChangeLog-pr-25458.yml b/html/changelogs/AutoChangeLog-pr-25458.yml new file mode 100644 index 00000000000..9f58df768f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25458.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Belligerent now prevents you from running for 7 seconds after every chant." + - rscdel: "However, you no longer remain walking after Belligerent's effect fades." diff --git a/html/changelogs/AutoChangeLog-pr-25596.yml b/html/changelogs/AutoChangeLog-pr-25596.yml new file mode 100644 index 00000000000..3967efa494c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25596.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - rscadd: "Clockcult component generation will automatically focus on components needed to activate the Ark if it exists." diff --git a/html/changelogs/AutoChangeLog-pr-25743.yml b/html/changelogs/AutoChangeLog-pr-25743.yml new file mode 100644 index 00000000000..97ec1e44784 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25743.yml @@ -0,0 +1,4 @@ +author: "Cyberboss" +delete-after: True +changes: + - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" diff --git a/html/changelogs/AutoChangeLog-pr-26477.yml b/html/changelogs/AutoChangeLog-pr-26477.yml new file mode 100644 index 00000000000..8848bcb4508 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26477.yml @@ -0,0 +1,7 @@ +author: "ninjanomnom" +delete-after: True +changes: + - tweak: "TEG displays power in kw or MW now" + - tweak: "TEG power bar only maxes over 1MW now" + - experiment: "Moves TEG to SSair" + - experiment: "Moves SM to SSair" diff --git a/html/changelogs/AutoChangeLog-pr-26556.yml b/html/changelogs/AutoChangeLog-pr-26556.yml new file mode 100644 index 00000000000..68fca1b6ac7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26556.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - tweak: "Saline glucose now acts as temporary blood instead of increasing blood regeneration" From 7e7a77ef882364624b778078f7542ae4c1cc3676 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 045/100] Revert "Automatic changelog generation for PR #26477 [ci skip]" This reverts commit 88cc53e0a6a0c5ae3b8aa601d65a9ce1bfa447de. --- html/changelogs/AutoChangeLog-pr-26477.yml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26477.yml diff --git a/html/changelogs/AutoChangeLog-pr-26477.yml b/html/changelogs/AutoChangeLog-pr-26477.yml deleted file mode 100644 index 8848bcb4508..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26477.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - tweak: "TEG displays power in kw or MW now" - - tweak: "TEG power bar only maxes over 1MW now" - - experiment: "Moves TEG to SSair" - - experiment: "Moves SM to SSair" From a8f2daa7394f25d75f4c1b134d37ea050a7d1c76 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 048/100] Revert "Automatic changelog generation for PR #26556 [ci skip]" This reverts commit 1955724e2897a9eb81b25dd8725361aa221a7bda. --- html/changelogs/AutoChangeLog-pr-26556.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26556.yml diff --git a/html/changelogs/AutoChangeLog-pr-26556.yml b/html/changelogs/AutoChangeLog-pr-26556.yml deleted file mode 100644 index 68fca1b6ac7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26556.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QualityVan" -delete-after: True -changes: - - tweak: "Saline glucose now acts as temporary blood instead of increasing blood regeneration" From 906dc75725ddde7d1718b03738b65bc8ac434822 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 050/100] Revert "Automatic changelog generation for PR #25743 [ci skip]" This reverts commit c46a91f856f83d7fed75cff33ad21cb05e953163. --- html/changelogs/AutoChangeLog-pr-25743.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25743.yml diff --git a/html/changelogs/AutoChangeLog-pr-25743.yml b/html/changelogs/AutoChangeLog-pr-25743.yml deleted file mode 100644 index 97ec1e44784..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25743.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cyberboss" -delete-after: True -changes: - - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" From 06963ef976465ef28929e36200b63e1d6d4e6176 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 052/100] Revert "Automatic changelog generation for PR #25596 [ci skip]" This reverts commit c3897b8f3ce1b8cee4897de4092569762836a970. --- html/changelogs/AutoChangeLog-pr-25596.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25596.yml diff --git a/html/changelogs/AutoChangeLog-pr-25596.yml b/html/changelogs/AutoChangeLog-pr-25596.yml deleted file mode 100644 index 3967efa494c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25596.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Clockcult component generation will automatically focus on components needed to activate the Ark if it exists." From 3a3690589da48dbf0d04727da1b95ddcb6cbe0ac Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 054/100] Revert "Automatic changelog generation for PR #25458 [ci skip]" This reverts commit aa7d778b27d3713ce624541c6faf47769250c1b1. --- html/changelogs/AutoChangeLog-pr-25458.yml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25458.yml diff --git a/html/changelogs/AutoChangeLog-pr-25458.yml b/html/changelogs/AutoChangeLog-pr-25458.yml deleted file mode 100644 index 9f58df768f3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25458.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Belligerent now prevents you from running for 7 seconds after every chant." - - rscdel: "However, you no longer remain walking after Belligerent's effect fades." From a7c10b052c7d3091ba30f367750de979057364a0 Mon Sep 17 00:00:00 2001 From: Thunder12345 Date: Mon, 1 May 2017 20:58:38 +0100 Subject: [PATCH 060/100] Revert "Fixes Ahelp queing (#26739)" This reverts commit 0c1620d32cead359a42033c044e8b4d5aa5e3e83. --- code/modules/admin/verbs/adminhelp.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index db32b8b600e..235a9fd2961 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -485,10 +485,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") current_ticket.Close() - if(!(/client/verb/adminhelp in verbs)) - to_chat(usr, "Nice try!") - return - new /datum/admin_help(msg, src, FALSE) //admin proc From 607809396f3c330572831f53e4c37163297c57ae Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 1 May 2017 15:27:44 -0700 Subject: [PATCH 061/100] Fixes biogenerator (#26743) --- code/modules/research/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index aa106541e6f..827cce162f7 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -185,7 +185,7 @@ research holder datum. if((D.build_type & SMELTER) && ("initial" in D.category)) AddDesign2Known(D) -/datum/research/biogenerator/AddDesign2Known(datum/design/D) +/datum/research/smelter/AddDesign2Known(datum/design/D) if(!(D.build_type & SMELTER)) return ..() From 6cf624b399caba2c7f11e39b367daf19be686d46 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 15:27:45 -0700 Subject: [PATCH 062/100] Automatic changelog generation for PR #26743 [ci skip] --- html/changelogs/AutoChangeLog-pr-26743.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26743.yml diff --git a/html/changelogs/AutoChangeLog-pr-26743.yml b/html/changelogs/AutoChangeLog-pr-26743.yml new file mode 100644 index 00000000000..67713641eb2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26743.yml @@ -0,0 +1,4 @@ +author: "Shadowlight213" +delete-after: True +changes: + - bugfix: "The biogenerator will now show its recipes again." From c4320ee111b9ee89729f2350ce986cd4e61c7f94 Mon Sep 17 00:00:00 2001 From: Profakos Date: Tue, 2 May 2017 00:31:06 +0200 Subject: [PATCH 063/100] Adds persistent trophy cases (#26745) * Persistent trophy cases * QDEL_NULLs, TrySaveTrophy * Breaking tweaks * Persistence tweaks, moves the alert message * JSON format and ckey logging * Showpiece dummy * Better illegal check --- code/_globalvars/lists/objects.dm | 1 + code/controllers/subsystem/persistence.dm | 57 +++++++++- code/game/objects/structures/displaycase.dm | 109 ++++++++++++++++++-- 3 files changed, 157 insertions(+), 10 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 5de5d341ee4..680ae8703ee 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection org GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors. GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) +GLOBAL_LIST_EMPTY(trophy_cases) GLOBAL_LIST_EMPTY(wire_color_directory) GLOBAL_LIST_EMPTY(wire_name_directory) \ No newline at end of file diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index e1cf992e8b5..6b3e47054c1 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -11,10 +11,14 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/savefile/chisel_messages_sav + var/savefile/trophy_sav + var/list/saved_trophies = list() + /datum/controller/subsystem/persistence/Initialize() LoadSatchels() LoadPoly() LoadChiselMessages() + LoadTrophies() ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -105,10 +109,49 @@ SUBSYSTEM_DEF(persistence) M.persists = FALSE qdel(M) +/datum/controller/subsystem/persistence/proc/LoadTrophies() + trophy_sav = new /savefile("data/npc_saves/TrophyItems.sav") + var/saved_json + trophy_sav >> saved_json + + var/decoded_json = json_decode(saved_json) + + if(!islist(decoded_json)) + return + + saved_trophies = decoded_json + + SetUpTrophies(saved_trophies.Copy()) + +/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) + for(var/A in GLOB.trophy_cases) + var/obj/structure/displaycase/trophy/T = A + T.added_roundstart = TRUE + + var/trophy_data = pick_n_take(trophy_items) + + if(!islist(trophy_data)) + continue + + var/list/chosen_trophy = trophy_data + + if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed + continue + + var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null + if(!path) + continue + + T.showpiece = new /obj/item/showpiece_dummy(T, path) + T.trophy_message = chosen_trophy["message"] + T.placer_key = chosen_trophy["placer_key"] + T.update_icon() + /datum/controller/subsystem/persistence/proc/CollectData() CollectChiselMessages() CollectSecretSatchels() + CollectTrophies() /datum/controller/subsystem/persistence/proc/CollectSecretSatchels() for(var/A in new_secret_satchels) @@ -135,4 +178,16 @@ SUBSYSTEM_DEF(persistence) chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) - saved_messages += list(M.pack()) // dm eats one list. + saved_messages += list(M.pack()) // dm eats one list + + +/datum/controller/subsystem/persistence/proc/CollectTrophies() + trophy_sav << json_encode(saved_trophies) + +/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) + if(!T.added_roundstart && T.showpiece) + var/list/data = list() + data["path"] = T.showpiece.type + data["message"] = T.trophy_message + data["placer_key"] = T.placer_key + saved_trophies += list(data) \ No newline at end of file diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 47e41574087..3bf87ea9f98 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -16,27 +16,25 @@ var/obj/item/weapon/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display -/obj/structure/displaycase/New() - ..() +/obj/structure/displaycase/Initialize() + . = ..() if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() /obj/structure/displaycase/Destroy() if(electronics) - qdel(electronics) - electronics = null + QDEL_NULL(electronics) if(showpiece) - qdel(showpiece) - showpiece = null + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) ..() - if(showpiece) - to_chat(user, "There's [showpiece] inside.") if(alert) to_chat(user, "Hooked up with an anti-theft system.") + if(showpiece) + to_chat(user, "There's [showpiece] inside.") /obj/structure/displaycase/proc/dump() @@ -176,8 +174,8 @@ /obj/structure/displaycase/attack_hand(mob/user) user.changeNext_move(CLICK_CD_MELEE) if (showpiece && (broken || open)) - dump() to_chat(user, "You deactivate the hover field built into the case.") + dump() src.add_fingerprint(user) update_icon() return @@ -249,3 +247,96 @@ desc = "A glass lab container for storing interesting creatures." start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(GLOB.access_rd) + + + +/obj/structure/displaycase/trophy + name = "trophy display case" + desc = "Store your trophies of accomplishment in here, and they will stay forever." + var/trophy_message = "" + var/placer_key = "" + var/added_roundstart = TRUE + alert = TRUE + integrity_failure = 0 + +/obj/structure/displaycase/trophy/Initialize() + . = ..() + GLOB.trophy_cases += src + +/obj/structure/displaycase/trophy/Destroy() + GLOB.trophy_cases -= src + return ..() + +/obj/structure/displaycase/trophy/examine(mob/user) + ..() + if(trophy_message) + to_chat(user, "The plaque reads:") + to_chat(user, trophy_message) + +/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) + + if(!user.Adjacent(src)) //no TK museology + return + + if(!added_roundstart) + to_chat(user, "You've already put something new in this case.") + return + + if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + for(var/a in W.GetAllContents()) + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + if(user.drop_item()) + + if(showpiece) + to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") + QDEL_NULL(showpiece) + + to_chat(user, "You insert [W] into the case.") + W.forceMove(src) + showpiece = W + added_roundstart = FALSE + update_icon() + + placer_key = user.ckey + + trophy_message = W.desc //default value + + var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") + if(chosen_plaque) + if(user.Adjacent(src)) + trophy_message = chosen_plaque + to_chat(user, "You set the plaque's text.") + else + to_chat(user, "You are too far to set the plaque's text.") + + SSpersistence.SaveTrophy(src) + + else + to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") + + return + +/obj/structure/displaycase/trophy/dump() + if (showpiece) + if(added_roundstart) + visible_message("The [showpiece] crumbles to dust!") + new /obj/effect/decal/cleanable/ash(loc) + QDEL_NULL(showpiece) + else + ..() + +/obj/item/showpiece_dummy + name = "Cheap replica" + +/obj/item/showpiece_dummy/Initialize(mapload, path) + . = ..() + var/obj/item/I = path + name = initial(I.name) + icon = initial(I.icon) + icon_state = initial(I.icon_state) From a5143e7d74c82a6b8aa89d2197402a34e9c4cab2 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 15:31:07 -0700 Subject: [PATCH 064/100] Automatic changelog generation for PR #26745 [ci skip] --- html/changelogs/AutoChangeLog-pr-26745.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26745.yml diff --git a/html/changelogs/AutoChangeLog-pr-26745.yml b/html/changelogs/AutoChangeLog-pr-26745.yml new file mode 100644 index 00000000000..bef4ff2c24e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26745.yml @@ -0,0 +1,4 @@ +author: "Kor, Goof and Plizzard" +delete-after: True +changes: + - rscadd: "Adds persistent trophy cases. They are not on any map yet." From fa0b432a318ec50d0ff96b727803e319fdce907a Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 1 May 2017 18:31:24 -0400 Subject: [PATCH 065/100] Makes admin sound announcement use the right span (#26746) --- code/modules/admin/verbs/playsound.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 118114e81ff..e781473634c 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -21,7 +21,7 @@ var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel") switch(res) if("Yes") - to_chat(world, "An admin played: [S]") + to_chat(world, "An admin played: [S]") if("Cancel") return From bd9b242575ae07689683be447976088aa29d2d32 Mon Sep 17 00:00:00 2001 From: 4dplanner <3combined@gmail.com> Date: Mon, 1 May 2017 23:34:29 +0100 Subject: [PATCH 066/100] Plants now react with turfs on squash() (#26752) --- code/modules/hydroponics/grown.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index b7fe78f35e4..5efd440c9bc 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -111,6 +111,7 @@ for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squash(src, target) + reagents.reaction(T) for(var/A in T) reagents.reaction(A) From 6b3b92f2e68dbb0a98a5089322afddfd294b79d1 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 1 May 2017 15:34:30 -0700 Subject: [PATCH 067/100] Automatic changelog generation for PR #26752 [ci skip] --- html/changelogs/AutoChangeLog-pr-26752.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26752.yml diff --git a/html/changelogs/AutoChangeLog-pr-26752.yml b/html/changelogs/AutoChangeLog-pr-26752.yml new file mode 100644 index 00000000000..00fa90ced11 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26752.yml @@ -0,0 +1,4 @@ +author: "4dplanner" +delete-after: True +changes: + - bugfix: "Squishy plants will now affect walls and other turfs they get squished on" From 784b9c3626304a8aac6f3bad86b43b1576998b7c Mon Sep 17 00:00:00 2001 From: bagil Date: Tue, 2 May 2017 01:27:28 +0000 Subject: [PATCH 068/100] Automatic changelog compile, [ci skip] --- html/changelog.html | 39 ++++++++-------------- html/changelogs/.all_changelog.yml | 8 +++++ html/changelogs/AutoChangeLog-pr-26743.yml | 4 --- html/changelogs/AutoChangeLog-pr-26745.yml | 4 --- html/changelogs/AutoChangeLog-pr-26752.yml | 4 --- 5 files changed, 22 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26743.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26745.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26752.yml diff --git a/html/changelog.html b/html/changelog.html index c54a4d14534..8598ff603df 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,20 @@ -->
+

02 May 2017

+

4dplanner updated:

+
    +
  • Squishy plants will now affect walls and other turfs they get squished on
  • +
+

Kor, Goof and Plizzard updated:

+
    +
  • Adds persistent trophy cases. They are not on any map yet.
  • +
+

Shadowlight213 updated:

+
    +
  • The biogenerator will now show its recipes again.
  • +
+

01 May 2017

4dplanner updated:

    @@ -1282,31 +1296,6 @@
    • Lobby music is no longer delayed
    - -

    28 February 2017

    -

    Cyberboss updated:

    -
      -
    • You will no longer be shown empty memories when the game starts
    • -
    • Built APCs now work again
    • -
    • Borg AI cameras now work again
    • -
    -

    Joan updated:

    -
      -
    • Anima Fragments now slam into non-Servants when bumping. This will ONLY happen if the fragment is not slowed, and slamming into someone will slightly damage the fragment and slow it severely.
    • -
    -

    Lzimann updated:

    -
      -
    • Communications console can also check the ID the user is wearing.
    • -
    -

    Supermichael777 updated:

    -
      -
    • The button now has a five second delay when detonating bombs
    • -
    -

    XDTM updated:

    -
      -
    • You can now change the input/output directons for Ore Redemption Machines by using a multitool on them with the panel open.
    • -
    • Diagnostic HUDs can now see if airlocks are shocked.
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7344a9b8d73..bad0d33dceb 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10814,3 +10814,11 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: TEG power bar only maxes over 1MW now - experiment: Moves TEG to SSair - experiment: Moves SM to SSair +2017-05-02: + 4dplanner: + - bugfix: Squishy plants will now affect walls and other turfs they get squished + on + Kor, Goof and Plizzard: + - rscadd: Adds persistent trophy cases. They are not on any map yet. + Shadowlight213: + - bugfix: The biogenerator will now show its recipes again. diff --git a/html/changelogs/AutoChangeLog-pr-26743.yml b/html/changelogs/AutoChangeLog-pr-26743.yml deleted file mode 100644 index 67713641eb2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26743.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadowlight213" -delete-after: True -changes: - - bugfix: "The biogenerator will now show its recipes again." diff --git a/html/changelogs/AutoChangeLog-pr-26745.yml b/html/changelogs/AutoChangeLog-pr-26745.yml deleted file mode 100644 index bef4ff2c24e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26745.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor, Goof and Plizzard" -delete-after: True -changes: - - rscadd: "Adds persistent trophy cases. They are not on any map yet." diff --git a/html/changelogs/AutoChangeLog-pr-26752.yml b/html/changelogs/AutoChangeLog-pr-26752.yml deleted file mode 100644 index 00fa90ced11..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26752.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "4dplanner" -delete-after: True -changes: - - bugfix: "Squishy plants will now affect walls and other turfs they get squished on" From 4d17c4fad29925359d379cdb8ad62e0166b9cae8 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 1 May 2017 21:45:57 -0400 Subject: [PATCH 069/100] Fixes cult and clockcult icons --- code/datums/antagonists/datum_clockcult.dm | 3 ++- code/datums/antagonists/datum_cult.dm | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index 85ff6f89302..3084b9ba829 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -29,6 +29,7 @@ else if(isbrain(current) || isclockmob(current)) to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") ..() + SSticker.mode.update_servant_icons_added(owner) if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) var/datum/game_mode/clockwork_cult/C = SSticker.mode C.present_tasks(owner) //Memorize the objectives @@ -39,7 +40,6 @@ if(istype(mob_override)) current = mob_override GLOB.all_clockwork_mobs += current - SSticker.mode.update_servant_icons_added(owner) current.faction |= "ratvar" current.grant_language(/datum/language/ratvar) current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons @@ -117,6 +117,7 @@ /datum/antagonist/clockcult/on_removal() . = ..() + SSticker.mode.update_servant_icons_removed(owner) if(!silent) owner.current.visible_message("[owner] seems to have remembered their true allegiance!", \ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index e6db2392419..7a2161a1a0c 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -11,6 +11,7 @@ return if(jobban_isbanned(owner.current, ROLE_CULTIST)) addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) + SSticker.mode.update_cult_icons_added(owner) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) @@ -33,6 +34,7 @@ /datum/antagonist/cult/on_removal() . = ..() + SSticker.mode.update_cult_icons_removed(owner) to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) From a0459ad41073d3c1687fee96d6520bffbf71bf50 Mon Sep 17 00:00:00 2001 From: Really-Good-Soda-Flavor Date: Mon, 1 May 2017 22:01:55 -0400 Subject: [PATCH 070/100] Moves playsound_local() to mob and gets rid of a useless proc. (#26726) * playsound_local to mob * Suggested change --- code/game/machinery/dance_machine.dm | 2 +- code/game/objects/effects/step_triggers.dm | 5 +++-- code/game/sound.dm | 13 ++++--------- code/modules/flufftext/Hallucination.dm | 8 ++++---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index cf18a99875d..3e367767733 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -85,7 +85,7 @@ return if(!allowed(user)) to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.") - playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1) + user.playsound_local(src,'sound/misc/compiler-failure.ogg', 25, 1) return if(!Adjacent(user) && !isAI(user)) return diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 60b992ac460..cffb1571790 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -183,8 +183,9 @@ if(!T) return - if(triggerer_only) - A.playsound_local(T, sound, volume, freq_vary) + if(triggerer_only && ismob(A)) + var/mob/B = A + B.playsound_local(T, sound, volume, freq_vary) else playsound(T, sound, volume, freq_vary, extra_range) diff --git a/code/game/sound.dm b/code/game/sound.dm index 2e716194132..847dc0d4bfd 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -23,10 +23,10 @@ if(T && T.z == turf_source.z) M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, surround, channel, pressure_affected) -/atom/proc/playsound_direct(soundin, vol as num, vary, frequency, falloff, surround = TRUE, channel = 0, pressure_affected = FALSE) - playsound_local(get_turf(src), soundin, vol, vary, frequency, falloff, surround, channel) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE) + if(!client || !can_hear()) + return -/atom/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE) soundin = get_sfx(soundin) var/sound/S = sound(soundin) @@ -76,15 +76,10 @@ // The y value is for above your head, but there is no ceiling in 2d spessmens. S.y = 1 - S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) + S.falloff = falloff || FALLOFF_SOUNDS src << S -/mob/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, surround = 1, channel = 0, pressure_affected = TRUE) - if(!client || !can_hear()) - return - ..() - /proc/open_sound_channel() var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used . = ++next_channel diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 4c1328a38b0..9710098c5fa 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -356,9 +356,9 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/i=0,i Date: Tue, 2 May 2017 04:19:51 -0300 Subject: [PATCH 071/100] Changes a bunch of hrefs to the proper defines (#26760) --- code/datums/mind.dm | 2 +- code/game/machinery/computer/robot.dm | 5 +++-- code/game/mecha/equipment/weapons/weapons.dm | 4 ++-- .../objects/effects/effect_system/effects_smoke.dm | 2 +- code/game/objects/effects/portals.dm | 2 +- code/game/objects/items/charter.dm | 2 +- code/game/objects/items/devices/powersink.dm | 4 ++-- code/game/objects/items/devices/transfer_valve.dm | 8 ++++---- code/game/objects/items/stacks/sheets/mineral.dm | 5 +++-- code/game/objects/items/weapons/flamethrower.dm | 2 +- .../objects/items/weapons/grenades/chem_grenade.dm | 10 +++++----- .../game/objects/items/weapons/grenades/plastic.dm | 4 ++-- .../items/weapons/implants/implant_explosive.dm | 2 +- code/game/objects/structures/false_walls.dm | 5 +++-- code/game/objects/structures/mineral_doors.dm | 5 +++-- code/game/objects/structures/statues.dm | 14 ++++++++------ code/game/turfs/simulated/floor/mineral_floor.dm | 4 ++-- code/game/turfs/simulated/minerals.dm | 8 ++++---- code/game/turfs/simulated/wall/mineral_walls.dm | 4 ++-- code/modules/admin/verbs/adminhelp.dm | 14 +++++++------- code/modules/admin/verbs/map_template_loadverb.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 4 ++-- code/modules/assembly/timer.dm | 4 ++-- .../atmospherics/machinery/portable/canister.dm | 4 ++-- .../atmospherics/machinery/portable/pump.dm | 5 +++-- code/modules/client/verbs/who.dm | 2 +- code/modules/hydroponics/grown/misc.dm | 4 ++-- code/modules/mining/mine_items.dm | 4 ++-- code/modules/mining/ores_coins.dm | 12 ++++++------ code/modules/power/gravitygenerator.dm | 6 +++--- code/modules/power/singularity/emitter.dm | 11 ++++++----- .../particle_accelerator/particle_control.dm | 8 ++++---- code/modules/power/smes.dm | 11 ++++++----- code/modules/power/supermatter/supermatter.dm | 6 +++--- code/modules/projectiles/guns/energy/pulse.dm | 7 ++----- code/modules/reagents/chemistry/recipes.dm | 4 ++-- .../reagents/chemistry/recipes/pyrotechnics.dm | 7 ++++--- .../reagents/chemistry/recipes/slime_extracts.dm | 7 ++++--- code/modules/reagents/reagent_containers/spray.dm | 13 +++++++------ code/modules/shuttle/emergency.dm | 8 ++------ code/modules/shuttle/ferry.dm | 2 +- 41 files changed, 121 insertions(+), 116 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b7a5962865e..7e4d175537f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -280,7 +280,7 @@ creator.faction |= current.faction if(creator.mind.special_role) - message_admins("[key_name_admin(current)](?) has been created by [key_name_admin(creator)](?), an antagonist.") + message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalities change, so do yours. This will never change unless your creator's body is destroyed.") /datum/mind/proc/show_memory(mob/recipient, window=1) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index fe3992724be..214163c7397 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -113,7 +113,8 @@ to_chat(R.connected_ai, "

ALERT - Cyborg detonation detected: [R.name]
") R.ResetSecurityCodes() else - message_admins("[key_name_admin(usr)] (FLW) detonated [key_name(R, R.client)](JMP)!") + var/turf/T = get_turf(R) + message_admins("[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!") log_game("\[key_name(usr)] detonated [key_name(R)]!") if(R.connected_ai) to_chat(R.connected_ai, "

ALERT - Cyborg detonation detected: [R.name]
") @@ -127,7 +128,7 @@ if(can_control(usr, R)) var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") if(choice == "Confirm" && can_control(usr, R) && !..()) - message_admins("[key_name_admin(usr)] (FLW) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](FLW)!") + message_admins("[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!") log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!") R.SetLockdown(!R.lockcharge) to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 5c0af6b13a1..20cb7aff0b8 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -337,8 +337,8 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/weapon/grenade/flashbang/F) var/turf/T = get_turf(src) - message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1) - log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])") + message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] fired a [src] in [ADMIN_COORDJMP(T)]",0,1) + log_game("[key_name(chassis.occupant)] fired a [src] [COORD(T)]") addtimer(CALLBACK(F, /obj/item/weapon/grenade/flashbang.proc/prime), det_time) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index a34e30e689f..9324c6edb7d 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -74,7 +74,7 @@ /obj/effect/particle_effect/smoke/proc/spread_smoke() var/turf/t_loc = get_turf(src) if(!t_loc) - return + return var/list/newsmokes = list() for(var/turf/T in t_loc.GetAtmosAdjacentTurfs()) var/obj/effect/particle_effect/smoke/foundsmoke = locate() in T //Don't spread smoke where there's already smoke! diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 6aff1855fb5..9e7dbe7fa9d 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -63,7 +63,7 @@ return if (istype(M, /atom/movable)) if(ismegafauna(M)) - message_admins("[M] (FLW) has teleported through [src].") + message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].") do_teleport(M, target, precision) ///You will appear adjacent to the beacon diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 0cf73fd9ff6..186d2186900 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -60,7 +60,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[key_name_admin(user)] (?) proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) (RPLY)") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index fc8b666fe15..fb70d77ff3a 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -95,8 +95,8 @@ "[user] activates \the [src]!", \ "You activate \the [src].", "You hear a click.") - message_admins("Power sink activated by [key_name_admin(user)](?) (FLW) at ([x],[y],[z] - JMP)") - log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") + message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]") + log_game("Power sink activated by [key_name(user)] at [COORD(src)]") set_mode(OPERATING) if(OPERATING) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 450d0c021fe..9296dd9e090 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -178,21 +178,21 @@ var/log_attacher = "" if(attacher) - log_attacher = "(?) (FLW)" + log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]" var/mob/mob = get_mob_by_key(src.fingerprintslast) var/last_touch_info = "" if(mob) - last_touch_info = "(?) (FLW)" + last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]" var/log_str3 = " Last touched by: [key_name_admin(mob)]" - var/bomb_message = "[log_str1] [A.name] [log_str2][log_attacher] [log_str3][last_touch_info]" + var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]" GLOB.bombers += bomb_message message_admins(bomb_message, 0, 1) - log_game("[log_str1] [A.name]([A.x],[A.y],[A.z]) [log_str2] [log_str3]") + log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]") merge_gases() spawn(20) // In case one tank bursts for (var/i=0,i<5,i++) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 611ef76eb46..d81b8a5a69f 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -154,8 +154,9 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ /obj/item/stack/sheet/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma sheets ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma sheets ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]") fire_act() else return ..() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index ac53eb25ff7..aab6c9db484 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -158,7 +158,7 @@ if(lit) START_PROCESSING(SSobj, src) if(!warned_admins) - message_admins("[key_name_admin(usr)]? (FLW) has lit a flamethrower.") + message_admins("[ADMIN_LOOKUPFLW(usr)] has lit a flamethrower.") warned_admins = 1 if(href_list["amount"]) throw_amount = throw_amount + text2num(href_list["amount"]) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 3bb9c2155b8..fed13eb2622 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -36,8 +36,8 @@ else if(clown_check(user)) var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) - message_admins("[key_name_admin(usr)]? (FLW) has primed a [name] for detonation at [A.name] (JMP).") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") + message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") to_chat(user, "You prime the [name]! [det_time / 10] second\s!") playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 @@ -177,12 +177,12 @@ var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) var/turf/T = get_turf(src) var/area/A = get_area(T) - message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") - log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [COORD(T)]") var/turf/DT = get_turf(src) var/area/DA = get_area(DT) - log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") + log_game("A grenade detonated at [DA.name] [COORD(DT)]") update_mob() diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index aedf0954c2a..fb5b92aee2e 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -119,8 +119,8 @@ qdel(src) //How? /obj/item/weapon/grenade/plastic/suicide_act(mob/user) - message_admins("[key_name_admin(user)](?) (FLW) suicided with [src] at ([user.x],[user.y],[user.z] - JMP)",0,1) - message_admins("[key_name(user)] suicided with [src] at ([user.x],[user.y],[user.z])") + message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_COORDJMP(user)]",0,1) + log_game("[key_name(user)] suicided with [src] at [COORD(user)]") user.visible_message("[user] activates the [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!") var/message_say = "FOR NO RAISIN!" if(user.mind) diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 369effbe7c4..009aae3b543 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -44,7 +44,7 @@ active = TRUE var/turf/boomturf = get_turf(imp_in) var/area/A = get_area(boomturf) - message_admins("[key_name_admin(imp_in)]? (FLW) has activated their [name] at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [A.name] [ADMIN_JMP(boomturf)].") //If the delay is short, just blow up already jeez if(delay <= 7) explosion(src,heavy,medium,weak,weak, flame_range = weak) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 466be07c501..389ae40e880 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -234,8 +234,9 @@ /obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300) - message_admins("Plasma falsewall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma falsewall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma falsewall ignited by [key_name(user)] in [COORD(T)]") burnbabyburn() else return ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 82fb0191d02..ada75846e79 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -188,8 +188,9 @@ /obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot()) - message_admins("Plasma mineral door ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]") TemperatureAct() else return ..() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f5defdab505..6909965614f 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -163,18 +163,20 @@ PlasmaBurn(500) burn = TRUE if(burn) + var/turf/T = get_turf(src) if(Proj.firer) - message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])") + message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(Proj.firer)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [key_name(Proj.firer)] in [COORD(T)]") else - message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.") + message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [Proj] in [COORD(T)]. No known firer.") ..() /obj/structure/statue/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma statue ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])") + var/turf/T = get_turf(src) + message_admins("Plasma statue ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma statue ignited by [key_name(user)] in [COORD(T)]") ignite(W.is_hot()) else return ..() diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index 3e58e62854d..5024dfea90a 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -44,8 +44,8 @@ /turf/open/floor/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma flooring was ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Plasma flooring was ignited by [key_name(user)] in [COORD(src)]") ignite(W.is_hot()) return ..() diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 398ff190f2f..54f3ad5ad5a 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -407,14 +407,14 @@ if(z != 5) notify_admins = 1 if(!triggered_by_explosion) - message_admins("[key_name_admin(user)]? (FLW) has triggered a gibtonite deposit reaction at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") else - message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") + message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") if(!triggered_by_explosion) - log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).") + log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") else - log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("An explosion has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)]") countdown(notify_admins) diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 355ba66a627..61a26954d32 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -101,8 +101,8 @@ /turf/closed/wall/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite - message_admins("Plasma wall ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])") + message_admins("Plasma wall ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Plasma wall ignited by [key_name(user)] in [COORD(src)]") ignite(W.is_hot()) return ..() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 235a9fd2961..643f6f3a936 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) for(var/I in l2b) var/datum/admin_help/AH = I dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
" - + usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") //Tickets statpanel @@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(state == AHELP_ACTIVE) to_chat(usr, "This ticket is already open.") return - + if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey)) to_chat(usr, "This user already has an active ticket, cannot reopen this one.") return @@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) RemoveActive() state = AHELP_RESOLVED GLOB.ahelp_tickets.ListInsert(src) - + if(initiator) initiator.giveadminhelpverb() @@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/Reject(key_name = key_name_admin(usr)) if(state != AHELP_ACTIVE) return - + if(initiator) initiator.giveadminhelpverb() @@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) current_ticket.MessageNoRecipient(msg) current_ticket.TimeoutVerb() return - else + else to_chat(usr, "Ticket not found, creating new one...") else current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") @@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!check_rights(R_ADMIN, TRUE)) return - + var/browse_to switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets")) @@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) browse_to = AHELP_RESOLVED else return - + GLOB.ahelp_tickets.BrowseTickets(browse_to) // diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 9fdb3169711..ba50ecae32d 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -19,7 +19,7 @@ usr.client.images += preview if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes") if(template.load(T, centered = TRUE)) - message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP)") + message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]") else to_chat(usr, "Failed to place map") usr.client.images -= preview diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ef47c849eb8..be0738106d3 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -108,8 +108,8 @@ for(var/mob/M in view(range,A)) to_chat(M, msg) - log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]") - message_admins(" LocalNarrate: [key_name_admin(usr)] at ([get_area(A)]): [msg]
") + log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]") + message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
") SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index f4c36c1f4a4..44c77bb19a4 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -93,10 +93,10 @@ if(href_list["time"]) timing = text2num(href_list["time"]) if(timing && istype(holder, /obj/item/device/transfer_valve)) - var/timer_message = "[key_name_admin(usr)](?) (FLW) activated [src] attachment on [holder]." + var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]." message_admins(timer_message) GLOB.bombers += timer_message - log_game("[key_name(usr)] activated [src] attachment for [loc]") + log_game("[key_name(usr)] activated [src] attachment on [holder]") update_icon() if(href_list["repeat"]) loop = text2num(href_list["repeat"]) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index f5613c0b7ea..7c9989c15d7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -400,8 +400,8 @@ var/bz = air_contents.gases["bz"] var/freon = air_contents.gases["freon"] if(n2o || plasma || bz || freon) - message_admins("[key_name_admin(usr)] (?) (FLW) opened a canister that contains the following: (JMP)") - log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:") + message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]") + log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:") if(plasma) log_admin("Plasma") message_admins("Plasma") diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 33f50a3c503..376e907ab64 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -103,8 +103,9 @@ var/plasma = air_contents.gases["plasma"] var/n2o = air_contents.gases["n2o"] if(n2o || plasma) - message_admins("[key_name_admin(usr)] (?) (FLW) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (JMP)") - log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]") + var/area/A = get_area(src) + message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]") + log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]") . = TRUE if("direction") if(direction == PUMP_OUT) diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index 58095cd857e..a32da8ab69b 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -33,7 +33,7 @@ entry += " - DEAD" if(is_special_character(C.mob)) entry += " - Antagonist" - entry += " (?)" + entry += " [ADMIN_QUE(C.mob)]" entry += " ([round(C.avgping, 1)]ms)" Lines += entry else//If they don't have +ADMIN, only show hidden admins diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 71e6debf25a..a67fef24731 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -123,8 +123,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user) var/area/A = get_area(user) user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!") - message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") - log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]") + log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].") prime() /obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 2bb438639bf..d15896a8db9 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -278,8 +278,8 @@ var/turf/T = deploy_location if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level - message_admins("[key_name_admin(usr)] (?) (FLW) activated a bluespace capsule away from the mining level! (JMP)") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") + message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]") + log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]") template.load(deploy_location, centered = TRUE) new /obj/effect/particle_effect/smoke(get_turf(src)) qdel(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 1f7f4b4695f..f5214e48362 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -248,18 +248,18 @@ if(notify_admins) if(triggered_by == 1) - message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).") + message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].") else if(triggered_by == 2) - message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]? (FLW)") + message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]") else - message_admins("[key_name_admin(user)]? (FLW) has triggered a [name] to detonate at [A.name] (JMP).") + message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].") if(triggered_by == 1) - log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]") else if(triggered_by == 2) - log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].") + log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].") else user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.") - log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") + log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]") spawn(det_time) if(primed) if(quality == 3) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 17682376c56..2ba8705e481 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne use_power = on ? 2 : 1 // Sound the alert if gravity was just enabled or disabled. var/alert = 0 - var/area/area = get_area(src) + var/area/A = get_area(src) if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live. if(gravity_in_level() == 0) alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") - message_admins("The gravity generator was brought online. ([area.name])") + message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]") else if(gravity_in_level() == 1) alert = 1 investigate_log("was brought offline and there is now no gravity for this level.", "gravity") - message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") + message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]") update_icon() update_list() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a084788daf7..c1ff1ee9ce0 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -98,9 +98,10 @@ /obj/machinery/power/emitter/Destroy() if(SSticker && SSticker.IsRoundInProgress()) - message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) - log_game("Emitter deleted at ([x],[y],[z])") - investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo") + var/turf/T = get_turf(src) + message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1) + log_game("Emitter deleted at [COORD(T)]") + investigate_log("deleted at [get_area(src)] [COORD(T)]","singulo") QDEL_NULL(sparks) return ..() @@ -121,8 +122,8 @@ if(src.active==1) src.active = 0 to_chat(user, "You turn off \the [src].") - message_admins("Emitter turned off by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])") + message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("Emitter turned off by [key_name(user)] in [COORD(src)]") investigate_log("turned off by [key_name(user)] at [get_area(src)]","singulo") else src.active = 1 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 9cf19aff2dc..2045cb380cb 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -117,8 +117,8 @@ strength++ strength_change() - message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])") + message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]") investigate_log("increased to [strength] by [key_name(usr)]","singulo") @@ -127,8 +127,8 @@ strength-- strength_change() - message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])") + message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]") investigate_log("decreased to [strength] by [key_name(usr)]","singulo") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 1e1737661e4..8044132a0f6 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -170,7 +170,7 @@ //crowbarring it ! var/turf/T = get_turf(src) if(default_deconstruction_crowbar(I)) - message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([T.x],[T.y],[T.z] - JMP)",0,1) + message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) log_game("[src] has been deconstructed by [key_name(user)]") investigate_log("SMES deconstructed by [key_name(user)]","singulo") return @@ -192,10 +192,11 @@ /obj/machinery/power/smes/Destroy() if(SSticker && SSticker.IsRoundInProgress()) - var/area/area = get_area(src) - message_admins("SMES deleted at ([area.name])") - log_game("SMES deleted at ([area.name])") - investigate_log("deleted at ([area.name])","singulo") + var/area/A = get_area(src) + var/turf/T = get_turf(src) + message_admins("SMES deleted at [A][ADMIN_JMP(T)]") + log_game("SMES deleted at [A][COORD(T)]") + investigate_log("deleted at [A][COORD(T)]","singulo") if(terminal) disconnect_terminal() return ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a580b63e552..712cd5cd415 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -344,7 +344,7 @@ lastwarning = REALTIMEOFDAY if(!has_reached_emergency) investigate_log("has reached the emergency point for the first time.", "supermatter") - message_admins("[src] has reached the emergency point (JMP).") + message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].") has_reached_emergency = 1 else if(damage >= damage_archived) // The damage is still going up SPEAK("[warning_alert] Instability: [stability]%") @@ -391,7 +391,7 @@ power += Proj.damage * config_bullet_energy if(!has_been_powered) investigate_log("has been powered for the first time.", "supermatter") - message_admins("[src] has been powered for the first time (JMP).") + message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") has_been_powered = 1 else if(takes_damage) damage += Proj.damage * config_bullet_energy @@ -490,7 +490,7 @@ /obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM) if(isliving(AM)) var/mob/living/user = AM - message_admins("[src] has consumed [key_name_admin(user)]? (FLW) (JMP).") + message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].") investigate_log("has consumed [key_name(user)].", "supermatter") user.dust() matter_power += 200 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index e99ff04add9..73d3a34a1b9 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -19,15 +19,12 @@ /obj/item/weapon/gun/energy/pulse/prize/New() . = ..() GLOB.poi_list |= src - var/msg = "A pulse rifle prize has been created at ([x],[y],[z] - (\ - \ - JMP)" + var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]" message_admins(msg) log_game(msg) - notify_ghosts("Someone won a pulse rifle as a prize!", source = src, - action = NOTIFY_ORBIT) + notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT) /obj/item/weapon/gun/energy/pulse/prize/Destroy() GLOB.poi_list -= src diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 9e0bb2d0e4f..c13ff096e4c 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -36,12 +36,12 @@ var/atom/A = holder.my_atom var/turf/T = get_turf(A) var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (JMP)" + var/message = "A [reaction_name] reaction has occurred in [my_area.name] [ADMIN_COORDJMP(T)]" message += " (VV)" var/mob/M = get(A, /mob) if(M) - message += " - Carried By: [key_name_admin(M)](?) (FLW)" + message += " - Carried By: [ADMIN_LOOKUPFLW(M)]" else message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 805aa936d43..6cfdd80cf53 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -6,6 +6,7 @@ /datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) + var/area/A = get_area(T) var/inside_msg if(ismob(holder.my_atom)) var/mob/M = holder.my_atom @@ -14,9 +15,9 @@ var/touch_msg = "N/A" if(lastkey) var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[key_name_admin(lastkey)]? (FLW)" - message_admins("Reagent explosion reaction occurred at [T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].") - log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" + message_admins("Reagent explosion reaction occurred at [A] [ADMIN_COORDJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") + log_game("Reagent explosion reaction occurred at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) var/datum/effect_system/reagents_explosion/e = new() e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0) e.start() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index a1c4a74795f..e67557919e4 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -437,13 +437,14 @@ /datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) var/turf/T = get_turf(holder.my_atom) + var/area/A = get_area(T) var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" if(lastkey) var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[key_name_admin(lastkey)]?(FLW)." - message_admins("Slime Explosion reaction started at [T.loc.name] (JMP). Last Fingerprint: [touch_msg]") - log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].") + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." + message_admins("Slime Explosion reaction started at [A] [ADMIN_COORDJMP(T)]. Last Fingerprint: [touch_msg]") + log_game("Slime Explosion reaction started at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") T.visible_message("The slime extract begins to vibrate violently !") addtimer(CALLBACK(src, .proc/boom, holder), 50) var/obj/item/slime_extract/M = holder.my_atom diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 79db908d507..df8f7927c0c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -48,15 +48,16 @@ user.changeNext_move(CLICK_CD_RANGE*2) user.newtonian_move(get_dir(A, user)) var/turf/T = get_turf(src) + var/area/area = get_area(src) if(reagents.has_reagent("sacid")) - message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).") if(reagents.has_reagent("facid")) - message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].") if(reagents.has_reagent("lube")) - message_admins("[key_name_admin(user)] fired Space lube from \a [src] at ([get_area(src)] ([T.x], [T.y], [T.z])).") - log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).") + message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].") + log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].") return diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index b9d284b280a..6344689f0bd 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -104,12 +104,8 @@ authorized += ID - message_admins("[key_name_admin(user.client)] \ - (?) \ - (FLW) \ - has authorized early shuttle launch", 0, 1) - log_game("[key_name(user)] has authorized early shuttle launch in \ - ([x],[y],[z])") + message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch", 0, 1) + log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]") // Now check if we're on our way . = TRUE process() diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index f90fe2f7e08..a5226abd58f 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -30,4 +30,4 @@ return last_request = world.time to_chat(usr, "Your request has been recieved by Centcom.") - to_chat(GLOB.admins, "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.") + to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.") From a291cb10ecc81c3b2df92213e5f7df8712aaabcf Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 2 May 2017 03:23:17 -0400 Subject: [PATCH 072/100] fixes drakes overswooping (#26757) --- .../mob/living/simple_animal/hostile/megafauna/dragon.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 3425d08e239..45139747fa0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -187,8 +187,9 @@ Difficulty: Medium animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING) for(var/i in 1 to 3) sleep(1) - if(QDELETED(src)) //we got hit and died, rip us + if(QDELETED(src) || stat == DEAD) //we got hit and died, rip us qdel(F) + swooping &= ~SWOOP_DAMAGEABLE return animate(src, transform = matrix()*0.7, time = 7) swooping |= SWOOP_INVULNERABLE From a19916c2d21a4b4c6a2fc1ff227cbdc4efb54282 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 2 May 2017 02:57:06 -0700 Subject: [PATCH 073/100] Automatic changelog generation for PR #26707 [ci skip] --- html/changelogs/AutoChangeLog-pr-26707.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26707.yml diff --git a/html/changelogs/AutoChangeLog-pr-26707.yml b/html/changelogs/AutoChangeLog-pr-26707.yml new file mode 100644 index 00000000000..d5e4582f402 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26707.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - tweak: "Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim." From 5fa5e68a423b7fe49f435f464ce76d6a9e9a068d Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 2 May 2017 10:54:47 -0400 Subject: [PATCH 074/100] Fixes proximity sensors not tracking correctly (#26769) --- code/game/objects/effects/proximity.dm | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 8a6893c8871..bfa6cd8fa90 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -9,10 +9,12 @@ host = _host last_host_loc = _host.loc ignore_if_not_on_turf = _ignore_if_not_on_turf + checkers = list() SetRange(range) /datum/proximity_monitor/Destroy() host = null + last_host_loc = null QDEL_LIST(checkers) return ..() @@ -34,46 +36,47 @@ current_range = range - var/list/old_checkers = checkers - var/old_checkers_len = LAZYLEN(old_checkers) + var/list/checkers_local = checkers + var/old_checkers_len = checkers_local.len - var/atom/host_loc = host.loc + var/atom/_host = host - var/atom/loc_to_use = ignore_if_not_on_turf ? host_loc : get_turf(host) + var/atom/loc_to_use = ignore_if_not_on_turf ? _host.loc : get_turf(_host) if(!isturf(loc_to_use)) //only check the host's loc if(range) var/obj/effect/abstract/proximity_checker/pc if(old_checkers_len) - pc = old_checkers[old_checkers_len] - --old_checkers.len + pc = checkers_local[old_checkers_len] + --checkers_local.len + QDEL_LIST(checkers_local) else - pc = new(host_loc, src) + pc = new(loc_to_use, src) - checkers = list(pc) //only check the host's loc + checkers_local += pc //only check the host's loc return var/list/turfs = RANGE_TURFS(range, loc_to_use) - var/old_checkers_used = min(turfs.len, old_checkers_len) + var/turfs_len = turfs.len + var/old_checkers_used = min(turfs_len, old_checkers_len) //reuse what we can for(var/I in 1 to old_checkers_len) if(I <= old_checkers_used) - var/obj/effect/abstract/proximity_checker/pc = old_checkers[I] + var/obj/effect/abstract/proximity_checker/pc = checkers_local[I] pc.loc = turfs[I] else - qdel(old_checkers[I]) //delete the leftovers + qdel(checkers_local[I]) //delete the leftovers - LAZYCLEARLIST(old_checkers) - - //create what we lack - var/list/checkers_local = list() - for(var/I in (old_checkers_used + 1) to turfs.len) - checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src) - - checkers = checkers_local + if(old_checkers_len < turfs_len) + //create what we lack + for(var/I in (old_checkers_used + 1) to turfs_len) + checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src) + else + checkers_local.Cut(old_checkers_used + 1, old_checkers_len) /obj/effect/abstract/proximity_checker invisibility = INVISIBILITY_ABSTRACT + anchored = TRUE var/datum/proximity_monitor/monitor /obj/effect/abstract/proximity_checker/Initialize(mapload, datum/proximity_monitor/_monitor) @@ -81,8 +84,8 @@ if(_monitor) monitor = _monitor else - stack_trace("proximity_checker created without proximity_monitor") - qdel(src) + stack_trace("proximity_checker created without host") + return INITIALIZE_HINT_QDEL /obj/effect/abstract/proximity_checker/Destroy() monitor = null @@ -90,9 +93,6 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE - var/datum/proximity_monitor/M = monitor - if(!M.current_range) - return - var/atom/H = M.host + var/atom/H = monitor.host testing("HasProx: [H] -> [AM]") H.HasProximity(AM) From c8b67b49e095602d371cbac0d3bd4821266f9209 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 2 May 2017 16:56:12 +0200 Subject: [PATCH 075/100] Locked inventory slots are now indicated. (#26768) --- code/_onclick/hud/hud.dm | 4 ++- code/_onclick/hud/human.dm | 26 +++++++++---------- .../mob/living/carbon/human/species.dm | 2 ++ .../carbon/human/species_types/golems.dm | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index eb6f0aca8a2..1bb3ba52234 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -208,7 +208,6 @@ mymob.reload_fullscreen() update_parallax_pref(screenmob) - /datum/hud/human/show_hud(version = 0,mob/viewmob) ..() hidden_inventory_update(viewmob) @@ -266,3 +265,6 @@ E.screen_loc = ui_equip_position(mymob) if(mymob.hud_used) show_hud(HUD_STYLE_STANDARD,mymob) + +/datum/hud/proc/update_locked_slots() + return \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 296a911770b..407086f2628 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -124,7 +124,6 @@ inv_box.icon = ui_style inv_box.slot_id = slot_w_uniform inv_box.icon_state = "uniform" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_iclothing toggleable_inventory += inv_box @@ -133,7 +132,6 @@ inv_box.icon = ui_style inv_box.slot_id = slot_wear_suit inv_box.icon_state = "suit" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_oclothing toggleable_inventory += inv_box @@ -155,7 +153,6 @@ inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_id inv_box.slot_id = slot_wear_id static_inventory += inv_box @@ -164,7 +161,6 @@ inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_mask inv_box.slot_id = slot_wear_mask toggleable_inventory += inv_box @@ -173,7 +169,6 @@ inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_neck inv_box.slot_id = slot_neck toggleable_inventory += inv_box @@ -182,7 +177,6 @@ inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_back inv_box.slot_id = slot_back static_inventory += inv_box @@ -191,7 +185,6 @@ inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_storage1 inv_box.slot_id = slot_l_store static_inventory += inv_box @@ -200,7 +193,6 @@ inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" -// inv_box.icon_full = "template_small" inv_box.screen_loc = ui_storage2 inv_box.slot_id = slot_r_store static_inventory += inv_box @@ -209,7 +201,6 @@ inv_box.name = "suit storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_sstore1 inv_box.slot_id = slot_s_store static_inventory += inv_box @@ -233,7 +224,6 @@ inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_gloves inv_box.slot_id = slot_gloves toggleable_inventory += inv_box @@ -242,7 +232,6 @@ inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_glasses inv_box.slot_id = slot_glasses toggleable_inventory += inv_box @@ -251,7 +240,6 @@ inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_ears inv_box.slot_id = slot_ears toggleable_inventory += inv_box @@ -260,7 +248,6 @@ inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_head inv_box.slot_id = slot_head toggleable_inventory += inv_box @@ -269,7 +256,6 @@ inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" -// inv_box.icon_full = "template" inv_box.screen_loc = ui_shoes inv_box.slot_id = slot_shoes toggleable_inventory += inv_box @@ -323,6 +309,18 @@ inv_slots[inv.slot_id] = inv inv.update_icon() +/datum/hud/human/update_locked_slots() + if(!mymob) + return + var/mob/living/carbon/human/H = mymob + var/datum/species/S = H.dna.species + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + if(inv.slot_id) + if(inv.slot_id in S.no_equip) + inv.alpha = 128 + else + inv.alpha = initial(inv.alpha) + /datum/hud/human/hidden_inventory_update(mob/viewer) if(!mymob) return diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fe75bf6cc86..f87b01c6671 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -118,6 +118,8 @@ var/obj/item/thing = C.get_item_by_slot(slot_id) if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception))) C.dropItemToGround(thing) + if(C.hud_used) + C.hud_used.update_locked_slots() // this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs") diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index ed051385023..cfc99a315cd 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -9,7 +9,7 @@ punchdamagelow = 5 punchdamagehigh = 14 punchstunthreshold = 11 //about 40% chance to stun - no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform) + no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) nojumpsuit = 1 sexes = 1 damage_overlay_type = "" From dcf5cb845670dc485899ad402262dcd8a83810b1 Mon Sep 17 00:00:00 2001 From: coiax Date: Tue, 2 May 2017 15:56:54 +0100 Subject: [PATCH 076/100] The alien hivemind uses a mob's real_name (#26767) :cl: coiax add: When talking on the alien hivemind, a person will be identified by their real name, rather than who they are disguised as. /:cl: Because hiveminds obeying visual disguises is silly. --- code/modules/mob/living/carbon/alien/say.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index a42ad17307f..002a4e8364f 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,4 +1,4 @@ -/mob/living/proc/alien_talk(message, shown_name = name) +/mob/living/proc/alien_talk(message, shown_name = real_name) log_say("[key_name(src)] : [message]") message = trim(message) if(!message) return From ce493000524da2be8f003095067871323a38d11a Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 2 May 2017 07:56:59 -0700 Subject: [PATCH 077/100] Automatic changelog generation for PR #26767 [ci skip] --- html/changelogs/AutoChangeLog-pr-26767.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26767.yml diff --git a/html/changelogs/AutoChangeLog-pr-26767.yml b/html/changelogs/AutoChangeLog-pr-26767.yml new file mode 100644 index 00000000000..fbb98e00393 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26767.yml @@ -0,0 +1,5 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "When talking on the alien hivemind, a person will be identified by +their real name, rather than who they are disguised as." From 32dd2d65e9723892bdfbed3ffbd99c1deb1e33a1 Mon Sep 17 00:00:00 2001 From: XDTM Date: Tue, 2 May 2017 16:59:47 +0200 Subject: [PATCH 078/100] Makes golems able to transfer into empty shells (#26765) * Makes golems able to transfer into empty shells * Name & plasma --- .../objects/structures/ghost_role_spawners.dm | 22 +++++++++++++++++-- code/modules/awaymissions/corpse.dm | 7 +++--- .../carbon/human/species_types/golems.dm | 13 +++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index f1a808938e2..d087b143905 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -101,6 +101,7 @@ death = FALSE anchored = 0 density = 0 + var/can_transfer = TRUE //if golems can switch bodies to this new shell var/mob/living/owner = null //golem's owner if it has one flavour_text = "You are a Free Golem. Your family worships The Liberator. In his infinite and divine wisdom, he set your clan free to \ travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \ @@ -119,7 +120,7 @@ Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." owner = creator -/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn) +/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn, name) var/datum/species/golem/X = mob_species to_chat(new_spawn, "[initial(X.info_text)]") if(!owner) @@ -132,7 +133,23 @@ if(ishuman(new_spawn)) var/mob/living/carbon/human/H = new_spawn H.set_cloned_appearance() - H.real_name = H.dna.species.random_name() + if(!name) + H.real_name = H.dna.species.random_name() + else + H.real_name = name + +/obj/effect/mob_spawn/human/golem/attack_hand(mob/user) + if(isgolem(user) && can_transfer) + var/transfer = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No") + if(!transfer) + return + log_game("[user.ckey] golem-swapped into [src]") + user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!") + create(ckey = user.ckey, flavour = FALSE, name = user.real_name) + user.death() + return + ..() + /obj/effect/mob_spawn/human/golem/adamantine name = "dust-caked golem shell" @@ -140,6 +157,7 @@ mob_name = "a free golem" anchored = 1 density = 1 + can_transfer = FALSE mob_species = /datum/species/golem/adamantine //Malfunctioning cryostasis sleepers: Spawns in makeshift shelters in lavaland. Ghosts become hermits with knowledge of how they got to where they are now. diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 96c0bc35deb..9fa0fbf5a5e 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -53,7 +53,7 @@ /obj/effect/mob_spawn/proc/equip(mob/M) return -/obj/effect/mob_spawn/proc/create(ckey) +/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name) var/mob/living/M = new mob_type(get_turf(src)) //living mobs only if(!random) M.real_name = mob_name ? mob_name : M.name @@ -71,12 +71,13 @@ if(ckey) M.ckey = ckey - to_chat(M, "[flavour_text]") + if(flavour) + to_chat(M, "[flavour_text]") var/datum/mind/MM = M.mind if(objectives) for(var/objective in objectives) MM.objectives += new/datum/objective(objective) - special(M) + special(M, name) MM.name = M.real_name if(uses > 0) uses-- diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index cfc99a315cd..fd8b8f4f250 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -71,10 +71,14 @@ prefix = "Plasma" special_names = list("Flood","Fire","Bar","Man") -/datum/species/golem/plasma/spec_death(gibbed, mob/living/carbon/human/H) - explosion(get_turf(H),0,1,2,flame_range = 5) - if(H) - H.gib() +/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H) + if(H.bodytemperature > 900 && H.on_fire) + explosion(get_turf(H),1,2,4,flame_range = 5) + if(H) + H.gib() + if(H.fire_stacks < 2) //flammable + H.adjust_fire_stacks(1) + ..() //Harder to hurt /datum/species/golem/diamond @@ -501,6 +505,7 @@ sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie." species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) //no mutcolors + prefix = "Runic" var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift var/obj/effect/proc_holder/spell/targeted/abyssal_gaze/abyssal_gaze From a25e6512300fdb6c7bc553fc7dfca1c6890755da Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 2 May 2017 07:59:53 -0700 Subject: [PATCH 079/100] Automatic changelog generation for PR #26765 [ci skip] --- html/changelogs/AutoChangeLog-pr-26765.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26765.yml diff --git a/html/changelogs/AutoChangeLog-pr-26765.yml b/html/changelogs/AutoChangeLog-pr-26765.yml new file mode 100644 index 00000000000..bf7c2e79f9d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26765.yml @@ -0,0 +1,6 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "Golems can now click on empty golem shells to transfer into them." + - tweak: "Plasma Golems now no longer explode on death. They instead explode if they're on fire and are hot enough. The explosion size has been increased." + - tweak: "Plasma Golems are now always flammable." From 3a7d424005aa4742c9d0316eed367a4e843bc250 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Tue, 2 May 2017 11:21:54 -0400 Subject: [PATCH 080/100] Curator Update --- .../map_files/Deltastation/DeltaStation2.dmm | 24 +++++++++++++++---- _maps/map_files/MetaStation/MetaStation.dmm | 20 +++++++++++----- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 6 ++--- .../objects/items/weapons/storage/bags.dm | 10 ++++++++ code/game/objects/structures/displaycase.dm | 3 +++ code/modules/jobs/job_types/civilian.dm | 2 +- 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea8305..a41877e9f26 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -112311,6 +112311,22 @@ }, /turf/open/floor/plasteel/neutral, /area/atmos) +"ehO" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehP" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehQ" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"ehR" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) (1,1,1) = {" aaa @@ -143544,7 +143560,7 @@ cbA cdn ceS cgp -chQ +ehO cjl ckP cjl @@ -143801,7 +143817,7 @@ cbB cdo ceS cgq -chQ +ehP cjl ckP cjl @@ -144315,7 +144331,7 @@ bWi cdq ceS cgp -chQ +ehQ cjm ckP cmk @@ -144572,7 +144588,7 @@ cbC cdr ceT cgp -chQ +ehR cjn ckP cmk diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 320823a490e..f6e571f8698 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -45372,12 +45372,12 @@ name = "Port Maintenance" }) "bBr" = ( -/obj/structure/table/wood, /obj/machinery/airalarm{ dir = 4; pixel_x = -23; pixel_y = 0 }, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "bBs" = ( @@ -47035,7 +47035,6 @@ name = "\improper Auxiliary Restrooms" }) "bEw" = ( -/obj/structure/table/wood, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -32; pixel_y = 0 @@ -47044,6 +47043,7 @@ dir = 4; network = list("SS13") }, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "bEx" = ( @@ -95333,6 +95333,14 @@ icon_state = "xenomaint"; name = "Xeno Maintenance" }) +"dmD" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) +"dmE" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/library) (1,1,1) = {" aaa @@ -114481,7 +114489,7 @@ bwa bxU bzD bBr -bCT +bSx bEw bzE bHR @@ -114737,9 +114745,9 @@ bue bwb bxV bzE -bBs -bCU -bBs +dmD +bzE +dmE bzE bHR bJz diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index aa5e44a5210..ad0da0ed09e 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -19609,7 +19609,7 @@ /turf/open/floor/wood, /area/library) "aRO" = ( -/obj/structure/bookcase/random/nonfiction, +/obj/structure/displaycase/trophy, /turf/open/floor/wood, /area/library) "aRP" = ( @@ -108807,7 +108807,7 @@ aIt aPd aIt aRO -aIt +aRO aUC aVP aXu @@ -109064,7 +109064,7 @@ aNV aPd aIt aRO -aIt +aRO aIt aVQ aXu diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 266fe875792..345eb034b83 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -291,6 +291,16 @@ can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook) resistance_flags = FLAMMABLE +/obj/item/weapon/storage/bag/books/curator/New() + ..() + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/head/curator(src) + new /obj/item/clothing/suit/curator(src) + new /obj/item/clothing/under/rank/librarian/curator(src) + new /obj/item/weapon/melee/curator_whip(src) + new /obj/item/weapon/storage/backpack/satchel/explorer(src) + + /* * Trays - Agouri */ diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3bf87ea9f98..31f7b493b6b 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -278,6 +278,9 @@ if(!user.Adjacent(src)) //no TK museology return + if(!(user.mind && user.mind.assigned_role == "Librarian")) + to_chat(user, "You're not sure how to work this. Maybe you should as the librarian for help.") + if(!added_roundstart) to_chat(user, "You've already put something new in this case.") return diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 3ff8892d7e4..ad375b3710d 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -136,7 +136,7 @@ Librarian belt = /obj/item/device/pda/librarian uniform = /obj/item/clothing/under/rank/librarian - l_hand = /obj/item/weapon/storage/bag/books + l_hand = /obj/item/weapon/storage/bag/books/curator r_pocket = /obj/item/weapon/barcodescanner l_pocket = /obj/item/device/laser_pointer backpack_contents = list( From 2490d201a984e92c4d604c271237dce67c5b44b2 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Tue, 2 May 2017 11:49:29 -0400 Subject: [PATCH 081/100] Missing Return --- code/game/objects/structures/displaycase.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 31f7b493b6b..53951943534 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -279,7 +279,8 @@ return if(!(user.mind && user.mind.assigned_role == "Librarian")) - to_chat(user, "You're not sure how to work this. Maybe you should as the librarian for help.") + to_chat(user, "You're not sure how to work this. Maybe you should ask the librarian for help.") + return if(!added_roundstart) to_chat(user, "You've already put something new in this case.") From f9afd1ad5b6d2eba4d4349eb740e5be4ff1fd4a0 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Tue, 2 May 2017 13:47:03 -0400 Subject: [PATCH 082/100] Removes vestigial list from minds. (#26771) --- code/datums/mind.dm | 2 -- code/modules/admin/verbs/randomverbs.dm | 1 - code/modules/spells/spell_types/mind_transfer.dm | 15 --------------- 3 files changed, 18 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7e4d175537f..5b1082b04e5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -44,9 +44,7 @@ var/datum/job/assigned_job var/list/datum/objective/objectives = list() - var/list/datum/objective/special_verbs = list() - var/list/cult_words = list() var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. var/datum/faction/faction //associated faction diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index be0738106d3..22dfa9e5ee7 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -350,7 +350,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(G_found.mind && !G_found.mind.active) G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_character.mind.special_verbs = list() else new_character.mind_initialize() if(!new_character.mind.assigned_role) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index b41c099d7fc..491496f0447 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -62,29 +62,14 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/caster = user//The wizard/whomever doing the body transferring. //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. - for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. - caster.verbs -= V//But a safety nontheless. - - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. - for(var/V in victim.mind.special_verbs) - victim.verbs -= V - var/mob/dead/observer/ghost = victim.ghostize(0) caster.mind.transfer_to(victim) - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. - for(var/V in caster.mind.special_verbs)//Not too important but could come into play. - caster.verbs += V - ghost.mind.transfer_to(caster) if(ghost.key) caster.key = ghost.key //have to transfer the key since the mind was not active qdel(ghost) - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. - for(var/V in caster.mind.special_verbs) - caster.verbs += V //MIND TRANSFER END //Here we paralyze both mobs and knock them out for a time. From 0af7fe68508e98857c0122bec67ba9ba5ec374c2 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 2 May 2017 15:27:30 -0400 Subject: [PATCH 083/100] Ports pastries to Initialize --- .../food_and_drinks/food/snacks_pastry.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 76ef327bb6e..6081838669c 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -13,8 +13,8 @@ filling_color = "#D2691E" tastes = list("donut" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/Initialize() + . = ..() if(prob(30)) icon_state = "donut2" name = "frosted donut" @@ -28,8 +28,8 @@ bitesize = 10 tastes = list("donut" = 3, "chaos" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/Initialize() + . = ..() extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") reagents.add_reagent("[extra_reagent]", 3) bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1) @@ -48,8 +48,8 @@ extra_reagent = "berryjuice" tastes = list("jelly" = 1, "donut" = 3) -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/Initialize() + . = ..() if(extra_reagent) reagents.add_reagent("[extra_reagent]", 3) if(prob(30)) @@ -210,13 +210,13 @@ filling_color = "#F0E68C" tastes = list("mushroom" = 1, "biscuit" = 1) -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() var/fey = prob(10) if(fey) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" bonus_reagents = list("omnizine" = 5, "nutriment" = 1, "vitamin" = 1) - ..() + . = ..() if(fey) reagents.add_reagent("omnizine", 5) From 4c583a1f4f9edb2c50d95080210049a594ceed33 Mon Sep 17 00:00:00 2001 From: Profakos Date: Tue, 2 May 2017 21:36:37 +0200 Subject: [PATCH 084/100] Trophy case hotfixes (#26822) * Checks if the file's contents are empty * Prevents afterattack on insertion * True --- code/controllers/subsystem/persistence.dm | 3 +++ code/game/objects/structures/displaycase.dm | 1 + 2 files changed, 4 insertions(+) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 6b3e47054c1..c42dfc38e2e 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -114,6 +114,9 @@ SUBSYSTEM_DEF(persistence) var/saved_json trophy_sav >> saved_json + if(!saved_json) + return + var/decoded_json = json_decode(saved_json) if(!islist(decoded_json)) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3bf87ea9f98..9a64d33d730 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -316,6 +316,7 @@ to_chat(user, "You are too far to set the plaque's text.") SSpersistence.SaveTrophy(src) + return TRUE else to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") From 039b8a7834f35a41084455455dcfe8e2faf6a2c2 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 2 May 2017 15:59:16 -0400 Subject: [PATCH 085/100] I TOLD YOU THIS WAS WRONG #25467 --- code/modules/reagents/chemistry/machinery/reagentgrinder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 2dbc0ff1c23..a8ab8fd4269 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -38,7 +38,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5), - /obj/item/weapon/reagent_containers/food/snacks/donut/New = list("sprinkles" = -2, "sugar" = 1), + /obj/item/weapon/reagent_containers/food/snacks/donut = list("sprinkles" = -2, "sugar" = 1), /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5), From 85b1a44b2f918c17b614c08138e00cacabf43c31 Mon Sep 17 00:00:00 2001 From: bagil Date: Tue, 2 May 2017 20:10:43 +0000 Subject: [PATCH 086/100] Automatic changelog compile, [ci skip] --- html/changelog.html | 11 +++++++++++ html/changelogs/.all_changelog.yml | 10 ++++++++++ html/changelogs/AutoChangeLog-pr-26707.yml | 4 ---- html/changelogs/AutoChangeLog-pr-26765.yml | 6 ------ html/changelogs/AutoChangeLog-pr-26767.yml | 5 ----- 5 files changed, 21 insertions(+), 15 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26707.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26765.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-26767.yml diff --git a/html/changelog.html b/html/changelog.html index 8598ff603df..b5d7258486d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -68,6 +68,17 @@
  • The biogenerator will now show its recipes again.
+

XDTM updated:

+
    +
  • Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim.
  • +
  • Golems can now click on empty golem shells to transfer into them.
  • +
  • Plasma Golems now no longer explode on death. They instead explode if they're on fire and are hot enough. The explosion size has been increased.
  • +
  • Plasma Golems are now always flammable.
  • +
+

coiax updated:

+
    +
  • When talking on the alien hivemind, a person will be identified by their real name, rather than who they are disguised as.
  • +

01 May 2017

4dplanner updated:

diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bad0d33dceb..4a4facbfc93 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10822,3 +10822,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds persistent trophy cases. They are not on any map yet. Shadowlight213: - bugfix: The biogenerator will now show its recipes again. + XDTM: + - tweak: Blood Cult's talisman of Horrors now works at range. It will still give + no warning to the victim. + - rscadd: Golems can now click on empty golem shells to transfer into them. + - tweak: Plasma Golems now no longer explode on death. They instead explode if they're + on fire and are hot enough. The explosion size has been increased. + - tweak: Plasma Golems are now always flammable. + coiax: + - rscadd: When talking on the alien hivemind, a person will be identified by their + real name, rather than who they are disguised as. diff --git a/html/changelogs/AutoChangeLog-pr-26707.yml b/html/changelogs/AutoChangeLog-pr-26707.yml deleted file mode 100644 index d5e4582f402..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26707.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim." diff --git a/html/changelogs/AutoChangeLog-pr-26765.yml b/html/changelogs/AutoChangeLog-pr-26765.yml deleted file mode 100644 index bf7c2e79f9d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26765.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Golems can now click on empty golem shells to transfer into them." - - tweak: "Plasma Golems now no longer explode on death. They instead explode if they're on fire and are hot enough. The explosion size has been increased." - - tweak: "Plasma Golems are now always flammable." diff --git a/html/changelogs/AutoChangeLog-pr-26767.yml b/html/changelogs/AutoChangeLog-pr-26767.yml deleted file mode 100644 index fbb98e00393..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26767.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "When talking on the alien hivemind, a person will be identified by -their real name, rather than who they are disguised as." From 67c6bff51d0605e6fbac59025aefef092a4a9c19 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 2 May 2017 16:47:14 -0700 Subject: [PATCH 087/100] Automatic changelog generation for PR #26645 [ci skip] --- html/changelogs/AutoChangeLog-pr-26645.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26645.yml diff --git a/html/changelogs/AutoChangeLog-pr-26645.yml b/html/changelogs/AutoChangeLog-pr-26645.yml new file mode 100644 index 00000000000..ae21de51a9e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26645.yml @@ -0,0 +1,6 @@ +author: "Jordie0608" +delete-after: True +changes: + - rscadd: "Investigate logs are now persistent." + - tweak: "Game logs are now stored per-round; use .getserverlog to access previous rounds." + - rscdel: ".giveruntimelog and .getruntimelog removed." From 6c303855e807f774f2a5451a8180ed9bb491fbc8 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 2 May 2017 21:43:34 -0400 Subject: [PATCH 088/100] Should fix all of the cult/clockcult issues (#26832) --- code/datums/antagonists/antag_datum.dm | 21 +++++-- code/datums/antagonists/datum_clockcult.dm | 69 ++++++++++++++++------ code/datums/antagonists/datum_cult.dm | 17 ++++-- code/datums/mind.dm | 32 ++++------ 4 files changed, 94 insertions(+), 45 deletions(-) diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm index deee1111c06..396c1859618 100644 --- a/code/datums/antagonists/antag_datum.dm +++ b/code/datums/antagonists/antag_datum.dm @@ -8,13 +8,26 @@ var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with - /datum/antagonist/New(datum/mind/new_owner) - . = ..() typecache_datum_blacklist = typecacheof(typecache_datum_blacklist) if(new_owner) owner = new_owner +/datum/antagonist/Destroy() + if(owner) + LAZYREMOVE(owner.antag_datums, src) + owner = null + return ..() + +/datum/antagonist/proc/can_be_owned(datum/mind/new_owner) + . = TRUE + if(owner.has_antag_datum(type)) + return FALSE + for(var/i in owner.antag_datums) + var/datum/antagonist/A = i + if(is_type_in_typecache(src, A.typecache_datum_blacklist)) + return FALSE + /datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) remove_innate_effects(old_body) apply_innate_effects(new_body) @@ -37,7 +50,7 @@ /datum/antagonist/proc/on_removal() remove_innate_effects() if(owner) - owner.antag_datums -= src + LAZYREMOVE(owner.antag_datums, src) if(!silent && owner.current) farewell() qdel(src) @@ -46,4 +59,4 @@ return /datum/antagonist/proc/farewell() - return \ No newline at end of file + return diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index 3084b9ba829..b8dfa00f23e 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -9,27 +9,52 @@ qdel(hierophant_network) return ..() +/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) + . = ..() + if(.) + if(iscyborg(new_owner.current)) + var/mob/living/silicon/robot/R = new_owner.current + if(R.deployed) + var/mob/living/silicon/ai/AI = R.mainframe + R.undeploy() + to_chat(AI, "Anomaly Detected. Returned to core!") //The AI needs to be in its core to properly be converted + . = is_eligible_servant(new_owner.current) + if(!silent && new_owner.current) + if(issilicon(new_owner.current)) + to_chat(new_owner.current, "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the \ + Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.") + else + to_chat(new_owner.current, "[iscarbon(new_owner.current) ? "Your mind is racing! Your body feels incredibly light! ":""]Your world glows a brilliant \ + yellow! All at once it comes to you. Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.") + if(!.) + new_owner.current.visible_message("[new_owner.current] seems to resist an unseen force!") + to_chat(new_owner.current, "And yet, you somehow push it all away.") + +/datum/antagonist/clockcult/greet() + if(!owner.current || silent) + return + owner.current.visible_message("[owner.current]'s eyes glow a blazing yellow!") + to_chat(owner.current, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \ + Justiciar above all else. Perform his every whim without hesitation.") + /datum/antagonist/clockcult/on_gain() - if(!owner) - return var/mob/living/current = owner.current - if(!istype(current)) - return + SSticker.mode.servants_of_ratvar += owner + SSticker.mode.update_servant_icons_added(owner) if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR)) addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) + owner.special_role = "Servant of Ratvar" owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) if(issilicon(current)) - var/mob/living/silicon/S = owner - if(iscyborg(S) && !silent) - to_chat(S, "You have been desynced from your master AI.") - to_chat(S, "In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") - if(isAI(S)) - to_chat(S, "You are able to use your cameras to listen in on conversations.") - to_chat(S, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") + if(iscyborg(current) && !silent) + to_chat(current, "You have been desynced from your master AI.") + to_chat(current, "In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") + if(isAI(current)) + to_chat(current, "You are able to use your cameras to listen in on conversations.") + to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") else if(isbrain(current) || isclockmob(current)) to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") ..() - SSticker.mode.update_servant_icons_added(owner) if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) var/datum/game_mode/clockwork_cult/C = SSticker.mode C.present_tasks(owner) //Memorize the objectives @@ -47,11 +72,17 @@ var/mob/living/silicon/S = current if(iscyborg(S)) var/mob/living/silicon/robot/R = S - R.UnlinkSelf() + if(!R.shell) + R.UnlinkSelf() R.module.rebuild_modules() else if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT + var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame + for(var/d in GLOB.cardinal) + AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow + A.add_overlay(AI_frame) if(!A.lacks_power()) A.ai_restore_power() if(A.eyeobj) @@ -84,8 +115,6 @@ current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) if(!GLOB.clockwork_gateway_activated) current.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs) - update_slab_info() - /datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override) var/mob/living/current = owner.current @@ -102,7 +131,9 @@ var/mob/living/silicon/S = current if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = initial(A.can_be_carded) A.requires_power = initial(A.requires_power) + A.cut_overlays() S.make_laws() S.update_icons() S.show_laws() @@ -113,14 +144,16 @@ R.module.rebuild_modules() if(temp_owner) temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons - update_slab_info() /datum/antagonist/clockcult/on_removal() - . = ..() + SSticker.mode.servants_of_ratvar -= owner SSticker.mode.update_servant_icons_removed(owner) if(!silent) owner.current.visible_message("[owner] seems to have remembered their true allegiance!", \ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) + owner.wipe_memory() + owner.special_role = null if(iscyborg(owner.current)) - to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") \ No newline at end of file + to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") + . = ..() diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 7a2161a1a0c..30c0aa84507 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -5,13 +5,20 @@ qdel(communion) return ..() +/datum/antagonist/cult/can_be_owned(datum/mind/new_owner) + . = ..() + if(.) + . = is_convertable_to_cult(new_owner.current) + /datum/antagonist/cult/on_gain() . = ..() - if(!owner) - return + SSticker.mode.cult += owner + SSticker.mode.update_cult_icons_added(owner) + if(istype(SSticker.mode, /datum/game_mode/cult)) + var/datum/game_mode/cult/C = SSticker.mode + C.memorize_cult_objectives(owner) if(jobban_isbanned(owner.current, ROLE_CULTIST)) addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) - SSticker.mode.update_cult_icons_added(owner) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) @@ -33,9 +40,11 @@ communion.Remove(current) /datum/antagonist/cult/on_removal() - . = ..() + owner.wipe_memory() + SSticker.mode.cult -= owner SSticker.mode.update_cult_icons_removed(owner) to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") + . = ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5b1082b04e5..439b178dc1e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -52,7 +52,7 @@ var/linglink var/miming = 0 // Mime's vow of silence - var/list/antag_datums = list() + var/list/antag_datums var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD var/datum/gang/gang_datum //Which gang this mind belongs to, if any @@ -69,6 +69,10 @@ /datum/mind/Destroy() SSticker.minds -= src + if(islist(antag_datums)) + for(var/i in antag_datums) + qdel(i) + antag_datums = null return ..() /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) @@ -108,15 +112,16 @@ memory = null // Datum antag mind procs -/datum/mind/proc/add_antag_datum(datum_type, on_gain = TRUE) +/datum/mind/proc/add_antag_datum(datum_type) if(!datum_type) return - if(!can_hold_antag_datum(datum_type)) - return var/datum/antagonist/A = new datum_type(src) - antag_datums += A - if(on_gain) - A.on_gain() + if(!A.can_be_owned(src)) + qdel(A) + return + LAZYADD(antag_datums, A) + A.on_gain() + return A /datum/mind/proc/remove_antag_datum(datum_type) if(!datum_type) @@ -124,6 +129,7 @@ var/datum/antagonist/A = has_antag_datum(datum_type) if(A) A.on_removal() + return TRUE /datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us. for(var/a in antag_datums) @@ -141,18 +147,6 @@ else if(A.type == datum_type) return A -/datum/mind/proc/can_hold_antag_datum(datum_type) - if(!datum_type) - return - . = TRUE - if(has_antag_datum(datum_type)) - return FALSE - for(var/i in antag_datums) - var/datum/antagonist/A = i - if(is_type_in_typecache(A, A.typecache_datum_blacklist)) - return FALSE - - /* Removes antag type's references from a mind. objectives, uplinks, powers etc are all handled. From 2ed3284bd2405afb821e3fb0bf12dcebb62c4c1b Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 3 May 2017 00:57:06 -0400 Subject: [PATCH 089/100] Fixes sleepers --- code/game/machinery/Sleeper.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index cad4bb6e8e0..0f4b6b2b709 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -162,7 +162,7 @@ . = TRUE if("inject") var/chem = params["chem"] - if(!is_operational() || mob_occupant) + if(!is_operational() || !mob_occupant) return if(mob_occupant.health < min_health && chem != "epinephrine") return From 0dfcae7739fc350cae9dfec26b476ef5a78b88bc Mon Sep 17 00:00:00 2001 From: sybil Date: Wed, 3 May 2017 05:02:04 +0000 Subject: [PATCH 090/100] Automatic changelog compile, [ci skip] --- html/changelog.html | 14 ++++++++------ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-26645.yml | 6 ------ 3 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26645.yml diff --git a/html/changelog.html b/html/changelog.html index b5d7258486d..a07e28b0afa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,14 @@ -->
+

03 May 2017

+

Jordie0608 updated:

+
    +
  • Investigate logs are now persistent.
  • +
  • Game logs are now stored per-round; use .getserverlog to access previous rounds.
  • +
  • .giveruntimelog and .getruntimelog removed.
  • +
+

02 May 2017

4dplanner updated:

    @@ -1301,12 +1309,6 @@
  • Pressure plates are hidden under the floor like smuggler satchels are, but you can attach a signaller to them to have it signal when a mob passes over them!
  • Bomb armor is now effective in lessening the chance of being knocked out by bombs.
- -

01 March 2017

-

Cyberboss updated:

-
    -
  • Lobby music is no longer delayed
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 4a4facbfc93..3274f4e55d6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10832,3 +10832,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. coiax: - rscadd: When talking on the alien hivemind, a person will be identified by their real name, rather than who they are disguised as. +2017-05-03: + Jordie0608: + - rscadd: Investigate logs are now persistent. + - tweak: Game logs are now stored per-round; use .getserverlog to access previous + rounds. + - rscdel: .giveruntimelog and .getruntimelog removed. diff --git a/html/changelogs/AutoChangeLog-pr-26645.yml b/html/changelogs/AutoChangeLog-pr-26645.yml deleted file mode 100644 index ae21de51a9e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26645.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Jordie0608" -delete-after: True -changes: - - rscadd: "Investigate logs are now persistent." - - tweak: "Game logs are now stored per-round; use .getserverlog to access previous rounds." - - rscdel: ".giveruntimelog and .getruntimelog removed." From a029e4ca92c9ddaf8b355b7bf0f9d7e0da3131d3 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 3 May 2017 02:42:14 -0400 Subject: [PATCH 091/100] Adds eyeball soup and spaghetti to the game: it's now been 8 days edition (#26842) * Adds eyeball soup to the game. * minor reagent/sprite tweak --- .../food_and_drinks/food/snacks_soup.dm | 9 +++++++-- .../food_and_drinks/food/snacks_spaghetti.dm | 2 +- .../recipes/tablecraft/recipes_soup.dm | 12 ++++++++++++ icons/obj/food/soupsalad.dmi | Bin 18041 -> 18570 bytes 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 79df428ebb7..e11231fdfc6 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -128,6 +128,13 @@ list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3) tastes = list("tomato" = 1) +/obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball + name = "eyeball soup" + desc = "It looks back at you..." + icon_state = "eyeballsoup" + bonus_reagents = list("nutriment" = 1, "liquidgibs" = 3) + tastes = list("tomato" = 1, "squirming" = 1) + /obj/item/weapon/reagent_containers/food/snacks/soup/milo name = "milosoup" desc = "The universes best soup! Yum!!!" @@ -196,5 +203,3 @@ icon_state = "redbeetsoup" bonus_reagents = list("nutriment" = 4, "vitamin" = 6) tastes = list("beet" = 1) - - diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm index fd17c0ebd56..dc3aa601152 100644 --- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm +++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm @@ -83,5 +83,5 @@ icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "beefnoodle" trash = /obj/item/weapon/reagent_containers/glass/bowl - bonus_reagents = list("nutriment" = 5, "vitamin" = 6) + bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "liquidgibs" = 3) tastes = list("noodle" = 1, "meat" = 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 050beb84781..8ab865f65db 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -91,6 +91,18 @@ result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato category = CAT_SOUP +/datum/crafting_recipe/food/eyeballsoup + name = "Eyeball soup" + reqs = list( + /datum/reagent/water = 10, + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2, + /obj/item/organ/eyes = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball + category = CAT_SOUP + + /datum/crafting_recipe/food/milosoup name = "Milo soup" reqs = list( diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index fe4c07362af1de60863c06136e4b6b5edf9d54bc..c6df0a26039a75e9e460ba81307807b3e8d3ddf2 100644 GIT binary patch literal 18570 zcmb@ubyQrz*DctMLvRSL!9BQJAh-n$1b0Y~;Mz12T!IHD!QCCYad&qK?(R07-}m0w zn>F8>wdS8*eQ#CQy>(8>K6Uo)Ff|of3^Won004j?FDI=I003cM0qZD8u+JmOMm5-t zC@;;=F47jxW==MaE;bJK0Dwn&RN{yVEj4!E*ovy;mF@6e`Rapd?=QhUmT$$sNfh4f zNpNO>ys<3jM#_WH2<1SU&xdc=N4hqr_It>(R5ytg^U{aSL57sQCNvBkN;`eW0tmE} zTbpW#2qWg~-z=@*ISnEMbJR!7?R!m_u+Pn2L(p|yjHQ1P|N3hGl~9GTv+x6du_R*V zL{57tU)mGgz|#1`@9nE#Z`b~g zjn{3bT9rpadEL#dlIe=&2)n%$Xj)(NF!mnWA}q?=#~FYuZ^^xo=nJI$8cr&H{9?KX z#a{N>HkKQ^=MzU9m9q`;6Jlr>jqz!gbVOT>{A`xSm9wn9uF>g`061XO@ytZ z-ROR543PnKgaJ>WbP(h*kF&(3m}D~g)91T}q_6hL zMf#JY6j9K6wggIl8~|7yhh1Hf@zbRlBF?O}f8r8nABUYc=4;SY+)}I}u2nGlnC@K6 z@@!lGZ6QE{%2B!Y*%tukpZ$uBM1|e>z7v1|M<_!CmRRpZfyYMCCo+K*zM(;f)ienL zq9CwGz6bcX|G@b_D(^&+w38RbPNq!P(6RH@8C@e<@w2^p>)YP1ZB8~56296mrtB!a za*rz)DNiDQ5#hDcoDRsJ)*NsiN&-#2wyCE;I*Me-6MU)^XTA@;QY4dfy#o>nni4sP z+=|wm_&x9&A$wW5xz*xa&Gc0CukQT>osIAN{>iE@=-;4{Bj(SZi}}szP|@{Z_}$Dq z*TK8YYNa6|HI?M)`ME4fBE74eLtz z@o*AAW`_W)x91|{3gyW1>ptm8E&wz|XG(=ch&^(|2sgF8o6>L~PJXAC=$XLmvI~4brDK5NG0n=O6l7qeEFB)npIJ;hLsE|7@bcVbc;oj0BIvXy8AatIT<9b~p6*POzqPD` zjUr60gGmIE%Nqrl?b71na9i8jJlBmt+DionCpnPv zay}gF?1JV+1PKYSNcPf|Ynv9aqSWWtj*<+%?u@K9n&<1R3bjw4ewWu+!5Nc3DU7o) z`a9SFsM6Y7UQa3LM_XpfK_72qDtdvZyDD`3OI~|Kgv=QY2uM6DM97+T*$B|Jg&yES3ujEZwFFK?X#}Nf!D6CbzzZNsdA|Y3pQ2udAbQ$5jJOx59zq+a_mB^bmBgEgc_lZ#gEip23OmBsnx4?4~xz5SMjEn_j2HG>^V8-}0yDZ66WW!fp8`CeHDt2fT8PeD|; zAH9&lkH4EeP4y*UTf4)rjrRPgiyv2{R?!pfBDzS_SEJv$bysXa3h#B;Y;2frb1Lx6 zNbrt>lpn3g2THb;CT?*UFm~rQ2FzTzN0cW_8ApdE1&?G6F7dNz%OW9q_8BjORjwlx z6quNpOa@qDX_c>Q(L8>VuAWU?xQ2zg?T&+JfIzQze^!73wQKXghc8ZB`|pavEL7$3 z6BFXFt&F_?wtnHYIc=i?MyC3510*G@Cl*QkEyh_yAsxoqt*xzHyO47;)(G6W_?y)Z zl|ZA8wY99%(>c70noRNhma1_(mSi6n8}D&h%S|^ec#c>F~c`peuqlOZa z#vlOTFO8^UOR>MOw#wg01L3Btk9aTxHn+aiyPn4LrYJIaO%M@;>FlFI{4DWnjFOdQ ziyVfU8+hOmWe*J{ZTu>X=t###Bk;n$T(bbiRm5uzm)q7eF91>svcv^ zRzBghpEqT5A$%da=M0LZhk4DXWfu@5%AK5tRkl<8Jx8wD3t^Q|U%6{X6?jyxGbAdI zPN<@fEWnR=cQG!i@8060Lib}tTDqk~amZBynTC<+o3<=U8l-$Te4_%ef+dxu>lju0 z)buDPuFqES{*cJE2ZQ`(sme^&y};l7JD>ITD!=Dvz$K+mSV)rZ-|?%l=k|Em#K~q0 z?K`jb=8LF!%`6aa#+M*R1+YS1ya`0ye?N$A-g{}Uie@IS)ZB0E+NR11f}Rtb*BW>5 zc<&l~;-wBKktYP4$p5`X^HShL?#bJP8=Z%a*H|6Ta5If}L{HAB01LhG7tW-0*Ly&B zZ}WHE0}05AQ~DDh9ty8i536Su7aJ|I2e#W36o8x$FoxoYcv}lijgs0n>^2xAiRg5R zXRQ>2R)eN-SQ}038wiay_K_dYP=&O8)D#-icKDy~>pE2_gFdjlAwrJeY!BmlW z3zE&OWfm4;3foN<>sS^ha4&&g*0|?>wQu?8n*}k6c>1tp3k9=T-Un-5^b{QwtF9VO z*qvhCRESDwF4WLs+|a{J98m785oo{(2OIg;_c8ppd{`EGQ!XXdqxyb%Co#{p>KHHk z&gCYXsj5Wv>pHjyp*-ltP?`G0mLP4fXI$c(v}rm+T7&!AA(Q@l&$yXKEHQ%~ z44w4TGfuJ<$fxGBP{T~~( zU%(0ZgGqi7G%)NvG9dMA@h@x2D!v$vX3s5?Gdj^9H~A@w-1teL=PCxTu(#4a&1id( zZE#31RTk%Fq)SY%WuqN_*(EOX7H~eU7((`k!5deGZBpDpuOF}$RbV}1uI5)5D4Lp< z$!2~2V4ksfVanSNbZz@!=gGPMg)iggw)2MlgO%c!cU@aedtsBd1+bMW6V;`@wg;PW zO@dcjD_t8t=%&c{q7qPY=uj7=(!fO1Kh^Ydqm*5f$Ch-w=`u{Yh3t)#mwVCcyym>y zd2iKvvN2o>wa-FuDa4uA&41N#J6iPun0MYugpdT<#Y{|veE0^9z=$FG+R({X<$91Q zf^YuldsXRS)Dks{yR=%|K#As*unM}9wShM<5mpyiIfS0{^h}at84i+;`Ho!)&HP=D7Q^8R8o>jv7DHa|!6y-|z4^+ea%>zLX0)@x6 z*#5n@p%BfSDp9)w(GoaDJ{3da^XFeH&x(qQGsi6uza`r*su;h2^Gumso@0_OI6(VL z$CsePNBtadELU5}{)y`iyg(}%q%VAB1W>f)C4t4q8=0{Z>jfkq8ylvSHNPJNYDn#V zeBV0OP1Yf#C+|FrS+!F7LKRhZ%oR(tQsVyTrz+kEy86@uv$!tlVF1U*+Pbo(cB^H^ zL9b2RK&leMW2m&LUNJ+(N=sWlq>KU@A8br|wmZ`FQTeUCgH2c*rhbR6l*fAFW3Itr zG`GpDgj<;~CfJhpCKG=1Ql z&Kned6cvYi2hcSF$$isj{S=FXpT*e0;exVMUr=TLs#l)s&Qc=o6T+XR`|;xmXDd>$ ziTx}t5w?Ve)LZCD+>~ygYRU)sPwapZy2oY_db%^K(Y6)lejRZNRo#@>aW(kW)zw@) z1#3eBi|BS--=(vb9VPXmc9y?YM}oXrcqm5 zh)g@FN4p3PM#^l2h-%#pJLk;1mZqZyN)hpHny&hpy~RTcd4HKD?tZ7#gH2|Wte`3m zGk|^5p0@VWE&1f!k>&nmUQkd__MH2x)M|Zx<+@vw@*;PD3P!d#d8PPuV!O`8^cOzJ zKWsl__|El;5!MWE0QuosB73?wq41g~LZBa<*;rdp{sZn61;iuhqgt&MR@ciJvY6g2 zEra4^{{XAiO`T57%Oj=d-;G@x5yNoV&j`G-(b&o9=n~HZ`j})w(K_E~b;bRrY>G>R zCzWh=mY0}VSh|egpY3F9*tUCpTuSkt zxTfX@A?>ml*zFt+sSrbY{no3@OOr-HdcrkvS>KZd0&)@ZC*aDkigMFjeq*;rFIKS7l z<&iYiFVJ`1Ik{I?HvytmY?qEl)%Vi|w{Q?j4qCqsr&^6b#&6d7_U_(hl$d02>|7}T z80N+eQI_EReRpPlbG$Y%en%9kRYwH(OvH7gj~26iG5YWtQt>GFx6AZ%)rJ{vmu&S} zG4wA5L39C>Lm5NM!wY$GTJ1*>BsH+f8(bd6$nPBCvar15>Gw$_mo^T~Jov|jr8P6a z(^FTZ@xkpw&0iGw$#`ygB`i9Q2{~;i;=J#92|bD5b#)1<61b{sBU_(DE-uVzJYGlo z!YES~EyzosoJy{a%-kzYEy=24?QPXq$VBxd4hnCmPmddO*jx5hlGgmh0Q=sDp;1>q;a>>_U$ajay;b z(;t;L5KGHwl74q6J{|$R6(;DL7T>AZrFF6=oQ8%5oqU|fe}7Yv$hbU}cWq+zt?VdM4)ccrWYZJoDW4?wvJj>}5U{B~PeN z&L`iBvmq@V!BXhI?X?UGqU7cHzDrVBwmg??jBI;gxW#^J+Q=|Bx7Ob>C$>2J-E3>! zuePSXyW3g30|+cIDO@s8C3gI;U_>ZAchWHYXluaPy11x|Th9JzWMt&2@_{Yi$O~gn znTSV7L3MV0_fRpA0uCNdZVi&()*8rEoya7y;~qie>5Ufgmz~Bf0(fS*<^G#CKPISK zNoGefof99-mbahK6P3$~>9(3KuWL=5oL525$DU9Ma(WsZE2JuNsR9cwyRtE5kI@}1A}z(KEuHIS zH^zrpR8uAPW$FYeKl(Pm*)Y0p?+weeFXW{PhM2##sH`Xh@sWM(t!ZgojwQ<~ixBPY zDE-ezIX$!Phz@V-Eimf`WyUk$nIDow+i>RrQFL@3AEgT`-m=ay<*&cRku2?K|D8@I z!546H^}Fp>+3-GzI8Z3_s%1$ksDioc|8Pcp%vt`o```6;}_ z=!qBl5G61jN;t0TbyYRsd@iE(qw23fb13!tMlhuppTnwBP)EFE4pNm_g}z@w{JZCx z+pI(iA7gf1U73<={&*EGZd7lm|5kM@Pj^RusQ_0zH>xtFysjyQ?tq1PzU4)X$YEMQ z*ua3u?Vb29_se%72kSd6l*t6*Pb3VAH+p_5iw3#TXf>oqgI~9wn}Jw*iEYLgwD$Ur zq^Hp4+#$2i&%INVox;1{1sX+pEg^P_1z?&-yP`3$u`Djt#pz{ zP}Kilz_bIPs7QUdUl*V3p~v>Qp<<5HIrDmCrqhU0ZA6m#A$@luNYuP;t#qO0bHmOG zW}CPRC*r)voM`KK5(;mF1g4XPO%tXNiKM;cBg)1#{jZlr7O=AhxKFgJ%*$hlic-uP zJH*N92nn(+*Us`Tppyf#UYCmya(#Rak-yB+jG}T*V1V9r`m{+N@0X-0Yt#IQtj|X7 z^EUKmq<3uIpGfpgSB}k0Yx=059ENxrJN^@Om1aOe)%~s!Z|Ovo@!S1Li+#vT{k&q7 zUD|a$3;Qn-*doKtw0N9n(J=C`^tLNLu5?v6?VUcSzcXx&JKW$JB_&pt$a3)Y53)|P0+rvYgom67zyu|?_h&+lT?KiNOGr`s*+hR z=Cb-IG`N4&YCx{onN3tMm7`eKa({K%MvERUSXM!QoFY-6NZQ)A?P)6&cwQUuKM*e+ z7b^gamp7w=2n`U$+xun{L9GVyGcPT66uNtRlp+B`$$$TBM{`zG<_@igs6Y_+9FUJ3 ze18_e!2q^O%dKceW&_K=NTMwz?mc7v)N}L>eqn{TsmS=bF1TAda0T4Z?Up+}6%z0* z3lRkdfBDzhs>qqrPoyO4*Q7BbZtFunM?A^C51 zwgDE_PqOGMqWIJMbKvJ=@N*f~@hyD%v2P+y*TRiJIgKj(&5Q;ZEm{O)en}O`EO5c9 zU?c*cLnJwT=6rl}mn1-Phh`v#GQEa5zxIGODiVlgWwibVL@ID0P{|zw42+L~yG@3F z(Y`_qsEInsVyVrB29`jtVOJRE-v8YJ@qY(^|1YP>|4Ze~X%4t+{?R8sBcmtwtdhf9 zhRn=Nbq$U973c8qaP`By#>Tr+p;Jij?=^&{weyHv+Nn2g4Wg}^6xY`p@nouizbHu< zt6XN~aSwWuUs|wg)`%4TLFBx=Jbd#~ty{qi@EzOUoPE6Cw(IoDsatV{TJwgl=VK55 zZTO4B+aYksO?FIpc-(A-k*cvV)x^YvuM=d`mcZ4f)B7pwc*^U<&bOcjKBi^m;j%$Y zBch^$L(+_wRX=yvk3ne}&o+aoTUSaAP8C%sucJaq(RiC4uNSX!-Ai;xjB5i2MOJM2 zaNoy>yW;Dj7NLQ;~tdV-?!fLME##GaC$<06R?%WYr`!vjmOv6lsW zcQ=jigN_293RUyPM^}S0h@@?>Zq)^xVj}PIa#Ly(SP!C3F*05 zs{{oN&9pa?xYP)m8HUGzi;v$8yGbPC@jjkj`QUn@y)pG;T$UvU!Y&w^?h%w~TWCFm zRC<{+d*$bA30M7M`U@BCf$urVR$wL{+VD$nDg^e#6mpN{W0IRzCLA8^KvjH%KB>1bBBb4_Q#ENe6cmlKko=d;HXVR z61K7-x2Qjjc6~13^e<6OdRjt7RSgNru%eU;JGf>~%>b|v#g!N#>0y`RDU0kZk%5X4 z*GJ?xWZ=P9lAVn-f2!7r8p09npL>~2MQHkW8;iC7qu*GM&pv;<%`+vYipkWgjiBLL zfJ>Nkr^lVuxHzD32l}cuM!9v_mdEuYHJE;t@7UPp&YI=&pD{7_S)@OHlut}dB%jsM z(sH!{`1|{7YH6A9kZ_VLUB1b*k2%`kX9C(fvPfdh(yQs}4vc093x7K-`!74n*IY-0dh9VQWR6>!MRe)+ac0I~ays4sHuN4H%OX4kfdhZdlXnItrMQRCI^ z^V$J@c3j47y5i0!9fpD(k{3e3J6V-Lma!=fBUWV44n2xuoKYaz6Nd=Pt%`}fem=1^c}_C^G5 zV;*cpB<+1h=+hQ)wTue(S%!_`^Y&yNU0;yHm!Dx{<2geZcgHfu6nC$x`Sp6x57Rz<6_;IXlMtOBZg-z zhY8n7{uOGUKksSUBmN8&XJib`&ZdGTCT75^RZ^o*&c}6g#WdjS!?}_UDCpVC6?OpF z$H>Z>fKMYx-aEq@=Vn`9MJj+<+j}S3$WXxSI*lVox1ouv(kvJrSQc1x-dw))ySe6p zeuR%1wJ(&T8$ILkXSh1HM7C!Z?~NpUm9Rm&lO6zibn$rh z3p%BeJze)4Fa5<6Ch<2V8QjZua=2aaf15yk*7h~C8=L9&FF;T!o4PX_^ZK%3pl^L* z_Jx`2H;*y}29Gq6-1VZu$8r%kB9jE}d?9Xx*UKfRGnNiR_b#skJhhMqO>HUP#N{O& zZ7F+tHgEesHrpQ#@Te|Upd~cmS0a}5*#=QRDcWWG1n+y^3E}=VB#!8sll`pOlRl3R z6gYqa*O&3{nJWv{5*^k&rtgUuIXD^~JqxDZupnhyQwlmEfaT-qt6(;p!NBR_)l9Z$!7alf>fvtWrv|R z=hnBqb2(%Ek#|gNAW}n5Y@$+XQ*bb_N>51(Hwt;A_VeB;l24r=!olsvZVQ&wJ=V&B zyAYy>N1v$X)?idQj}*lLi$7%&Eh$`o+hM@rc9WmI_Tx|QZTfgylA#K>lb!4~^tRh_ zPxXv|&zP@?u2hGHg5sf}o?T&UZHewDB5kZ~H&29ippQ^V{c2&Ia630JU{xmprGxeD)EV;`# z48OYXXvx2U%X()wd)Q7CFu?^!UYDq*$+mHtM_sUtP9gy()9_a(OG@q<)Jl4b=i&%I zR7_!Ms=sbSuGj)<0Y-(6o3h3;GR2);&#C=1)4pxsp*jV>3&1Qt&|cd(Y9CyAVHt}L z)Z>J+NXTyG&y>LMK(wm4{4mCS^XN2;QFY@ZLLGw1%%4c1|PeJ~OeUY;3wK-aw2v=PkGN?7cr{tuLKUn$hJEY!7x=LjN-+CG(+pV}S`m&Cn@ zxS}HkN@9F~=JrfuTCXvXpOta+m3+eViP5+QFv>4o&-Co2W!HODkoc@O0_P97zkWxC zzbFy^P4ZJG4cPPvL&DgV(;v)P;QhSj;%2OvJ~IBM?eQ$4Qdy(r_!@CLxWwjV=m+@o$VRSXROo04s$xrhoZ#L^>3_59`)~v_b7B zT?;FO(wG8@>8LNDMJyBadV{Mq}0*VyRr z4XhJ3Uy={~jQtkWIcW^fPw&Kp5%$+p8t zeOJ3br=hHs_Of+gs@HH+26`y%@!*8>LkCP7=fVj_ErJg+Xs@b3i=}g@J7iB2wfl;; zsm1FDb&-n?A1DtU=mcbApgL)w9O)mQ;7|i{Zn z`LV)Hzr&@&ik04OV+Ub_Y`#169lMN5_$9w?+B^_hRhPq3C@);^-5(DBN zFjawDPg@bcnSoNufK27z9;v3B34unjPkkm1Pa>8#wzlRh&$&H!GqgYD0D&lU{-1;4 z2kiV-XIAepPK147{S(1O`TfIjIgAFNI{4m^48D)}U?b}B4l<>hRrkxpXRW4HZ_J;*bL{Cv^cn^oUtTC=E0xJ-Zv-G$8e$b87+l8d?Dr`5!vLu z>$46eE8WmU;OQL-<4lu5P#1Xd7n@oWvL?lm*HgK(c^_>3)0Bq{cvJg4BaNs*bZ@+7 z;CIY7xLHT^9AJ%lp2OQa#w>adWcr1RwR=U*1rWTOquQm80ot*8$VhymGpE_5TgCWQ zAazK2cG>)A?lR}mh9HO5`j)5X4+C6T)#M`h=1~fS0y5O_G7`7p1btlBg-7ki{eWPv zsYm=%HBUTKnfk8h3L;iR5FeQiVvYuMqGl(>Ya{Ut4rKwws6C?he4np$BRCz&_-#XB zR;txhkInp@_99MNabd^`K$A@Gyn+_$H2*ZAZM4_0L1->{k?9aPz z?-Nbt1WVVB@&9c+HU*ZXo4^KRj1zbsk8a!F#l)Di#a&onh0X~ZXUD129LWYOEVJAD zffloW13Gs>2AhF;9v;a&Fbv4B388x89 z8Kp!lRCctY?GMy-mbBd(wpjt#IQI&<6v%{Z>PK-!6jW3x^xLx55A2AX>fKA$woxSR zQUCS|G}&3fD}zW>w$qA)3%m9xb1}u4QLXqLQ3Nn~?t(u1_U>mVtVDfdcSSJ0;FbWv zlko(;5^a47d(x2?;6*U&PL5YU-Pgfg&F6%B`a>m-YKvM3Bx_a!- z2GZZmFq$8nNYGklPtSO>EkI6~;3MYtJ+h%hF+>g`eMNX+%MOH7h+M{ zU>xvLMLK4CT9!jX`asMma4{W&WMX1|cCq+k%NIjWcTH-_jq_c50dELFyQoBf7b>%N z{u&XMT%|CUHFw6j-I~PS;#Hm9gDlV}!{_A$V$A1X|J&-JWob5sfovNNffI!YVKM#! zP5CXr6|ACzaHlRw4(XR_&D?|83B~kJ@z|K~c3yqHG8AGb2|4P%*VkubAg6kluekxABxWedX6Pr9DD;<-D3;ZtMG)Z` zrO1tLrPoyLO_f4z=hi+7BB@Qqd)Mz{!Pj12h@D^@?7J5^+zJA6CPHCk51(m<+|rg{ z*pj#Op($#@?5t$0qvad{U^pm0HzZ4{pAiu)bM@n~^deq3yzb>bcf^ZaCgxKE|DUe0 zgus@j5%6#|#Ol|D>pVz6D+1!^J$8+iE(=52JbyGAPDkO5>@W@Okk*UrrmzACs2VLO z@8tHJLHkuN-SE4y1W;wZY`)%xm9G;vUxDMc7VrZ8t?1LoT_b?Si_F6iG6Af63bn>& zQMsnMKXzXg^%jVtG=Y#k*T+J55fZQRF@M4STQGh7>CY++$lM>IpYE$I1>s^}$7O`w27@a_kWCsIHg zcVDfq&ibIM%lTPW8tRxRQlmFwlSXnmvM4Wt)#VN)Q4pi0+X+F^2O04TNs>Bh1fBjI zbjq?iP|1@uT<`_ugEX{zQ!;g!8r_C;d+*y-;?1tf5vgxmU*NA1>bt$0Az|B?FNt4e zGT-rD$3n9D)+Epnj-&aW71H7^`YT~;cg&Slz!v-`J97J)C=jpR15~JVtq9nt0CM@w zab=(jovHvD(1|yX6F!ueu5CL5%70QC?7i{TnRUPO1CGut=`$KyGHWuN^*b8silUddFMC#6sI9J+>4hD8ylNEQ9%h3M;YX6$O zxFCStxVsoiBFIo#g_a%dV-5sC#!pp!b+RA50o2s?_BB?gh)Qf<=jgxRRbJmv^ z*A878M=~=cwce&5A;SNU{yGVf1C^S#2?p$DOIZy;g0XpuHHF2tM;Gy?rmfRWpY6)R zV4c7u=K|J}iKTCqzIo&OdoAnX#(H?^&@qX!qOl4Z@kw@$27GamR6pndq+(X6SoJ9? z;nqF=%2ikC<4GVU=JoQRbN}Z@NSfDHC(NI>Ij}Tz7XK~*2?@#B&CN;W)%A59a|?_Q zSvGhROr3kohi&;42rol^ufn_O&X|Cy0#&OU(m7z|O?1pcGDNf_iS@BX4(qIN%wG;YR8o7xc*8eCoeTfj^K8MVXSApmPBG` zwoKms`*-j2TX$!@*Ru`QlNOFDm>>Fz+Xig*YFt^A()-Uls#Ny-KzGzf%c$edzA4=# zH7W6BWd=#8bNgp=wi`Jy30iG=Yt(?1S5{=nOTxFaz`NNmpRZ=y{y3CioIS@JZj+z> zoU>bQjCCFr3`u@{aUU{sR9IuNFWs4=6pPRH9j(YF@`pmj#VrR?)Hz6qmB1}6LRUKQ zYmB#@+lac;_($8uUhxn22K$6t?1W{Iqx5M zbQa`;tQ0%4o@HU~Dnv~E!bqD)g-b$8z=VytiKJdy10RuQAiQ;1QP0v!gmw*ahPGmf z?&wItlx-|J((=>OI1is`ePOAd8M%<3xL!oK^~eZa#|TSTtjVvkmv&{F>0cwiDw+qG zeD^nF&gX0e#n|#>A0VXs@aq*bf0Y2Uwd7_iS8u$O*HQpSZ=TtPl8P3=T3G0XeLtIx zCA0Qf7H_T+&Gy2?`lrAq=Mb{dI=-jNo#jb`Pl{$m;_$CZ8WUgzPPzz)?0jpoCdu>fIF9AF6ipq(brV zB{kpzvJ>uSDxoq@0uLj*;qtRLMkRb#EUhh-0gNrXX4KZNW?V=Hj_x6h-U=_GBJ<;?0!a)#Hc@) z+}=?02b!E;C=1f<*#*9;$@DE@6kMXW!w7s8y7${8sEf+$0R!=x+?584xWx1Y%;KN) zR&34!Gra%PVT8*1)fHP`J89`;EV>dQPd$YcCRoG7* zu3zTLzL2{a{il~}iF;RB{znEuqe(YssHn)P z-py-^q`$N({^yzQh-3;_<@zYHSYg4|c@{NI*X@Ujr9@gH2n zE^YXK(}(=`i01z!Ci$P01r+7wb@v?K$#-$PWZ9)XQ>NkL?JbASq-zbn;O>68Iz)jP!k4@_?mF zxD3dw0SVZmy^nT;e!HHbf4MDU+qryeanD-&ErFAt9!XVI)zVS>;1ES{%?P)*b<()VRw!Up;x$T`<;b-|txzZ9OEQ~u5U zSEQY9@L4yUPPmJeeMvI;LM)wQqRir zbI;Aql>^-0-*0ViU*CVfa!39g+xDsX=r1b3y7iBBnHZSe7+>A2$`)bGettUvva$xR zrouyS!w2|8ZPKVX!t-@GEIf?P`IcQKI;)-h`*)GddYqim48oV6oplovJfi0a=YgC3 zqDis}3TQ2E1seaAU@X8K=39qJW~S|J&D-spw_G_yEw4Rcf)*y!Qw8OZpk?kVM6RSu zhbZCHvl8Pu+u@JO)>don0YJl_Rp}Nu{1VR!XR&hzX>N8gBoYeabd!S(0ZawI6kpva z1OM#&rEntjfrj)dVYO1oA!IYUQr5};MsK`#xZ4s9zPYGhchKwPt`HgA8mP#;`Ob*s za&9M%CvJ^?`U+JQsQi;MLFj49Zu@7yFzJG2_xtJEEe;9J2q2IHCmEz-+`b+3gX1V3 za949h8`5jn%gvf8|M+*FlRjqtv*503_Z*1=d-CVYo18XWa6S2Y(D{Jv(%9ITjxc0? z{&V=7iz4P^;r4*ddsw!0atd=?+t0-@wpkg~%feSleIr)Unwzx1>B?M!_U7KthI9eqfb}0%VQJ*x z6$WmZf9^6&(BkhqwzqzAfDYEV(Q#o+g9(4KOPuCW)C1UKl_r_43M7~V8>~imXDilZ zO6JCYlVV%|_$By(Z_%~%r(*kquH2md)}tYMdCBzb+tIV^N-bO4WvSDD`KXsR14`tTEA z(G6^3VnU>sX49TAKYxSy9yU-r1D|KE?PzfR{{7oOG^7#JweZgi3Dj*<#>ii}-)9v| zAL0bvYtn6Z@Vk_(bpZZD$96n1P$J4w@_fOmn|s}Ey}YX}3=OHzFOtOinUvJ~^G;wn z&r(Hu`n}T=!sO(noV>hA-*gc`>0zG%0J(qQt_HmX%X1$gfBYw1+TTA$Y%vu6)6xvz zZZ0-&l3|K=Xy{e?1y2p`>=dbHxdwhxm1V+_E-}g*wb`S3dFiw%4pB!A#aGWRC8*a zluuyyzIHaiGL3@1V`oP?f8;xjl?~EHV918s0NOGOjOafaT%kbmT>wQB{vzr9X;844 z&{Ld}`L`fRKcdbuzX7Yst54k?r#cvg7IV)YvlEN6@GN%Ya#zvpN@c36D|@H9lZM?5^sr zA?pB-aP;2l5-wom1lOsK8s*{jGJ%B!sF%#tEY!?{1=yoysMUTq5K(FI-&I zd?&4KmnMa-71?$|^8n@XaON9^*Z{mL-{rWt8@Gex8^a-XS?IHmQv7RFwDnnQp!f*6 z@=^Bb{B0X$j!g9Wifrchy{AN>Q2EpmvP&R+q^jj-C+1A#3VI$l5vHIm${GY*l>Xyro;F=@rmKmUZ5`;WY8#+UR(( z%}$=nv*8Dy$8d8%XHCGJ=YE;h}5TCXZPx98s(gxU=R9^$wutb&k(cf0v}xI zU#smi+TuRETmM=nQ6r4HLlIQFujZAGxNFA%tM|!B^>Fst9mdo0Itz#?A|($qIz|nB z4o5yo>xpLqdOYn*o%xVqT2=ausMTJdbZ3P3Jk~o1`s4}wXZePYV*ASs(leg$dNKok ziMIwU?vI^A;o+Ofe3^E|*&d0X9PBLacTXCTGymKPh~QU9@>}wW&+?s3JbHVcMyrE- zB*#L5>-)buILZ-^<=FOIVL?QAx$9fy2aclUYYy}-D^rmx@)qR=SML`Ea(#hYc6txh zAhsG4|7G|SkR&8}lQ2~<9rC03!Qg<=cx;F2-61oZED+s5IHYhR5iG*Heqz*2?yols z-@c`2U(>vs#|oRyKT~v+^!3xdUL}dC88eJvUT{?ypPvt{I`jL-1r%%$1se0Bsr>^V zvo!s-2-&|7z_58uHhFp_D|u`oQK$*saKdcpmsJT^((opL{9NnI+%wbc9AnO@#d zlY}%BGJ`z)V7D`4%? zUB`rIld(E5>8}!GHU0w--_gqO-n>BYiSJa=WkYEo?Fd76in9QZJ$F}}#&*=uOOQ;B zwxRn02xSGni}oF4_KXtBmMfjxiFFaWE^WxSP%|e$4i?=9Bu=zLMhfPDZUv`||Fpx@ z&+LA08=;dlr%y-Z`>9LzpVkT-tc82)jZX+_(&hQ?|7yCWU zWQ-Omu1w%fij#$2jXC=V)xq?4-RSL+G{qfQnXT^mdnkCj-W?f&2M7YHV7t z)BfJm{B>GG75JWg@Uix={eo!J1=%D2y5(8dap_y(proseL!NB8(i#<=5f26$HCH{sH+Hh4yoAYL8w(}HxEN3W?&;Pj(|dWw%ui_Tr$UV=j? zsr?^RF!m}La$7%Cq(isAU+Dnc+|aH5z>CB`sO%yN#P7!@J^}~2;7Z{ZZBaAqHS%#r z#o*TuqD~teUoy!1QqU!~iCEXNiZIWV_Fvg?0|g%Ovp=Y2BDq}m-hL7A+ZKQo?gNfa zJRZ~!mG)lQ(X*kB|B8hDy!)o-ysU&f0qN~Cq**0dudwLo6=Uz9(F@-F`cj+}2a5dv zqP2%0VqdYqb};6yra%AyDf{350zCVoutyR7KkD!QXUO#5iS-Mvp#YewRb5+~AS^8G zpqcmUEH)V#D~MBu>W+LP0jT+pVdwG@R#vK86D;Vw^D{BACtc7Pkjv{Jj&`LCx;g>H zkH*!U@0RF4KOwfMCX1ula)>tv*nwOWy;#JX?E=LeM%j3Hc-D`PS4{Q~55H>7^6^fd za#HDUJoWg&-*C8Lv>Sr1e)-=7l9!HT^Izn!V7$U8Yp&Ku7>{Co-)#Rne!_s9SpM;8 zL!lH2?)@VwCnj`YtA~OaN^5m8C_diA~n!p z0tAnDXm3Ya^a+(}?3G=f+64ixILOi4`NW&(U`T`fBIgT9K%V4$>PM^l0Xv)FB^D-8 z18Hf5k2V$AmuS1@-`UF;s)}h6`*sWfqp^{Y*ijhE zj?q$@iT}u19ZX^U2d|!XmL7ZSSHJWz=jQKZ;LGjlz?9Gb@Sa7|x%oR8^3|43^@IWR zFCFdy9L*^pCaFF6l|W8QOCu#Er9pNSgl>g)9^Z4fL&p4V>Kyc@|B>>dm-?Q?5 zBBMv5)0-I@GmJ8~Mt=Ho6&}9c7#qjq>+V7Bx6hGVc8b5un+C%#gZ&>c_n}89+PjPF zgGVuzSCBe$7EOCs;XC$Phbty3DoO$f3JSv31ndRB67 z`9Lgwx&~?+pt3NF*u+V=4f_*rK;^!#@b!R}pwVb+j$$nH0-#zGj^XfE5Hy+4HhU7fnTcj`sF{L_E!O+Td7FMZ71`>q47b4pimX6bSYaJbx?haY~} zZo#y)G^_mR$~q8hgNLV{(8PMo*1o!e66j_RIeg zQ-I$X-6jX^?+mg1t>53A>GNOx#?#WmJLmoXF-*>%!{AmB&cMLHz;N=LFoSee3`2@C z1H+uVkd}d>972ys+I5Eb5>19)H3o+Jj~Ezkc27hxQ^VMpVNz@vga3p!#*GD4|B(xV z(E?y#0m-)m5A+SO18x661A6%X&WYXsuddk7khi#tD&3F0TemZ)Sh!+jeg=lo0$`xQ z==I>E00V3+sQRxR;mF`*sZ4SA1D5%5*)>`K3@jME7-SSMFfc$C?ZEo!AOHVhP_b}j zym|lPe}?!3f)NZx3xH8D3Pvyh0Kc$! UZxbhPqyPW_07*qoM6N<$f_^i8$^ZZW literal 18041 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 Date: Wed, 3 May 2017 18:02:47 +1000 Subject: [PATCH 092/100] fixes config loading logs --- code/_globalvars/logging.dm | 2 ++ code/controllers/configuration.dm | 28 ++++++++++++++-------------- code/world.dm | 6 +++++- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index c2f0efba451..00665bdfe22 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -10,6 +10,8 @@ GLOBAL_VAR(world_href_log) GLOBAL_PROTECT(world_href_log) GLOBAL_VAR(round_id) GLOBAL_PROTECT(round_id) +GLOBAL_VAR(config_error_log) +GLOBAL_PROTECT(config_error_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index cb4416e2983..730582070ae 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -269,7 +269,7 @@ if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once - GLOB.world_game_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." + GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." modes += M.config_tag mode_names[M.config_tag] = M.name probabilities[M.config_tag] = M.probability @@ -534,7 +534,7 @@ if("error_msg_delay") error_msg_delay = text2num(value) else - GLOB.world_game_log << "Unknown setting in configuration: '[name]'" + GLOB.config_error_log << "Unknown setting in configuration: '[name]'" else if(type == "game_options") switch(name) @@ -597,13 +597,13 @@ if(mode_name in modes) continuous[mode_name] = 1 else - GLOB.world_game_log << "Unknown continuous configuration definition: [mode_name]." + GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]." if("midround_antag") var/mode_name = lowertext(value) if(mode_name in modes) midround_antag[mode_name] = 1 else - GLOB.world_game_log << "Unknown midround antagonist configuration definition: [mode_name]." + GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]." if("midround_antag_time_check") midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -619,9 +619,9 @@ if(mode_name in modes) min_pop[mode_name] = text2num(mode_value) else - GLOB.world_game_log << "Unknown minimum population configuration definition: [mode_name]." + GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]." else - GLOB.world_game_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." + GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." if("max_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -633,9 +633,9 @@ if(mode_name in modes) max_pop[mode_name] = text2num(mode_value) else - GLOB.world_game_log << "Unknown maximum population configuration definition: [mode_name]." + GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]." else - GLOB.world_game_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." + GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." if("shuttle_refuel_delay") shuttle_refuel_delay = text2num(value) if("show_game_type_odds") @@ -663,9 +663,9 @@ if(prob_name in modes) probabilities[prob_name] = text2num(prob_value) else - GLOB.world_game_log << "Unknown game mode probability configuration definition: [prob_name]." + GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]." else - GLOB.world_game_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." + GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 @@ -712,7 +712,7 @@ // Value is in the form "LAWID,NUMBER" var/list/L = splittext(value, ",") if(L.len != 2) - GLOB.world_game_log << "Invalid LAW_WEIGHT: " + t + GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t continue var/lawid = L[1] var/weight = text2num(L[2]) @@ -767,7 +767,7 @@ if("mice_roundstart") mice_roundstart = text2num(value) else - GLOB.world_game_log << "Unknown setting in configuration: '[name]'" + GLOB.config_error_log << "Unknown setting in configuration: '[name]'" fps = round(fps) if(fps <= 0) @@ -821,7 +821,7 @@ maplist[currentmap.map_name] = currentmap currentmap = null else - GLOB.world_game_log << "Unknown command in map vote config: '[command]'" + GLOB.config_error_log << "Unknown command in map vote config: '[command]'" /datum/configuration/proc/loadsql(filename) @@ -865,7 +865,7 @@ if("feedback_tableprefix") global.sqlfdbktableprefix = value else - GLOB.world_game_log << "Unknown setting in configuration: '[name]'" + GLOB.config_error_log << "Unknown setting in configuration: '[name]'" /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up diff --git a/code/world.dm b/code/world.dm index 03508e64102..c46e3a9fb82 100644 --- a/code/world.dm +++ b/code/world.dm @@ -25,6 +25,8 @@ else external_rsc_urls.Cut(i,i+1) #endif + GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) config = new GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" if(config.sql_enabled) @@ -49,8 +51,10 @@ GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently + if(fexists(GLOB.config_error_log)) + fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") + fdel(GLOB.config_error_log) - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) GLOB.revdata.DownloadPRDetails() load_mode() load_motd() From 482585951062ffc20a6c4ffcfab2620813a2855e Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 3 May 2017 05:07:19 -0400 Subject: [PATCH 093/100] Fixes the Slimecore HUD's neck slot (#26802) --- icons/mob/screen_slimecore.dmi | Bin 28022 -> 28030 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index bc33ad6e376e1d811c7745c3acd61a9cd3d136b5..63d67e6fbac8156d15f9ce1e1b0c58cc9b668314 100644 GIT binary patch delta 11296 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 From 9655f3bd260308dbd9d64bab805f8c295f9a18f3 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 02:07:20 -0700 Subject: [PATCH 094/100] Automatic changelog generation for PR #26802 [ci skip] --- html/changelogs/AutoChangeLog-pr-26802.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26802.yml diff --git a/html/changelogs/AutoChangeLog-pr-26802.yml b/html/changelogs/AutoChangeLog-pr-26802.yml new file mode 100644 index 00000000000..2eaec0638ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26802.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Fixed the slimecore HUD's neck slot sprite." From 7997ee35fb5e1c5f82502aaca814ca238823816c Mon Sep 17 00:00:00 2001 From: sybil Date: Wed, 3 May 2017 10:21:56 +0000 Subject: [PATCH 095/100] Automatic changelog compile, [ci skip] --- html/changelog.html | 4 ++++ html/changelogs/.all_changelog.yml | 2 ++ html/changelogs/AutoChangeLog-pr-26802.yml | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-26802.yml diff --git a/html/changelog.html b/html/changelog.html index a07e28b0afa..575ee862cc1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -62,6 +62,10 @@
  • Game logs are now stored per-round; use .getserverlog to access previous rounds.
  • .giveruntimelog and .getruntimelog removed.
  • +

    deathride58 updated:

    +
      +
    • Fixed the slimecore HUD's neck slot sprite.
    • +

    02 May 2017

    4dplanner updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3274f4e55d6..86571b113cd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10838,3 +10838,5 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Game logs are now stored per-round; use .getserverlog to access previous rounds. - rscdel: .giveruntimelog and .getruntimelog removed. + deathride58: + - tweak: Fixed the slimecore HUD's neck slot sprite. diff --git a/html/changelogs/AutoChangeLog-pr-26802.yml b/html/changelogs/AutoChangeLog-pr-26802.yml deleted file mode 100644 index 2eaec0638ad..00000000000 --- a/html/changelogs/AutoChangeLog-pr-26802.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - tweak: "Fixed the slimecore HUD's neck slot sprite." From b7864be38adb52eef23cd227d7dfe2ff1c39b8a4 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 3 May 2017 08:08:14 -0400 Subject: [PATCH 096/100] Curator --- .../map_files/Deltastation/DeltaStation2.dmm | 22 ++++++++-------- _maps/map_files/MetaStation/MetaStation.dmm | 8 +++++- _maps/map_files/PubbyStation/PubbyStation.dmm | 2 +- _maps/map_files/PubbyStation/job_changes.dm | 2 +- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 6 +++++ _maps/map_files/generic/Centcomm.dmm | 2 +- code/__DEFINES/jobs.dm | 2 +- code/game/gamemodes/devil/devil_game_mode.dm | 2 +- code/game/machinery/computer/crew.dm | 2 +- code/game/objects/effects/landmarks.dm | 2 +- .../objects/items/devices/PDA/PDA_types.dm | 6 ++--- code/game/objects/items/devices/PDA/cart.dm | 2 +- code/game/objects/items/toys.dm | 6 ++--- .../objects/items/weapons/storage/bags.dm | 10 -------- .../objects/items/weapons/storage/internal.dm | 2 +- code/game/objects/structures/displaycase.dm | 4 +-- code/modules/cargo/packs.dm | 4 +-- code/modules/clothing/head/collectable.dm | 2 +- code/modules/clothing/under/jobs/civilian.dm | 4 +-- code/modules/jobs/access.dm | 2 +- code/modules/jobs/job_types/civilian.dm | 25 ++++++++++--------- code/modules/jobs/jobs.dm | 2 +- code/modules/library/lib_codex_gigas.dm | 2 +- code/modules/library/lib_readme.dm | 8 +++--- code/modules/library/soapstone.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- code/modules/uplink/uplink_item.dm | 2 +- 27 files changed, 70 insertions(+), 65 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index a41877e9f26..f5e6964696a 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -62918,7 +62918,7 @@ "cpl" = ( /obj/structure/table/wood, /obj/item/weapon/clipboard, -/obj/item/toy/figure/librarian, +/obj/item/toy/figure/curator, /obj/machinery/airalarm{ dir = 8; icon_state = "alarm0"; @@ -64356,10 +64356,12 @@ /turf/open/floor/plasteel/black, /area/library) "crP" = ( -/obj/structure/dresser, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -32 - }, +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /turf/open/floor/plasteel/black, /area/library) "crQ" = ( @@ -67498,7 +67500,7 @@ desc = "This looks awfully familiar..."; icon_state = "curator" }, -/obj/item/clothing/under/rank/librarian/curator, +/obj/item/clothing/under/rank/curator/treasure_hunter, /turf/open/floor/carpet, /area/crew_quarters/sleep) "cxC" = ( @@ -105516,7 +105518,7 @@ /area/library/abandoned_library) "dSu" = ( /obj/structure/table/wood, -/obj/item/clothing/under/rank/librarian, +/obj/item/clothing/under/rank/curator, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; name = "2maintenance loot spawner" @@ -143817,7 +143819,7 @@ cbB cdo ceS cgq -ehP +ehO cjl ckP cjl @@ -144331,7 +144333,7 @@ bWi cdq ceS cgp -ehQ +ehO cjm ckP cmk @@ -144588,7 +144590,7 @@ cbC cdr ceT cgp -ehR +ehO cjn ckP cmk diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index f6e571f8698..abc3eccf3d0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -53664,6 +53664,12 @@ pixel_x = 30; pixel_y = 0 }, +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /turf/open/floor/engine/cult, /area/library) "bPY" = ( @@ -114747,7 +114753,7 @@ bxV bzE dmD bzE -dmE +dmD bzE bHR bJz diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e0e721840d8..2de3a5e8dcb 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -15105,7 +15105,7 @@ /area/maintenance/apmaint) "aEl" = ( /obj/structure/closet/coffin, -/obj/item/toy/figure/librarian, +/obj/item/toy/figure/curator, /turf/open/floor/plating, /area/maintenance/apmaint) "aEm" = ( diff --git a/_maps/map_files/PubbyStation/job_changes.dm b/_maps/map_files/PubbyStation/job_changes.dm index 8b26cd5b680..d366a15ae3f 100644 --- a/_maps/map_files/PubbyStation/job_changes.dm +++ b/_maps/map_files/PubbyStation/job_changes.dm @@ -18,5 +18,5 @@ access += GLOB.access_crematorium minimal_access += GLOB.access_crematorium -MAP_REMOVE_JOB(librarian) +MAP_REMOVE_JOB(curator) MAP_REMOVE_JOB(lawyer) \ No newline at end of file diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index ad0da0ed09e..7fbc6e734e7 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -19114,6 +19114,12 @@ /turf/open/floor/wood, /area/library) "aQr" = ( +/obj/structure/closet/crate, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/clothing/under/rank/curator/treasure_hunter, +/obj/item/clothing/suit/curator, +/obj/item/clothing/head/curator, +/obj/item/weapon/storage/backpack/satchel/explorer, /obj/machinery/light/small, /turf/open/floor/engine/cult, /area/library) diff --git a/_maps/map_files/generic/Centcomm.dmm b/_maps/map_files/generic/Centcomm.dmm index 9f7787b585a..e3870a49f88 100644 --- a/_maps/map_files/generic/Centcomm.dmm +++ b/_maps/map_files/generic/Centcomm.dmm @@ -5586,7 +5586,7 @@ /area/centcom/ferry) "ot" = ( /obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/librarian/curator, +/obj/item/clothing/under/rank/curator/treasure_hunter, /obj/item/clothing/under/skirt/black, /obj/item/clothing/under/shorts/black, /obj/item/clothing/under/pants/track, diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index d719d087a27..82acf13dcf8 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -32,7 +32,7 @@ #define BOTANIST (1<<2) #define COOK (1<<3) #define JANITOR (1<<4) -#define LIBRARIAN (1<<5) +#define CURATOR (1<<5) #define QUARTERMASTER (1<<6) #define CARGOTECH (1<<7) #define MINER (1<<8) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 9a528a12406..c275ac790a3 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -2,7 +2,7 @@ name = "devil" config_tag = "devil" antag_flag = ROLE_DEVIL - protected_jobs = list("Lawyer", "Librarian", "Chaplain", "Head of Security", "Captain", "AI") + protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") required_players = 0 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 7bc41bacc66..e8bdbf9a1e9 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -56,7 +56,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Bartender"] = 61 jobs["Cook"] = 62 jobs["Botanist"] = 63 - jobs["Librarian"] = 64 + jobs["Curator"] = 64 jobs["Chaplain"] = 65 jobs["Clown"] = 66 jobs["Mime"] = 67 diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 57e3763ef70..5ce88f1c27e 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -94,7 +94,7 @@ name = "Head of Personnel" /obj/effect/landmark/start/librarian - name = "Librarian" + name = "Curator" /obj/effect/landmark/start/lawyer name = "Lawyer" diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 4d466358471..6adc4efe223 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -161,11 +161,11 @@ icon_state = "pda-roboticist" default_cartridge = /obj/item/weapon/cartridge/roboticist -/obj/item/device/pda/librarian - name = "librarian PDA" +/obj/item/device/pda/curator + name = "curator PDA" icon_state = "pda-library" icon_alert = "pda-r-library" - default_cartridge = /obj/item/weapon/cartridge/librarian + default_cartridge = /obj/item/weapon/cartridge/curator desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a WGW-11 series e-reader." note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!" silent = 1 //Quiet in the library! diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 3e044cb4a52..60296fd4d5d 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -108,7 +108,7 @@ access_mime = 1 var/mime_charges = 5 -/obj/item/weapon/cartridge/librarian +/obj/item/weapon/cartridge/curator name = "\improper Lib-Tweet cartridge" icon_state = "cart-s" access_newscaster = 1 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f332422578f..0979a659816 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1218,9 +1218,9 @@ icon_state = "lawyer" toysay = "My client is a dirty traitor!" -/obj/item/toy/figure/librarian - name = "Librarian action figure" - icon_state = "librarian" +/obj/item/toy/figure/curator + name = "Curator action figure" + icon_state = "curator" toysay = "One day while..." /obj/item/toy/figure/md diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 345eb034b83..266fe875792 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -291,16 +291,6 @@ can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook) resistance_flags = FLAMMABLE -/obj/item/weapon/storage/bag/books/curator/New() - ..() - new /obj/item/clothing/shoes/workboots/mining(src) - new /obj/item/clothing/head/curator(src) - new /obj/item/clothing/suit/curator(src) - new /obj/item/clothing/under/rank/librarian/curator(src) - new /obj/item/weapon/melee/curator_whip(src) - new /obj/item/weapon/storage/backpack/satchel/explorer(src) - - /* * Trays - Agouri */ diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 8c7b7df04c0..540ff0f206c 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -53,7 +53,7 @@ /obj/item/weapon/implanter, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool/mini, /obj/item/device/firing_pin ) - //can hold both regular pens and energy daggers. made for your every-day tactical librarians/murderers. + //can hold both regular pens and energy daggers. made for your every-day tactical curators/murderers. priority = FALSE quickdraw = TRUE silent = TRUE diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 53951943534..9966b97b047 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -278,8 +278,8 @@ if(!user.Adjacent(src)) //no TK museology return - if(!(user.mind && user.mind.assigned_role == "Librarian")) - to_chat(user, "You're not sure how to work this. Maybe you should ask the librarian for help.") + if(!(user.mind && user.mind.assigned_role == "Curator")) + to_chat(user, "You're not sure how to work this. Maybe you should ask the curator for help.") return if(!added_roundstart) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 1a61048f486..da947c6c5ca 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1681,8 +1681,8 @@ crate_name = "art supply crate" /datum/supply_pack/misc/soapstone - name = "Librarian Engraving/Scribbling Crate" - crate_name = "librarian engraving/scribbling crate" + name = "Curator Engraving/Scribbling Crate" + crate_name = "curator engraving/scribbling crate" cost = 3000 contains = list(/obj/item/soapstone) access = GLOB.access_library diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 70dfabdcfcb..8ec8d00c772 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -30,7 +30,7 @@ /obj/item/clothing/head/collectable/paper name = "collectable paper hat" - desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Librarians." + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Curators." icon_state = "paper" dog_fashion = /datum/dog_fashion/head diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 509d5421c2f..6ee444adb18 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -137,7 +137,7 @@ can_adjust = 1 alt_covers_chest = 1 -/obj/item/clothing/under/rank/librarian +/obj/item/clothing/under/rank/curator name = "sensible suit" desc = "It's very... sensible." icon_state = "red_suit" @@ -145,7 +145,7 @@ item_color = "red_suit" can_adjust = 0 -/obj/item/clothing/under/rank/librarian/curator +/obj/item/clothing/under/rank/curator/treasure_hunter name = "treasure hunter uniform" desc = "A rugged uniform suitable for treasure hunting." icon_state = "curator" diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index be6b662790e..d3a8c089d62 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -459,7 +459,7 @@ GLOBAL_VAR_CONST(access_away_generic4, 208) /proc/get_all_jobs() return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", - "Shaft Miner", "Clown", "Mime", "Janitor", "Librarian", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", + "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index ad375b3710d..3561e0e60cd 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -112,11 +112,11 @@ Mime H.mind.miming = 1 /* -Librarian +Curator */ -/datum/job/librarian - title = "Librarian" - flag = LIBRARIAN +/datum/job/curator + title = "Curator" + flag = CURATOR department_head = list("Head of Personnel") department_flag = CIVILIAN faction = "Station" @@ -125,26 +125,27 @@ Librarian supervisors = "the head of personnel" selection_color = "#dddddd" - outfit = /datum/outfit/job/librarian + outfit = /datum/outfit/job/curator access = list(GLOB.access_library) minimal_access = list(GLOB.access_library) -/datum/outfit/job/librarian - name = "Librarian" - jobtype = /datum/job/librarian +/datum/outfit/job/curator + name = "Curator" + jobtype = /datum/job/curator - belt = /obj/item/device/pda/librarian - uniform = /obj/item/clothing/under/rank/librarian - l_hand = /obj/item/weapon/storage/bag/books/curator + belt = /obj/item/device/pda/curator + uniform = /obj/item/clothing/under/rank/curator + l_hand = /obj/item/weapon/storage/bag/books r_pocket = /obj/item/weapon/barcodescanner l_pocket = /obj/item/device/laser_pointer backpack_contents = list( + /obj/item/weapon/melee/curator_whip = 1, /obj/item/soapstone = 1 ) -/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 6d2448cd8ec..2d7caa5fc48 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(civilian_positions, list( "Botanist", "Cook", "Janitor", - "Librarian", + "Curator", "Lawyer", "Chaplain", "Clown", diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index 4fcd00c5c04..35cb9880836 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -32,7 +32,7 @@ var/speed = 300 var/correctness = 85 var/willpower = 98 - if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research + if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research speed = 45 correctness = 100 willpower = 100 diff --git a/code/modules/library/lib_readme.dm b/code/modules/library/lib_readme.dm index 069756c359b..224c6f81991 100644 --- a/code/modules/library/lib_readme.dm +++ b/code/modules/library/lib_readme.dm @@ -22,7 +22,7 @@ ------------ A place for the crew to go, relax, and enjoy a good book. Aspiring authors can even self publish and, if they're lucky - convince the on-staff Librarian to submit it to the Archives + convince the on-staff Curator to submit it to the Archives to be chronicled in history forever - some say even persisting through alternate dimensions. @@ -49,12 +49,12 @@ // Ideas for the future // --------------------- -// - Visitor's computer should be able to search the current in-round library inventory (that the Librarian has stocked and checked in) +// - Visitor's computer should be able to search the current in-round library inventory (that the Curator has stocked and checked in) // -- Give computer other features like an Instant Messenger application, or the ability to edit, save, and print documents. // - Admin interface directly tied to the Archive DB. Right now there's no way to delete uploaded books in-game. -// -- If this gets implemented, allow Librarians to "tag" or "suggest" books to be deleted. The DB ID of the tagged books gets saved to a text file (or another table in the DB maybe?). +// -- If this gets implemented, allow Curators to "tag" or "suggest" books to be deleted. The DB ID of the tagged books gets saved to a text file (or another table in the DB maybe?). // The admin interface would automatically take these IDs and SELECT them all from the DB to be displayed along with a Delete link to drop the row from the table. -// - When the game sets up and the round begins, have it automatically pick random books from the DB to populate the library with. Even if the Librarian is a useless fuck there are at least a few books around. +// - When the game sets up and the round begins, have it automatically pick random books from the DB to populate the library with. Even if the Curator is a useless fuck there are at least a few books around. // - Allow books to be "hollowed out" like the Chaplain's Bible, allowing you to store one pocket-sized item inside. // - Make books/book cases burn when exposed to flame. // - Make book binder hackable. diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 231f5417ab6..d8899285a23 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -115,7 +115,7 @@ as instructions and/or memes for the next generation of spessmen. Limited in location to station_z only. Can be smashed out or exploded, - but only permamently removed with the librarian's soapstone. + but only permamently removed with the curator's soapstone. */ /obj/item/soapstone/infinite diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a2048c2b718..b310f891fbd 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -247,7 +247,7 @@ else if((findtext(message, silence_words))) cooldown = COOLDOWN_STUN for(var/mob/living/carbon/C in listeners) - if(user.mind && (user.mind.assigned_role == "Librarian" || user.mind.assigned_role == "Mime")) + if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) power_multiplier *= 3 C.silent += (10 * power_multiplier) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index d80a8e21b3c..09334b24c8f 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -1250,7 +1250,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking." item = /obj/item/toy/eightball/haunted cost = 2 - restricted_roles = list("Librarian") + restricted_roles = list("Curator") limited_stock = 1 // please don't spam deadchat // Pointless From cfcdc73a3d73bcfa6e09918629967982c8a7eb8b Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 3 May 2017 08:17:36 -0400 Subject: [PATCH 097/100] Fixes action figure being invisible --- icons/obj/toy.dmi | Bin 34072 -> 34071 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index f71e135dce02a8024d2be3745714847f88ecd48c..f2176c395d7a2302b07c9cc8811adad708f36016 100644 GIT binary patch delta 1165 zcmV;81akYBiUOC40+1wsX?j#xbVOxyV{&P5bZKvH004NLrP@nx+c*#h@U#6Xi1wOY zG>+uQ!H2dfcC(8XDE0#wBXT6Mrbv~fqBx&^4}QdQ*UQluxg@~+L_KC4|0TT_pT7L@ z^i4c|eVRU_587F=7TNC~rjuT)Sc|oIm`x`&>Z*?WKSG3vVlCc(l@1yOKE9hyl=eZa z#r9YuTXi;BRyt^;cOew6Clwb46ecT!g|>BVx~?tUOR}nmh`s=0oJ${3 z(fM%Y^yJftLIXRo7Wa3DpXtOn*IsPGyDeT_=|8~v4*qua>`ZDGL+hegi~HW4gBnduG*rx)HRk3`+27qg-##R!md5nF&{lKM{O?3?t5oIfX~q*_@@Phtg&Fpj4gAvoU`SEEthP$V$1y?u;_6N zSokyqEPWh*0TwEuXE}V1Wf(w^ixZ=Wn+jHcx>pAw+^c;Nb zd5%4_{AhX+I`Xk#HWoaL1sN@Fg`HJeLc|eS@XgSp;F}>Q!8bw+g6F%%$$=+7HU^G@ z4_ugWVa|nfE?jWok_%T{IEa6vE1+JX^Vu5U!ldQ zCFO8y!b?Oop)-Fr$&w#nbtHUT8R&O}gOr^I%I2E%iEVU4czs1%!d_Wze?YRT*RSAz z)B8m!afKsZ>L4}RNUB8X%2G?h@rIpMgnui~+B@Sa%HlnEMY+#xU0(p33I78mgiT-Th-9HqZZ{IbVIA^KUkTx`(0D?=<$KyMia4Du`dLbUZt1Fy|97q4 fi!a|E#pBnf>A%`&!+Cq}J#YX3AOK0ToCJJ;<}OM2 delta 1165 zcmV;81akYAiUOF50+1wsYI;;ybVOxyV{&P5bZKvH004NLrP@nx+c*#a;IsWJi1wOY zG>+uQ!H2dfcC(8XDE0>!BXT6Mrbv~fqBy^P4}QdQ*UQluxg@}R;%mn7NO~_mefi_* zn|S>CG<`-Nw6kI@vfn>UC%sm&7Hjb^n@(!fRUP+#ga{GETD&WN9W)Ajd^epa?Soj0 z`{|_g(BS^}Q=o*l>TEKsbkIoeLMU8M3N8#NOhyI^ZR^@}TwA!8WK<6keF4TemtIlP z`EX@>^65mOft^^3`@6%>bYh%qFD~KT7O#%UHY7Vv`2chLWngzyxLXpLb`6}!K&8l*L1$r&TeUu4S47jdRlZq4{c4o za%ZU5b!ry^c7Yb%*6`{qE!Jby60Jm9_{S&0`O59af_2eDK)WeBV@9JIOgS1E!e`2* z!KRJr+#1Zxs{3>zXj>VS;MGRC-kyz^rgAeAt`vVF_!vfi$_KX0*fM9!Ia@B+a>=l;Y#sO3kq3f!IBwU=4?4<%LQ95*>c5}`$AyRV;QjU zsR&s5SOP46d?)~xoe5Wp&!#I_+0TI)7v@|z=fVXSF1c{Uh5NMU$Ya)X>?!Fv_?Yt? zdr0}w^rGp=$AZ~d@Gur+w00}(tkM!9j_3v7480Y6GvrS2jnEpw^J#JVz>^=_29AOc zT$piT&V_R>TyWu%3s+n?X#YmZi|%ify=?wQ;fvmXZ8u8x)F3_9rP zM#w>b`;czXhVkkCY#5(z&xY}Y4zt_h)n~D@>G|XCUyxQNy+Maq>D-k*@obR%E`NiK zwz|QH&L_u^;M>-8q1J>4uf3r?7_Gc6OHF*}8n$RKQXkQVTBqM^h;FxeLF>qYn=YUt zMK`Vs=~>DqJvM}(Lj;?CodjazLNclVAJHm*OrLq-eEN-t!bPz9+S?q13~D3j^c@@t zzH$*|osJ}Ia1E^?jap;+hKa1PAuZLoK0Ty{bd17?GV15_N>%vTK{_|lR@x%r@GGlMML*R!73em4SXoSftT~2TwVOCcU+dZU`^1XiJ!v)%FJ@qk8>+ z3O+qAN{A~Q@vwu`Xd@{Sr7KG<3F{3zs|f#Cp0#(zRg}Sd@QQM$*}A>}!u?eVVN)28 z+f8Y7+Y!KH2oLTXT&XO%e?vk03ZOfngo4-5NcUy From f3ac38b09256db7bd233de1ab84d3423348d9091 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Wed, 3 May 2017 07:48:09 -0700 Subject: [PATCH 098/100] adds a safety catch to spin() (#26811) * Update mob.dm * Update mob.dm --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 0c8335f62df..4080601971c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -350,6 +350,8 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir + if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + return while(spintime >= speed) sleep(speed) switch(D) From f3016645ca0c4f0a2f26332179cffeddf7a9aad1 Mon Sep 17 00:00:00 2001 From: QualityVan Date: Wed, 3 May 2017 10:50:56 -0400 Subject: [PATCH 099/100] Gives ears, eyes, and vocal cords plural gender (#26803) --- code/modules/surgery/organs/ears.dm | 1 + code/modules/surgery/organs/eyes.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index c91cb219afd..e66346a2c89 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -4,6 +4,7 @@ desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = "head" slot = "ears" + gender = PLURAL // `deaf` measures "ticks" of deafness. While > 0, the person is unable // to hear anything. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 4ad8b9c518e..46d448a7ed2 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -4,6 +4,7 @@ desc = "I see you!" zone = "eyes" slot = "eye_sight" + gender = PLURAL var/sight_flags = 0 var/see_in_dark = 2 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a2048c2b718..e4ab2199ad1 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -8,6 +8,7 @@ icon_state = "appendix" zone = "mouth" slot = "vocal_cords" + gender = PLURAL var/list/spans = null /obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords From 2da8867f67a669509b40055a404047877afb5b00 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Wed, 3 May 2017 08:18:17 -0700 Subject: [PATCH 100/100] Automatic changelog generation for PR #26813 [ci skip] --- html/changelogs/AutoChangeLog-pr-26813.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26813.yml diff --git a/html/changelogs/AutoChangeLog-pr-26813.yml b/html/changelogs/AutoChangeLog-pr-26813.yml new file mode 100644 index 00000000000..10d910d62b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26813.yml @@ -0,0 +1,7 @@ +author: "Kor, Profakos, Iamgoofball" +delete-after: True +changes: + - rscadd: "The Librarian has been replaced by the Curator." + - rscadd: "Persistent trophy cases have been added to the library on Meta, Delta, and Box. These are only usable by the Curator." + - rscadd: "The Curator now starts with his whip." + - rscadd: "The Curator now has access to his treasure hunter outfit, stashed in his private office."