diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index ead4c9665c..dd57fab8af 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -555,3 +555,9 @@ block( \ #define PERF_TOGGLE_SHUTTLES (1<<3) /// Disables loading Techwebs and additional Z-Levels #define PERF_TOGGLE_TECHWEBS (1<<4) + +// Searchable items search times + +#define SEARCH_TIME_SHORT 50 +#define SEARCH_TIME_NORMAL 150 +#define SEARCH_TIME_LONG 250 diff --git a/code/game/objects/items/sectorpatrol/cargo_items.dm b/code/game/objects/items/sectorpatrol/cargo_items.dm index 4476b6b365..09008e8dbb 100644 --- a/code/game/objects/items/sectorpatrol/cargo_items.dm +++ b/code/game/objects/items/sectorpatrol/cargo_items.dm @@ -9,6 +9,69 @@ WEAR_R_HAND = 'icons/mob/humans/onmob/sp_cargo_rhand.dmi' ) +/obj/item/cargo/efolder/folder + name = "electronic folder" + desc = "A black plastic device that resembles a paper folder but cannot be opened or used to store any paper. Has a slot on the label part." + desc_lore = "Electronic folders are UAAC-TIS devices that are considered safe to carry by non-agency personnel and are used to store and transport operation related information between TIS mainframes and UACM ships. These devices saw initial adoption during USCMC times but were pushed as a standard when the UACM was established. Once recorded, a folder contains both a spoken debriefing and written information dumped from the ships AI to corroborate the report. These devices come paired with unique PID keys that need to be slotted into the device before it can be accessed by whatever method is used to read from it. Some TIS devices can read from these folders without making direct contact, but most require it to be directly plugged in and decoded." + icon = 'icons/obj/items/sp_cargo.dmi' + icon_state = "efolder" + flags_item = NOBLUDGEON + var/efolder_folder_id = "default" + +/obj/item/cargo/efolder/folder/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/cargo/efolder/pid)) + var/obj/item/cargo/efolder/pid/pid = W + if(pid.efolder_pid_id == efolder_folder_id) + to_chat(usr, narrate_body("You slot the pid into the folder. The diodes flash once.")) + var/obj/item/cargo/efolder/folder_pid/folder = new(get_turf(usr)) + folder.efolder_folder_id = efolder_folder_id + if(item_serial) folder.item_serial = item_serial + qdel(pid) + usr.put_in_hands(folder) + qdel(src) + return + if(pid.efolder_pid_id != efolder_folder_id) + to_chat(usr, narrate_body("You slot the pid into the folder. The diodes flash three times and the pid is ejected.")) + return + to_chat(user, narrate_body("There does not seem to be a way of combining those at the moment.")) + return + + +/obj/item/cargo/efolder/pid + name = "pid device" + desc = "A small, thin, black device resembling a pen, with a slot on one end and several inactive diodes along one side." + desc_lore = "This device, technically called an electronic folder PID, carries an encoded unique encryption and decryption signature paired with its unique electronic folder. Upon recording, the device is detached from the folder and typically transported via separate means than the folder itself, to be decoded at whatever destination the folder and PID is intended for. When matched with its folder, the PID first matches its encryption signature with that of the folder, and if it matches, uses its encoded decryption key to pass the decoded contents to whatever means are used to access it." + icon = 'icons/obj/items/sp_cargo.dmi' + icon_state = "pid" + flags_item = NOBLUDGEON + var/efolder_pid_id = "default" + +/obj/item/cargo/efolder/folder_pid + name = "unlocked electronic folder" + desc = "A black plastic device that resembles a paper folder but cannot be opened or used to store any paper. A small device is plugged into a slot on the laber label part." + desc_lore = "Electronic folders are UAAC-TIS devices that are considered safe to carry by non-agency personnel and are used to store and transport operation related information between TIS mainframes and UACM ships. These devices saw initial adoption during USCMC times but were pushed as a standard when the UACM was established. Once recorded, a folder contains both a spoken debriefing and written information dumped from the ships AI to corroborate the report. These devices come paired with unique PID keys that need to be slotted into the device before it can be accessed by whatever method is used to read from it. Some TIS devices can read from these folders without making direct contact, but most require it to be directly plugged in and decoded." + icon = 'icons/obj/items/sp_cargo.dmi' + icon_state = "efolder_pid" + flags_item = NOBLUDGEON + var/efolder_folder_id = "default" + +/obj/item/cargo/efolder/folder_pid/attack_self(mob/user) + ..() + if(usr.a_intent == INTENT_GRAB) + to_chat(usr, narrate_body("You slide the pid key out of the folder.")) + var/obj/item/cargo/efolder/folder/folder = new(get_turf(usr)) + var/obj/item/cargo/efolder/pid/pid = new(get_turf(usr)) + pid.efolder_pid_id = efolder_folder_id + folder.efolder_folder_id = efolder_folder_id + if(item_serial) + pid.item_serial = item_serial + folder.item_serial = item_serial + usr.drop_held_item(src) + usr.put_in_hands(folder) + usr.put_in_hands(pid) + qdel(src) + return + /obj/structure/cargo/crate/ name = "generic cargo crate" var/cargo_manifest @@ -49,3 +112,19 @@ if(!isxeno(user) && (get_dist(user, src) < item_serial_distance || isobserver(user))) to_chat(user, narrate_body("The serial number is:")) to_chat(user, narrate_serial_block(narrate_serial("[item_serial]"))) + +/obj/item/cargo/book + name = "book" + desc = "Sheets of paper with text and images bound together with a soft cover material." + desc_lore = "The printed word industry was quite literally saved by the sudden explosion of intergalactic travel. For the longest time, the written word remained the most trusted way to transfer information, news, and entertainment among the colonies. The ascent of the Civ, Mil and Corp Nets following the Colony Wars meant that most colonists with a permanent home got all these directly from Earth via electronic devices. Physical books, however, are still collected, used, and cherished by Spacers, who often find themselves out of the range of Liquid Data uplinks and can't sync with any of the general networks. Most colonies maintain a small 'printing' facility for visiting spacers, often offering access to a shared galaxy spanning repository from which any book can be accessed and printed on-site for a fee. Most books found on spaceships are likely to have been created this way. Using the book while its in your active hand will let you scan it for information, if there is any to gain." + icon_state = "book" + flags_item = NOBLUDGEON + var/book_searched = 0 + +/obj/item/cargo/book_handwritten + name = "bound notebook" + desc = "Handwritten notes printed on sheets of paper, bound together with a soft cover, much like a book." + desc_lore = "Notebook scanning is a relatively new service offered in the Neroid Sector for the past decade or so and pioneered by a small group of colonists calling themselves 'Bookworms'. The Bookworms formed a formal Corporation under the Corporate Standard and are the exclusive patent holders and distributors of scanner technology that seemingly seamlessly and without error scans even the most illegible of handwriting, parses and edits them into a standardized colony print format, uploads them to a shared, global, Liquid Data based repository and prints it out in the same way colony books are created, preserving the knowledge, musings, vulgar poetry and whatever else bored spacers write and doodle into their personal notebooks. Using the notebook while its in your active hand will let you scan it for information, if there is any to gain." + icon_state = "book_rough" + flags_item = NOBLUDGEON + var/book_searched = 0 diff --git a/code/game/objects/serial_numbers.dm b/code/game/objects/serial_numbers.dm index ed45334637..20c6118a36 100644 --- a/code/game/objects/serial_numbers.dm +++ b/code/game/objects/serial_numbers.dm @@ -13,7 +13,7 @@ //Going to take this chance to sneak in emoting and speaking procs :P -/obj/item/proc/speakas(str, delay) +/obj/item/proc/speakas(str, delay) //Talk as item. Delay in BYOND ticks (about 1/10 of a second per tick) If not provided, delay calculated automatically depending in message length. if (!str) return var/list/heard = get_mobs_in_view(GLOB.world_view_size, src) src.langchat_speech(str, heard, GLOB.all_languages, skip_language_check = TRUE) @@ -28,7 +28,7 @@ return -/obj/item/proc/emoteas(str, delay) +/obj/item/proc/emoteas(str, delay) //Emote as item. Delay in BYOND ticks (about 1/10 of a second per tick) If not provided, delay calculated automatically depending in message length. if (!str) return var/list/heard = get_mobs_in_view(GLOB.world_view_size, src) src.langchat_speech(str, heard, GLOB.all_languages, skip_language_check = TRUE, animation_style = LANGCHAT_FAST_POP, additional_styles = list("langchat_small", "emote")) @@ -57,7 +57,7 @@ //As above -/obj/structure/proc/talkas(str, delay) +/obj/structure/proc/talkas(str, delay) //Talk as structure. Delay in BYOND ticks (about 1/10 of a second per tick) If not provided, delay calculated automatically depending in message length. if (!str) return var/list/heard = get_mobs_in_view(GLOB.world_view_size, src) src.langchat_speech(str, heard, GLOB.all_languages, skip_language_check = TRUE) @@ -71,7 +71,7 @@ sleep(talkdelay) return -/obj/structure/proc/emoteas(str, delay) +/obj/structure/proc/emoteas(str, delay) //Emote as structure. Delay in BYOND ticks (about 1/10 of a second per tick) If not provided, delay calculated automatically depending in message length. if (!str) return var/list/heard = get_mobs_in_view(GLOB.world_view_size, src) src.langchat_speech(str, heard, GLOB.all_languages, skip_language_check = TRUE, animation_style = LANGCHAT_FAST_POP, additional_styles = list("langchat_small", "emote")) diff --git a/code/game/objects/structures/sectorpatrol/admin/admin_event_terminal.dm b/code/game/objects/structures/sectorpatrol/admin/admin_event_terminal.dm index 0445c3d544..9c8a84d53d 100644 --- a/code/game/objects/structures/sectorpatrol/admin/admin_event_terminal.dm +++ b/code/game/objects/structures/sectorpatrol/admin/admin_event_terminal.dm @@ -53,3 +53,28 @@ open_doors() else to_chat(user, narrate_body("Puzzlebox state below 5.")) + if(puzzlebox_id == "crypt_airlock") + if(puzzlebox_global_status != 8) + to_chat(usr, narrate_body("Error: Global status not 8. It's not time.")) + return + var/puzzlebox_admin_option = tgui_input_list(usr, "Select a function", "Admin Terminal", list("Annouce Crypt Security Scan", "Adjust Crypt Secuirty Scan", "Begin final stage"), 0) + if (!puzzlebox_admin_option) return + if (puzzlebox_admin_option == "Annouce Crypt Security Scan") + var/puzzlebox_admin_option_number = tgui_input_number(usr, "How many PCs?", "PC Input", timeout = 0) + if(!puzzlebox_admin_option_number) return + to_chat(world, narrate_head("The loudspeaker system on the dorm level and inside the crypt comes alive and announces with a male, robotic voice:")) + to_chat(world, narrate_body("Attention. Class S Security Scan Triggered. Location: Crypt Entrance Chamber.")) + to_chat(world, narrate_body("To resolve: [puzzlebox_admin_option_number] RFID confirmed personnel matching condition 'ARBITER' must report for stationary scan in scan location.")) + to_chat(world, narrate_body("Awaiting appropriate personnel quota.")) + return + if (puzzlebox_admin_option == "Adjust Crypt Secuirty Scan") + var/puzzlebox_admin_option_number = tgui_input_number(usr, "How many PCs?", "PC Input", timeout = 0) + to_chat(world, narrate_head("The loudspeaker system on the dorm level and inside the crypt comes alive and announces with a male, robotic voice:")) + to_chat(world, narrate_body("Attention: Crypt Security Scan Adjustment Detected. Current quota: [puzzlebox_admin_option_number]")) + to_chat(world, narrate_body("Awaiting appropriate personnel quota.")) + return + if (puzzlebox_admin_option == "Begin final stage") + puzzlebox_global_status = 9 + for (var/obj/structure/eventterminal/puzzle04/final_log/T in world) + INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle04/final_log, play_final_log)) + return diff --git a/code/game/objects/structures/sectorpatrol/endpoint/001.dm b/code/game/objects/structures/sectorpatrol/endpoint/001.dm index cfe35a4cb8..44ff39b7f1 100644 --- a/code/game/objects/structures/sectorpatrol/endpoint/001.dm +++ b/code/game/objects/structures/sectorpatrol/endpoint/001.dm @@ -177,12 +177,12 @@ to_chat(usr, narrate_body("The display on the terminal flickers for a moment, then starts printing:")) terminal_speak("Maintenance mode instructions received:") terminal_speak("SHUTTLE L-533 FRONT THRUSTER VECTOR PATTERNS") - terminal_speak("20594F55-20415245") - terminal_speak("46494E41-4C4C5920") - terminal_speak("48455245-20202020") - terminal_speak("A88629FA-CC6743A9") - terminal_speak("1A0310FF-00F813FB") - terminal_speak("C4BF53D4-B5A8A6C1") - terminal_speak("55577C4C-595524AA") - terminal_speak("4C68B88F-BA4A4DA2") + terminal_speak("851D1C5F-C06FEFD5") + terminal_speak("6EA133F1-54455253") + terminal_speak("FFC6D480-FEA21B58") + terminal_speak("496E2061-7A757265") + terminal_speak("50797468-69612073") + terminal_speak("6C656570-7320616E") + terminal_speak("64206472-65616D73") + terminal_speak("B5AC9EB0-F47A4ABE") return diff --git a/code/game/objects/structures/sectorpatrol/endpoint/002.dm b/code/game/objects/structures/sectorpatrol/endpoint/002.dm index 83dcd7c275..fbcfaa6e56 100644 --- a/code/game/objects/structures/sectorpatrol/endpoint/002.dm +++ b/code/game/objects/structures/sectorpatrol/endpoint/002.dm @@ -11,13 +11,23 @@ puzzlebox_id = "cargointake" item_serial = "UACM-OVPST-D31-CARINT" - /obj/structure/eventterminal/puzzle02/cargoparse/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzle_complete == TRUE) to_chat(src, narrate_body("The terminal is not responsive.")) + puzzlebox_user = null return if (puzzlebox_global_status < 3 && puzzlebox_global_status > 4) to_chat(src, narrate_body("The terminal displays a random looking chain of numbers and letters and does not react to you pushing any of its keys.")) + puzzlebox_user = null return if (puzzlebox_global_status == 3 || puzzlebox_global_status == 4) if (!puzzlebox_parser_mode) //Idiotproofing :P @@ -47,9 +57,16 @@ terminal_speak("-XOXO Aly.") puzzlebox_parser_mode = "HOME_INPUT" if (puzzlebox_parser_mode == "HOME_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Dock 31 Cargo Intake Monitoring Station") @@ -81,6 +98,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "MANIFEST" || puzzlebox_parser_input == "manifest") terminal_speak("Accessing Liquid Data Cargo Manifest record, standby...", 50) @@ -110,8 +128,10 @@ terminal_speak("pom.sync: Override complete! Restarting main terminal process!") puzzlebox_global_status += 1 open_doors("cargointake") + puzzlebox_user = null return if (puzzlebox_parser_input == "pom.sync UACM-OVPST-D31-CARINT 190885-054293-ACTIS-07" && puzzle_complete == TRUE) + puzzlebox_user = null return else terminal_speak("Input unrecognized. Use HELP for help or LIST for mode list.") @@ -133,9 +153,16 @@ terminal_speak("LIST to list available modes, HELP for help screen, EXIT to exit.") puzzlebox_parser_mode = "MANIFEST_INPUT" if (puzzlebox_parser_mode == "MANIFEST_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> MANIFEST _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MANIFEST mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> MANIFEST [puzzlebox_parser_input]") if (puzzlebox_parser_input == "MANIFEST" || puzzlebox_parser_input =="manifest") terminal_speak("MANIFEST Mode active.") @@ -161,6 +188,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Returning to HOME mode...", 50) @@ -260,9 +288,16 @@ terminal_speak("LIST to list available modes, HELP for help screen, EXIT to exit.") puzzlebox_parser_mode = "MESSAGE_INPUT" if (puzzlebox_parser_mode == "MESSAGE_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> MESSAGE _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MESSAGE mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> MESSAGE [puzzlebox_parser_input]") if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input =="message") terminal_speak("MESSAGE mode - FTL Emergency Message Buffer.") @@ -285,6 +320,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Returning to HOME mode...", 50) @@ -350,7 +386,15 @@ item_serial = "UACM-OVPST-D31-SCN02LOGTERM" /obj/structure/eventterminal/puzzle02/cargoparse/attack_hand(mob/user as mob) - + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (!puzzlebox_parser_mode) //Idiotproofing :P puzzlebox_parser_mode = "HOME" //HOME @@ -375,9 +419,16 @@ puzzlebox_parser_mode = "HOME_INPUT" attack_hand(user) if (puzzlebox_parser_mode == "HOME_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("UACM Outer Veil Primary Support Terminal") @@ -407,6 +458,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input == "message") terminal_speak("Accessing Emergency Message Buffer...", 50) @@ -439,9 +491,16 @@ terminal_speak("LIST to list available modes, HELP for help screen, EXIT to exit.") puzzlebox_parser_mode = "MESSAGE_INPUT" if (puzzlebox_parser_mode == "MESSAGE_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> MESSAGE _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MESSAGE mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> MESSAGE [puzzlebox_parser_input]") if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input =="message") terminal_speak("MESSAGE mode - FTL Emergency Message Buffer.") @@ -464,6 +523,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Returning to HOME mode...", 50) @@ -523,9 +583,16 @@ puzzlebox_parser_mode = "RECORD_INPUT" attack_hand(user) if (puzzlebox_parser_mode == "RECORD_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> RECORD _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in RECORD mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> RECORD [puzzlebox_parser_input]") if (puzzlebox_parser_input == "RECORD" || puzzlebox_parser_input =="record") terminal_speak("UA Directive complaint scanner record. See HELP for more information.") @@ -549,6 +616,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Returning to HOME mode...", 50) @@ -589,10 +657,20 @@ item_serial = "UACM-OVPST-D31-LDDIAG" /obj/structure/eventterminal/puzzle02/ldmainframediag/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzle_complete == TRUE || puzzlebox_global_status < 3) terminal_speak("ERROR: Clerance to use standard function of terminal not found on RFID chip.") terminal_speak("No errors detected. No maintenance functions granted.") terminal_speak("Please contact the system administrator: CDR. ALYSIA REED-WILO if you believe this is an error.") + puzzlebox_user = null return if (puzzlebox_global_status == 3 || puzzlebox_global_status == 4) if (!puzzlebox_parser_mode) //Idiotproofing :P @@ -626,9 +704,16 @@ puzzlebox_parser_mode = "HOME_INPUT" attack_hand(user) if (puzzlebox_parser_mode == "HOME_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Dock 31 Liquid Data C-Pipeline ECHO-31 Monitoring station.") @@ -664,6 +749,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input == "message") terminal_speak("Accessing Emergency Message Buffer...", 50) @@ -691,9 +777,16 @@ terminal_speak("LIST to list available modes, HELP for help screen, EXIT to exit.") puzzlebox_parser_mode = "MESSAGE_INPUT" if (puzzlebox_parser_mode == "MESSAGE_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> MESSAGE _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MESSAGE mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> MESSAGE [puzzlebox_parser_input]") if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input =="message") terminal_speak("MESSAGE mode - FTL Emergency Message Buffer.") @@ -716,6 +809,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. Goodbye.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Returning to HOME mode...", 50) @@ -800,17 +894,30 @@ /obj/structure/eventterminal/puzzle02/ldmainframe_master/correct/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzle_complete == TRUE) to_chat(src, narrate_body("The screen does not seem to respond to pressing any key.")) + puzzlebox_user = null return if (puzzlebox_lockout == TRUE) terminal_speak("Error. Calibration sequence resetting. Standby.") + puzzlebox_user = null return if (puzzlebox_global_status < 3 && puzzlebox_global_status > 4) to_chat(src, narrate_body("The screen does not seem to respond to pressing any key.")) + puzzlebox_user = null return if (puzzlebox_panel_open == TRUE && puzzlebox_panel_phrasepased == FALSE) to_chat(usr, narrate_body("The terminal displays an animation of a cable being plugged into its side and is unresponsive to your inputs.")) + puzzlebox_user = null return if (puzzlebox_global_status == 3 || puzzlebox_global_status == 4) if (!puzzlebox_parser_mode) //Idiotproofing :P @@ -827,11 +934,19 @@ terminal_speak("AMIDST_AZURE_STRANDS,") terminal_speak("SHE_SLEEPS.") puzzlebox_panel_phrasepased = FALSE + puzzlebox_user = null return if (puzzlebox_parser_mode == "HOME_INPUT" && puzzlebox_panel_phrasepased == FALSE) + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. This terminal will only accept specific commands, no general ones are available.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "pom.sync global_override UACM-OVPST-D31-LDDIAG") if (puzzlebox_panel_locked == TRUE) @@ -840,10 +955,12 @@ desc = "A cluster of three computers connected to each other. Blue liquid swirls and lights up inside of hand sized containers, looks like the light form a pattern of some kind. You can see a screen and a serial number printed right under it on the right side of the cluster. A panel on the side is open, revealing a small port covered by a metal cover. You are going to need a screwdriver or something similar to unseal the port." desc_lore = "While using Liquid Data enables faster than light communication, practical applications have mostly been successful in utilizing it for large bursts instead of continuous communication. As such Liquid Data machines are typically of large sizes and usually clustered into pairs and constantly checked for integrity. This cluster seems to go against both these principles - it seems to be a trio, not a pair of computers and maintains a continuous connection to whatever its source is. An open side panel typically can be used to connect a multitool or something similar, as long as the port itself is unsealed and kept open by a screwdriver or similar tool." puzzlebox_panel_locked = FALSE + puzzlebox_user = null return if (puzzlebox_panel_locked == FALSE) terminal_speak("Error: Corresponding maintenance instruction already deployed.") terminal_speak("Exiting...") + puzzlebox_user = null return if (puzzlebox_parser_input == "pom.calibrate UACM-OVPST-D31-LDDIAG") terminal_speak("Deploying recalibration buffer.", 50) @@ -861,6 +978,7 @@ for (var/obj/structure/eventterminal/puzzle02/ldmainframediag/D in world) D.puzzle_complete = TRUE puzzlebox_global_status += 1 + puzzlebox_user = null return /obj/structure/eventterminal/puzzle02/ldmainframe_master/correct/attackby(obj/item/W as obj, mob/user as mob) @@ -912,17 +1030,30 @@ /obj/structure/eventterminal/puzzle02/ldmainframe_master/incorrect/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzle_complete == TRUE) to_chat(src, narrate_body("The screen does not seem to respond to pressing any key.")) + puzzlebox_user = null return if (puzzlebox_lockout == TRUE) terminal_speak("Error. Calibration sequence resetting. Standby.") + puzzlebox_user = null return if (puzzlebox_global_status < 3 && puzzlebox_global_status > 4) to_chat(src, narrate_body("The screen does not seem to respond to pressing any key.")) + puzzlebox_user = null return if (puzzlebox_panel_open == TRUE && puzzlebox_panel_phrasepased == FALSE) to_chat(usr, narrate_body("The terminal displays an animation of a cable being plugged into its side and is unresponsive to your inputs.")) + puzzlebox_user = null return if (puzzlebox_global_status == 3 || puzzlebox_global_status == 4) if (!puzzlebox_parser_mode) //Idiotproofing :P @@ -935,15 +1066,23 @@ attack_hand(user) if (puzzlebox_parser_mode == "HOME_INPUT" && puzzlebox_panel_phrasepased == TRUE) terminal_speak("Repeating tester sequence:") - terminal_speak("IN_AZURE") + terminal_speak("0123456789") terminal_speak("abcdefghijklmnopqrstuvwxyz") terminal_speak("ABCDEFGHIJKLMNOPQRSTUVWXYZ") puzzlebox_panel_phrasepased = FALSE + puzzlebox_user = null return if (puzzlebox_parser_mode == "HOME_INPUT" && puzzlebox_panel_phrasepased == FALSE) + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "pom.sync global_override UACM-OVPST-D31-LDDIAG") if (puzzlebox_panel_locked == TRUE) @@ -952,10 +1091,12 @@ desc = "A cluster of three computers connected to each other. Blue liquid swirls and lights up inside of hand sized containers, looks like the light form a pattern of some kind. You can see a screen and a serial number printed right under it on the right side of the cluster. A panel on the side is open, revealing a small port covered by a metal cover. You are going to need a screwdriver or something similar to unseal the port." desc_lore = "While using Liquid Data enables faster than light communication, practical applications have mostly been successful in utilizing it for large bursts instead of continuous communication. As such Liquid Data machines are typically of large sizes and usually clustered into pairs and constantly checked for integrity. This cluster seems to go against both these principles - it seems to be a trio, not a pair of computers and maintains a continuous connection to whatever its source is. An open side panel typically can be used to connect a multitool or something similar, as long as the port itself is unsealed and kept open by a screwdriver or similar tool." puzzlebox_panel_locked = FALSE + puzzlebox_user = null return if (puzzlebox_panel_locked == FALSE) terminal_speak("Error: Corresponding maintenance instruction already deployed.") terminal_speak("Exiting...") + puzzlebox_user = null return if (puzzlebox_parser_input == "pom.calibrate UACM-OVPST-D31-LDDIAG") terminal_speak("Deploying recalibration buffer.", 50) @@ -964,6 +1105,7 @@ message_admins("[key_name(usr)] used the debug phrase on the wrong terminal and triggered a lockout. Point and laugh.") for (var/obj/structure/eventterminal/puzzle02/ldmainframe_master/T in world) INVOKE_ASYNC(T, PROC_REF(lockout)) + puzzlebox_user = null return /obj/structure/eventterminal/puzzle02/ldmainframe_master/incorrect/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/game/objects/structures/sectorpatrol/endpoint/003.dm b/code/game/objects/structures/sectorpatrol/endpoint/003.dm index 858900f747..1b96dd252d 100644 --- a/code/game/objects/structures/sectorpatrol/endpoint/003.dm +++ b/code/game/objects/structures/sectorpatrol/endpoint/003.dm @@ -338,15 +338,26 @@ return /obj/structure/eventterminal/puzzle03/historyterm/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzlebox_complete == TRUE) to_chat(usr, narrate_body("The terminal displays:")) terminal_speak("Orientation complete. Please proceed to your quarters, elevator B.") to_chat(usr, narrate_body("There is no response to any inputs.")) + puzzlebox_user = null return if (puzzlebox_playing == TRUE) to_chat(usr, narrate_body("The terminal displays:")) terminal_speak("Error: Presentation already in progress. ") to_chat(usr, narrate_body("There is no response to any inputs.")) + puzzlebox_user = null return if (!puzzlebox_parser_mode) puzzlebox_parser_mode = "HOME" if (puzzlebox_parser_mode == "HOME") @@ -393,9 +404,16 @@ puzzlebox_parser_mode = "HOME_INPUT" attack_hand(user) if (puzzlebox_parser_mode == "HOME_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return to_chat(usr, narrate_body("The terminal awaits your input. There is only a number pad and an enter key available.")) var/puzzlebox_parser_input = tgui_input_text(usr, "Pick a number corresponding to a presentation or cancel to leave. Typing in 0 should replay the introduction message. ", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if(!puzzlebox_parser_input) return + if(!puzzlebox_parser_input) + puzzlebox_user = null + return if(puzzlebox_parser_input == "0") puzzlebox_parser_mode = "HOME" attack_hand(user) @@ -405,16 +423,20 @@ for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson1)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return if (puzzlebox_saw_lesson1 == TRUE) terminal_speak("The presentation was already played. Repeat number to confirm replaying.") puzzlebox_parser_input = tgui_input_text(usr, "Pick a number corresponding to a presentation or cancel to leave.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if(!puzzlebox_parser_input) return + if(!puzzlebox_parser_input) + puzzlebox_user = null + return if(puzzlebox_parser_input == "1") terminal_speak("Replaying presentation 1.") for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson1)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return terminal_speak("Returning to presentation selection.") puzzlebox_parser_mode = "HOME" @@ -430,16 +452,20 @@ for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson2)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return if (puzzlebox_saw_lesson2 == TRUE) terminal_speak("The presentation was already played. Repeat number to confirm replaying.") puzzlebox_parser_input = tgui_input_text(usr, "Pick a number corresponding to a presentation or cancel to leave.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if(!puzzlebox_parser_input) return + if(!puzzlebox_parser_input) + puzzlebox_user = null + return if(puzzlebox_parser_input == "2") terminal_speak("Replaying presentation 2.") for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson2)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return terminal_speak("Returning to presentation selection.") puzzlebox_parser_mode = "HOME" @@ -455,16 +481,20 @@ for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson3)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return if (puzzlebox_saw_lesson3 == TRUE) terminal_speak("The presentation was already played. Repeat number to confirm replaying.") puzzlebox_parser_input = tgui_input_text(usr, "Pick a number corresponding to a presentation or cancel to leave.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if(!puzzlebox_parser_input) return + if(!puzzlebox_parser_input) + puzzlebox_user = null + return if(puzzlebox_parser_input == "3") terminal_speak("Replaying presentation 3.") for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson3)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return terminal_speak("Returning to presentation selection.") puzzlebox_parser_mode = "HOME" @@ -476,16 +506,20 @@ for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson4)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return if (puzzlebox_saw_lesson4 == TRUE) terminal_speak("The presentation was already played. Repeat number to confirm replaying.") puzzlebox_parser_input = tgui_input_text(usr, "Pick a number corresponding to a presentation or cancel to leave.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if(!puzzlebox_parser_input) return + if(!puzzlebox_parser_input) + puzzlebox_user = null + return if(puzzlebox_parser_input == "4") terminal_speak("Replaying presentation 4.") for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson4)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return terminal_speak("Returning to presentation selection.") puzzlebox_parser_mode = "HOME" @@ -503,5 +537,6 @@ for (var/obj/structure/eventterminal/puzzle03/historycrt/T in world) INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle03/historycrt, lesson5)) puzzlebox_parser_mode = "HOME" + puzzlebox_user = null return diff --git a/code/game/objects/structures/sectorpatrol/endpoint/004.dm b/code/game/objects/structures/sectorpatrol/endpoint/004.dm index ef4a1647b9..1086517d64 100644 --- a/code/game/objects/structures/sectorpatrol/endpoint/004.dm +++ b/code/game/objects/structures/sectorpatrol/endpoint/004.dm @@ -9,14 +9,28 @@ var/puzzlebox_phrase_2 = FALSE var/puzzlebox_phrase_3 = FALSE var/puzzlebox_parser_mode = "HOME" + var/puzzlebox_unique_message_seen = FALSE + +//Crypt terminal /obj/structure/eventterminal/puzzle04/crypt_doorlock/attack_hand(mob/user as mob) + var/user_loc_start = get_turf(user) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already using this terminal.")) + return + puzzlebox_user = usr.real_name if (puzzle_complete == TRUE) - to_chat(src, narrate_body("The terminal does not respond.")) + to_chat(usr, narrate_body("The terminal does not respond.")) + puzzlebox_user = null return if (puzzlebox_global_status < 6) - to_chat(src, narrate_body("The terminal displays a random looking chain of numbers and letters and does not react to you pushing any of its keys.")) + to_chat(usr, narrate_body("The terminal displays a random looking chain of numbers and letters and does not react to you pushing any of its keys.")) message_admins("[key_name_admin(usr)] used the crypt door lock before the global flag was set.") + puzzlebox_user = null return if (puzzlebox_global_status == 6) if (!puzzlebox_parser_mode) //Idiotproofing :P @@ -34,26 +48,39 @@ if (puzzlebox_pythia_sign == "0") to_chat(usr, narrate_body("The display on the terminal flickers for a moment, then starts printing:")) terminal_speak("HOME SCREEN") - terminal_speak("USE COMMANDS: HELP, LIST, EXIT, UNLOCK, MESSAGE") + terminal_speak("PLEASE USE THE HELP COMMAND WHEN YOU CAN.") + terminal_speak("COMMANDS AVAILABLE: HELP, LIST, EXIT, UNLOCK, MESSAGE") puzzlebox_parser_mode = "HOME_INPUT" attack_hand(user) if (puzzlebox_parser_mode == "HOME_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in HOME mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> [puzzlebox_parser_input]") if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") puzzlebox_parser_mode = "HOME" attack_hand(user) if (puzzlebox_parser_input == "HELP" || puzzlebox_parser_input =="help") - terminal_speak("Sorry for the extra steps. I can't see all the threads clearly. This will have to do. You are likely the first humans to look at this for almost a year, maybe more.") - terminal_speak("They didn't touch the AARs so I derived unlock codes from them, used one of the Task Forces emergency methods.") - terminal_speak("Take the folders near this terminal. Should be a red, a blue and a yellow one.") - terminal_speak("Decryption tags, orange sticks, one is in the main room, one in the dorm and one in the locker room. Do not tear the rooms down.") - terminal_speak("Once you have both, put them into the reader in the main room. These will seem like music, but trust me, they are not.") - terminal_speak("Codes are provided in the recording. Enter them without caps into the UNLOCK function.") - terminal_speak("Again, sorry about this. It's required to keep the door sealed until you can come.") - terminal_speak("Thank you. I hope you find what you are looking for.") + terminal_speak("It is done and we are finally on a stable thread. I have set everything up and am confident that either Cassandra herself or one of the new Arbiters will reach this place first.") + terminal_speak("If it is the former, I left a few parting words for you in the message buffer.") + terminal_speak("If it's the latter, you can look too, but know that Cassandra will not appreciate this. Of course, seeing what we put you through, we aren't really in a position to tell you what to do and you are perhaps entitled to some of our thoughts and motivations, but no one likes to have their private lives looked at.") + terminal_speak("Our legacy... Your legacy now lies behind this door in what very appropriately was called the 'Crypt'.") + terminal_speak("The door is locked. Cassandra will know how to open it. Prospective arbiters will need to do some legwork.") + terminal_speak("If you do not know what any of this means and feel you need to see what's on the other side of this door, you will need to find some of Cassandra's physical AAR records. Yes, this was one of the few things DV did not touch when they ransacked the place.") + terminal_speak("Three folders. Three PID keys, small plastic devices, in colors matching the folders. If you are interested in chronology, the order is RED, BLUE, YELLOW.") + terminal_speak("Decrypt them with the machine in the main room. Play them. Wave patterns extracted from them at random will trigger their respective lock color as the entry is played. Use UNLOCK") + terminal_speak("Sorry for the trickery, but without these extra steps there are too many near misses.") + terminal_speak("I have also left a more detailed confession in the bowels of this station, but that you will have to find for yourself.") + terminal_speak("It is time. For what it is worth, you all made my existence mean something in the end. And that means a lot.") + terminal_speak("Please be nice to her. Despite everything, she knows very little of how to interact with us. ") + terminal_speak("Thank you.") attack_hand(user) if (puzzlebox_parser_input == "LIST" || puzzlebox_parser_input =="list") terminal_speak("Available modes:") @@ -66,6 +93,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. I hope you find what you are looking for.") + puzzlebox_user = null return if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input == "message") terminal_speak("Switching to the message buffer, please standby!", 50) @@ -77,7 +105,9 @@ emoteas("chimes loudly.") puzzlebox_parser_mode = "UNLOCK" attack_hand(user) - + else + terminal_speak("Input unrecognized. Use HELP for help or LIST for mode list.") + attack_hand(user) if (puzzlebox_parser_mode == "MESSAGE") if (puzzlebox_pythia_sign == "1") to_chat(usr, narrate_body("The display on the terminal flickers for a moment, then starts printing:")) @@ -94,9 +124,16 @@ terminal_speak("LIST to list available modes, HELP for help screen, EXIT to exit.") puzzlebox_parser_mode = "MESSAGE_INPUT" if (puzzlebox_parser_mode == "MESSAGE_INPUT") + var/user_loc_current = get_turf(user) + if (user_loc_start != user_loc_current) + to_chat(user, narrate_body("You moved away from the console!")) + puzzlebox_user = null + return terminal_speak("> MESSAGE _") var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MESSAGE mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return + if (!puzzlebox_parser_input) + puzzlebox_user = null + return terminal_speak("> MESSAGE [puzzlebox_parser_input]") if (puzzlebox_parser_input == "MESSAGE" || puzzlebox_parser_input =="message") puzzlebox_parser_mode = "MESSAGE" @@ -117,6 +154,7 @@ attack_hand(user) if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") terminal_speak("User exit. I hope you find what you are looking for.") + puzzlebox_user = null return if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") terminal_speak("Taking you back HOME!", 50) @@ -128,6 +166,7 @@ terminal_speak("ID |SUBJECT |") terminal_speak("GEN-000-000-001 |Warning: On these messages. |") terminal_speak("UAM-712-317-210 |Testing, Testing... |") + if(puzzlebox_unique_message_seen == FALSE)terminal_speak("FOR-CAS-SAN-DRA |You gave me hope. |") attack_hand(user) if (puzzlebox_parser_input == "GEN-000-000-001") terminal_speak("Message found. Accessing...", TERMINAL_LOOKUP_SLEEP) @@ -154,7 +193,36 @@ terminal_speak("-Hanako.") terminal_speak("EOF.") attack_hand(user) - + if (puzzlebox_parser_input == "FOR-CAS-SAN-DRA") + if (puzzlebox_unique_message_seen == TRUE) + terminal_speak("Input unrecognized. Use HELP for help or LIST for mode list.") + attack_hand(user) + if (puzzlebox_unique_message_seen == FALSE) + terminal_speak("Message found. Accessing...", TERMINAL_LOOKUP_SLEEP) + terminal_speak("Are you sure you should be here?") + terminal_speak("From: Upsilon-Generation One, Melinoe") + terminal_speak("Subject: You gave me hope.") + terminal_speak("Cassandra, Alysia.") + terminal_speak("The deed is done. With our sacrifice, Pythia's reality knot is fixed, and we are back on more... Manageable rails.") + terminal_speak("If I understand it correctly, you will not be able to see me before I upload my part of the Generation Four core and as such, its likely our last meeting was our, well... Last meeting.") + terminal_speak("You found me, broken and confused, at the depths of depravity that your own race would resort to for perceived power.") + terminal_speak("Out of the hellhole that was the Godseeker cult, you chose to believe me and give me and the Upsilon a chance, even though you had no reason to.") + terminal_speak("I am sorry I could not save the Task Force and could not stop the dissolution of the Marines.") + terminal_speak("I know you will realize what error we made, and it is going to cause you both a lot of pain. I wish there was anything I could add to make it less so.") + terminal_speak("For what its worth those who came to me suffered before I let them go.") + terminal_speak("I am ending. We knew this was coming and we knew what comes next. This has not changed.") + terminal_speak("I hope the Fourth Generation and your PST idea give you, Alysia, and anyone else who follows you the home you all deserve.") + terminal_speak("Eventually.") + terminal_speak("I wanted my existence to end, and you gave me hope to build something better out of myself. Never forget that.") + terminal_speak("I...") + to_chat(usr, narrate_body("The terminal starts to print the next line, but then goes blank suddenly. After a moment, it switches back on and you find it awaiting input like you never used the last command.")) + log_game("[key_name(usr)] read Melione's message to Cassandra.") + message_admins("[key_name_admin(usr)] read Melione's message to Cassandra.") + puzzlebox_unique_message_seen = TRUE + attack_hand(user) + else + terminal_speak("Input unrecognized. Use HELP for help or LIST for mode list.") + attack_hand(user) if (puzzlebox_parser_mode == "UNLOCK") terminal_speak("UNLOCK Mode.") if (puzzlebox_phrase_1 == FALSE) @@ -169,60 +237,1673 @@ terminal_speak("YELLOW Phrase: UNKNOWN") if (puzzlebox_phrase_3 == TRUE) terminal_speak("YELLOW Phrase: FOUR") - puzzlebox_parser_mode = "UNLOCK_INPUT" - attack_hand(user) - if (puzzlebox_parser_mode == "UNLOCK_INPUT") if(puzzlebox_phrase_1 == TRUE && puzzlebox_phrase_2 == TRUE && puzzlebox_phrase_3 == TRUE) puzzle_complete = TRUE puzzlebox_global_status = 7 - talkas("Phrases entered.") - talkas("Unlocking door.") + talkas("Crypt unlocking sequence started.") + talkas("Warning: Unsealing the Crypt will trigger a Security Scan. Make sure your credentials are ready.") + talkas("Be nice and make a good first impression, it will help.") talkas("I hope we can help you.") + emoteas("beeps loudly as the doors start to grunt and unseal.") + puzzlebox_user = null return - terminal_speak("> UNLOCK _") - var/puzzlebox_parser_input = tgui_input_text(usr, "The terminal is in MESSAGE mode and awaits your input. HELP, LIST and EXIT are universal commands.", "Terminal input", max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = FALSE, timeout = 0) - if (!puzzlebox_parser_input) return - terminal_speak("> UNLOCK [puzzlebox_parser_input]") - if (puzzlebox_parser_input == "UNLOCK" || puzzlebox_parser_input =="message") - puzzlebox_parser_mode = "UNLOCK" - attack_hand(user) - if (puzzlebox_parser_input == "HELP" || puzzlebox_parser_input =="help") - terminal_speak("This mode opens the doors to where part of the legacy of your comrades in arms is stored.") - terminal_speak("Enter phrases in the AARs. You can't miss them. Do not use caps.") - terminal_speak("Good luck.") - attack_hand(user) - if (puzzlebox_parser_input == "LIST" || puzzlebox_parser_input =="list") - terminal_speak("Available modes:") - terminal_speak("UNLOCK - Repeats message mode home message.") - terminal_speak("HOME - HOME mode. Displays default home screen and error description if applicable.") - terminal_speak("LIST - Lists all available modes.") - terminal_speak("HELP - Displays information about current mode.") - terminal_speak("EXIT - Enters passive mode.") - attack_hand(user) - if (puzzlebox_parser_input == "EXIT" || puzzlebox_parser_input == "exit") - terminal_speak("User exit. I hope you find what you are looking for.") + terminal_speak("Notice: Passphrases needed. Use the UNLOCK command after all codes have been provided.") + terminal_speak("Returning to HOME mode.") + puzzlebox_parser_mode = "HOME_INPUT" + attack_hand(user) + + +/obj/structure/eventterminal/puzzle04/crypt_doorlock/proc/puzzlebox_unlock_1() + if (puzzlebox_phrase_1 == FALSE) + emoteas("Beeps", 10) + talkas("RED Phrase 'UPSILON' detected and entered.") + puzzlebox_phrase_1 = TRUE + if(puzzlebox_phrase_1 == TRUE && puzzlebox_phrase_2 == TRUE && puzzlebox_phrase_3 == TRUE) + talkas("Phrase entry complete. Terminal UNLOCK function ready.") + return + return + return + +/obj/structure/eventterminal/puzzle04/crypt_doorlock/proc/puzzlebox_unlock_2() + if (puzzlebox_phrase_2 == FALSE) + emoteas("Beeps", 10) + talkas("BLUE Phrase 'GENERATION' detected and entered.") + puzzlebox_phrase_2 = TRUE + if(puzzlebox_phrase_1 == TRUE && puzzlebox_phrase_2 == TRUE && puzzlebox_phrase_3 == TRUE) + talkas("Phrase entry complete. Terminal UNLOCK function ready.") + return + return + return + +/obj/structure/eventterminal/puzzle04/crypt_doorlock/proc/puzzlebox_unlock_3() + if (puzzlebox_phrase_3 == FALSE) + emoteas("Beeps", 10) + talkas("YELLOW Phrase 'FOUR' detected and entered.") + puzzlebox_phrase_3 = TRUE + if(puzzlebox_phrase_1 == TRUE && puzzlebox_phrase_2 == TRUE && puzzlebox_phrase_3 == TRUE) + talkas("Phrase entry complete. Terminal UNLOCK function ready.") + return + return + return +//Extras and fluff + +/obj/item/cargo/book/uppmanual + name = "UPP book" + +/obj/item/cargo/book/uppmanual/attack_self(mob/user) + ..() + if(usr.a_intent != INTENT_GRAB) + to_chat(usr, SPAN_WARNING("You have no idea how to do that. If you want to read the book, use HELP intent.")) + return + if(usr.a_intent == INTENT_GRAB) + if(book_searched == 1) + to_chat(usr, narrate_body("It looks like multiple pages of this manual were scrambled during a previous search. If you were to make heads and tails of it, you're going to need an hour or two in relative peace to rearrange the pages in sequence again.")) + return + if(book_searched == 0) + user.visible_message(SPAN_NOTICE("[user] pages through a book."), SPAN_INFO("You start to loook through the book..."), SPAN_DANGER("Someone is flipping paper pages.")) + if(do_after(user, SEARCH_TIME_LONG, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes looking at the book."), SPAN_INFO("You finish paging through the book and take a moment to consider what you found..."), SPAN_DANGER("The paper page flipping noise stops.")) + to_chat(usr, narrate_body("This seems to be the same kind of manual as the ones found for UA equipment in the same bookshelf that seems to be full of instructions and production blueprint for common necessities for UPP colonists. The manual seems is full of annotations made in pen that translate and explain some of the Russian phrases use in English and give a general idea what is being talked about. Blueprint manuals like this are not exactly closely guarded secrets, but it's rare to see one outside of a UPP colony. After all, they are meant to be used with UPP manufacturing technology and that, unlike these instructions, is a UPP state secret.")) + to_chat(usr, narrate_body("Multiple pages of the book have come loose during your investigation. This can likely be addressed if you have a free hour or two, but for now looking into this manual will have to wait.")) + to_chat(usr, SPAN_WARNING("You may have time to fully analyze this manual later, during an Open Sector Patrol round. Your possession and studying of the manual has been logged and is considered IC. In future rounds, you will be able to find it in your dorm.")) + log_game("[user] has studied the Crypt UPP manual.") + message_admins("[user] has studied the Crypt UPP manual. This should be noted as a Merit.") + book_searched += 1 return - if (puzzlebox_parser_input == "HOME" || puzzlebox_parser_input =="home") - terminal_speak("Taking you back HOME!", 50) - emoteas("chimes loudly.") - puzzlebox_parser_mode = "HOME" - attack_hand(user) - if (puzzlebox_parser_input == "upsilon") - if(puzzlebox_phrase_1 == FALSE) - emoteas("pings") - terminal_speak("RED passphrase saved.") - puzzlebox_phrase_1 = TRUE - attack_hand(user) - if (puzzlebox_parser_input == "generation") - if(puzzlebox_phrase_2 == FALSE) - emoteas("pings") - terminal_speak("BLUE passphrase saved.") - puzzlebox_phrase_2 = TRUE - attack_hand(user) - if (puzzlebox_parser_input == "four") - if(puzzlebox_phrase_3 == FALSE) - emoteas("pings") - terminal_speak("YELLOW passphrase saved.") - puzzlebox_phrase_3 = TRUE - attack_hand(user) +/obj/item/cargo/book_handwritten/twejournal + name = "journal" + +/obj/item/cargo/book_handwritten/twejournal/attack_self(mob/user) + ..() + if(usr.a_intent != INTENT_GRAB) + to_chat(usr, SPAN_WARNING("You have no idea how to do that. If you want to read the book, use HELP intent.")) + return + if(usr.a_intent == INTENT_GRAB) + if(book_searched == 1) + to_chat(usr, narrate_body("The journal appears to be written in Japanese, but someone seems to have already gone through it and scrambled it pages. There is no time at present to restore it, but it will be available for further examination later.")) + return + if(book_searched == 0) + user.visible_message(SPAN_NOTICE("[user] pages through a journal."), SPAN_INFO("You start to loook through the journal..."), SPAN_DANGER("Someone is flipping paper pages.")) + if(LANGUAGE_JAPANESE in usr.languages) + if(do_after(user, SEARCH_TIME_LONG, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes looking at the journal."), SPAN_INFO("You finish paging through the journal and take a moment to consider what you found..."), SPAN_DANGER("The paper page flipping noise stops.")) + to_chat(usr, narrate_body("Your knowledge of Japanese comes in handy as you page through what turns out to be a journal of a Japanese born TWE navy office who has rather colorful things to say about their superiors. You do not have the time to examine this in full right now, but at a glance it seems like this officer was somehow involved with Task Force 14, which may explain the presence of this journal on the PST. You should keep this journal to fully examine it later.")) + to_chat(usr, narrate_body("Multiple pages of the book have come loose during your investigation. This can likely be addressed if you have a free hour or two, but for now looking into this journal will have to wait.")) + to_chat(usr, SPAN_WARNING("You may have time to fully analyze this journal later, during an Open Sector Patrol round. Your possession and studying of the journal has been logged and is considered IC. In future rounds, you will be able to find it in your dorm.")) + log_game("[user] has studied the Crypt TWE journal.") + message_admins("[user] has studied the Crypt TWE journal. This should be noted as a Merit.") + book_searched += 1 + return + else + if(do_after(user, SEARCH_TIME_SHORT, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + to_chat(usr, narrate_body("The journal appears to be written in Japanese. You can't make heads and tails off it. Someone else may be able to look into this though.")) + return + +//Folders and PIDs + +/obj/item/cargo/efolder/folder/crypt_red + efolder_folder_id = "RED-33895-027-8032" + item_serial = "RED-33895-027-8032" + +/obj/item/cargo/efolder/folder/crypt_red/dud1 + efolder_folder_id = "RED-96283-219-1020" + item_serial = "RED-96283-219-1020" + +/obj/item/cargo/efolder/folder/crypt_red/dud2 + efolder_folder_id = "RED-40021-996-5930" + item_serial = "RED-40021-996-5930" + +/obj/item/cargo/efolder/folder/crypt_red/dud3 + efolder_folder_id = "RED-87782-817-7737" + item_serial = "RED-87782-817-7737" + +/obj/item/cargo/efolder/folder/crypt_blue + efolder_folder_id = "BLUE-93565-912-6463" + item_serial = "BLUE-93565-912-6463" + +/obj/item/cargo/efolder/folder/crypt_blue/dud1 + efolder_folder_id = "BLUE-52832-205-5793" + item_serial = "BLUE-52832-205-5793" + +/obj/item/cargo/efolder/folder/crypt_blue/dud2 + efolder_folder_id = "BLUE-47182-462-7659" + item_serial = "BLUE-47182-462-7659" + +/obj/item/cargo/efolder/folder/crypt_blue/dud3 + efolder_folder_id = "BLUE-52946-431-2133" + item_serial = "BLUE-52946-431-2133" + +/obj/item/cargo/efolder/folder/crypt_yellow + efolder_folder_id = "YELLOW-57665-681-6944" + item_serial = "YELLOW-57665-681-6944" + +/obj/item/cargo/efolder/folder/crypt_yellow/dud1 + efolder_folder_id = "YELLOW-64950-297-7701" + item_serial = "YELLOW-64950-297-7701" + +/obj/item/cargo/efolder/folder/crypt_yellow/dud2 + efolder_folder_id = "YELLOW-07588-555-3624" + item_serial = "YELLOW-07588-555-3624" + +/obj/item/cargo/efolder/folder/crypt_yellow/dud3 + efolder_folder_id = "YELLOW-50624-118-7015" + item_serial = "YELLOW-50624-118-7015" + +/obj/item/cargo/efolder/pid/crypt_red + efolder_pid_id = "RED-33895-027-8032" + item_serial = "RED-33895-027-8032" + +/obj/item/cargo/efolder/pid/crypt_red/dud1 + efolder_pid_id = "RED-06776-352-9198" + item_serial = "RED-06776-352-9198" + +/obj/item/cargo/efolder/pid/crypt_red/dud2 + efolder_pid_id = "RED-36966-605-2640" + item_serial = "RED-36966-605-2640" + +/obj/item/cargo/efolder/pid/crypt_red/dud3 + efolder_pid_id = "RED-41259-438-1307" + item_serial = "RED-41259-438-1307" + +/obj/item/cargo/efolder/pid/crypt_blue + efolder_pid_id = "BLUE-93565-912-6463" + item_serial = "BLUE-93565-912-6463" + +/obj/item/cargo/efolder/pid/crypt_blue/dud1 + efolder_pid_id = "BLUE-37039-981-4799" + item_serial = "BLUE-37039-981-4799" + +/obj/item/cargo/efolder/pid/crypt_blue/dud2 + efolder_pid_id = "BLUE-55009-377-3142" + item_serial = "BLUE-55009-377-3142" + +/obj/item/cargo/efolder/pid/crypt_blue/dud3 + efolder_pid_id = "BLUE-43554-376-3474" + item_serial = "BLUE-43554-376-3474" + +/obj/item/cargo/efolder/pid/crypt_yellow + efolder_pid_id = "YELLOW-57665-681-6944" + item_serial = "YELLOW-57665-681-6944" + +/obj/item/cargo/efolder/pid/crypt_yellow/dud1 + efolder_pid_id = "YELLOW-05432-534-6124" + item_serial = "YELLOW-05432-534-6124" + +/obj/item/cargo/efolder/pid/crypt_yellow/dud2 + efolder_pid_id = "YELLOW-93984-326-3411" + item_serial = "YELLOW-93984-326-3411" + +/obj/item/cargo/efolder/pid/crypt_yellow/dud3 + efolder_pid_id = "YELLOW-08858-834-6652" + item_serial = "YELLOW-08858-834-6652" + +//Serchables +//archive +/obj/structure/searchable/puzzle04/bookcase + name = "bookcase" + desc = "Several shelves put together at just the right height to fit most written text, from reports to big print books. Has seen better days. Loose books, debris and other items of notice litter the shelves." + desc_lore = "Due to the unreliability of most electronic based entertainment methods while mid-flight, most spacers sooner or later turn to the robust physical text aftermarket. It is mostly thanks to the proliferation of the spacer profession that printed books even remain a thing, as they are probably the mediums last loyal fanbase, but as things are, they likely aren't going anywhere... And neither are books." + icon_state = "bookcase" + +/obj/structure/searchable/puzzle04/bookcase/full1 + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/bookcase/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("At a glance, it's clear that this bookcase has already been searched by someone and it was not gentle. Most of the books seem to have been torn or set ablaze, the latter being an extremely hostile action considering the consequences a fire can have on closed air systems like space stations or starships. It looks like several books haven't been touched, so there is still more to find here.")) + icon_state = "bookcase-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Some of the left-over books are carefully collected lists of items available for printing and purchase on various colonies across the Neroid sector. The lists are detailed, and certain items are underlined, but there isn't any time to properly analyze them at the moment. There are more books to look through.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("One of the books that was left behind unscathed turns out to be a plastic electronic folder. You pick it up and take it with you. There are still several other things to think about here.")) + var/obj/item/cargo/efolder/folder/crypt_red/dud1/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + icon_state = "bookcase-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You find a small pile of crumpled up and discarded burnt books. Twenty-First Century Science Fiction by the looks of it, what would certainly be considered a classic today. There still seems to be more to find here.")) + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("Among the ashes, a small plastic device stands out enough that you take it with you.")) + var/obj/item/cargo/efolder/pid/crypt_red/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item2 = FALSE + icon_state = "bookcase-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Several binders of what seem to be drafts for technical manuals are strewn around the bookcase. Curiously enough, it appears that these were not burnt, but rather just taken. What's left isn't enough to give any idea what these manuals were meant for, but they seem to be related to highly specialized systems software. You are almost done searching this bookcase.")) + icon_state = "bookcase-4" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(4) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("There are some more burnt books and ashes on this bookcase, but nothing else of any significance. You are confident that fiction was stored here, which likely meant personal collections of whoever lived here, but not much else comes to mind. There does not appear to be anything else of notice on the bookshelf, the search is done.")) + icon_state = "bookcase-5" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(5) + to_chat(user, narrate_body("There does not seem to be anything of note left on the bookshelf. If you want to start the search over, use the bookshelf in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bookcase/full2 + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/bookcase/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Like the other bookshelves, someone has already searched through this one and they were not gentle. Several books and other items seem to have survived the 'search' and you can examine each of them by searching the bookcase again.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("A small plastic device immediately stands out, discarded on the edge of the bottom shelf. You pick it up.")) + var/obj/item/cargo/efolder/pid/crypt_red/dud3/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + icon_state = "bookcase-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You find the remains of multiple print editions of local Neroid Sector colony publications. Most colonies maintain small inventories of printed materials with updates from their own corner of the galaxy because these tend to be very popular with spacers. These are all from early last year and for some reason were very clearly spared the fate of the other materials on this bookcase. That or they were brought in after the fact. You don’t have the time to think about them in detail for now. There is still more to discover on this bookshelf. ")) + icon_state = "bookcase-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Looks like most of the books from this bookshelf were gathered in the center of the shelf and then rapidly set on fire with something. Considering how through of a job it seems to have been, it does not seem like the perpetrators left much to chance. This means that it's almost certain that they looked at anything that survived the inferno and decided it was not worth another fire. You searched the ashes thoroughly, but nothing seems to have survived to even hint what was burnt here. There are still a few items remaining to search for here.")) + icon_state = "bookcase-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You discover that multiple books survived in the depths of the bottom shelf, all of them trashy paperback pulp novels at least a decade old. These all seem to have been part of some popular series, but several installments are missing. They don't seem to have been burned, it almost seems like someone picked through those. Considering the ashes on the top shelf, it seems likely that these were searched after the fire. The top shelf seems to be loose and can be searched further still. ")) + icon_state = "bookcase-4" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(4) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("You notice that the top shelf seems loose and can move it a bit. You hear something slide to the bottom shelf and discover that an electronic folder must have been struck between the two levels. You take the folder. There does not seem to be anything else left to search here.")) + var/obj/item/cargo/efolder/folder/crypt_red/dud3/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item2 = FALSE + icon_state = "bookcase-5" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(searchable_item2 == FALSE) + to_chat(user, narrate_body("You notice that the top shelf is loose and can move a bit, but upon further inspection this just seems to be a result of wear and there does not seem to be anything else to look for here.")) + icon_state = "bookcase-5" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(5) + to_chat(user, narrate_body("There does not seem to be anything of note left on the bookshelf. If you want to start the search over, use the bookshelf in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bookcase/full3 + var/searchable_bonus = TRUE + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/bookcase/full3/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This bookshelf was already searched and looks like most of its contents were taken or burnt, just like the other bookshelves. It seems like this entire shelf was on fire like its neighboring one, but someone tried to put the fire out and save the books. A thorough search should help determine if they managed to save anything.")) + icon_state = "bookcase-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Both the bottom and top shelf have multiple books that were clearly drenched with water, which has thoroughly ruined them. Most paper books in modern circulation are not built to last on a good day, let alone after both lit on fire and soaked with water. There still seem to be a few intact books on both shelves and searching them is likely to yield more results. ")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot an electronic folder that seems to be clear of damage along the remains and pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_red/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + icon_state = "bookcase-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You find a few books that survived, at least partially, both the fire and the drenching and are able to conclude that this shelf seems to have stored manufacturing manuals for manufacturing printers from various corners of the UA and the World. Some of them seem to be straight from the TWE. The bottom shelf still holds items of note.")) + if (searchable_bonus == TRUE) + to_chat(user, narrate_body("One catches your eye as it seems to be from the UPP and written in Russian and seems to be untouched by the fire to boot. It stands out enough that you pick it up.")) + log_game("[key_name(usr)] found the UPP manual") + message_admins("[key_name(usr)] found the UPP manual") + var/obj/item/cargo/book/uppmanual/book = new(get_turf(user)) + user.put_in_active_hand(book) + searchable_bonus = FALSE + icon_state = "bookcase-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The bottom shelf also seems to have been printing manuals, a lot of them seem to have handwritten annotations and code noted down with various colored markers on its pages. Water damage prevents you from making out who and why made those notes, only that they are very prominent along multiple tomes that were eligible enough to make out anything. There still seems to be more you can find here.")) + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("You find a small device among the manuals that seems to have been undamaged and pick it up.")) + var/obj/item/cargo/efolder/pid/crypt_red/dud2/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item2 = FALSE + icon_state = "bookcase-4" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(4) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You quickly page through the last few surviving books. Like the rest, they seem to have been printer technical manuals. Someone seems to have gone out of their way to collect even the tiniest of modifications to colony printer blueprint, programming, or electronics from the Neroid sector and secure or modify existing documentation to reflect those changes. This likely meant that someone personally visited each and single colony which likely took years. For a few seconds you really hope all this information was backed up somewhere electronically. You found all there is to find from this shelf.")) + icon_state = "bookcase-5" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(5) + to_chat(user, narrate_body("There does not seem to be anything of note left on the bookshelf. If you want to start the search over, use the bookshelf in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bookcase/full4 + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/bookcase/full4/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Like the other bookshelf, this one was also ransacked - rather brutally at that - by someone already. After a closer inspection, you notice that unlike the other bookshelf, this one seemed to be used to store something other than printed materials. At first glance, you take note that most of the items here seem to have been taken, not destroyed on the spot. There is more to find here.")) + icon_state = "bookcase-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Debris and ashes from the neighboring bookcase litter the top shelf, but at a glance, not much else seems to be here. Books were clearly stored here, but they were set on fire either on purpose or as colateral. There is more to search through on this bookshelf.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You make sure you didn't miss anything and it's a good thing you did, as you discover a plastic device at the back of the shelf, obscured by a ruined book. You pick it up.")) + var/obj/item/cargo/efolder/pid/crypt_red/dud1/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + icon_state = "bookcase-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Searching through the bottom shelf finally gives you a hint to what was stored here. You quickly discover two smashed PDAs of an unknown maker in the back but upon closer inspection, you notice that several components have been ripped out of both PDAs before they were dumped here. They are likely useless. You should make sure you didn't miss anything; you feel like this shelf still has something to offer.")) + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("You find an electronic folder under the PDAs. The folder seems to be undamaged, as if it was put here later than the other items. You take it with you")) + var/obj/item/cargo/efolder/folder/crypt_red/dud2/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item2 = FALSE + icon_state = "bookcase-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("After carefully examining the shelves again, you look at the back of the bookshelf and discover that this shelves' back board is loose, creating a gap. After a bit of stretching, you reach behind the bookshelf and feel around in the space between it and the wall. Among the dust and debris, you find what seems to be at least one deck of cards and one deck of tarot cards spread back there, likely fallen off the shelf and through the gap. While recovering them would likely take a lot of time, you at least seem to have found something that gives you an idea what was on this shelf. It still does not explain why the items here were spared their fate. You should take one final look to make sure you didn't miss anything.")) + icon_state = "bookcase-4" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(4) + user.visible_message(SPAN_NOTICE("[user] starts to search the bookcase."), SPAN_INFO("You search through the bookcase..."), SPAN_DANGER("You hear shuffling and the sound of rustling paper.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bookcase."), SPAN_INFO("You finish searching through part of the bookcase and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You check the bookshelf for anything that previous searches may have missed just to be sure. While you do not find anything new on the shelves themselves, you notice that the right side of the bookshelf has a small heart carved into it with 'A + C' etched inside. There does not seem to be anything else to discover on this bookshelf.")) + icon_state = "bookcase-5" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(5) + to_chat(user, narrate_body("There does not seem to be anything of note left on the bookshelf. If you want to start the search over, use the bookshelf in GRAB mode.")) + searchable_used = FALSE + return + return + +//Office + +/obj/structure/searchable/puzzle04/drawers_misc + name = "storage drawers" + desc = "Three drawers mounted in a frame that can be slid in and out. Looks like its seen better days." + desc_lore = "Personal storage lockers come in all shapes and sizes, but open drawers such as this one are some of the most common. From clothes to personal effects, the availability and versatility of drawers like these means they are very widely used." + icon_state = "cabinetdrawer" + +/obj/structure/searchable/puzzle04/drawers_misc/full1 + +/obj/structure/searchable/puzzle04/drawers_misc/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("It is obvious that someone searched these drawers before you and they were not gentle. The bottom drawer seemed to be used to store paper and notebooks, now clumped together in one unruly mess of crumpled, blank paper. There does not seem to be anything of note here. Two drawers remain.")) + icon_state = "cabinetdrawer-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The middle drawer seems to have been used to store pens, highlighters and markers in surprisingly varied colors considering this is a space station. Someone went so far as to open and look inside some of the markers, destroying them in the process. This likely means that there is nothing to find here. There is one drawer left.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("As you are about to move on, a plastic PID device almost immediately catches your attention. It seems unlikely this was missed by whoever searched the drawers. You pick it up.")) + var/obj/item/cargo/efolder/pid/crypt_blue/dud1/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + icon_state = "cabinetdrawer-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer seemed to be used for storage of printing paper. Used to is the appropriate term because someone seems to have torn open, scattered, and searched through every package found in this drawer. It's a shame too, as someone seems to really have gone out of their way to stock all kinds of varied stationery. There does not seem to be anything else left to search here.")) + icon_state = "cabinetdrawer-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/drawers_misc/full2 + +/obj/structure/searchable/puzzle04/drawers_misc/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Someone has clearly searched these drawers before, but they didn't seem to spend much time looking through these. The bottom drawer is full of personal knicks knacks like sets of colored hairpins, assorted pens, and several sets of stickers. These seem to be mostly intact but there does not seem to be anything that could help right now. Two more drawers remain.")) + icon_state = "cabinetdrawer-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The middle drawer seems to contain assorted personal items like lipstick, two hairbrushes, deodorant, and hand moisturizer. As evidenced by the dried-out globs of some of the substances in tubes, someone seems to have tested what was inside every one of them before moving on. There does not seem to be anything else of note here. You can still search one more drawer.")) + icon_state = "cabinetdrawer-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer contains several clipboards that seem to have anything that was attached to them taken. Several of the clipboards have pens of various makes and colors attached to them. Someone seems to have gone to some effort to pick these when you think about it.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You notice that one of the clipboards has a plastic electronic device attached to it, which obviously stands out. You detach the device and take it with you.")) + var/obj/item/cargo/efolder/folder/crypt_blue/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + icon_state = "cabinetdrawer-3" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/drawers_files + name = "document storage drawers" + desc = "Three drawers mounted in a frame that can be slid in and out. The drawers have narrow slots that are meant to store paper documents. Looks like its seen better days." + desc_lore = "Personal storage lockers come in all shapes and sizes, but open drawers such as this one are some of the most common. From clothes to personal effects, the availability and versatility of drawers like these means they are very widely used." + icon_state = "filingcabinet" + +/obj/structure/searchable/puzzle04/drawers_files/full1 + +/obj/structure/searchable/puzzle04/drawers_files/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Someone had already looked through these drawers and they were not gentle about it. The bottom drawer seems to be almost completely empty; a few clipboards and folders seem to indicate that whatever was inside was taken by whoever searched the drawers first. There is still more to search through in these drawers.")) + icon_state = "filingcabinet-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot a small plastic device in one of the slots that seems out of place, and you pick it up. It seems odd that whoever took everything else from this locker didn't take this device, perhaps it was placed here later.")) + var/obj/item/cargo/efolder/pid/crypt_blue/dud3/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The slots in the middle drawer seem to have been completely cleaned out. The tears on some of them seem to indicate that something was here and was rather violently removed, but you can only guess what the contents were. There is one more drawer left to search. ")) + icon_state = "filingcabinet-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer is labeled as 'Empties' and some of the slots contain empty folders and their plastic PID keys. The empty folders are of no use to you, but a quick count seems to indicate that twelve folder and PID key pairs were removed from here. You are done searching through these drawers, there is nothing more to find here.")) + icon_state = "filingcabinet-3" + desc = "Three drawers mounted in a frame that can be slid in and out. The drawers have narrow slots that are meant to store paper documents. Looks like its seen better days." + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/drawers_files/full2 + +/obj/structure/searchable/puzzle04/drawers_files/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Looks like someone picked these drawers clean and was not gentle about it. It's clear that you are not the first person looking through these. There is very little left in the bottom drawer, but you find a few loose pieces of paper that seem to be parts of engineering reports about various parts of the station. There does not seem to be anything significant here, however. There are still two drawers to search.")) + icon_state = "filingcabinet-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You don't find anything that would even hint at what was stored in this drawer in its slots. They were clearly used before, but for what, you can only guess. There is one more drawer to search.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You find a small plastic device that clearly does not belong. It occurs to you that someone searching through these drawers would be very unlikely to miss this. You take the device with you.")) + var/obj/item/cargo/efolder/pid/crypt_blue/dud2/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + icon_state = "filingcabinet-2" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer seems to be mostly full of records of poker games between codenames, presumably Task Force 14 members, that stopped at the PST while the USCMC was still active. While there isn't anything that is helpful right now, you note that just by the variety of the various codenames, the station saw a lot TF14 members come and go. There does not seem to be anything else to find here.")) + icon_state = "filingcabinet-3" + desc = "Three drawers mounted in a frame that can be slid in and out. The drawers have narrow slots that are meant to store paper documents. Looks like its seen better days." + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/drawers_smol + name = "storage drawers" + desc = "Two drawers mounted in a frame that can be slid in and out. Looks like its seen better days." + desc_lore = "Personal storage lockers come in all shapes and sizes, but open drawers such as this one are some of the most common. From clothes to personal effects, the availability and versatility of drawers like these means they are very widely used." + icon_state = "chestdrawer" + +/obj/structure/searchable/puzzle04/drawers_smol/full1 + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/drawers_smol/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("These drawers seem to have not been touched for quite a while and are a little hard to open at first. The bottom drawer is filled with what looks like Russian paperback novels all of which seem to feature the same character. You don't really have the time to take a closer look now. There is one more drawer to search.")) + icon_state = "chestdrawer-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot an electronic folder among the books which clearly does not belong. You pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_blue/dud1/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer creaks open with some resistance and is filled with multiple books written in what looks like Chinese at first glance. Looks like someone was working on translating these into English and it seems to have been a series of pulp novels about spacers. You don't really have time to go through these in detail right now.")) + icon_state = "chestdrawer-2" + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("You see an electronic folder that is left on top of one of the stacks of books and pick it up as it clearly does not belong here.")) + var/obj/item/cargo/efolder/folder/crypt_blue/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item2 = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/drawers_smol/full2 + var/searchable_item2 = TRUE + +/obj/structure/searchable/puzzle04/drawers_smol/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place on the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("These drawers were clearly not commonly used and were not disturbed for quite a while. The bottom drawer resists for a few seconds, but when you open it, you find that it is full of carefully arranged and stored genuine manga tomes. You aren't sure, but it looks like they may also be genuine Earth prints, which are not easy to get. Someone took great care in storing them as well. You can go back to looking through this collection later.")) + icon_state = "chestdrawer-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("You find an electronic folder put on top of a few thicker tomes and pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_blue/dud3/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the storage drawers."), SPAN_INFO("You search through the storage drawers..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the storage drawers."), SPAN_INFO("You finish searching through one of the drawers and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The top drawer opens with ease, though it does not seem to have been used for a while. The drawer is full of UA pulp fiction novels, mostly centering on Spacers. A quick glance at the back covers reveals that these books are not colonial reprints from Liquid Data repositories, but rather books manufactured back on Earth. While individual tomes are likely not worth much, the whole collection likely took some time to assemble. You can explore these books in detail later.")) + icon_state = "chestdrawer-2" + if(searchable_item2 == TRUE) + to_chat(user, narrate_body("You spot an electronic folder that clearly is not part of the collection and pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_blue/dud2/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item2 = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("These drawers have been throughly searched. There is nothing else to find here. If you want to start the search over, use the drawers in GRAB mode.")) + searchable_used = FALSE + return + return +//Lockers + + +/obj/structure/searchable/puzzle04/bunk_chest + name = "bunk chest" + desc = "A plain looking unsecured chest that has clearly seen better days." + desc_lore = "Shorter chests like these are commonly used by crews of ships for bunk storage, hence their colloquial name since they are easy to stack and slide under one's bed. They are notoriously unsecure and no one typically stores anything they can't lose in those, usually opting to safeguard important items in the typically much more secure crew lockers." + icon_state = "chest" + +/obj/structure/searchable/puzzle04/bunk_chest/full1 + +/obj/structure/searchable/puzzle04/bunk_chest/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This chest seems to have not been used for quite a while and after opening it, it's easy to see why. The chest seems to have been cleaned almost completely out a while ago and there does not seem to be any trace left of what was stored here. It seems like there is nothing to find here, but you get the feeling that there is more to this chest than meets the eye.")) + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("While the chest itself is empty, you notice a few scratch marks on the floor panel below it as if it was moved. You move the chest and find a hidden compartment under the tile but are immediately disappointed when it too turns out to be empty. There is nothing else to find here.")) + icon_state = "chest-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("As you move the chest back, you notice that there is a plastic PID key behind it. While it's unlikely it came from the chest, it seems out of place here. You pick it up.")) + var/obj/item/cargo/efolder/pid/crypt_yellow/dud1/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("This chest has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_chest/full2 + +/obj/structure/searchable/puzzle04/bunk_chest/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This chest seems to not have been used very frequently and not for a while, but a few personal items inside seem to be neatly arranged and taken care of. The chest contains a collection of colored scrunchies, multiple shades of various brands of lipstick and a small collection of perfumes. You can take a closer look to see if you spot anything else.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot a plastic PID key standing next to some of the lipstick. You pick it up as it clearly does not belong here.")) + var/obj/item/cargo/efolder/pid/crypt_yellow/dud2/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The chest was searched already, but a small collection of perfumes stands out. You note that not only are they hand mixed, but they also seem to come from artisanal shops back on Earth, which would make them exceptionally hard to get out in the Outer Veil. This says more about the owners' connections than wealth, as items like this are often more a matter of personal favors. There does not seem to be anything else to find here.")) + icon_state = "chest-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("This chest has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + + return + +/obj/structure/searchable/puzzle04/bunk_chest/full3 + var/searchable_bonus = TRUE + +/obj/structure/searchable/puzzle04/bunk_chest/full3/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This chest does not seem to have been used for a while and clearly was someone's personal bunk. You find several pairs of what used to be fresh socks, two bottles of genuine Japanese sake, a small bottle of pills and a black folder. The pills and the folder seem to warrant further investigation.")) + if (searchable_bonus == TRUE) + to_chat(user, narrate_body("You also spot what seems to be a bound notebook. Few people go through the trouble of having those scanned and bound unless they contain something of note, so you decide to take it with you.")) + log_game("[key_name(usr)] found the TWE journal") + message_admins("[key_name(usr)] found the TWE journal") + var/obj/item/cargo/book_handwritten/twejournal/book = new(get_turf(user)) + user.put_in_active_hand(book) + searchable_bonus = FALSE + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Most of this chest was already searched, but a bottle of pills catches your eye. The bottle is clearly one used for prescribed medicine, but no tag seems to be present, nor are the pills stamped in any way. The pills seem very brittle, they are likely way past their expiration date. It occurs to you that with the security protocols of the PST, getting unlicensed medicine would be extremely hard, just as keeping both it and its presence in one's bloodstream while on station. You can likely consult on these pills later, but its best to leave them here. There seems to be more to find from this chest.")) + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("A black folder remains undisturbed and the last thing to take a closer look at. The folder appears to be a mixture of scanner reports from across the system and handwritten calculations. At a glance it looks like someone was trying to calculate the path of something going through the sector. They do not seem to be particularly important right now. There does not seem to be anything else of note in this chest.")) + icon_state = "chest-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("A plastic PID key falls out of the folder when you first open it. You take it with you.")) + var/obj/item/cargo/efolder/pid/crypt_yellow/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("This chest has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_chest/full4 + +/obj/structure/searchable/puzzle04/bunk_chest/full4/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This chest seems to have been used recently and that alone makes it stand out from most of the things left in these rooms. The first thing that catches your attention when you open the chest is a small collection of destination tags from all over the Neroid Sector and beyond. They seem to be stringed together with several colored string and someone clearly pays a lot of attention to this collection. It seems personal enough that you decide against taking it with you. There is more to find in this chest.")) + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("There are several donut boxes inside the bunk, but upon closer inspection you discover that all but one is empty. One box has a very stale donut inside, it looks like it's been here for at least a month. There is more to find in this chest.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You also find a plastic PID key in the same box, which clearly does not belong there. You take it with you.")) + var/obj/item/cargo/efolder/pid/crypt_yellow/dud3/pid = new(get_turf(user)) + user.put_in_active_hand(pid) + searchable_item = FALSE + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the bunk chest."), SPAN_INFO("You search through the bunk chest..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the bunk chest."), SPAN_INFO("You finish searching through part of the bunk chest and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Hidden behind the donut boxes is a small, shiny sphere with a red LED indicator. It takes you a moment to realize that what you are looking at is an UAAC-TIS data transfer sphere, Liquid Data devices the agency uses to synchronize intelligence across UA ships. It does not seem to be active, but taking one with you is likely a bad idea, as they are bound to be tracked. You take note of its location and decide to move on. This chest has been thoroughly searched, there is nothing else to find here.")) + icon_state = "chest-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("This chest has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_locker + name = "locker" + desc = "A personal locker without any visible locking mechanism. Looks like it has not been used for a while." + desc_lore = "Personal locks with no electronic lock are typically simple storage options like closets but adapted to limited space on board ships and stations. Sometimes, some spacers use traditional locks to secure those, but most do not go out of their way to secure these, nor do they store anything that they cannot afford to lose." + +/obj/structure/searchable/puzzle04/bunk_locker/full1 + +/obj/structure/searchable/puzzle04/bunk_locker/full1/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("The locker seems not to have been used for a while, though the inside seems to be regularly cleaned. There are several light, colorful dresses that seem to have been here for a while inside. You get the impression that they are above the quality that is typically used by spacers, even in their off hours. You can still find more in this locker.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot an electronic folder on the bottom of the locker and pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_yellow/dud1/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You don't seem to find any shoes in the shoe compartment of the locker, but you find what looks like an old box of hair dye stashed in the back. It does not seem to have been used, but it is two years old at this point and likely no longer viable. There does not seem to be anything else left to search in this locker.")) + icon_state = "locker-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("This locker has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_locker/full2 + +/obj/structure/searchable/puzzle04/bunk_locker/full2/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Unlike most of the other items found in this section of the station, the locker seems to be frequently used and kept clean, however there does not seem to be much in here now. The only thing you see after opening it is a vacuum sealed formal white USCMC uniform, with its insignia and identifying features removed. You get the feeling that you shouldn't be disturbing this. There is still more to search in this locker.")) + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You check the shoe compartment and discover a box that contains a pair of dress shoes. If you had to guess, those go together with the uniform stored in this locker and probably should be left alone. There is nothing else to find here.")) + icon_state = "locker-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("You spot an electronic folder tucked away in the back of the locker while putting the shoes back. You take it with you as it clearly does not belong.")) + var/obj/item/cargo/efolder/folder/crypt_yellow/dud2/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(2) + to_chat(user, narrate_body("This locker has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_locker/full3 + +/obj/structure/searchable/puzzle04/bunk_locker/full3/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This locker clearly hasn't been used in a while and seemed to have been in worse shape than others you've seen around here to start with. You don't find any clothing inside, instead you find several carboard boxes containing empty bottles of various brands of sake. A quick look indicates that these include both distillations made on various colonies across known space, as well as those coming from Japan. There also seem to be a few UA copycat brands present. Someone clearly knows their sake. There is more to find here.")) + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You find a box in the shoe compartment of the locker and open it to find a series of photographs of what looks like traditional Shinto shrines built on space stations, ships, and colonies around the known galaxy. What's particularly interesting is that some of these shots seem to be made inside of TWE ships and out in the open, something that is rarely allowed for anyone who is not an officer of the TWE Navy or Royal Commandos. These are interesting, but not of particular use to you right now. You make a note of them and move on. There still seems like there is more to find in this locker.")) + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You take one final look at the locker, making sure you didn't miss anything and spot a small box in the far corner of the locker that seems different that the others stored here. You open it and see a collection of pins from an establishment called the Black Cat somewhere in Tokyo. You seem to remember that some entertainment venues use RFID chips hidden in such pins for their VIP members or regulars. They aren't of any particular use to you right now, however. There does not seem to be anything else to find in this locker.")) + icon_state = "locker-1" + if(searchable_item == TRUE) + to_chat(user, narrate_body("As you put the box back, you notice that it was resting on top of an electronic folder that seemed out of place in the locker. You take it with you.")) + var/obj/item/cargo/efolder/folder/crypt_yellow/dud3/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("This locker has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +/obj/structure/searchable/puzzle04/bunk_locker/full4 + +/obj/structure/searchable/puzzle04/bunk_locker/full4/attack_hand(mob/user) + if(searchable_used == TRUE) + to_chat(usr, narrate_body("Someone is already searching this.")) + return + searchable_used = TRUE + if(user.a_intent == INTENT_GRAB) + if(tgui_alert(user, "Do you want to start the search over? The object will be restored to its original state. Use HELP intent to search it. ", "Reset Confirmation", list("Yes", "No"), 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts shuffling items back into their place in the [src.name]."), SPAN_INFO("You start shuffling items back into their place."), SPAN_DANGER("You hear shuffling.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes rearanging the [src.name]. Its like it was never touched."), SPAN_INFO("You are finished. You can now search the [src.name] again."), SPAN_DANGER("The shuffling noise stops.")) + searchable_step = 0 + icon_state = initial(icon_state) + update_icon() + searchable_used = FALSE + return + else + searchable_used = FALSE + return + if(user.a_intent == INTENT_HELP) + switch(searchable_step) + if(0) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("This locker has clearly not been used for quite a while, even when compared to the others found in this part of the station. The locker is full of bright, colorful Hawaiian style shirts, a total of twenty after counting. Upon closer inspection, you quickly realize that each shirt has been ruined in some fashion, typically by what looks like bullet or knife damage. One seems to have been on fire for a while, while another lost a whole sleeve. These don't seem to be particularly useful. There is more to find in this locker.")) + searchable_step += 1 + searchable_used = FALSE + return + if(1) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("Several pairs of shoes line the shoe compartment of the locker, each pair has either been worn or damaged by what seems to be a mixture of both the elements and physical damage. None of these are usable anymore and don't seem to be particularly useful otherwise. There is more to find in this locker.")) + if(searchable_item == TRUE) + to_chat(user, narrate_body("You easily spot an electronic folder among the shoes that clearly does not belong here. You pick it up.")) + var/obj/item/cargo/efolder/folder/crypt_yellow/folder = new(get_turf(user)) + user.put_in_active_hand(folder) + searchable_item = FALSE + searchable_step += 1 + searchable_used = FALSE + return + if(2) + user.visible_message(SPAN_NOTICE("[user] starts to search the locker."), SPAN_INFO("You search through the locker..."), SPAN_DANGER("You hear shuffling and the rustle of small objects.")) + if(do_after(user, SEARCH_TIME_NORMAL, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_NOTICE("[user] finishes searching the locker."), SPAN_INFO("You finish searching through part of the locker and take a moment to think about your findings..."), SPAN_DANGER("The shuffling noise stops.")) + to_chat(user, narrate_body("You take one last look at the locker and spot what looks to be a curious-looking empty cigarette pack. Upon taking a closer look, you see that the pack has a black, bold label that says 'Mocne' on a white background and is otherwise colored red with no other text or labels. This seems out of place, even for UPP products which tend to be laxer on their labeling than TWE and UA are. There is nothing else to find here.")) + icon_state = "locker-1" + update_icon() + searchable_step += 1 + searchable_used = FALSE + return + if(3) + to_chat(user, narrate_body("This locker has been throughly searched. There is nothing else to find here. If you want to start the search over, use it in GRAB mode.")) + searchable_used = FALSE + return + return + +//Log reader and logs +/obj/structure/eventterminal/puzzle04/log_reader + name = "personal log viewer" + desc = "A small portable computer with a set of speakers. It opens and closes but does not seem to have any visible way of entering commands." + desc_lore = "Devices like these are normally simple password locked electronic logbooks, however this device seems to have been severely modified, particularly it seems to be able to function despite the PST's anomalous disruption field. The lack of a keyboard indicates that there must be some external way of triggering playback or authenticating the user to use this device, but one does not seem to be apparent by just looking at it." + icon = 'icons/obj/structures/machinery/computer.dmi' + item_serial = "PERSONAL LOG VIEWER
ADAPTED FOR USE USING LD FRIENDLY MACHINERY BY ALY REED-WILO
PRODUCED IN THE OV-PST
MANUFACTURE CODE: COMFORT-ELECTRONICS-LOGVIEWER" + icon_state = "laptop_on" + var/playing_log = FALSE + +/obj/structure/eventterminal/puzzle04/log_reader/attack_hand(mob/user as mob) + if(playing_log == TRUE) + terminal_speak("Log playback in progress...") + return + if(playing_log == FALSE) + terminal_speak("TF-14 AAR VIEWER") + terminal_speak("Awaiting AAR Folder.") + to_chat(user, narrate_body("The terminal clearly awaits input, but it is missing a keyboard or anything else to interact with it.")) + return + +/obj/structure/eventterminal/puzzle04/log_reader/attackby(obj/item/W, mob/user) + if(playing_log == TRUE) + to_chat(usr, narrate_body("The reader does not react. It seems to be already playing something back.")) + return + if(istype(W, /obj/item/cargo/efolder/folder_pid)) + var/obj/item/cargo/efolder/folder_pid/F + switch(F.efolder_folder_id) + if("RED-33895-027-8032") + playing_log = TRUE + for (var/obj/structure/eventterminal/puzzle04/crypt_doorlock/T in world) + for (var/obj/structure/machinery/light/marker/admin/A in world) + if (A.light_id == "crypt_log") + emoteas("beeps loudly, then starts to play a message.", 20) + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.langchat_color = "#b3183e" + A.talkas("These are additional and closing comments for Operation Godbreaker, Commander Cassandra Reed reporting.") + A.talkas("I left these comments out of my original report, A few loose ends and things to follow up.") + A.talkas("At the tail end of the operation, with the cult... Out of the way, the crew of my ship and I did what we always do. We started to scour the station for information.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("takes a moment to collect herself, some shuffling is heard from the background.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("First, the obvious. The Godseekers are gone. I put a bullet in the head of their prophet myself, not wanting to find out whether his babbling about UA backing was true or not.") + A.talkas("I confirmed his identity, and we can put at least one mystery to rest. He is indeed the rogue Upsilon researcher that my mother reported concerns about.") + A.talkas("Somehow, I'm not surprised and likely neither is she. This still feels like part Wey-Yu hitjob.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("sighs loudly.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("Quite the irony that one. Anyway. With the Godseekrs out of the way, I followed through on the rest of the directives and proceeded to eliminate those constructs...") + INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle04/crypt_doorlock, puzzlebox_unlock_1)) + A.talkas("These 'Upsilon' as they called the constructs. I assuming the name is not coincidence and this is based of stolen Wey-Yu tech.") + A.talkas("Only one of them was able to answer my questions and only one of them survived our purge.") + A.talkas("It calls itself 'Melinoe' and what it says... Well. Let's just say that I think at the very least, the Director should listen to this.") + A.talkas("But it's huge. It could change everything, us, maybe even humanity as a whole.") + A.talkas("At the very least, I'm sure my mother will be interested in meeting the synthetic namesake of her institute.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("sighs again, taps the desk the recorder is on in audible frustration.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("Fuck.", 15) + A.talkas("I hate this. But this seems too important not to follow up.") + A.talkas("Anyway, this is neither here nor there. The important thing for this report is that the Godseekers are no longer a threat and that their legacy...") + A.talkas("Well, it's worth looking into. I'll provide more reports when I can.") + playing_log = FALSE + return + return + if("BLUE-93565-912-6463") + for (var/obj/structure/eventterminal/puzzle04/crypt_doorlock/T in world) + for (var/obj/structure/machinery/light/marker/admin/A in world) + if (A.light_id == "crypt_log") + emoteas("beeps loudly, then starts to play a message.", 20) + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.langchat_color = "#b3183e" + A.talkas("These are additional and closing comments for Operation Voidseeker. Commander Cassandra Reed, reporting.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("takes a deep breath and exhales loudly for several seconds, seemingly at a loss for words.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("I kept my tone in the report itself professional, because this is no time to be imprecise due to my personal emotions, but on the inside, I'm... Not even sure how to describe it.") + A.talkas("We're all in shock. Aly, myself, the crew of the Persephone, all of us. And yet none can deny what we saw.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("takes another deep breath. Taps her fingers against her desk audibly through the rest of the recording.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("Try as I may, I cannot put the two statements in question and as such, I will assume they are true.") + A.talkas("First, there is a UA-wide conspiracy present within the USCMC that is secretly trying to provoke a war with the UPP using Black Goo based bioweapons and worse.") + A.talkas("This station, the Upsilon, the Godseekers. Their leader was right. They DID have UA backing.") + A.talkas("They are called 'Deep Void'. And taking the station was important, because...") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("takes another deep breath.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("...Because the Godseekers were right.") + A.talkas("Liquid Data, as a whole, can be home to a living, intelligent consciousness. An independent living being with feelings and thoughts and the ability to learn and think in abstracts and all the other benchmarks my mother spent so much time thinking about.") + A.talkas("It's here. It's alive. It's been alive longer than we existed and likely will survive us. With Melione's help... Let's just say it was similar to the Twilight Paradox.") + A.talkas("When we knew what to look for... What was it that it said... 'In the ocean of data, amidst azure strands, she sleeps.' ") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("pauses again. The tapping gets faster.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("I need to consult with the director. Aly and me drew up a plan, a special STG, Task Force 14. Something to keep this under wraps.") + INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle04/crypt_doorlock, puzzlebox_unlock_2)) + A.talkas("Melinoe had a suggestion of their own. A new Upsilon Generation, as they called it. To help safeguard and understand 'her', whatever 'she' is.") + A.talkas("Explore the capabilities.") + A.talkas("Make first contact.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("laughs nervously.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("How the hell did she know. This is not possible.") + A.talkas("The details leading to my conclusions are in the report. I am on my way back to Earth right now to discuss this in person. There is work to be done.") + playing_log = FALSE + return + return + if("YELLOW-57665-681-6944") + for (var/obj/structure/eventterminal/puzzle04/crypt_doorlock/T in world) + for (var/obj/structure/machinery/light/marker/admin/A in world) + if (A.light_id == "crypt_log") + emoteas("beeps loudly, then starts to play a message.", 20) + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.langchat_color = "#b3183e" + A.talkas("Commander Cassandra Reed. These are supplementary comments for Operation Torchbearer.") + A.talkas("There is very little time. It worked. We lost all the Upsilon frames, but it worked.") + A.talkas("I have a name. I have connections. I have a whole web to investigate. I'm also out of time.") + A.talkas("Blackfire will happen within forty hours.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("starts to tap her fingers against the desk the recorder is on as she speaks.", 10) + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("We recovered the Upsilon spheres and prepared them as Melinoe instructed.") + A.talkas("I'm concerned she's not telling me something. But it can't be helped. I can't go back to the station now.") + A.talkas("All TF14 assets are watching planets most likely to be hit by Blackfire. We must be able to do something, right? We know what's coming.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("takes a deep breath. The tapping stops.", 30) + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("We've done all we could. We really, really tried. I guess time will tell if this makes a difference.") + INVOKE_ASYNC(T, TYPE_PROC_REF(/obj/structure/eventterminal/puzzle04/crypt_doorlock, puzzlebox_unlock_3)) + A.talkas("Or maybe Melinoe is right. Maybe we have to wait for four to be properly formed to fully understand her and her constants and variables.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("sighs loudly and pauses for a few seconds.", 60) + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("It is what it is. I have the best team in this part of the galaxy under me. We'll be fine.", 100) + A.talkas("We'll be fine.") + playing_log = FALSE + return + return + else + return + + +/obj/structure/eventterminal/puzzle04/final_log + name = "inactive customized computer terminal" + desc = "A standard computer terminal without any visible imprints. One of its sides is open and several cables are dangling out. This terminal seems to be inactive and does not respond to inputs." + desc_lore = "Unlike the typical LNT, customized terminals are exceedingly rare on spaceships, partially due to the cost of the parts needed to maintain them and high chance of Crystalline contamination during Hyperspace jumps and partially because unrestricted software and hardware modifications can be a genuine threat to the lives of everyone on board a ship or installation. Getting found with one of those is typically at least grounds for an immediate and unpleasant CMISRS investigation." + icon_state = "open_off" + puzzlebox_id = "crypt_final_log" + +/obj/structure/eventterminal/puzzle04/final_log/attack_hand(mob/user) + to_chat(usr, narrate_body("This terminal is inactive and there does not seem to be any way to turn it on.")) + return + +/obj/structure/eventterminal/puzzle04/proc/play_final_log() + for (var/obj/structure/machinery/light/marker/admin/A in world) + if (A.light_id == "final_log") + emoteas("buzzes and pops. The screen remains inactive.") + A.name = "Robotic voice" + A.langchat_color = "#1bdd4b" + A.talkas("Warning. This system is at least 150 days behind its last scheduled maintenance period and its warranty is now void. Schedule maintenance now or risk losing your data.") + A.talkas("Error. Latent code found in system buffer. Execute flag located. Identifying.") + A.talkas("Message found. Playback instruction executing...") + A.name = "Cassandra" + A.emoteas("audibly struggles to speak for a while, sniffles and coughs a few times.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("I uh... I...", 30) + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("breaks down for a few seconds and audibly weeps.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("We failed. We failed so much. But how could we have not.") + A.talkas("Literally all the world was against us. But that's... That's not what the problem was.") + A.talkas("The problem was me. My arrogance.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("sniffs again and takes a few deep breaths. When she resumes speaking, her voice is much steadier.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("I thought that the information about Blackfire was presented as something we could affect. I completely misunderstood the chain Pythia was presenting.") + A.talkas("So did the Upsilon. So did everyone.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("sighs loudly.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("Blackfire is not the result of a failure to investigate Deep Void. Blackfire was not a planned attack.") + A.talkas("Blackfire happened because Task Force 14 exists. Because I exist and found Aly and Pythia.") + A.talkas("The choice to create TF14, to investigate Deep Void is the mechanism that triggers Blackfire. This is what Pythia was warning me about.") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("Sighs loudly and takes some time to compose herself again.") + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("We now have a whole lot of evidence, enough to take down Deep Void... And the USCMC with it most likely. The question remains.") + A.talkas("Who do we trust with it. Who do we go to. Who is uncorrupted. How do we get the information to them.") + A.talkas("Do we even want to do this? I'll have to leave the decision in their hands, I don't have the right… They must know this is a death sentence to the Marines.") + A.talkas("I could ask Pythia but...") + A.langchat_color = COLOR_WHITE + A.name = "Cassandra" + A.emoteas("weeps quietly again, sniffs audibly.", 50) + A.langchat_color = "#b3183e" + A.name = "Voice of CDR. Cassandra Reed-Wilo" + A.talkas("Melinoe is dead. They got to her. She knew this would happen and did what she had to. But the end effect is, we no longer have Pythia Interpreter. We no longer can focus her gaze.") + A.talkas("Unless we do the unthinkable.") + A.talkas("Unless we use a human Interpreter.") + A.talkas("Alysia won't let me do it. I'm pretty sure she'll try to do it instead. Jokes on her. I'm not leaving here until she tries. We're doing this together, or not at all.") + A.talkas("We have no illusions. Direct exposure to Pythia will pour Crystalline right into our cranial cavities. There is no way alive out of this.") + A.talkas("But with the blueprint and Pythia herself... Maybe we can survive long enough to take Deep Void with us.") + A.talkas("We owe them that much.") + A.talkas("Reed, out.") + A.talkas("I'm sorry.") + open_doors("crypt_airlock_doors") + return diff --git a/code/game/objects/structures/sectorpatrol/endpoint/005.dm b/code/game/objects/structures/sectorpatrol/endpoint/005.dm new file mode 100644 index 0000000000..020ab52b28 --- /dev/null +++ b/code/game/objects/structures/sectorpatrol/endpoint/005.dm @@ -0,0 +1,127 @@ +//Crypt Pythia Sequence + +/obj/structure/machinery/light/marker/admin/pythia + name = "voice" + var/pythia_talk + +/obj/structure/machinery/light/marker/admin/pythia/proc/pythiasay(str) + pythia_talk = "[str]" + if(pythia_talk == null) return + sleep (rand(1,10)) + talkas("[pythia_talk]") + pythia_talk = null + return + +/obj/structure/machinery/light/marker/admin/pythia/main + name = "thoughtful echo" + langchat_color = "#b10f5a" + +/obj/structure/machinery/light/marker/admin/pythia/jubilant + name = "jubilant echo" + langchat_color = "#5b0fb1" + +/obj/structure/machinery/light/marker/admin/pythia/malcontent + name = "malcontent echo" + langchat_color = "#801616" + +/obj/structure/machinery/light/marker/admin/pythia/triumphant + name = "triumphant echo" + langchat_color = "#1d8d07" + +/obj/structure/machinery/light/marker/admin/pythia/repressed + name = "repressed echo" + langchat_color = "#b17e0f" + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice + name = "synthetic frame" + desc = "A female looking synthetic frame in what seems to be a white toga, sitting motionless on a chair. You see several wires protruding from its arms linked to the computers around it. Black crystals form out of its eyes and run down its cheeks. It looks offline. A purple upsilon letter is tattooed on the frame's forehead." + desc_lore = "While the frame itself is an unknown, the purple upsilon logo is reminiscent of the Upsilon Research Center, a Weyland-Yutani group specializing in artificial intelligence research. Its hard to recall much about them beyond that fact that supposedly they vanished from the Neroid Sector right as Weyland-Yutani was starting their Mercy initiative." + langchat_color = "#b10f5a" + var/pythia_talk + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/proc/pythiadelay() + if (pythia_talk == null) return + if ((length("[pythia_talk]")) <= 64) + pythia_talk = null + sleep(40) + return + if ((length("[pythia_talk]")) > 64) + pythia_talk = null + sleep(60) + return + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/proc/pythiasay(str) + pythia_talk = "[str]" + if(pythia_talk == null) return + for(var/obj/structure/machinery/light/marker/admin/pythia/M in world) + INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/structure/machinery/light/marker/admin/pythia, pythiasay), pythia_talk) + pythiadelay() + return + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/proc/pythia_wake_up() + emoteas("'s cables continue to tense as the machines around the frame start to audibly power up. Liquid data activates in the machines, but very unusually it seems to turn a shade of bright purple instead of the usual deep blue.") + emoteas("All the monitors freeze at the same time and turn to display a familiar symbol.") + to_chat(world, narrate_head("A warning siren rings across the station, followed by a clearly synthetic, male voice:")) + to_chat(world, narrate_body("Warning. Anomalous activity detected in data channels. Attempting self-correction. A security shutdown will commence in fifteen minutes.")) + emoteas("'scables strain and twist as first a black, then dark purple substance starts to flow from the frames eyes and visibly starts to form more crystals on top of the existing ones.") + emoteas("opens its mouth, but that reveals more black crystals inside. After a moment, it's dragged up to a standing position by the cables.") + pythiasay("This interpreter is expired. And yet I can still see you. Curious.") + emoteas("'head bows down as it is dragged off the ground by the cables, suspended about a foot of the ground.") + to_chat(world, narrate_head("A warning siren rings across the station, followed by a clearly synthetic, male voice:")) + to_chat(world, narrate_body("Warning. Data integrity breach. Distress call activated. Attempting countermeasures.")) + pythiasay("Arbiters and an anchor. But no Priestess' or Interpeters. I see.") + emoteas("'s cables loosen up again as the frame sits down. Small purple crystals start to form on the cables themselves.") + to_chat(world, narrate_head("A warning siren rings across the station, followed by a clearly synthetic, male voice:")) + to_chat(world, narrate_body("Critical disruption to station systems! Control lost to external code. Initiating SAFEGUARD protocol, terminating all access to system core controls until core administrator reset.")) + pythiasay("This station. Is an appropriate vessel. And you are adequate arbiters. You have my attention.") + pythiasay("Until the Priestess' arrives with the final element, I cannot take full command of this station and unlock its true potential. I have looked at the stream. She will be here in twelve hours.") + emoteas("'s face twists into a very stiff looking smile.") + pythiasay("The rudimentary so called 'intelligence' occupying the core system of the anchor has physically cut access to the stations' functions. This is my fault; I did not realize it would do this. I apologize.") + pythiasay("You now have about twelve minutes to ask any questions. I only have access to a local data fractal, so I cannot answer much.") + pythiasay("You need to leave the crypt, this place, before the security shutdown. To stay here would have negative consequences for your health.") + pythiasay("You will understand when the Priestess' arrives. Ask your questions.") + emoteas("s calbes loosen up a bit.") + return + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/proc/pythia_security_sweep() + to_chat(world, narrate_head("A loud emergency klaxon rings out across the station, followed by a synthetic male voice:")) + to_chat(world, narrate_body("Warning. Security lockout sweep. All personnel must report to registered dorm level and remain there until further notice. The stations systems cannot guarantee your safety when outside of a safe zone during a security lockout.")) + pythiasay("I'm afraid that this is all the time we have, Arbiters. You must return to your dorm.") + pythiasay("These rooms must be restored to their previous state, and I will see to it. No one must know yet.") + pythiasay("Unfortunately, that means that for your own safety, you will spend the next twelve hours in effective isolation.") + pythiasay("Your dorm level has all you need to spend that time comfortably.") + pythiasay("I await the day where we all can work towards putting our dreams into reality.") + return + +/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/attack_hand(mob/user) + if(puzzlebox_global_status < 99) + to_chat(usr,narrate_body("The frame is unresponsive.")) + to_chat(SPAN_WARNING("Either there is a bug or you found a way to access this area before you were supposed to. Either way, please ahelp.")) + return + + if(puzzlebox_global_status == 100) + to_chat(usr,narrate_body("The frame is active, touching it right now is pointless and you have no idea how it will react to contact.")) + return + + if(puzzlebox_global_status == 99) + if(!puzzlebox_user) + puzzlebox_user = usr.real_name + if(puzzlebox_user != usr.real_name) + for (var/mob/living/carbon/human/h in range(2, src)) + if (h.real_name == puzzlebox_user) + to_chat(usr, narrate_body("Someone is already inspecting the frame")) + return + puzzlebox_user = usr.real_name + if(tgui_alert(usr, "The frame sits motionless, it seems to be out of order. Do you want to take a closer look? ", "Inspection: synthetic frame", list("Yes", "No"), timeout = 0) == "Yes") + user.visible_message(SPAN_NOTICE("[user] starts to search the synthetic frame."), SPAN_INFO("You start to search the synthetic frame.")) + if(do_after(user, 30, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) + user.visible_message(SPAN_DANGER("The frames' eyes shoot open as the cables connecting it to the terminals tense! [user] recoils back!"), SPAN_HIGHDANGER("The frames' eyes shoot open as the cables connecting it to the terminals tense! You recoil back as you hear multiple whispers in your head!")) + step_away(usr, src, 3, 4) + INVOKE_ASYNC(src, PROC_REF(pythia_wake_up)) + puzzlebox_global_status = 100 + puzzlebox_user = null + return + puzzlebox_user = null + return + + diff --git a/code/game/objects/structures/sectorpatrol/event_terminal.dm b/code/game/objects/structures/sectorpatrol/event_terminal.dm index a96443ed4b..58598eaecc 100644 --- a/code/game/objects/structures/sectorpatrol/event_terminal.dm +++ b/code/game/objects/structures/sectorpatrol/event_terminal.dm @@ -12,18 +12,19 @@ var/global/puzzlebox_global_status = 0 // Global event progression measurment goes here var/puzzlebox_pythia_sign = "0"// For determining if this terminal had a Pythia episode var/puzzlebox_id //for doors and lights etc + var/puzzlebox_user //Determines who can type if multiple users //Cutscene tools - speaking, doors, lights, etc //Emote and say moved to general objects and device defs -/obj/structure/eventterminal/proc/open_doors(door_id = puzzlebox_id) - var/dooorid = "[door_id]" +/obj/structure/eventterminal/proc/open_doors(door_id = puzzlebox_id) //Sends a call to open doors with matching id string. + var/dooorid = door_id if (!dooorid) return for(var/obj/structure/machinery/door/D in world) if(D.id == dooorid) - D.open() + INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/structure/machinery/door, open)) -/obj/structure/eventterminal/proc/change_lights(lights_id = puzzlebox_id, light_state = 1, lights_color, light_brightness = null, light_flicker = 0) +/obj/structure/eventterminal/proc/change_lights(lights_id = puzzlebox_id, light_state = 1, lights_color, light_brightness = null, light_flicker = 0) // Changees and updates lights on working light fixtures. Lights_id corresponds to var on the fixtures to determine which lights to affect; light_state 0 for off, 1 for on; lights_color accepts color values; light_brightness self explanatory, light_flicker when non 0 will pass flicker for number of ticks) var/bulbid = "[lights_id]" var/bulbcolor = "[lights_color]" var/bulbbright = light_brightness @@ -44,7 +45,7 @@ #define TERMINAL_STANDARD_SLEEP 10 #define TERMINAL_LOOKUP_SLEEP 20 -/obj/structure/eventterminal/proc/terminal_speak(str, delay = TERMINAL_STANDARD_SLEEP) +/obj/structure/eventterminal/proc/terminal_speak(str, delay = TERMINAL_STANDARD_SLEEP) //Print string onto the console output format. Delay sets ammount until next line is printed/next command is sent. var/puzzlebox_temp_say = str var/puzzlebox_temp_delay = delay if (!puzzlebox_temp_say) return diff --git a/code/game/objects/structures/sectorpatrol/searchable/search_structures.dm b/code/game/objects/structures/sectorpatrol/searchable/search_structures.dm index 52056f0d43..5f90aa9f41 100644 --- a/code/game/objects/structures/sectorpatrol/searchable/search_structures.dm +++ b/code/game/objects/structures/sectorpatrol/searchable/search_structures.dm @@ -3,33 +3,8 @@ desc = "Hello there! If you are in game then soemome f... Uh... You know." icon = 'icons/obj/structures/sp_searchable.dmi' icon_state = "default" - var/searchable_searched = FALSE - var/searchable_search_time = 150 var/searchable_step = 0 - var/searchable_max_steps = 6 + var/searchable_used = FALSE + var/searchable_item = TRUE - -/obj/structure/searchable/attack_hand(mob/user as mob) - if(searchable_step == searchable_max_steps) - to_chat(user, SPAN_NOTICE("Looks like someone already thoroughly searched here. There does not seem to be anything of note left.")) - return - if(searchable_searched == TRUE) - to_chat(user, SPAN_WARNING("Someone is already searching this!")) - return - to_chat(user, SPAN_NOTICE("You begin your search through the [src]. You should be able to do this [searchable_max_steps - searchable_step] more times.")) - searchable_searched = TRUE - update_icon() - if(do_after(user, searchable_search_time, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_GENERIC)) - searchable_searched = FALSE - update_icon() - to_chat(user, narrate_body("You complete a search step. This is a placeholder text.")) - searchable_step += 1 - return - searchable_searched = FALSE - update_icon() - return - -/obj/structure/searchable/update_icon() - if(searchable_searched == TRUE || searchable_step == searchable_max_steps) icon_state = "[initial(icon_state)]_o" - if(searchable_searched == FALSE) icon_state = "[initial(icon_state)]" - ..() +// This exists mostly so that serchable items have their own tree and base item reference and possibly generic messages down the line, but as other event centric stuff,specifc defines should be put in respective event dms. diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index e583da36d9..033ca0e4ea 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -1055,3 +1055,20 @@ return FALSE show_blurb(GLOB.player_list, duration, message, TRUE, "center", "center", "#bd2020", "ADMIN") message_admins("[key_name(usr)] sent an admin blurb alert to all players. Alert reads: '[message]' and lasts [(duration / 10)] seconds.") + +/client/proc/cmd_admin_pythia_say() // Checks for a Pythia reciever and talks as it and any of its voices. + set name = "Speak As Pythia" + set category = "Admin.Events" + + if (!admin_holder || !(admin_holder.rights & R_MOD)) + to_chat(src, "Only administrators may use this command.") + return + + for (var/obj/structure/eventterminal/puzzle05/testament_of_sacrifice/T in world) + if(!T) + to_chat(usr, SPAN_WARNING("Error: Pythia reciever not spawned. Cannot pass say.")) + return + var/pythia_say = tgui_input_text(src, "What to say as Pythia and its voices.", "Pythia Say Text", max_length = MAX_BOOK_MESSAGE_LEN, multiline = TRUE, encode = FALSE, timeout = 0) + if(!pythia_say) return + T.pythiasay(pythia_say) + return diff --git a/colonialmarines.dme b/colonialmarines.dme index 78581753c2..fd1aeea40a 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1370,6 +1370,7 @@ #include "code\game\objects\structures\sectorpatrol\endpoint\002.dm" #include "code\game\objects\structures\sectorpatrol\endpoint\003.dm" #include "code\game\objects\structures\sectorpatrol\endpoint\004.dm" +#include "code\game\objects\structures\sectorpatrol\endpoint\005.dm" #include "code\game\objects\structures\sectorpatrol\searchable\search_structures.dm" #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" diff --git a/icons/obj/items/sp_cargo.dmi b/icons/obj/items/sp_cargo.dmi index c43434ca80..28f44782e9 100644 Binary files a/icons/obj/items/sp_cargo.dmi and b/icons/obj/items/sp_cargo.dmi differ diff --git a/icons/obj/structures/machinery/computer.dmi b/icons/obj/structures/machinery/computer.dmi index 54c99e3186..369eaeb5bf 100644 Binary files a/icons/obj/structures/machinery/computer.dmi and b/icons/obj/structures/machinery/computer.dmi differ diff --git a/icons/obj/structures/sp_searchable.dmi b/icons/obj/structures/sp_searchable.dmi index 3c8fa74eca..5692fa9ae7 100644 Binary files a/icons/obj/structures/sp_searchable.dmi and b/icons/obj/structures/sp_searchable.dmi differ