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 8ce91fc1833..5b84764254c 100644 Binary files a/icons/obj/modular_console.dmi and b/icons/obj/modular_console.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 69bf2bb9c58..512ab9a47a0 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 5147a696860..8bf81a8dfc4 100644 Binary files a/icons/obj/modular_tablet.dmi and b/icons/obj/modular_tablet.dmi differ diff --git a/maps/space_ruins/derelict.dmm b/maps/space_ruins/derelict.dmm index 83490de0b98..a48f4769e23 100644 --- a/maps/space_ruins/derelict.dmm +++ b/maps/space_ruins/derelict.dmm @@ -5691,7 +5691,7 @@ /area/derelict/hallway/southeast) "rm" = ( /obj/structure/table/wood, -/obj/machinery/computer/records/medical/laptop, +/obj/structure/computerframe, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/wood, /area/derelict/hallway/southeast) @@ -6379,7 +6379,7 @@ /area/derelict/hallway/southeast) "ta" = ( /obj/structure/table/standard, -/obj/machinery/computer/records/medical/laptop, +/obj/structure/computerframe, /obj/machinery/light{ icon_state = "tube1"; dir = 4 @@ -6565,7 +6565,7 @@ /area/template_noop) "tA" = ( /obj/structure/table/standard, -/obj/machinery/computer/records/employment, +/obj/structure/computerframe, /turf/simulated/floor/carpet/blue, /area/derelict/hallway/southeast) "tB" = ( @@ -7538,7 +7538,7 @@ /area/derelict/hallway/southwest) "vO" = ( /obj/structure/table/standard, -/obj/machinery/computer/records/employment, +/obj/structure/computerframe, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/derelict/hallway/southeast) diff --git a/vueui/src/components/view/records/general.vue b/vueui/src/components/view/records/general.vue index 5a4a7d892c9..1dc00b1236a 100644 --- a/vueui/src/components/view/records/general.vue +++ b/vueui/src/components/view/records/general.vue @@ -29,6 +29,7 @@ +