From 4e56f6e66e6b56499ecf2e6278c3aeea16a3ffe5 Mon Sep 17 00:00:00 2001 From: Karolis Date: Mon, 23 Dec 2019 09:46:15 +0200 Subject: [PATCH] Add record programs, keeps old consoles to avoid converting main maps. (#7225) Add record printing (fixes #6042) --- aurorastation.dme | 2 + code/controllers/subsystems/records.dm | 64 ++++ code/datums/records.dm | 43 ++- code/game/machinery/computer/records.dm | 4 +- code/game/machinery/records_scanner.dm | 143 -------- .../computers/subtypes/dev_laptop.dm | 2 + .../computers/subtypes/preset_console.dm | 18 + .../computers/subtypes/preset_laptop.dm | 107 ++++++ .../file_system/programs/app_presets.dm | 146 +++++++- .../file_system/programs/generic/records.dm | 340 ++++++++++++++++++ .../hardware/nano_printer.dm | 1 + code/modules/paperwork/paper.dm | 1 - html/changelogs/aaaaaaaa.yml | 5 + html/changelogs/aaaaaaaa2.yml | 4 + icons/obj/modular_console.dmi | Bin 61517 -> 63041 bytes icons/obj/modular_laptop.dmi | Bin 28070 -> 28995 bytes icons/obj/modular_tablet.dmi | Bin 3546 -> 4011 bytes maps/space_ruins/derelict.dmm | 8 +- vueui/src/components/view/records/general.vue | 1 + vueui/src/components/view/records/list.vue | 4 +- vueui/src/components/view/records/main.vue | 2 + 21 files changed, 734 insertions(+), 161 deletions(-) delete mode 100644 code/game/machinery/records_scanner.dm create mode 100644 code/modules/modular_computers/computers/subtypes/preset_laptop.dm create mode 100644 code/modules/modular_computers/file_system/programs/generic/records.dm create mode 100644 html/changelogs/aaaaaaaa.yml create mode 100644 html/changelogs/aaaaaaaa2.yml diff --git a/aurorastation.dme b/aurorastation.dme index 3da83e0ddf7..289e80e869a 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1959,6 +1959,7 @@ #include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" #include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" #include "code\modules\modular_computers\computers\subtypes\preset_console.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" #include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" #include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" @@ -1985,6 +1986,7 @@ #include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntsl2_interpreter.dm" #include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\records.dm" #include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" #include "code\modules\modular_computers\file_system\programs\research\ai_restorer.dm" #include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" diff --git a/code/controllers/subsystems/records.dm b/code/controllers/subsystems/records.dm index 03e5d748216..8b19f10ac12 100644 --- a/code/controllers/subsystems/records.dm +++ b/code/controllers/subsystems/records.dm @@ -11,6 +11,7 @@ var/list/viruses var/list/excluded_fields + var/list/localized_fields var/manifest_json var/list/manifest @@ -20,6 +21,8 @@ /datum/controller/subsystem/records/Initialize() ..() + for(var/type in localized_fields) + localized_fields[type] = compute_localized_field(type) InitializeCitizenships() InitializeReligions() @@ -30,6 +33,7 @@ warrants = list() viruses = list() excluded_fields = list() + localized_fields = list() manifest = list() NEW_SS_GLOBAL(SSrecords) var/datum/D = new() @@ -37,6 +41,49 @@ excluded_fields[v] = v excluded_fields["cmp_field"] = "cmp_field" excluded_fields["excluded_fields"] = "excluded_fields" + excluded_fields["excluded_print_fields"] = "excluded_print_fields" + localized_fields[/datum/record] = list( + "id" = "Id", + "notes" = "Notes" + ) + localized_fields[/datum/record/general] = list( + "_parent" = /datum/record, + "name" = "Name", + "rank" = "Rank", + "age" = "Age", + "sex" = "Sex", + "fingerprint" = "Fingerprint", + "physical_status" = "Physical Status", + "mental_status" = "Mental Status", + "species" = "Species", + "citizenship" = "Citizenship", + "employer" = "", + "religion" = "Religion", + "ccia_record" = "CCIA Notes", + "notes" = "Employment/skills summary", + ) + localized_fields[/datum/record/medical] = list( + "_parent" = /datum/record, + "blood_type" = "Blood type", + "blood_dna" = "DNA", + "disabilities" = "Disabilities", + "allergies" = "Allergies", + "diseases" = "Diseases", + "comments" = "Comments" + ) + localized_fields[/datum/record/security] = list( + "_parent" = /datum/record, + "criminal" = "Criminal Status", + "crimes" = "Crimes", + "incidents" = "Incidents", + "comments" = "Comments" + ) + localized_fields[/datum/record/virus] = list( + "_parent" = /datum/record, + "description" = "Description", + "antigen" = "", + "spread_type" = "", + ) /datum/controller/subsystem/records/proc/generate_record(var/mob/living/carbon/human/H) if(H.mind && SSjobs.ShouldCreateRecords(H.mind)) @@ -271,3 +318,20 @@ var/datum/religion/religion = SSrecords.religions[target_religion] if(religion) return religion.get_records_name() + +/datum/controller/subsystem/records/proc/compute_localized_field(var/type) + if(!localized_fields[type]) + return + if(localized_fields[type]["_parent"]) + . = compute_localized_field(localized_fields[type]["_parent"]) + else + . = list() + + for(var/field in localized_fields[type]) + if(field == "_parent") + continue + var/value = localized_fields[type][field] + //if(istype(value)) + // .[field] = compute_localized_field(value) + // continue + .[field] = value \ No newline at end of file diff --git a/code/datums/records.dm b/code/datums/records.dm index 828f0d6be45..e3020557b02 100644 --- a/code/datums/records.dm +++ b/code/datums/records.dm @@ -5,6 +5,7 @@ var/cmp_field = "id" var/list/excluded_fields + var/list/excluded_print_fields /datum/record/New() ..() @@ -12,6 +13,10 @@ excluded_fields = list() for(var/f in tmp_ex) excluded_fields[f] = f + tmp_ex = excluded_print_fields + excluded_print_fields = list() + for(var/f in tmp_ex) + excluded_print_fields[f] = f /datum/record/proc/Copy(var/datum/copied) if(!copied) @@ -60,10 +65,37 @@ else if(!to_update) record[variable] = src.vars[variable] + +/datum/record/proc/Printify(var/list/excluded = list()) // Mostyl to support old things or to use with serialization + . = "" + var/tmp_ex = excluded + excluded = list() + for(var/e in tmp_ex) + excluded[e] = e + var/exclusions = (SSrecords.excluded_fields | src.excluded_fields | excluded | src.excluded_print_fields) + var/extendedVars = list() // To put last + for(var/variable in src.vars) + if(!exclusions[variable]) + if(istype(src.vars[variable], /datum/record)) + extendedVars[variable] = src.vars[variable] + // . += "

[variable]

" + // . += src.vars[variable].Printify() + else if(istype(src.vars[variable], /list)) + . += "[get_field_name(variable)]:
" + . += jointext(src.vars[variable], "
") + else if(istext(src.vars[variable]) || isnum(src.vars[variable])) + . += "[get_field_name(variable)]: [src.vars[variable]]
" + for(var/variable in extendedVars) + . += "

[get_field_name(variable)]

" + . += src.vars[variable].Printify() + +/datum/record/proc/get_field_name(var/field) + . = SSrecords.localized_fields[src.type][field] + if(!.) + return capitalize(replacetext(field, "_", " ")) + // Record for storing general data, data tree top level datum /datum/record/general - var/datum/record/medical/medical - var/datum/record/security/security var/name = "New Record" var/real_rank = "Unassigned" var/rank = "Unassigned" @@ -80,9 +112,12 @@ var/list/ccia_actions = list() var/icon/photo_front var/icon/photo_side - var/list/advanced_fields = list("species", "citizenship", "faction", "religion", "ccia_record", "ccia_actions") + var/datum/record/medical/medical + var/datum/record/security/security + var/list/advanced_fields = list("species", "citizenship", "employer", "religion", "ccia_record", "ccia_actions") cmp_field = "name" - excluded_fields = list("photo_front", "photo_side", "advanced_fields") + excluded_fields = list("photo_front", "photo_side", "advanced_fields", "real_rank") + excluded_print_fields = list("ccia_actions") /datum/record/general/New(var/mob/living/carbon/human/H, var/nid) ..() diff --git a/code/game/machinery/computer/records.dm b/code/game/machinery/computer/records.dm index 8354abbe8ce..54f413cb197 100644 --- a/code/game/machinery/computer/records.dm +++ b/code/game/machinery/computer/records.dm @@ -289,6 +289,8 @@ * Listener for record changes */ + +/* /listener/record/rconsole/on_delete(var/datum/record/r) . = FALSE var/obj/machinery/computer/records/t = target @@ -306,4 +308,4 @@ var/obj/machinery/computer/records/t = target if(istype(t) && !t.isEditing) if(t.active == r || t.active_virus == r) - SSvueui.check_uis_for_change(t) \ No newline at end of file + SSvueui.check_uis_for_change(t)*/ \ No newline at end of file diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm deleted file mode 100644 index ae8e1076c29..00000000000 --- a/code/game/machinery/records_scanner.dm +++ /dev/null @@ -1,143 +0,0 @@ -//not a computer -obj/machinery/scanner - name = "Identity Analyser" - var/outputdir = 0 - icon = 'icons/obj/stationobjs.dmi' - icon_state = "scanner_idle" - density = 1 - anchored = 1 - var/lastuser = null - -obj/machinery/scanner/New() - if(!outputdir) - switch(dir) - if(1) - outputdir = 2 - if(2) - outputdir = 1 - if(4) - outputdir = 8 - if(8) - outputdir = 4 - if(!outputdir) - outputdir = 8 - -/obj/machinery/scanner/machinery_process() - if(stat & NOPOWER) - return - use_power(50) - -/obj/machinery/scanner/power_change() - ..() - if(stat & NOPOWER) - spawn(rand(0, 15)) - icon_state = "scanner_off" - else - icon_state = "scanner_idle" - -obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) - if(stat & NOPOWER) - return - if(!ishuman(user) || lastuser == user.real_name) - return - use_power(500) - flick("scanner_on",src) - lastuser = user.real_name - var/mname = user.real_name - var/dna = user.dna.unique_enzymes - var/bloodtype = user.dna.b_type - var/fingerprint = md5(user.dna.uni_identity) - var/list/marks = list() - var/age = user.age - var/gender = user.gender - /* no dbstuff yet - var/DBQuery/cquery = dbcon.NewQuery("SELECT * from jobban WHERE ckey='[user.ckey]'") - if(!cquery.Execute()) return - else - while(cquery.NextRow()) - var/list/row = cquery.GetRowData() - marks += row["rank"] - */ - var/text = {" -
Report

- Name: [mname] - Age: [age] - Sex: [gender] - DNA: [dna] - Blood Type: [bloodtype] - Fingerprint: [fingerprint] - - Black Marks:
"} - for(var/A in marks) - text += "[A]
" - to_chat(user, "You feel a sting as the scanner extracts some of your blood.") - var/turf/T = get_step(src,outputdir) - var/obj/item/paper/print = new(T) - print.set_content_unsafe("[mname] Report", text) - print.stamped = 1 - - for(var/datum/data/record/test in data_core.general) - if (test.fields["name"] == mname) - return - - var/datum/data/record/G = new() - var/datum/data/record/M = new() - var/datum/data/record/S = new() - var/datum/data/record/L = new() - G.fields["rank"] = "Unassigned" - G.fields["real_rank"] = G.fields["rank"] - G.fields["name"] = mname - G.fields["id"] = generate_record_id() - M.fields["name"] = G.fields["name"] - M.fields["id"] = G.fields["id"] - S.fields["name"] = G.fields["name"] - S.fields["id"] = G.fields["id"] - if(gender == FEMALE) - G.fields["sex"] = "Female" - else - G.fields["sex"] = "Male" - G.fields["age"] = text("[]", age) - G.fields["fingerprint"] = text("[]", fingerprint) - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - M.fields["b_type"] = text("[]", bloodtype) - M.fields["b_dna"] = dna - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = "No notes." - S.fields["criminal"] = "None" - S.fields["mi_crim"] = "None" - S.fields["mi_crim_d"] = "No minor crime convictions." - S.fields["ma_crim"] = "None" - S.fields["ma_crim_d"] = "No major crime convictions." - S.fields["notes"] = "No notes." - - //Begin locked reporting - L.fields["name"] = mname - L.fields["sex"] = gender - L.fields["age"] = age - L.fields["id"] = md5("[mname][user.mind.assigned_role]") - L.fields["rank"] = "Unknown" - L.fields["real_rank"] = L.fields["rank"] - L.fields["b_type"] = bloodtype - L.fields["b_dna"] = dna - L.fields["enzymes"] = user.dna.struc_enzymes - L.fields["identity"] = user.dna.uni_identity - L.fields["image"] = getFlatIcon(user,0)//What the person looks like. Naked, in this case. - //End locked reporting - - data_core.general += G - data_core.medical += M - data_core.security += S - data_core.locked += L - - G.inDataCore = 1 - M.inDataCore = 1 - S.inDataCore = 1 - L.inDataCore = 1 diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index 718564ad06a..f7101178076 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -7,6 +7,8 @@ icon = 'icons/obj/modular_laptop.dmi' icon_state = "laptop-open" icon_state_broken = "laptop-broken" + randpixel = 6 + center_of_mass = list("x"=14, "y"=10) base_idle_power_usage = 25 base_active_power_usage = 200 max_hardware_size = 2 diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index ea81691aa7e..d82a90202cb 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -22,16 +22,19 @@ // Engineering /obj/item/modular_computer/console/preset/engineering/ + name = "engineering console" _app_preset_name = "engineering" enrolled = 1 // Medical /obj/item/modular_computer/console/preset/medical/ + name = "medical console" _app_preset_name = "medical" enrolled = 1 // Research /obj/item/modular_computer/console/preset/research/ + name = "research console" _app_preset_name = "research" enrolled = 1 @@ -41,6 +44,7 @@ // Command /obj/item/modular_computer/console/preset/command/ + name = "command console" _app_preset_name = "command" enrolled = 1 @@ -52,6 +56,7 @@ card_slot = new/obj/item/computer_hardware/card_slot(src) /obj/item/modular_computer/console/preset/captain/ + name = "captain's console" _app_preset_name = "captain" enrolled = 1 @@ -64,16 +69,29 @@ // Security /obj/item/modular_computer/console/preset/security/ + name = "security console" _app_preset_name = "security" enrolled = 1 +/obj/item/modular_computer/console/preset/security/investigations + name = "investigations console" + _app_preset_name = "security_inv" + enrolled = 1 + +/obj/item/modular_computer/console/preset/security/hos + name = "head of security's console" + _app_preset_name = "security_head" + enrolled = 1 + // Civilian /obj/item/modular_computer/console/preset/civilian/ + name = "civilian console" _app_preset_name = "civilian" enrolled = 1 // Supply /obj/item/modular_computer/console/preset/supply/ + name = "supply console" _app_preset_name = "supply" enrolled = 1 diff --git a/code/modules/modular_computers/computers/subtypes/preset_laptop.dm b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm new file mode 100644 index 00000000000..c0bdd7d681c --- /dev/null +++ b/code/modules/modular_computers/computers/subtypes/preset_laptop.dm @@ -0,0 +1,107 @@ +/obj/item/modular_computer/laptop/preset + anchored = 0 + screen_on = 0 + icon_state = "laptop-closed" + +/obj/item/modular_computer/laptop/preset/install_default_hardware() + ..() + processor_unit = new/obj/item/computer_hardware/processor_unit(src) + hard_drive = new/obj/item/computer_hardware/hard_drive(src) + network_card = new/obj/item/computer_hardware/network_card(src) + battery_module = new/obj/item/computer_hardware/battery_module(src) + battery_module.charge_to_full() + nano_printer = new/obj/item/computer_hardware/nano_printer(src) + nano_printer.max_paper = 10 + nano_printer.stored_paper = 5 + +/obj/item/modular_computer/laptop/preset/install_default_programs() + ..() + +// Engineering +/obj/item/modular_computer/laptop/preset/engineering/ + name = "engineering laptop" + desc = "A portable computer belonging to the engineering department. It appears to have been used as a door stop at one point or another." + _app_preset_name = "engineering" + enrolled = 1 + +/obj/item/modular_computer/laptop/preset/engineering/ce/ + name = "chief engineer's laptop" + desc = "A portable computer belonging to the chief engineer." + _app_preset_name = "engineering_head" + +// Medical +/obj/item/modular_computer/laptop/preset/medical/ + name = "medical laptop" + desc = "A portable computer belonging to the medical department." + _app_preset_name = "medical" + enrolled = 1 + +/obj/item/modular_computer/laptop/preset/medical/cmo/ + name = "chief medical officer's laptop" + desc = "A portable computer belonging to the chief medical officer." + _app_preset_name = "medical_head" + +// Research +/obj/item/modular_computer/laptop/preset/research/ + name = "research laptop" + desc = "A portable computer belonging to the research department." + _app_preset_name = "research" + enrolled = 1 + +/obj/item/modular_computer/laptop/preset/research/install_default_hardware() + ..() + ai_slot = new/obj/item/computer_hardware/ai_slot(src) + +/obj/item/modular_computer/laptop/preset/research/rd/ + name = "research director's laptop" + desc = "A portable computer belonging to the research director. The edges are stained and partially melted." + _app_preset_name = "research_head" + +// Command +/obj/item/modular_computer/laptop/preset/command/ + name = "command laptop" + _app_preset_name = "command" + enrolled = 1 + +/obj/item/modular_computer/laptop/preset/command/hop/ + name = "head of personnel's laptop" + desc = "A portable computer beloning to the head of personnel. The fan is filled with dog hair." + _app_preset_name = "command_hop" + +/obj/item/modular_computer/laptop/preset/command/captain/ + name = "captain's laptop" + desc = "A portable computer belonging to the captain." + _app_preset_name = "captain" + +// Security +/obj/item/modular_computer/laptop/preset/security/ + name = "security laptop" + desc = "A portable computer belonging to the security department." + _app_preset_name = "security" + enrolled = 1 + +/obj/item/modular_computer/laptop/preset/security/hos/ + name = "head of security's laptop" + desc = "A portable computer belonging to the head of security. It smells faintly of gunpowder." + _app_preset_name = "security_head" + +// Civilian +/obj/item/modular_computer/laptop/preset/civilian/ + _app_preset_name = "civilian" + enrolled = 1 + +// Supply +/obj/item/modular_computer/laptop/preset/supply/ + name = "supply laptop" + desc = "A portable computer belonging to cargo." + _app_preset_name = "supply" + enrolled = 1 + +// Representative +/obj/item/modular_computer/laptop/preset/representative/ + name = "representative's laptop" + desc = "A portable computer belonging to the representative's office." + _app_preset_name = "representative" + enrolled = 1 + + diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm index 0bda8b31dae..acc9642ce5e 100644 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ b/code/modules/modular_computers/file_system/programs/app_presets.dm @@ -37,6 +37,28 @@ ) return _prg_list +/datum/modular_computer_app_presets/engineering/ce + name = "engineering_head" + display_name = "Engineering - CE" + description = "Contains the most common engineering programs and command software." + available = 0 + +/datum/modular_computer_app_presets/engineering/ce/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/power_monitor(), + new/datum/computer_file/program/alarm_monitor(), + new/datum/computer_file/program/atmos_control(), + new/datum/computer_file/program/rcon_console(), + new/datum/computer_file/program/camera_monitor(), + new/datum/computer_file/program/lighting_control(), + new/datum/computer_file/program/comm(), + new/datum/computer_file/program/records/employment() + ) + return _prg_list + /datum/modular_computer_app_presets/medical name = "medical" display_name = "Medical" @@ -47,7 +69,25 @@ new/datum/computer_file/program/filemanager(), new/datum/computer_file/program/chatclient(), new/datum/computer_file/program/civilian/cargoorder(), - new/datum/computer_file/program/suit_sensors() + new/datum/computer_file/program/suit_sensors(), + new/datum/computer_file/program/records/medical() + ) + return _prg_list + +/datum/modular_computer_app_presets/medical/cmo + name = "medical_head" + display_name = "Medical - CMO" + description = "Contains the most common medical programs and command software." + available = 0 +/datum/modular_computer_app_presets/medical/cmo/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/suit_sensors(), + new/datum/computer_file/program/comm(), + new/datum/computer_file/program/records/employment(), + new/datum/computer_file/program/records/medical() ) return _prg_list @@ -66,6 +106,24 @@ ) return _prg_list +/datum/modular_computer_app_presets/research/rd + name = "research_head" + display_name = "Research - RD" + description = "Contains the most common research programs and command software." + available = 0 +/datum/modular_computer_app_presets/research/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/ntnetmonitor(), + new/datum/computer_file/program/aidiag(), + //new/datum/computer_file/program/exosuit_monitor(), + new/datum/computer_file/program/comm(1), + new/datum/computer_file/program/records/employment() + ) + return _prg_list + /datum/modular_computer_app_presets/command name = "command" display_name = "Command" @@ -77,7 +135,26 @@ new/datum/computer_file/program/chatclient(), new/datum/computer_file/program/civilian/cargoorder(), new/datum/computer_file/program/card_mod(), - new/datum/computer_file/program/comm(1) + new/datum/computer_file/program/comm(1), + new/datum/computer_file/program/records/employment() + ) + return _prg_list + +/datum/modular_computer_app_presets/command/hop + name = "command_hop" + display_name = "Command - HoP" + description = "Contains the most common command programs." + available = 0 +/datum/modular_computer_app_presets/command/hop/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/civilian/cargocontrol(), + new/datum/computer_file/program/card_mod(), + new/datum/computer_file/program/comm(), + new/datum/computer_file/program/records/employment(), + new/datum/computer_file/program/records/security() ) return _prg_list @@ -91,12 +168,15 @@ new/datum/computer_file/program/filemanager(), new/datum/computer_file/program/chatclient(), new/datum/computer_file/program/card_mod(), - new/datum/computer_file/program/comm(1,1), + new/datum/computer_file/program/comm(1), new/datum/computer_file/program/camera_monitor(), new/datum/computer_file/program/digitalwarrant(), new/datum/computer_file/program/civilian/cargocontrol(), new/datum/computer_file/program/civilian/cargoorder(), - new/datum/computer_file/program/alarm_monitor() + new/datum/computer_file/program/alarm_monitor(), + new/datum/computer_file/program/records/employment(), + new/datum/computer_file/program/records/medical(), + new/datum/computer_file/program/records/security() ) return _prg_list @@ -112,7 +192,45 @@ new/datum/computer_file/program/civilian/cargoorder(), new/datum/computer_file/program/camera_monitor(), new/datum/computer_file/program/comm(), - new/datum/computer_file/program/digitalwarrant() + new/datum/computer_file/program/digitalwarrant(), + new/datum/computer_file/program/records/security(), + new/datum/computer_file/program/records/employment() + ) + return _prg_list + +/datum/modular_computer_app_presets/security/investigations + name = "security_inv" + display_name = "Security - Investigations" + description = "Contains the most common security and forensics programs." + available = 0 +/datum/modular_computer_app_presets/security/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/camera_monitor(), + new/datum/computer_file/program/digitalwarrant(), + new/datum/computer_file/program/records/security(), + new/datum/computer_file/program/records/employment(), + new/datum/computer_file/program/records/medical() + ) + return _prg_list + +/datum/modular_computer_app_presets/security/hos + name = "security_head" + display_name = "Security - HoS" + description = "Contains the most common security programs and command software." + available = 0 +/datum/modular_computer_app_presets/security/hos/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/camera_monitor(), + new/datum/computer_file/program/comm(), + new/datum/computer_file/program/digitalwarrant(), + new/datum/computer_file/program/records/security(), + new/datum/computer_file/program/comm(1), + new/datum/computer_file/program/records/employment() ) return _prg_list @@ -159,6 +277,21 @@ ) return _prg_list +/datum/modular_computer_app_presets/representative + name = "representative" + display_name = "Representative" + description = "Contains software intended for representatives." + available = 0 +/datum/modular_computer_app_presets/representative/return_install_programs() + var/list/_prg_list = list( + new/datum/computer_file/program/filemanager(), + new/datum/computer_file/program/chatclient(), + new/datum/computer_file/program/game/sudoku(), + new/datum/computer_file/program/civilian/cargoorder(), + new/datum/computer_file/program/records/employment() + ) + return _prg_list + /datum/modular_computer_app_presets/wall_generic name = "wallgeneric" display_name = "Wall - Generic" @@ -201,7 +334,8 @@ new/datum/computer_file/program/suit_sensors(), new/datum/computer_file/program/alarm_monitor(), new/datum/computer_file/program/lighting_control(), - new/datum/computer_file/program/aidiag() + new/datum/computer_file/program/aidiag(), + new/datum/computer_file/program/records() ) return _prg_list diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm new file mode 100644 index 00000000000..57817f73308 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -0,0 +1,340 @@ +/datum/computer_file/program/records + filename = "record" + filedesc = "Records" + extended_desc = "Used to view, edit and maintain records." + + program_icon_state = "generic" + color = LIGHT_COLOR_BLUE + available_on_ntnet = 0 + size = 6 + + requires_ntnet = 1 + requires_ntnet_feature = NTNET_SYSTEMCONTROL + requires_access_to_run = PROGRAM_ACCESS_LIST_ONE + + var/records_type = RECORD_GENERAL | RECORD_MEDICAL | RECORD_SECURITY | RECORD_VIRUS | RECORD_WARRANT | RECORD_LOCKED + var/edit_type = RECORD_GENERAL | RECORD_MEDICAL | RECORD_SECURITY | RECORD_VIRUS | RECORD_WARRANT | RECORD_LOCKED + var/datum/record/general/active + var/datum/record/virus/active_virus + var/listener/record/rconsole/listener + var/isEditing = FALSE + var/authenticated = 0 + var/default_screen = "general" + var/record_prefix = "" + var/typechoices = list( + "physical_status" = list("Active", "*Deceased*", "*SSD*", "Physically Unfit", "Disabled"), + "mental_status" = list("Stable", "*Insane*", "*Unstable*", "*Watch*"), + "medical" = list( + "blood_type" = list("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+") + ) + ) + +/datum/computer_file/program/records/medical + filename = "medrec" + filedesc = "Medical records" + extended_desc = "Used to view, edit and maintain medical records." + record_prefix = "Medical " + + required_access_run = list(access_medical_equip, access_forensics_lockers, access_detective, access_hop) + required_access_download = access_heads + available_on_ntnet = 1 + + records_type = RECORD_MEDICAL | RECORD_VIRUS + edit_type = RECORD_MEDICAL + default_screen = "medical" + program_icon_state = "medical_record" + color = LIGHT_COLOR_CYAN + +/datum/computer_file/program/records/security + filename = "secrec" + filedesc = "Security records" + extended_desc = "Used to view, edit and maintain security records" + record_prefix = "Security " + + required_access_run = list(access_security, access_forensics_lockers, access_lawyer, access_hop) + required_access_download = access_heads + available_on_ntnet = 1 + + records_type = RECORD_SECURITY + edit_type = RECORD_SECURITY + default_screen = "security" + program_icon_state = "security_record" + color = LIGHT_COLOR_RED + +/datum/computer_file/program/records/employment + filename = "emprec" + filedesc = "Employment records" + extended_desc = "Used to view, edit and maintain employment records." + record_prefix = "Employment " + + required_access_run = list(access_security, access_forensics_lockers, access_lawyer, access_hop) + required_access_download = access_heads + available_on_ntnet = 1 + + records_type = RECORD_GENERAL | RECORD_SECURITY + edit_type = RECORD_GENERAL + program_icon_state = "employment_record" + color = LIGHT_COLOR_BLUE + +/datum/computer_file/program/records/New() + . = ..() + listener = new(src) + +/datum/computer_file/program/records/ui_interact(mob/user as mob) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if (!ui) + ui = new /datum/vueui/modularcomputer(user, src, "records-main", 450, 520, filedesc) + if(!authenticated) + ui.activeui = "records-login" + ui.open() + +/datum/computer_file/program/records/vueui_transfer(oldobj) + var/ui_name = "records-main" + if(!authenticated) + ui_name = "records-login" + SSvueui.transfer_uis(oldobj, src, ui_name, 450, 520, filedesc) + return TRUE + +/datum/computer_file/program/records/vueui_data_change(list/data, mob/user, datum/vueui/ui) + if(!data) + . = data = list( + "activeview" = "list", + "defaultview" = default_screen, + "editingvalue" = "", + "choices" = typechoices + ) + + var/headerdata = get_header_data(data["_PC"]) + if(headerdata) + data["_PC"] = headerdata + . = data + + if(!authenticated) + VUEUI_SET_CHECK(ui.activeui, "records-login", ., data) + else + VUEUI_SET_CHECK(ui.activeui, "records-main", ., data) + + VUEUI_SET_CHECK(data["canprint"], !!(computer?.nano_printer), ., data) + + VUEUI_SET_CHECK(data["avaivabletypes"], records_type, ., data) + VUEUI_SET_CHECK(data["editable"], edit_type, ., data) + LAZYINITLIST(data["allrecords"]) + LAZYINITLIST(data["allrecords_locked"]) + LAZYINITLIST(data["record_viruses"]) + if(authenticated) + if(data["allrecords"].len != SSrecords.records.len) + data["allrecords"].Cut() + for(var/tR in sortRecord(SSrecords.records)) + var/datum/record/general/R = tR + LAZYINITLIST(data["allrecords"][R.id]) + VUEUI_SET_CHECK(data["allrecords"][R.id]["id"], R.id, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["name"], R.name, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["rank"], R.rank, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["sex"], R.sex, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["age"], R.age, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["fingerprint"], R.fingerprint, ., data) + if(R.medical) + VUEUI_SET_CHECK(data["allrecords"][R.id]["blood"], R.medical.blood_type, ., data) + VUEUI_SET_CHECK(data["allrecords"][R.id]["dna"], R.medical.blood_dna, ., data) + + + if(records_type & RECORD_LOCKED) + if(data["allrecords_locked"].len != SSrecords.records_locked.len) + data["allrecords_locked"].Cut() + for(var/tR in sortRecord(SSrecords.records_locked)) + var/datum/record/general/R = tR + LAZYINITLIST(data["allrecords_locked"][R.id]) + VUEUI_SET_CHECK(data["allrecords_locked"][R.id]["id"], R.id, ., data) + VUEUI_SET_CHECK(data["allrecords_locked"][R.id]["name"], R.name, ., data) + VUEUI_SET_CHECK(data["allrecords_locked"][R.id]["rank"], R.rank, ., data) + + if(records_type & RECORD_VIRUS) + if(data["record_viruses"].len != SSrecords.viruses.len) + data["record_viruses"].Cut() + for(var/tR in sortRecord(SSrecords.viruses)) + var/datum/record/virus/R = tR + LAZYINITLIST(data["record_viruses"]["[R.id]"]) + VUEUI_SET_CHECK(data["record_viruses"]["[R.id]"]["id"], R.id, ., data) + VUEUI_SET_CHECK(data["record_viruses"]["[R.id]"]["name"], R.name, ., data) + if(active_virus) + var/returned = active_virus.Listify(1, list(), data["active_virus"]) + if(returned) + data["active_virus"] = returned + . = data + else + if(data["activeview"] == "virus") + VUEUI_SET_CHECK(data["activeview"], "list", ., data) + VUEUI_SET_CHECK(data["active_virus"], 0, ., data) + + if(active) + if(!ui.assets["front"] || !ui.assets["side"]) + ui.add_asset("front", active.photo_front) + ui.add_asset("side", active.photo_side) + var/excluded = list() + if(!(records_type & RECORD_GENERAL)) + excluded += active.advanced_fields + if(!(records_type & RECORD_SECURITY)) + excluded += "security" + if(!(records_type & RECORD_MEDICAL)) + excluded += "medical" + var/returned = active.Listify(1, excluded, data["active"]) + if(returned) + data["active"] = returned + . = data + else + if(data["activeview"] in list("general", "medical", "security")) + VUEUI_SET_CHECK(data["activeview"], "list", ., data) + VUEUI_SET_CHECK(data["active"], 0, ., data) + else + VUEUI_SET_CHECK(data["active_virus"], 0, ., data) + VUEUI_SET_CHECK(data["active"], 0, ., data) + +/datum/computer_file/program/records/Topic(href, href_list) + if(..()) + return 1 + var/datum/vueui/ui = href_list["vueui"] + if(!istype(ui)) + return + if(href_list["login"]) + if(can_run(usr, TRUE)) + authenticated = TRUE + else + to_chat(usr, "[src] beeps: Access Denied") + SSvueui.check_uis_for_change(src) + if(href_list["logout"]) + authenticated = 0 + active = null + active_virus = null + ui.remove_asset("front") + ui.remove_asset("side") + ui.data = null + SSvueui.check_uis_for_change(src) + if(!authenticated) + return + if(href_list["setactive"]) + active = SSrecords.find_record("id", href_list["setactive"]) + if(active) + ui.add_asset("front", active.photo_front) + ui.add_asset("side", active.photo_side) + ui.send_asset("front") + ui.send_asset("side") + else + ui.remove_asset("front") + ui.remove_asset("side") + SSvueui.check_uis_for_change(src) + if(href_list["setactive_locked"] && (records_type & RECORD_LOCKED)) + active = SSrecords.find_record("id", href_list["setactive_locked"], RECORD_GENERAL | RECORD_LOCKED) + SSvueui.check_uis_for_change(src) + if(href_list["setactive_virus"] && (records_type & RECORD_VIRUS)) + active_virus = SSrecords.find_record("id", text2num(href_list["setactive_virus"]), RECORD_VIRUS) + SSvueui.check_uis_for_change(src) + if(href_list["editrecord"]) + var/list/key = href_list["editrecord"]["key"] + var/value = sanitize(href_list["editrecord"]["value"], encode = 0, extra = 0) + if(key.len >= 2 && canEdit(key)) + if(isnum(obj_query_get(null, src, null, key))) + value = text2num(value) + isEditing = TRUE + obj_query_set(null, src, value, null, key) + obj_query_set(null, ui.data, value, null, key) + SSrecords.onModify(vars[key[1]]) + isEditing = FALSE + . = TRUE + if(href_list["deleterecord"]) + if(canEdit(list("active", "name"))) + var/confirm = alert("Are you sure you want to delete this record?", "Confirm Deletion", "No", "Yes") + if(confirm == "Yes") + isEditing = TRUE + SSrecords.remove_record(active) + ui.data["allrecords"] -= active.id + active = null + ui.data["activeview"] = default_screen + isEditing = FALSE + SSvueui.check_uis_for_change(src) + if(href_list["newrecord"]) + if(edit_type & RECORD_GENERAL) + active = new /datum/record/general() + SSrecords.add_record(active) + ui.add_asset("front", active.photo_front) + ui.add_asset("side", active.photo_side) + ui.send_asset("front") + ui.send_asset("side") + SSvueui.check_uis_for_change(src) + if(href_list["addtorecord"]) + var/list/key = href_list["addtorecord"]["key"] + var/value = sanitize(href_list["addtorecord"]["value"], encode = 0, extra = 0) + if(key.len >= 2 && canEdit(key)) + isEditing = TRUE + obj_query_set(null, src, obj_query_get(null, src, null, key) + value, null, key) + obj_query_set(null, ui.data, obj_query_get(null, ui.data, null, key) + value, null, key) + SSrecords.onModify(vars[key[1]]) + isEditing = FALSE + . = TRUE + if(href_list["removefromrecord"]) + var/list/key = href_list["removefromrecord"]["key"] + var/value = sanitize(href_list["removefromrecord"]["value"], encode = 0, extra = 0) + if(key.len >= 2 && canEdit(key)) + isEditing = TRUE + obj_query_set(null, src, obj_query_get(null, src, null, key) - value, null, key) + obj_query_set(null, ui.data, obj_query_get(null, ui.data, null, key) - value, null, key) + SSrecords.onModify(vars[key[1]]) + isEditing = FALSE + . = TRUE + if(href_list["print"]) + if(!(href_list["print"] in list("active", "active_virus"))) + return + if(computer?.nano_printer && vars[href_list["print"]]) + var/excluded = list() + if(href_list["print"] == "active") + if(!(records_type & RECORD_GENERAL)) + excluded += active.advanced_fields + if(!(records_type & RECORD_SECURITY)) + excluded += "security" + if(!(records_type & RECORD_MEDICAL)) + excluded += "medical" + var/out = vars[href_list["print"]].Printify(excluded) + computer.nano_printer.print_text(out, "[record_prefix]Record ([vars[href_list["print"]].name])") + + +/datum/computer_file/program/records/proc/canEdit(list/key) + if(!(key[1] in list("active", "active_virus"))) + return FALSE + if(vars[key[1]] == null) + return FALSE + if(key[1] == "active_virus" && !(edit_type & RECORD_VIRUS)) + return FALSE + if(key[1] == "active") + switch(key[2]) + if("security") + if(!(edit_type & RECORD_SECURITY)) + return FALSE + if("medical") + if(!(edit_type & RECORD_MEDICAL)) + return FALSE + else + if(key.len == 2 && !(edit_type & RECORD_GENERAL)) + return FALSE + return TRUE + +/* + * Listener for record changes + */ + +/listener/record/rconsole/on_delete(var/datum/record/r) + . = FALSE + var/datum/computer_file/program/records/t = target + if(istype(t) && !t.isEditing) + if(t.active == r) + t.active = null + . = TRUE + if(t.active_virus == r) + t.active_virus = null + . = TRUE + if(.) + SSvueui.check_uis_for_change(t) + +/listener/record/rconsole/on_modify(var/datum/record/r) + var/datum/computer_file/program/records/t = target + if(istype(t) && !t.isEditing) + if(t.active == r || t.active_virus == r) + SSvueui.check_uis_for_change(t) diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index 5f49199b311..16528278031 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -25,6 +25,7 @@ if(damage > damage_malfunction) text_to_print = stars(text_to_print, 100-malfunction_probability) var/obj/item/paper/P = new /obj/item/paper(get_turf(holder2),text_to_print, paper_title) + P.info = text_to_print if (paper_color) P.color = paper_color diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 19c2ef0f4ab..37e1643aabe 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -54,7 +54,6 @@ if(title) name = title if (text && length(text)) - info = html_encode(text) info = parsepencode(text) else info = "" diff --git a/html/changelogs/aaaaaaaa.yml b/html/changelogs/aaaaaaaa.yml new file mode 100644 index 00000000000..c87faee067b --- /dev/null +++ b/html/changelogs/aaaaaaaa.yml @@ -0,0 +1,5 @@ +author: Karolis2011 +delete-after: True +changes: + - rscadd: "Added record computer programs that can print records.." + - rscadd: "Yes, now you can print records again. " diff --git a/html/changelogs/aaaaaaaa2.yml b/html/changelogs/aaaaaaaa2.yml new file mode 100644 index 00000000000..4a1c6c200b1 --- /dev/null +++ b/html/changelogs/aaaaaaaa2.yml @@ -0,0 +1,4 @@ +author: Wowzewow (Wezzy) +delete-after: True +changes: + - imageadd: "Added new sprites for record programs." diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi index 8ce91fc1833e4ff2bbd22da142653aa2d0244948..5b84764254cfb466b3e0f00fdb6a184450ce82ef 100644 GIT binary patch delta 20544 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 delta 19009 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 diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 69bf2bb9c58e42cf15ec91ee6d5413e7f55b7a8f..512ab9a47a0ba8aca890d7a88b0175ded205c369 100644 GIT binary patch delta 6234 zcmb_5%-~Q5FqDYD$h;&K{3yX+BiG;A=A|YKOA+lTqK|o4HKx*j@>1IJnTuM^9 zq?VFcV%hkuzrWu3&O7tYyz}0fJD+o&`#E!;``mNR^Em~xWL+y{2||Edpvlu$cO87} zUOIcda`yB9fdbMq%mzJXWf(R33#;i4u+E^wTruKR@Ve*y&pxF1&j37nj&Zp%N9bJB^(cgQnZ>^3*%}>(o1GUgH6R zy`BZwyz$F@hjB{&0-*sg`t?P^D)o-9>y;BmyxNiD!NNflKKX2xGE;mB<5H-NeI)S3 z!Pxufq9SxWt6OBYCf)xf5Rzj(oEE;7Hk;O4*w~^N> zH|8msDNXe)*oeSog8h7Z!=JJs&4+emwWepqooCWtiD{!#oQu_c$u$4w1)ho>B+*6P50;@0N zhn}nH%jmC{M_IoV@#S9`XN{cgRH(m)V=ucL&k$xZZ5MBA&~bU{evXy_otdT8yv?*s zhSp(!l)>EmNqmbxW?^A(es5u++~6YUg@@lM-2e17vgHkMs&O%Yx)&6jjy*#zou2<~ zS;TXI{_03<<*w%*-FmZbxcp?r$o4UA8hov8qNw#4A7U6q(JtqI%mrRO^}?;h{VY9@ z4nL~wkz`+~Klg@$d3u~?mzI`tG^h=-TthP9dyb7_2_08uk*UwV{7U-Zn-=_6`f1(I zcz*n*^BEop7P_Q6o>+FJ$PkWBE+N!ii$@+~s2;T)9g&AC%7)JYvWzJeWX;a!4hqSp zHrIo>1__7u*~9T~1MIU~%gBu`p_SON?8#Lq7_;!DzB6_{&ihuKVFcG-h%?D+l_edT zcgU9lpTuH49C*W`#2IEl)W#@VdIW4@-_WYFVjO6GC=|Dc3}PH~xY8(g?SV(lou?{4`e!H~NACKAx@19S6;0IMelD@IE-IKtE$qVq5b1BGze;G&p2Hu}OITEU4>b>iU#OUT|v zB`-2d#kd0f;S@QsYM6clVbFRRV05ZbY|ha6nUA=5&k85}K@~BF2pWz}Hu#^ivCq1m zIx6Tpi;p&I2!EUmefOAgS|-{$SGx8~jGqcCQ148y?(UA$cepZ%sk5ZsHBxxujw1wD2g`B&|bZ;gOup)A-dP*4kFu*q!sks#9gH~p&wdU8`aHv z-0{W*ml;z!_FfO24;_lqF?Qcz;44wME%qcC@2AG+Gh;hlq<63C;6eJMSs4$S6{S+i zWYo3`m!5<6fEUCPP%@vhC@emsSz&YSgQ*gyYwP+nGwHkMt1^xdkJQX@hZ#-tXFkrT z-EkMx6e8nnw^u!(IXFFlxG|bED^`nH0Ak6GsPD{T3MHq;CecdCrcVQj{S~sw^_r7O z+kWS$i6gC6UD2xC zD~0on%T1wcotk%S&v6%tcMk)rvzZ>WfUjxse#=9Id}?)_n(j4%S``{A=76ugU3nt0 zO%&8fyA!NBtspiIRU*kh?cM1Ma3&#ldp z?GS*64yP=5e*DYC!s2+jKoz0R?8>JwOZOOo^*|S@0)3dlRFL#`p(?`TeH~Rsld1sv z$)Y}7^ETK}r3@d##hxe!9!_1@#@;rY`Kw)X(`jQUBl-*9#!7b-yGGj~S+otHudd$8bB_ZpEr;e^tW<0K6N(!om+5dr_DY1byiIY4s8W)eW)(9 zV!kkwPA;QeaKX;Yi&bA=KXW44c^_@O!Sdi}Ca`!f%Os;A`&%(mHB?!CDVxD3t27zB>ADqomqf!;M(;zJI{Ue&t?hFUO^w#2Mrj z6f)(yb9nBSC**b&2EWCSIPaki4GnXvt1pd>jTQVHoP_G6@Mw*N-(#%Mh$vu)b#{;| zFMqH-F*}>qK#1d0GlIcbKq+6pYAJB*JbJ_s$E%W4A+G|c(19X*Y?Ds(DH6ktxBkpK z6+-*+BdfUm=H53qj~jq>HxMrbtwtMMH4i6-!4x+gufI}Vt7)sUuaB!Q_;@ z?kmTA4-16I9=8gXJDM;0;WRWKg04Upo6hp_=#-D42;enR^@3A>%hA3>&&`$kxviME zxc-;4@&+J!a*p%M74naRY+U@EKYm2IgudHqdbRaw4KIzZ>||kPZl0$^In7$daMC-_ z&M5+cSRJ=9t*tL_>5j;R)CiE6!m1q4Tit7g3=TfGx2MElFtn6A8{XC2*F{u48}#+6Fc~{p8NZWf`;hPYXWpW? zSShNxZ?W6YPv!+{*u&qwfWT@ygVpX*=QIy`nUu`+N3{^@Gf!&QQm>`mu$-T){8&J( z4Fo3n;q105ZMV(i^O461`UVd@74k_xzo+BHbKCCf$4%F7FIkjdMV*hl%6<&*M_F1z zp%cktPJI|Xef{Si9?YLVfByaLxwfVC>(@p%4kGIYpb-n>^f{ zDn}oCDF399^*gugZEl2Rzm_eQo=JdF-v{)3VsxE(%7=bXMi%dSb9-#ZKOE!5{~nD& z&RB627-3&hi%o%?nqpIn`S3Gvb*@UcHM!ED+h}qAKV&06bzq0L*E^Q5cj&0YNYjY+ zeOF3a8cIf2Qc{wZlDt4~BJ$$<1kU4hp&Cmk9)z1lhMS(9`2;cOw@6I-YZB*~@ns($ zH^s19@L$J6ZA!Q-9a`JjDKZBy#ol9Mq-JA&U*)%JY2`C`+a)7FK~X^=(Fbh7l#nq5 zRl7goPO((qJ{zDOEYh#I(3>TN03`H!>q!h`Y&bAS{1^5IebAYErOS_eQ-7u$`);1N ztm<-(EA`rf(LuP$-VtSfWRL6}Zn$qy0u#J#V5o)9Jz}k?z9wwCvV-EsMd{uPy7yh^ z6#i+-emy-s8(Z7&;{@JeP*s<(oCl1>V>?-fimTO~qZDi>ccc}p#6n7V_(&oIqi61yExW> z$dc5t0(%@_wzx~Q&H3jx{#c-c@&!OOb3~-N_sv;$#48~%3opBk)$Ay`ClUN zpTPe~|HhIZ1?lAhpPQRi8`3oIFv@HGBXGd0@E?&Eptu{!?CU=z>hIphug>k0e2^=dr8MMo1do3JuPJkEX} zY($H{q8qOPrN_Rz%&_?P?>CR0p$xSvBH;$<%FmlAvi_;#>FEimax!Yv+4j))9d|8z z4FlQQ?`M3%Z;)U8j zUzWt5oSYPr-7z&a4XmFPJ zE#>=wLh4UW{8D7KK&oKmS@7hQmlG(H@)<@UCjEwfeX9u)McpL!v{AWi@9T0MEWI7BC}d zb7!Z!|FZ}iE#;_c;qGihZhk)1+mIu}3444jk5W#1yM{Khre@5Pw3imP*I<*StiR9f z?{p;-TY1uyJbRbB-g}?@U9LT^u9iDyI$e$xaXE;c@w6fIst4E+BwSowWdT3%2_mD9 zP;-=mKr~E5MD$v=oU>%^sT6gH z%`Y&#pDjB9CAsnV)D#5>y}ivwA3icV8hS%Fu4r4&zaZOuN%Co1;B5`uUu|D7Km7QkB!2$XykL+Yob-%{+2@8|1tvvKQi46x%1`EOA4{^HENTh?I^7Agh<}V9|g@7?@$?@ zY$I9{vCcn#@@D9w3^qpdAH^vdZ34K1K9^}GrMVDEXnj_0E`^%k4ykS*&_w&=+Hw|wiHR@11axVo+2Yl@x;j#Q(5bec=l?0( zcHTYh0JrxA6oL#qzm&Pyc1aqkQl853_~v?Ys)i-(`$DSyi`|aRiQiE9_$rFZ(gK}C z;f;)Be<<W8V-T^6Y#(ql5vLYnnU>^tSR#f%Ae3Lq(nrY1lo zCML$--j@Dt88R3jIN=sKU?Pj5nmJ>bW|qf>cb8(nZ@%*N-5Nq-(WRh}a%h7s20g(F zyTuy6J(Q`=0OI85m%e{tZzr&h`AHu>i>0|&X@Edp7Umd0tuG3N;v4Rzg+CAW+xeZHT4jr7 zC@3fx*Bd7-jfsJ$vY5I)VD0CZ3N%AfPO##-#v2+q9DX*#4(`RD26K_xo7>x6XJ-M= z);HFa3Vk=IHo!srJd@U8NBlQwguuu*!vBOM0iP8mP4Ohvwt=D2V~x~->SGOh&_5;H zZXY#nfS>87C6y3n`K?AWt_CfXEM-Qx!E`@-_ zSq;VLiEb^D7G#X9vN9;0fIyTwykXhvBTZ+K!d&BC9eY~^uCKmZ?>Ux0A@|DE07pISpkF)Q}ue$=QFS;b* zZ$}pE-P2N|UTTARnM>DooibH?3W~5ZtHfzXM0RfOx5WU--gBkEW8q;0cJp#b-tw>1 z%pf_<>T?+}wcwrk+TwIywy#%PxHt=scLmc}a^)t1@~C-G7FR#Mu1b6B{cusL`WztT zwu^>3R9cxK!-XBK@2>ZFQ1^<$Asq5a@|w$DPw^$*q=K2GurjX!)X~zW3s+*gv3sIW;H2TARd|I-rzy8gj42k8|XjYU>N&Z@<;Oz z41wrso>eS#U+q@rCDFR^}t|61jpD1FWFw5V)+1|qce~ zhGAM|k@p@?Yi}BoxK~XIp=T#7aYu-krQ{i@Hv%iu@8^)}R z6r~6krRWexkn>TYhH5y8&XXFj0hhpY#huCI=608Vp%EYys`P$aE0OjkS;E_8*mKqu z)9y;GG>g+yMR48_aq&X8rrZTxDFZqseu&26q`%p29aYLirj7hNhkH|TUthUdPou^D r?@XR3_Mi6tKlkom&;0?R8|z&iN0 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 diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 5147a696860ae722c892ceabb5b67c79f761d1df..8bf81a8dfc4564725d4ab7b904bb53a2e3e76cc9 100644 GIT binary patch delta 3819 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 +