diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 104c2746d16..db9fbd367cc 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -12,13 +12,13 @@ // Whether pAIs should automatically receive this module at no cost var/default = 0 - proc/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) +/datum/pai_software/proc/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) return - proc/toggle(mob/living/silicon/pai/user) +/datum/pai_software/proc/toggle(mob/living/silicon/pai/user) return - proc/is_active(mob/living/silicon/pai/user) +/datum/pai_software/proc/is_active(mob/living/silicon/pai/user) return 0 /datum/pai_software/directives @@ -28,54 +28,54 @@ toggle = 0 default = 1 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/directives/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - data["master"] = user.master - data["dna"] = user.master_dna - data["prime"] = user.pai_law0 - data["supplemental"] = user.pai_laws + data["master"] = user.master + data["dna"] = user.master_dna + data["prime"] = user.pai_law0 + data["supplemental"] = user.pai_laws - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/directives/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - if(href_list["getdna"]) - var/mob/living/M = P.loc - var/count = 0 + if(href_list["getdna"]) + var/mob/living/M = P.loc + var/count = 0 - // Find the carrier - while(!istype(M, /mob/living)) - if(!M || !M.loc || count > 6) - //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - to_chat(P, "You are not being carried by anyone!") - return 0 - M = M.loc - count++ + // Find the carrier + while(!istype(M, /mob/living)) + if(!M || !M.loc || count > 6) + //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) + to_chat(P, "You are not being carried by anyone!") + return 0 + M = M.loc + count++ - // Check the carrier - var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No") - if(answer == "Yes") - var/turf/T = get_turf_or_move(P.loc) - for(var/mob/v in viewers(T)) - v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) - var/datum/dna/dna = M.dna - to_chat(P, "

[M]'s UE string : [dna.unique_enzymes]

") - if(dna.unique_enzymes == P.master_dna) - to_chat(P, "DNA is a match to stored Master DNA.") - else - to_chat(P, "DNA does not match stored Master DNA.") + // Check the carrier + var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No") + if(answer == "Yes") + var/turf/T = get_turf_or_move(P.loc) + for(var/mob/v in viewers(T)) + v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) + var/datum/dna/dna = M.dna + to_chat(P, "

[M]'s UE string : [dna.unique_enzymes]

") + if(dna.unique_enzymes == P.master_dna) + to_chat(P, "DNA is a match to stored Master DNA.") else - to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.") - return 1 + to_chat(P, "DNA does not match stored Master DNA.") + else + to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.") + return 1 /datum/pai_software/radio_config name = "Radio Configuration" @@ -84,35 +84,35 @@ toggle = 0 default = 1 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui = null, force_open = 1) - var/data[0] +/datum/pai_software/radio_config/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui = null, force_open = 1) + var/data[0] - data["listening"] = user.radio.broadcasting - data["frequency"] = format_frequency(user.radio.frequency) + data["listening"] = user.radio.broadcasting + data["frequency"] = format_frequency(user.radio.frequency) - var/channels[0] - for(var/ch_name in user.radio.channels) - var/ch_stat = user.radio.channels[ch_name] - var/ch_dat[0] - ch_dat["name"] = ch_name - // FREQ_LISTENING is const in /obj/item/device/radio - ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING) - channels[++channels.len] = ch_dat + var/channels[0] + for(var/ch_name in user.radio.channels) + var/ch_stat = user.radio.channels[ch_name] + var/ch_dat[0] + ch_dat["name"] = ch_name + // FREQ_LISTENING is const in /obj/item/device/radio + ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING) + channels[++channels.len] = ch_dat - data["channels"] = channels + data["channels"] = channels - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150) - ui.set_initial_data(data) - ui.open() + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150) + ui.set_initial_data(data) + ui.open() - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/radio_config/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - P.radio.Topic(href, href_list) - return 1 + P.radio.Topic(href, href_list) + return 1 /datum/pai_software/crew_manifest name = "Crew Manifest" @@ -120,19 +120,18 @@ id = "manifest" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) +/datum/pai_software/crew_manifest/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] + data_core.get_manifest_json() + data["manifest"] = PDA_Manifest - var/data[0] - data_core.get_manifest_json() - data["manifest"] = PDA_Manifest - - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /datum/pai_software/messenger name = "Digital Messenger" @@ -140,88 +139,88 @@ id = "messenger" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/messenger/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - if(!user.pda) - return - var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger) + if(!user.pda) + return + var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger) + if(!M) + return + + data["receiver_off"] = M.toff + data["ringer_off"] = M.notify_silent + data["current_ref"] = null + data["current_name"] = user.current_pda_messaging + + var/pdas[0] + if(!M.toff) + for(var/obj/item/device/pda/P in PDAs) + var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger) + + if(P == user.pda || !PM || !PM.can_receive()) + continue + var/pda[0] + pda["name"] = "[P]" + pda["owner"] = "[P.owner]" + pda["ref"] = "\ref[P]" + if(P.owner == user.current_pda_messaging) + data["current_ref"] = "\ref[P]" + pdas[++pdas.len] = pda + + data["pdas"] = pdas + + var/messages[0] + if(user.current_pda_messaging) + for(var/index in M.tnote) + if(index["owner"] != user.current_pda_messaging) + continue + var/msg[0] + var/sent = index["sent"] + msg["sent"] = sent ? 1 : 0 + msg["target"] = index["owner"] + msg["message"] = index["message"] + messages[++messages.len] = msg + + data["messages"] = messages + + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/pai_software/messenger/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return + + if(!isnull(P.pda)) + var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger) if(!M) return - data["receiver_off"] = M.toff - data["ringer_off"] = M.notify_silent - data["current_ref"] = null - data["current_name"] = user.current_pda_messaging + if(href_list["toggler"]) + M.toff = href_list["toggler"] != "1" + return 1 + else if(href_list["ringer"]) + M.notify_silent = href_list["ringer"] != "1" + return 1 + else if(href_list["select"]) + var/s = href_list["select"] + if(s == "*NONE*") + P.current_pda_messaging = null + else + P.current_pda_messaging = s + return 1 + else if(href_list["target"]) + if(P.silence_time) + return alert("Communications circuits remain uninitialized.") - var/pdas[0] - if(!M.toff) - for(var/obj/item/device/pda/P in PDAs) - var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger) - - if(P == user.pda || !PM || !PM.can_receive()) - continue - var/pda[0] - pda["name"] = "[P]" - pda["owner"] = "[P.owner]" - pda["ref"] = "\ref[P]" - if(P.owner == user.current_pda_messaging) - data["current_ref"] = "\ref[P]" - pdas[++pdas.len] = pda - - data["pdas"] = pdas - - var/messages[0] - if(user.current_pda_messaging) - for(var/index in M.tnote) - if(index["owner"] != user.current_pda_messaging) - continue - var/msg[0] - var/sent = index["sent"] - msg["sent"] = sent ? 1 : 0 - msg["target"] = index["owner"] - msg["message"] = index["message"] - messages[++messages.len] = msg - - data["messages"] = messages - - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(!isnull(P.pda)) - var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger) - if(!M) - return - - if(href_list["toggler"]) - M.toff = href_list["toggler"] != "1" - return 1 - else if(href_list["ringer"]) - M.notify_silent = href_list["ringer"] != "1" - return 1 - else if(href_list["select"]) - var/s = href_list["select"] - if(s == "*NONE*") - P.current_pda_messaging = null - else - P.current_pda_messaging = s - return 1 - else if(href_list["target"]) - if(P.silence_time) - return alert("Communications circuits remain uninitialized.") - - var/target = locate(href_list["target"]) - M.create_message(P, target, 1) - return 1 + var/target = locate(href_list["target"]) + M.create_message(P, target, 1) + return 1 /datum/pai_software/chatroom name = "Digital Chatroom" @@ -229,116 +228,116 @@ id = "chatroom" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/chatroom/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - if(!user.pda) - return - var/datum/data/pda/app/chatroom/M = user.pda.find_program(/datum/data/pda/app/chatroom) + if(!user.pda) + return + var/datum/data/pda/app/chatroom/M = user.pda.find_program(/datum/data/pda/app/chatroom) + if(!M) + return + + data["receiver_off"] = M.toff + data["ringer_off"] = M.notify_silent + + var/list/rooms[0] + for(var/datum/chatroom/c in chatrooms) + if((M in c.users) || (M in c.invites) || c.is_public) + rooms += list(list(name = "[c]", ref = "\ref[c]")) + data["rooms"] = rooms + + if(M.disconnected || !M.messaging_available(1)) + data["disconnected"] = 1 + else if(M.current_room) + data["current_room"] = "\ref[M.current_room]" + data["current_room_name"] = M.current_room.name + data["current_room_topic"] = M.current_room.topic + data["messages"] = M.current_room.logs + var/list/users[0] + for(var/U in M.current_room.users) + var/datum/data/pda/app/chatroom/ch = U + users += "[ch.pda.owner]" + for(var/U in (M.current_room.invites - M.current_room.users)) + var/datum/data/pda/app/chatroom/ch = U + users += "[ch.pda.owner]" + data["users"] = users + + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_chatroom.tmpl", "Digital Chatroom", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/pai_software/chatroom/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) + return + + if(!isnull(P.pda) && P.pda.can_use()) + var/datum/data/pda/app/chatroom/M = P.pda.find_program(/datum/data/pda/app/chatroom) if(!M) return - data["receiver_off"] = M.toff - data["ringer_off"] = M.notify_silent - - var/list/rooms[0] - for(var/datum/chatroom/c in chatrooms) - if((M in c.users) || (M in c.invites) || c.is_public) - rooms += list(list(name = "[c]", ref = "\ref[c]")) - data["rooms"] = rooms - - if(M.disconnected || !M.messaging_available(1)) - data["disconnected"] = 1 - else if(M.current_room) - data["current_room"] = "\ref[M.current_room]" - data["current_room_name"] = M.current_room.name - data["current_room_topic"] = M.current_room.topic - data["messages"] = M.current_room.logs - var/list/users[0] - for(var/U in M.current_room.users) - var/datum/data/pda/app/chatroom/ch = U - users += "[ch.pda.owner]" - for(var/U in (M.current_room.invites - M.current_room.users)) - var/datum/data/pda/app/chatroom/ch = U - users += "[ch.pda.owner]" - data["users"] = users - - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_chatroom.tmpl", "Digital Chatroom", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) - return - - if(!isnull(P.pda) && P.pda.can_use()) - var/datum/data/pda/app/chatroom/M = P.pda.find_program(/datum/data/pda/app/chatroom) - if(!M) - return - - if(href_list["toggler"]) - M.toff = href_list["toggler"] != "1" + if(href_list["toggler"]) + M.toff = href_list["toggler"] != "1" + return 1 + else if(href_list["ringer"]) + M.notify_silent = href_list["ringer"] != "1" + return 1 + else if(href_list["topic"]) + if(!M.current_room) return 1 - else if(href_list["ringer"]) - M.notify_silent = href_list["ringer"] != "1" - return 1 - else if(href_list["topic"]) - if(!M.current_room) - return 1 - var/t = input("Enter new topic:", M.current_room, M.current_room.topic) as text|null + var/t = input("Enter new topic:", M.current_room, M.current_room.topic) as text|null + spawn() + if(!t || !M.check_messaging_available() || !P.pda.can_use()) + return + t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) + t = readd_quotes(t) + if(!t) + return + + M.current_room.topic = t + M.current_room.announce(M, "Topic has been changed to '[t]' by [P.pda.owner].") + return 1 + else if(href_list["select"]) + var/s = href_list["select"] + if(s == "*NONE*") + M.current_room = null + else + var/datum/chatroom/CR = locate(s) + if(istype(CR)) + if(!(M in CR.users)) + if(!CR.login(M)) + return + M.current_room = CR + return 1 + else if(href_list["target"]) + if(P.silence_time) + return alert("Communications circuits remain uninitialized.") + + var/datum/chatroom/target = locate(href_list["target"]) + if(istype(target)) + if(!(M in target.users)) + if(!target.login(M)) + return + var/t = input("Please enter message", target) as text|null spawn() - if(!t || !M.check_messaging_available() || !P.pda.can_use()) + if(!t || !M.check_messaging_available()) return t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) t = readd_quotes(t) - if(!t) + if(!t || !P.pda.can_use()) return - M.current_room.topic = t - M.current_room.announce(M, "Topic has been changed to '[t]' by [P.pda.owner].") - return 1 - else if(href_list["select"]) - var/s = href_list["select"] - if(s == "*NONE*") - M.current_room = null - else - var/datum/chatroom/CR = locate(s) - if(istype(CR)) - if(!(M in CR.users)) - if(!CR.login(M)) - return - M.current_room = CR - return 1 - else if(href_list["target"]) - if(P.silence_time) - return alert("Communications circuits remain uninitialized.") - - var/datum/chatroom/target = locate(href_list["target"]) - if(istype(target)) - if(!(M in target.users)) - if(!target.login(M)) - return - var/t = input("Please enter message", target) as text|null - spawn() - if(!t || !M.check_messaging_available()) - return - t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN)) - t = readd_quotes(t) - if(!t || !P.pda.can_use()) - return - - target.post(M, t) - return 1 - else if(href_list["reconnect"]) - spawn() - M.messaging_available() - return 1 + target.post(M, t) + return 1 + else if(href_list["reconnect"]) + spawn() + M.messaging_available() + return 1 /datum/pai_software/med_records name = "Medical Records" @@ -346,53 +345,53 @@ id = "med_records" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/med_records/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - var/records[0] - for(var/datum/data/record/general in sortRecord(data_core.general)) - var/record[0] - record["name"] = general.fields["name"] - record["ref"] = "\ref[general]" - records[++records.len] = record + var/records[0] + for(var/datum/data/record/general in sortRecord(data_core.general)) + var/record[0] + record["name"] = general.fields["name"] + record["ref"] = "\ref[general]" + records[++records.len] = record - data["records"] = records + data["records"] = records - var/datum/data/record/G = user.medicalActive1 - var/datum/data/record/M = user.medicalActive2 - data["general"] = G ? G.fields : null - data["medical"] = M ? M.fields : null - data["could_not_find"] = user.medical_cannotfind + var/datum/data/record/G = user.medicalActive1 + var/datum/data/record/M = user.medicalActive2 + data["general"] = G ? G.fields : null + data["medical"] = M ? M.fields : null + data["could_not_find"] = user.medical_cannotfind - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/med_records/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - if(href_list["select"]) - var/datum/data/record/record = locate(href_list["select"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/M = null - if(!( data_core.general.Find(R) )) - P.medical_cannotfind = 1 - else - P.medical_cannotfind = 0 - for(var/datum/data/record/E in data_core.medical) - if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - P.medicalActive1 = R - P.medicalActive2 = M - else + if(href_list["select"]) + var/datum/data/record/record = locate(href_list["select"]) + if(record) + var/datum/data/record/R = record + var/datum/data/record/M = null + if(!( data_core.general.Find(R) )) P.medical_cannotfind = 1 - return 1 + else + P.medical_cannotfind = 0 + for(var/datum/data/record/E in data_core.medical) + if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) + M = E + P.medicalActive1 = R + P.medicalActive2 = M + else + P.medical_cannotfind = 1 + return 1 /datum/pai_software/sec_records name = "Security Records" @@ -400,57 +399,57 @@ id = "sec_records" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/sec_records/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - var/records[0] - for(var/datum/data/record/general in sortRecord(data_core.general)) - var/record[0] - record["name"] = general.fields["name"] - record["ref"] = "\ref[general]" - records[++records.len] = record + var/records[0] + for(var/datum/data/record/general in sortRecord(data_core.general)) + var/record[0] + record["name"] = general.fields["name"] + record["ref"] = "\ref[general]" + records[++records.len] = record - data["records"] = records + data["records"] = records - var/datum/data/record/G = user.securityActive1 - var/datum/data/record/S = user.securityActive2 - data["general"] = G ? G.fields : null - data["security"] = S ? S.fields : null - data["could_not_find"] = user.security_cannotfind + var/datum/data/record/G = user.securityActive1 + var/datum/data/record/S = user.securityActive2 + data["general"] = G ? G.fields : null + data["security"] = S ? S.fields : null + data["could_not_find"] = user.security_cannotfind - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/sec_records/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - if(href_list["select"]) - var/datum/data/record/record = locate(href_list["select"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/S = null - if(!( data_core.general.Find(R) )) - P.securityActive1 = null - P.securityActive2 = null - P.security_cannotfind = 1 - else - P.security_cannotfind = 0 - for(var/datum/data/record/E in data_core.security) - if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - P.securityActive1 = R - P.securityActive2 = S - else + if(href_list["select"]) + var/datum/data/record/record = locate(href_list["select"]) + if(record) + var/datum/data/record/R = record + var/datum/data/record/S = null + if(!( data_core.general.Find(R) )) P.securityActive1 = null P.securityActive2 = null P.security_cannotfind = 1 - return 1 + else + P.security_cannotfind = 0 + for(var/datum/data/record/E in data_core.security) + if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) + S = E + P.securityActive1 = R + P.securityActive2 = S + else + P.securityActive1 = null + P.securityActive2 = null + P.security_cannotfind = 1 + return 1 /datum/pai_software/door_jack name = "Door Jack" @@ -458,44 +457,44 @@ id = "door_jack" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/door_jack/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - data["cable"] = user.cable != null - data["machine"] = user.cable && (user.cable.machine != null) - data["inprogress"] = user.hackdoor != null - data["progress_a"] = round(user.hackprogress / 10) - data["progress_b"] = user.hackprogress % 10 - data["aborted"] = user.hack_aborted + data["cable"] = user.cable != null + data["machine"] = user.cable && (user.cable.machine != null) + data["inprogress"] = user.hackdoor != null + data["progress_a"] = round(user.hackprogress / 10) + data["progress_b"] = user.hackprogress % 10 + data["aborted"] = user.hack_aborted - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/door_jack/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - if(href_list["jack"]) - if(P.cable && P.cable.machine) - P.hackdoor = P.cable.machine - P.hackloop() - return 1 - else if(href_list["cancel"]) - P.hackdoor = null - return 1 - else if(href_list["cable"]) - var/turf/T = get_turf_or_move(P.loc) - P.hack_aborted = 0 - P.cable = new /obj/item/weapon/pai_cable(T) - for(var/mob/M in viewers(T)) - M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3, - "You hear the soft click of something light and hard falling to the ground.", 2) - return 1 + if(href_list["jack"]) + if(P.cable && P.cable.machine) + P.hackdoor = P.cable.machine + P.hackloop() + return 1 + else if(href_list["cancel"]) + P.hackdoor = null + return 1 + else if(href_list["cable"]) + var/turf/T = get_turf_or_move(P.loc) + P.hack_aborted = 0 + P.cable = new /obj/item/weapon/pai_cable(T) + for(var/mob/M in viewers(T)) + M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3, + "You hear the soft click of something light and hard falling to the ground.", 2) + return 1 /mob/living/silicon/pai/proc/hackloop() var/turf/T = get_turf_or_move(src.loc) @@ -534,66 +533,67 @@ id = "atmos_sense" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/atmosphere_sensor/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - var/turf/T = get_turf_or_move(user.loc) - if(!T) - data["reading"] = 0 - data["pressure"] = 0 - data["temperature"] = 0 - data["temperatureC"] = 0 - data["gas"] = list() - else - var/datum/gas_mixture/env = T.return_air() - data["reading"] = 1 - data["pressure"] = env.return_pressure() - data["temperature"] = round(env.temperature) - data["temperatureC"] = round(env.temperature-T0C) + var/turf/T = get_turf_or_move(user.loc) + if(!T) + data["reading"] = 0 + data["pressure"] = 0 + data["temperature"] = 0 + data["temperatureC"] = 0 + data["gas"] = list() + else + var/datum/gas_mixture/env = T.return_air() + data["reading"] = 1 + data["pressure"] = env.return_pressure() + data["temperature"] = round(env.temperature) + data["temperatureC"] = round(env.temperature-T0C) - var/t_moles = env.total_moles() - var/gases[0] - if(t_moles) - var/n2[0] - n2["name"] = "Nitrogen" - n2["percent"] = round((env.nitrogen/t_moles)*100) - var/o2[0] - o2["name"] = "Oxygen" - o2["percent"] = round((env.oxygen/t_moles)*100) - var/co2[0] - co2["name"] = "Carbon Dioxide" - co2["percent"] = round((env.carbon_dioxide/t_moles)*100) - var/plasma[0] - plasma["name"] = "Plasma" - plasma["percent"] = round((env.toxins/t_moles)*100) - var/other[0] - other["name"] = "Other" - other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles))) - gases[++gases.len] = n2 - gases[++gases.len] = o2 - gases[++gases.len] = co2 - gases[++gases.len] = plasma - gases[++gases.len] = other - data["gas"] = gases + var/t_moles = env.total_moles() + var/gases[0] + if(t_moles) + var/n2[0] + n2["name"] = "Nitrogen" + n2["percent"] = round((env.nitrogen/t_moles)*100) + var/o2[0] + o2["name"] = "Oxygen" + o2["percent"] = round((env.oxygen/t_moles)*100) + var/co2[0] + co2["name"] = "Carbon Dioxide" + co2["percent"] = round((env.carbon_dioxide/t_moles)*100) + var/plasma[0] + plasma["name"] = "Plasma" + plasma["percent"] = round((env.toxins/t_moles)*100) + var/other[0] + other["name"] = "Other" + other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles))) + gases[++gases.len] = n2 + gases[++gases.len] = o2 + gases[++gases.len] = co2 + gases[++gases.len] = plasma + gases[++gases.len] = other + data["gas"] = gases - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300) - ui.set_initial_data(data) - ui.open() + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300) + ui.set_initial_data(data) + ui.open() /datum/pai_software/sec_hud name = "Security HUD" ram_cost = 20 id = "sec_hud" - toggle(mob/living/silicon/pai/user) - user.secHUD = !user.secHUD - user.remove_med_sec_hud() - if(user.secHUD) - user.add_sec_hud() - is_active(mob/living/silicon/pai/user) +/datum/pai_software/sec_hud/toggle(mob/living/silicon/pai/user) + user.secHUD = !user.secHUD + user.remove_med_sec_hud() + if(user.secHUD) + user.add_sec_hud() + +/datum/pai_software/sec_hud/is_active(mob/living/silicon/pai/user) return user.secHUD /datum/pai_software/med_hud @@ -601,48 +601,48 @@ ram_cost = 20 id = "med_hud" - toggle(mob/living/silicon/pai/user) - user.medHUD = !user.medHUD - user.remove_med_sec_hud() - if(user.medHUD) - user.add_med_hud() +/datum/pai_software/med_hud/toggle(mob/living/silicon/pai/user) + user.medHUD = !user.medHUD + user.remove_med_sec_hud() + if(user.medHUD) + user.add_med_hud() - is_active(mob/living/silicon/pai/user) - return user.medHUD +/datum/pai_software/med_hud/is_active(mob/living/silicon/pai/user) + return user.medHUD /datum/pai_software/translator name = "Universal Translator" ram_cost = 35 id = "translator" - toggle(mob/living/silicon/pai/user) - // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages - user.translator_on = !user.translator_on - if(user.translator_on) - user.add_language("Sinta'unathi") - user.add_language("Siik'tajr") - user.add_language("Canilunzt") - user.add_language("Skrellian") - user.add_language("Vox-pidgin") - user.add_language("Rootspeak") - user.add_language("Chittin") - user.add_language("Bubblish") - user.add_language("Orluum") - user.add_language("Clownish") - else - user.remove_language("Sinta'unathi") - user.remove_language("Siik'tajr") - user.remove_language("Canilunzt") - user.remove_language("Skrellian") - user.remove_language("Vox-pidgin") - user.remove_language("Rootspeak") - user.remove_language("Chittin") - user.remove_language("Bubblish") - user.remove_language("Orluum") - user.remove_language("Clownish") +/datum/pai_software/translator/toggle(mob/living/silicon/pai/user) + // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages + user.translator_on = !user.translator_on + if(user.translator_on) + user.add_language("Sinta'unathi") + user.add_language("Siik'tajr") + user.add_language("Canilunzt") + user.add_language("Skrellian") + user.add_language("Vox-pidgin") + user.add_language("Rootspeak") + user.add_language("Chittin") + user.add_language("Bubblish") + user.add_language("Orluum") + user.add_language("Clownish") + else + user.remove_language("Sinta'unathi") + user.remove_language("Siik'tajr") + user.remove_language("Canilunzt") + user.remove_language("Skrellian") + user.remove_language("Vox-pidgin") + user.remove_language("Rootspeak") + user.remove_language("Chittin") + user.remove_language("Bubblish") + user.remove_language("Orluum") + user.remove_language("Clownish") - is_active(mob/living/silicon/pai/user) - return user.translator_on +/datum/pai_software/translator/is_active(mob/living/silicon/pai/user) + return user.translator_on /datum/pai_software/signaller name = "Remote Signaller" @@ -650,42 +650,42 @@ id = "signaller" toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) - var/data[0] +/datum/pai_software/signaller/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] - data["frequency"] = format_frequency(user.sradio.frequency) - data["code"] = user.sradio.code + data["frequency"] = format_frequency(user.sradio.frequency) + data["code"] = user.sradio.code - ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) - ui.set_initial_data(data) - ui.open() + ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) + ui.set_initial_data(data) + ui.open() - Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return +/datum/pai_software/signaller/Topic(href, href_list) + var/mob/living/silicon/pai/P = usr + if(!istype(P)) return - if(href_list["send"]) - P.sradio.send_signal("ACTIVATE") - for(var/mob/O in hearers(1, P.loc)) - O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2) - return 1 + if(href_list["send"]) + P.sradio.send_signal("ACTIVATE") + for(var/mob/O in hearers(1, P.loc)) + O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2) + return 1 - else if(href_list["freq"]) - var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"])) - if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ) - new_frequency = sanitize_frequency(new_frequency) - P.sradio.set_frequency(new_frequency) - return 1 + else if(href_list["freq"]) + var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"])) + if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ) + new_frequency = sanitize_frequency(new_frequency) + P.sradio.set_frequency(new_frequency) + return 1 - else if(href_list["code"]) - P.sradio.code += text2num(href_list["code"]) - P.sradio.code = round(P.sradio.code) - P.sradio.code = min(100, P.sradio.code) - P.sradio.code = max(1, P.sradio.code) - return 1 + else if(href_list["code"]) + P.sradio.code += text2num(href_list["code"]) + P.sradio.code = round(P.sradio.code) + P.sradio.code = min(100, P.sradio.code) + P.sradio.code = max(1, P.sradio.code) + return 1 /datum/pai_software/host_scan name = "Host Bioscan" @@ -694,35 +694,34 @@ toggle = 0 - on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) +/datum/pai_software/host_scan/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) + var/data[0] + var/mob/living/held = user.loc + var/count = 0 - var/data[0] - var/mob/living/held = user.loc - var/count = 0 + // Find the carrier + while(!isliving(held)) + if(!held || !held.loc || count > 6) + //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) + to_chat(user, "You are not being carried by anyone!") + return 0 + held = held.loc + count++ + if(isliving(held)) + data["holder"] = held + data["health"] = "[held.stat > 1 ? "dead" : "[held.health]% healthy"]" + data["brute"] = "[held.getBruteLoss() > 50 ? "" : ""][held.getBruteLoss()]" + data["oxy"] = "[held.getOxyLoss() > 50 ? "" : ""][held.getOxyLoss()]" + data["tox"] = "[held.getToxLoss() > 50 ? "" : ""][held.getToxLoss()]" + data["burn"] = "[held.getFireLoss() > 50 ? "" : ""][held.getFireLoss()]" + data["temp"] = "[held.bodytemperature-T0C]°C ([held.bodytemperature*1.8-459.67]°F)" + else + data["holder"] = 0 - // Find the carrier - while(!isliving(held)) - if(!held || !held.loc || count > 6) - //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - to_chat(user, "You are not being carried by anyone!") - return 0 - held = held.loc - count++ - if(isliving(held)) - data["holder"] = held - data["health"] = "[held.stat > 1 ? "dead" : "[held.health]% healthy"]" - data["brute"] = "[held.getBruteLoss() > 50 ? "" : ""][held.getBruteLoss()]" - data["oxy"] = "[held.getOxyLoss() > 50 ? "" : ""][held.getOxyLoss()]" - data["tox"] = "[held.getToxLoss() > 50 ? "" : ""][held.getToxLoss()]" - data["burn"] = "[held.getFireLoss() > 50 ? "" : ""][held.getFireLoss()]" - data["temp"] = "[held.bodytemperature-T0C]°C ([held.bodytemperature*1.8-459.67]°F)" - else - data["holder"] = 0 - - ui = nanomanager.try_update_ui(user, user, id, ui,data , force_open) - if(!ui) - // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_bioscan.tmpl", "Host Bioscan", 400, 350) - ui.set_initial_data(data) - ui.open() - //.set_auto_update(1) + ui = nanomanager.try_update_ui(user, user, id, ui,data , force_open) + if(!ui) + // Don't copy-paste this unless you're making a pAI software module! + ui = new(user, user, id, "pai_bioscan.tmpl", "Host Bioscan", 400, 350) + ui.set_initial_data(data) + ui.open() + //.set_auto_update(1)