From 302acdc44425ce8850a6762073d7e7067c014bfb Mon Sep 17 00:00:00 2001 From: davipatury Date: Mon, 20 Feb 2017 19:38:23 -0300 Subject: [PATCH] Card Mod, Power Monitor and Console Presets. --- code/datums/cache/apc.dm | 12 +- .../computers/machinery/console_presets.dm | 74 ++++ .../computers/machinery/modular_console.dm | 57 +++ .../file_system/programs/airestorer.dm | 2 - .../file_system/programs/alarm.dm | 3 +- .../file_system/programs/card.dm | 410 ++++++++++++++++++ .../file_system/programs/power_monitor.dm | 47 ++ code/modules/nano/modules/power_monitor.dm | 2 +- nano/templates/card_prog.tmpl | 277 ++++++++++++ paradise.dme | 4 + 10 files changed, 878 insertions(+), 10 deletions(-) create mode 100644 code/modules/modular_computers/computers/machinery/console_presets.dm create mode 100644 code/modules/modular_computers/computers/machinery/modular_console.dm create mode 100644 code/modules/modular_computers/file_system/programs/card.dm create mode 100644 code/modules/modular_computers/file_system/programs/power_monitor.dm create mode 100644 nano/templates/card_prog.tmpl diff --git a/code/datums/cache/apc.dm b/code/datums/cache/apc.dm index 4271886ac4b..29a2574f6e0 100644 --- a/code/datums/cache/apc.dm +++ b/code/datums/cache/apc.dm @@ -1,8 +1,8 @@ var/global/datum/repository/apc/apc_repository = new() -/datum/repository/apc/proc/apc_data(var/obj/machinery/computer/monitor/powermonitor) +/datum/repository/apc/proc/apc_data(datum/powernet/powernet) var/apcData[0] - + var/datum/cache_entry/cache_entry = cache_data if(!cache_entry) cache_entry = new/datum/cache_entry @@ -10,10 +10,10 @@ var/global/datum/repository/apc/apc_repository = new() if(world.time < cache_entry.timestamp) return cache_entry.data - - if(powermonitor && !isnull(powermonitor.powernet)) + + if(powernet) var/list/L = list() - for(var/obj/machinery/power/terminal/term in powermonitor.powernet.nodes) + for(var/obj/machinery/power/terminal/term in powernet.nodes) if(istype(term.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = term.master L += A @@ -24,5 +24,5 @@ var/global/datum/repository/apc/apc_repository = new() apcData[++apcData.len] = list("Name" = html_encode(A.area.name), "Equipment" = Status[A.equipment+1], "Lights" = Status[A.lighting+1], "Environment" = Status[A.environ+1], "CellPct" = A.cell ? round(A.cell.percent(),1) : "M", "CellStatus" = A.cell ? chg[A.charging+1] : "M", "Load" = round(A.lastused_total,1)) cache_entry.timestamp = world.time + 5 SECONDS - cache_entry.data = apcData + cache_entry.data = apcData return apcData \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm new file mode 100644 index 00000000000..b2f0c5fb07e --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -0,0 +1,74 @@ +/obj/machinery/modular_computer/console/preset + // Can be changed to give devices specific hardware + var/_has_id_slot = 0 + var/_has_printer = 0 + var/_has_battery = 0 + var/_has_ai = 0 + +/obj/machinery/modular_computer/console/preset/New() + . = ..() + if(!cpu) + return + cpu.install_component(new /obj/item/weapon/computer_hardware/processor_unit) + + if(_has_id_slot) + cpu.install_component(new /obj/item/weapon/computer_hardware/card_slot) + if(_has_printer) + cpu.install_component(new /obj/item/weapon/computer_hardware/printer) + if(_has_battery) + cpu.install_component(new /obj/item/weapon/computer_hardware/battery(cpu, /obj/item/weapon/stock_parts/cell/computer/super)) + if(_has_ai) + cpu.install_component(new /obj/item/weapon/computer_hardware/ai_slot) + install_programs() + +// Override in child types to install preset-specific programs. +/obj/machinery/modular_computer/console/preset/proc/install_programs() + return + + + +// ===== ENGINEERING CONSOLE ===== +/obj/machinery/modular_computer/console/preset/engineering + console_department = "Engineering" + desc = "A stationary computer. This one comes preloaded with engineering programs." + +/obj/machinery/modular_computer/console/preset/engineering/install_programs() + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + hard_drive.store_file(new/datum/computer_file/program/power_monitor()) + hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) + +// ===== RESEARCH CONSOLE ===== +/obj/machinery/modular_computer/console/preset/research + console_department = "Research" + desc = "A stationary computer. This one comes preloaded with research programs." + _has_ai = 1 + +/obj/machinery/modular_computer/console/preset/research/install_programs() + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) + hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + hard_drive.store_file(new/datum/computer_file/program/chatclient()) + hard_drive.store_file(new/datum/computer_file/program/aidiag()) + + +// ===== COMMAND CONSOLE ===== +/obj/machinery/modular_computer/console/preset/command + console_department = "Command" + desc = "A stationary computer. This one comes preloaded with command programs." + _has_id_slot = 1 + _has_printer = 1 + +/obj/machinery/modular_computer/console/preset/command/install_programs() + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + hard_drive.store_file(new/datum/computer_file/program/chatclient()) + hard_drive.store_file(new/datum/computer_file/program/card_mod()) + +// ===== CIVILIAN CONSOLE ===== +/obj/machinery/modular_computer/console/preset/civilian + console_department = "Civilian" + desc = "A stationary computer. This one comes preloaded with generic programs." + +/obj/machinery/modular_computer/console/preset/civilian/install_programs() + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + hard_drive.store_file(new/datum/computer_file/program/chatclient()) + hard_drive.store_file(new/datum/computer_file/program/nttransfer()) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm new file mode 100644 index 00000000000..60315198ca6 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -0,0 +1,57 @@ +/obj/machinery/modular_computer/console + name = "console" + desc = "A stationary computer." + + icon = 'icons/obj/modular_console.dmi' + icon_state = "console" + icon_state_powered = "console" + icon_state_unpowered = "console-off" + screen_icon_state_menu = "menu" + hardware_flag = PROGRAM_CONSOLE + var/console_department = "" // Used in New() to set network tag according to our area. + anchored = 1 + density = 1 + base_idle_power_usage = 100 + base_active_power_usage = 500 + max_hardware_size = 4 + steel_sheet_cost = 10 + light_strength = 2 + obj_integrity = 300 + max_integrity = 300 + integrity_failure = 150 + +/obj/machinery/modular_computer/console/buildable/New() + ..() + // User-built consoles start as empty frames. + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] + var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET] + var/obj/item/weapon/computer_hardware/hard_drive/recharger = cpu.all_components[MC_CHARGE] + qdel(recharger) + qdel(network_card) + qdel(hard_drive) + +/obj/machinery/modular_computer/console/New() + ..() + var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL] + if(battery_module) + qdel(battery_module) + + var/obj/item/weapon/computer_hardware/network_card/wired/network_card = new() + + cpu.install_component(network_card) + cpu.install_component(new /obj/item/weapon/computer_hardware/recharger/APC) + cpu.install_component(new /obj/item/weapon/computer_hardware/hard_drive/super) // Consoles generally have better HDDs due to lower space limitations + + var/area/A = get_area(src) + // Attempts to set this console's tag according to our area. Since some areas have stuff like "XX - YY" in their names we try to remove that too. + if(A && console_department) + network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_" + else if(A) + network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_") + else if(console_department) + network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_") + else + network_card.identification_string = "Unknown Console" + if(cpu) + cpu.screen_on = 1 + update_icon() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 0f662b427ce..21cfdec4972 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -1,5 +1,3 @@ - - /datum/computer_file/program/aidiag filename = "aidiag" filedesc = "AI Maintenance Utility" diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 17e0a8ad2fb..66e3d1b120a 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -17,7 +17,8 @@ /datum/computer_file/program/alarm_monitor/Destroy() ..() - alarm_handlers.unregister(src) + for(var/datum/alarm_handler/AH in alarm_handlers) + AH.unregister(src) qdel(alarm_handlers) alarm_handlers = null diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm new file mode 100644 index 00000000000..9b02391eb4b --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -0,0 +1,410 @@ +/datum/computer_file/program/card_mod + filename = "cardmod" + filedesc = "ID card modification program" + program_icon_state = "id" + extended_desc = "Program for programming employee ID cards to access parts of the station." + transfer_access = access_change_ids + requires_ntnet = 0 + size = 8 + var/is_centcom = 0 + var/mode = 0 + var/printing = 0 + + //Cooldown for closing positions in seconds + //if set to -1: No cooldown... probably a bad idea + //if set to 0: Not able to close "original" positions. You can only close positions that you have opened before + var/change_position_cooldown = 60 + //Jobs you cannot open new positions for + var/list/blacklisted = list( + /datum/job/ai, + /datum/job/cyborg, + /datum/job/captain, + /datum/job/hop, + /datum/job/hos, + /datum/job/chief_engineer, + /datum/job/rd, + /datum/job/cmo, + /datum/job/judge, + /datum/job/blueshield, + /datum/job/nanotrasenrep, + /datum/job/pilot, + /datum/job/brigdoc, + /datum/job/mechanic, + /datum/job/barber, + /datum/job/chaplain, + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian + ) + + //The scaling factor of max total positions in relation to the total amount of people on board the station in % + var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players + + //This is used to keep track of opened positions for jobs to allow instant closing + //Assoc array: "JobName" = (int) + var/list/opened_positions = list() + +/datum/computer_file/program/card_mod/proc/is_authenticated(var/mob/user) + if(user.can_admin_interact()) + return 1 + if(computer) + var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] + if(card_slot) + var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2 + if(auth_card) + return check_access(auth_card) + return 0 + +/datum/computer_file/program/card_mod/proc/check_access(obj/item/I) + if(access_change_ids in I.GetAccess()) + return 1 + return 0 + +/datum/computer_file/program/card_mod/proc/get_target_rank() + if(computer) + var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] + if(card_slot) + var/obj/item/weapon/card/id/id_card = card_slot.stored_card + if(id_card && id_card.assignment) + return id_card.assignment + return "Unassigned" + +/datum/computer_file/program/card_mod/proc/format_job_slots() + var/list/formatted = list() + for(var/datum/job/job in job_master.occupations) + if(job_blacklisted(job)) + continue + formatted.Add(list(list( + "title" = job.title, + "current_positions" = job.current_positions, + "total_positions" = job.total_positions, + "can_open" = can_open_job(job), + "can_close" = can_close_job(job)))) + + return formatted + +/datum/computer_file/program/card_mod/proc/format_card_skins(list/card_skins) + var/list/formatted = list() + for(var/skin in card_skins) + formatted.Add(list(list( + "display_name" = get_skin_desc(skin), + "skin" = skin))) + + return formatted + + +/datum/computer_file/program/card_mod/proc/job_blacklisted(datum/job/job) + return (job.type in blacklisted) + + +//Logic check for if you can open the job +/datum/computer_file/program/card_mod/proc/can_open_job(datum/job/job) + if(job) + if(!job_blacklisted(job)) + if((job.total_positions <= player_list.len * (max_relative_positions / 100))) + var/delta = (world.time / 10) - time_last_changed_position + if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) + return 1 + return -2 + return -1 + return 0 + +//Logic check for if you can close the job +/datum/computer_file/program/card_mod/proc/can_close_job(datum/job/job) + if(job) + if(!job_blacklisted(job)) + if(job.total_positions > job.current_positions) + var/delta = (world.time / 10) - time_last_changed_position + if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) + return 1 + return -2 + return -1 + return 0 + +/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) + var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] + if(!card_slot || !card_slot.stored_card) + return null + var/obj/item/weapon/card/id/id_card = card_slot.stored_card + var/list/formatted = list() + for(var/job in jobs) + formatted.Add(list(list( + "display_name" = replacetext(job, " ", " "), + "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", + "job" = job))) + + return formatted + + +/datum/computer_file/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + ui = new(user, src, ui_key, "card_prog.tmpl", "ID card modification program", 775, 700) + ui.open() + +/datum/computer_file/program/card_mod/Topic(href, href_list) + if(..()) + return 1 + + var/obj/item/weapon/computer_hardware/card_slot/card_slot + var/obj/item/weapon/computer_hardware/printer/printer + if(computer) + card_slot = computer.all_components[MC_CARD] + printer = computer.all_components[MC_PRINT] + if(!card_slot) + return + + var/mob/user = usr + + var/obj/item/weapon/card/id/modify = card_slot.stored_card + var/obj/item/weapon/card/id/scan = card_slot.stored_card2 + + switch(href_list["action"]) + if("PRG_modify") + if(modify) + data_core.manifest_modify(modify.registered_name, modify.assignment) + modify.name = "[modify.registered_name]'s ID Card ([modify.assignment])" + card_slot.try_eject(1, user) + else + var/obj/item/I = usr.get_active_hand() + if(istype(I, /obj/item/weapon/card/id)) + if(!usr.drop_item()) + return + I.forceMove(computer) + card_slot.stored_card = I + + if("PRG_scan") + if(scan) + card_slot.try_eject(2, user) + else + var/obj/item/I = usr.get_active_hand() + if(istype(I, /obj/item/weapon/card/id)) + if(!usr.drop_item()) + return + I.forceMove(computer) + card_slot.stored_card2 = I + + if("PRG_access") + if(href_list["allowed"]) + if(is_authenticated(usr)) + var/access_type = text2num(href_list["access_target"]) + var/access_allowed = text2num(href_list["allowed"]) + if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses())) + modify.access -= access_type + if(!access_allowed) + modify.access += access_type + + if("PRG_skin") + var/skin = href_list["skin_target"] + if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom))) + modify.icon_state = href_list["skin_target"] + + if("PRG_assign") + if(is_authenticated(usr) && modify) + var/t1 = href_list["assign_target"] + if(t1 == "Custom") + var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) + //let custom jobs function as an impromptu alt title, mainly for sechuds + if(temp_t && modify) + modify.assignment = temp_t + else + var/list/access = list() + if(is_centcom) + access = get_centcom_access(t1) + else + var/datum/job/jobdatum + for(var/jobtype in typesof(/datum/job)) + var/datum/job/J = new jobtype + if(ckey(J.title) == ckey(t1)) + jobdatum = J + break + if(!jobdatum) + to_chat(usr, "\red No log exists for this job: [t1]") + return + + access = jobdatum.get_access() + + modify.access = access + modify.assignment = t1 + modify.rank = t1 + + callHook("reassign_employee", list(modify)) + + if("PRG_reg") + if(is_authenticated(usr)) + var/temp_name = reject_bad_name(href_list["reg"]) + if(temp_name) + modify.registered_name = temp_name + else + computer.visible_message("[src] buzzes rudely.") + + if("PRG_account") + if(is_authenticated(usr)) + var/account_num = text2num(href_list["account"]) + modify.associated_account_number = account_num + + if("PRG_mode") + mode = text2num(href_list["mode_target"]) + + if("PRG_print") + if(!printing && computer) + printing = 1 + playsound(computer.loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) + spawn(50) + printing = 0 + nanomanager.update_uis(src) + var/title + var/content + if(mode == 2) + title = "crew manifest ([worldtime2text()])" + content = "

Crew Manifest


[data_core ? data_core.get_manifest(0) : ""]" + else if(modify && !mode) + title = "access report" + content = {"

Access Report

+ Prepared By: [scan && scan.registered_name ? scan.registered_name : "Unknown"]
+ For: [modify.registered_name ? modify.registered_name : "Unregistered"]
+
+ Assignment: [modify.assignment]
+ Account Number: #[modify.associated_account_number]
+ Blood Type: [modify.blood_type]

+ Access:
"} + + var/first = 1 + for(var/A in modify.access) + content += "[first ? "" : ", "][get_access_desc(A)]" + first = 0 + content += "
" + + if(content) + if(!printer.print_text(content, title)) + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") + return 1 + else + computer.visible_message("\The [computer] prints out paper.") + + if("PRG_terminate") + if(is_authenticated(usr)) + modify.assignment = "Terminated" + modify.access = list() + + callHook("terminate_employee", list(modify)) + + if("PRG_make_job_available") + // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS + if(is_authenticated(usr)) + var/edit_job_target = href_list["job"] + var/datum/job/j = job_master.GetJob(edit_job_target) + if(!j) + return 1 + if(can_open_job(j) != 1) + return 1 + if(opened_positions[edit_job_target] >= 0) + time_last_changed_position = world.time / 10 + j.total_positions++ + opened_positions[edit_job_target]++ + + if("PRG_make_job_unavailable") + // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS + if(is_authenticated(usr)) + var/edit_job_target = href_list["job"] + var/datum/job/j = job_master.GetJob(edit_job_target) + if(!j) + return 1 + if(can_close_job(j) != 1) + return 1 + //Allow instant closing without cooldown if a position has been opened before + if(opened_positions[edit_job_target] <= 0) + time_last_changed_position = world.time / 10 + j.total_positions-- + opened_positions[edit_job_target]-- + + if(modify) + modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])") + + nanomanager.update_uis(src) + return 1 + +/datum/computer_file/program/card_mod/ui_data(mob/user) + var/list/data = get_header_data() + + var/obj/item/weapon/card/id/modify = null + var/obj/item/weapon/card/id/scan = null + + var/obj/item/weapon/computer_hardware/card_slot/card_slot + var/obj/item/weapon/computer_hardware/printer/printer + if(computer) + card_slot = computer.all_components[MC_CARD] + printer = computer.all_components[MC_PRINT] + if(card_slot) + modify = card_slot.stored_card + scan = card_slot.stored_card2 + + data["src"] = UID() + data["station_name"] = station_name() + data["mode"] = mode + data["printing"] = printing + data["printer"] = printer ? TRUE : FALSE + data["manifest"] = data_core ? data_core.get_manifest(0) : null + data["target_name"] = modify ? modify.name : "-----" + data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" + data["target_rank"] = get_target_rank() + data["scan_name"] = scan ? scan.name : "-----" + data["authenticated"] = is_authenticated(user) + data["has_modify"] = !!modify + data["account_number"] = modify ? modify.associated_account_number : null + data["centcom_access"] = is_centcom + data["all_centcom_access"] = null + data["regions"] = null + + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["support_jobs"] = format_jobs(support_positions) + data["civilian_jobs"] = format_jobs(civilian_positions) + data["special_jobs"] = format_jobs(whitelisted_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + data["card_skins"] = format_card_skins(get_station_card_skins()) + + data["job_slots"] = format_job_slots() + + var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - time_last_changed_position), 1) + var/mins = round(time_to_wait / 60) + var/seconds = time_to_wait - (60*mins) + data["cooldown_mins"] = mins + data["cooldown_secs"] = (seconds < 10) ? "0[seconds]" : seconds + + if(modify) + data["current_skin"] = modify.icon_state + + if(modify && is_centcom) + var/list/all_centcom_access = list() + for(var/access in get_all_centcom_access()) + all_centcom_access.Add(list(list( + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in modify.access) ? 1 : 0))) + + data["all_centcom_access"] = all_centcom_access + data["all_centcom_skins"] = format_card_skins(get_centcom_card_skins()) + + else if(modify) + var/list/regions = list() + for(var/i = 1; i <= 7; i++) + var/list/accesses = list() + for(var/access in get_region_accesses(i)) + if(get_access_desc(access)) + accesses.Add(list(list( + "desc" = replacetext(get_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in modify.access) ? 1 : 0))) + + regions.Add(list(list( + "name" = get_region_accesses_name(i), + "accesses" = accesses))) + + data["regions"] = regions + + return data \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/power_monitor.dm b/code/modules/modular_computers/file_system/programs/power_monitor.dm new file mode 100644 index 00000000000..0b057f7aa4f --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/power_monitor.dm @@ -0,0 +1,47 @@ +/datum/computer_file/program/power_monitor + filename = "powermonitor" + filedesc = "Power Monitoring" + program_icon_state = "power_monitor" + extended_desc = "This program connects to sensors around the station to provide information about electrical systems" + ui_header = "power_norm.gif" + transfer_access = access_engine + usage_flags = PROGRAM_CONSOLE + requires_ntnet = 0 + network_destination = "power monitoring system" + size = 9 + var/obj/structure/cable/attached + +/datum/computer_file/program/power_monitor/run_program(mob/living/user) + . = ..(user) + search() + +/datum/computer_file/program/power_monitor/process_tick() + if(!attached) + search() + +/datum/computer_file/program/power_monitor/proc/search() + var/turf/T = get_turf(computer) + attached = locate() in T + +/datum/computer_file/program/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers) + assets.send(user) + ui = new(user, src, ui_key, "power_monitor.tmpl", "Alarm Monitoring", 800, 700) + ui.set_auto_update(1) + ui.open() + +/datum/computer_file/program/power_monitor/ui_data() + var/list/data = get_header_data() + + data["powermonitor"] = attached ? TRUE : FALSE + + if(attached) + var/datum/powernet/powernet = attached.get_powernet() + data["poweravail"] = powernet.avail + data["powerload"] = powernet.viewload + data["powerdemand"] = powernet.load + data["apcs"] = apc_repository.apc_data(powernet) + + return data \ No newline at end of file diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 33e08b00e83..ef052d6a5f6 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -33,7 +33,7 @@ data["poweravail"] = powermonitor.powernet.avail data["powerload"] = powermonitor.powernet.viewload data["powerdemand"] = powermonitor.powernet.load - data["apcs"] = apc_repository.apc_data(powermonitor) + data["apcs"] = apc_repository.apc_data(powermonitor.powernet) return data diff --git a/nano/templates/card_prog.tmpl b/nano/templates/card_prog.tmpl new file mode 100644 index 00000000000..897732ef1aa --- /dev/null +++ b/nano/templates/card_prog.tmpl @@ -0,0 +1,277 @@ +{{if data.printing}} +
The computer is currently busy.
+
+
Printing...
+
+

+ Thank you for your patience! +

+{{else}} + {{:helper.link('Access Modification', 'home', {'action' : 'PRG_mode', 'mode_target' : 0}, !data.mode ? 'disabled' : null)}} + {{:helper.link('Job Management', 'gear', {'action' : 'PRG_mode', 'mode_target' : 1}, data.mode == 1 ? 'disabled' : null)}} + {{:helper.link('Crew Manifest', 'folder-open', {'action' : 'PRG_mode', 'mode_target' : 2}, data.mode == 2 ? 'disabled' : null)}} + {{:helper.link('Print', 'print', {'action' : 'PRG_print'}, data.printer && (data.mode == 2 || data.has_modify && !data.mode) ? null : 'disabled')}} + + {{if data.mode == 1}} +
+

Job Management

+
+
+
+ Authorized Identity: +
+
+ {{:helper.link(data.scan_name, 'eject', {'action' : 'PRG_scan'})}} +
+
+ Cooldown: +
+
+ {{if data.cooldown_mins > 0 || data.cooldown_mins == 0 && data.cooldown_secs > 0}} + Next change in: {{:data.cooldown_mins}}:{{:data.cooldown_secs}} + {{else}} + Ready + {{/if}} +
+
+
+
+ {{for data.job_slots}} +
+ {{:value.title}}: {{:value.current_positions}}/{{:value.total_positions}} + {{:helper.link('-', null, {'action' : 'PRG_make_job_unavailable', 'job' : value.title}, value.can_close == 1 && data.authenticated ? null : 'disabled')}} + {{:helper.link('+', null, {'action' : 'PRG_make_job_available', 'job' : value.title}, value.can_open == 1 && data.authenticated ? null : 'disabled')}} +
+ {{/for}} +
+ {{else data.mode == 2}} +
+

Crew Manifest

+
+
+ {{:data.manifest}} +
+ {{else}} +
+

Access Modification

+
+ + {{if !data.authenticated}} + Please insert the IDs into the terminal to proceed.
+ {{/if}} + +
+
+ Target Identity: +
+
+ {{:helper.link(data.target_name, 'eject', {'action' : 'PRG_modify'})}} +
+
+
+
+ Authorized Identity: +
+
+ {{:helper.link(data.scan_name, 'eject', {'action' : 'PRG_scan'})}} +
+
+
+ + {{if data.authenticated}} + + + {{if data.has_modify}} +
+

Details

+
+ +
+
+
+ + + Registered Name: +
+
+ + +
+
+
+ +
+
+
+ + + Account Number: +
+
+ + +
+
+
+ +
+
+ Terminations: +
+
+ {{:helper.link('Terminate ' + data.target_owner, 'gear', {'action' : 'PRG_terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} +
+
+ +
+

Assignment

+
+ + +
+ +
+ + {{if data.centcom_access}} +
+

Central Command

+
+
+ {{for data.all_centcom_access}} + {{:helper.link(value.desc, '', {'action' : 'PRG_access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}} + {{/for}} +
+
Card Skin
+ {{for data.all_centcom_skins}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}} + {{/for}} +
+
+ {{else}} +
+

{{:data.station_name}}

+
+
+ {{for data.regions}} +
+
{{:value.name}}
+ {{for value.accesses :accessValue:accessKey}} +
+ {{:helper.link(accessValue.desc, '', {'action' : 'PRG_access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}} +
+ {{/for}} +
+ {{/for}} +
+
Card Skin
+ {{for data.card_skins}} + {{:helper.link(value.display_name, '', {'action' : 'PRG_skin', 'skin_target' : value.skin}, null,(data.current_skin == value.skin) ? 'selected' : null )}} + {{/for}} +
+
+ {{/if}} + {{/if}} + {{/if}} + {{/if}} +{{/if}} diff --git a/paradise.dme b/paradise.dme index 901804277da..c3ea1823b25 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1764,19 +1764,23 @@ #include "code\modules\modular_computers\computers\item\processor.dm" #include "code\modules\modular_computers\computers\item\tablet.dm" #include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" #include "code\modules\modular_computers\file_system\data.dm" #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\program_events.dm" #include "code\modules\modular_computers\file_system\programs\airestorer.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\card.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\power_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" #include "code\modules\modular_computers\hardware\_hardware.dm"