diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm index 6a1a62134d7..8c29401ce5a 100644 --- a/code/defines/obj/computer.dm +++ b/code/defines/obj/computer.dm @@ -134,6 +134,7 @@ req_access = list(access_medical) circuit = "/obj/item/weapon/circuitboard/med_data" var/obj/item/weapon/card/id/scan = null + var/obj/item/weapon/disk/records/disk = null var/authenticated = null var/rank = null var/screen = null @@ -182,6 +183,7 @@ req_access = list(access_security) circuit = "/obj/item/weapon/circuitboard/secure_data" var/obj/item/weapon/card/id/scan = null + var/obj/item/weapon/disk/records/disk = null var/authenticated = null var/rank = null var/screen = null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 6a53e2198b6..926aaacbe44 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -1,12 +1,15 @@ -/obj/machinery/computer/med_data/attackby(O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/idcard = O - if(!scan) - usr.drop_item() - idcard.loc = src - scan = idcard - else - ..() +/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) + if(istype(O, /obj/item/weapon/card/id) && !scan) + usr.drop_item() + O.loc = src + scan = O + user << "You insert [O]." + else if(istype(O, /obj/item/weapon/disk/records) && !disk) + usr.drop_item() + O.loc = src + disk = O + user << "You insert [O]." + ..() /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) @@ -43,7 +46,24 @@ //Foreach goto(132) dat += text("
Back", src) if(3.0) - dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) + dat += "Records Maintenance
" + if(disk) + dat += "Disk Contents:Backup To Disk
" + if(disk.general && disk.medical) + dat += "Restore From Disk
" + else + dat += "Disk does not contain medical records.
" + dat += "Eject Disk
" + else + dat += "Please insert a records disk.
" + dat += "
Delete All Records

Back" if(4.0) dat += "
Medical Record

" if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) @@ -108,8 +128,11 @@ src.temp = null if (href_list["scan"]) if (src.scan) - src.scan.loc = src.loc - src.scan = null + if(!usr.get_active_hand()) + usr.put_in_hand(scan) + else + scan.loc = get_turf(src) + scan = null else var/obj/item/I = usr.equipped() if (istype(I, /obj/item/weapon/card/id)) @@ -432,6 +455,24 @@ if ((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) active1 = E screen = 4 + if (href_list["eject_disk"]) + if (!disk) + return + if(!usr.get_active_hand()) + usr.put_in_hand(disk) + else + disk.loc = get_turf(src) + disk = null + if (href_list["backup"]) + if (!disk) + return + disk.backup(1, 0) + temp = "Data backup complete." + if (href_list["restore"]) + if (!disk) + return + disk.restore(1, 0) + temp = "Data restore complete." src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 95b62855d9f..8e2b81390c2 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -1,12 +1,15 @@ -/obj/machinery/computer/secure_data/attackby(O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/idcard = O - if(!scan) - usr.drop_item() - idcard.loc = src - scan = idcard - else - ..() +/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob) + if(istype(O, /obj/item/weapon/card/id) && !scan) + usr.drop_item() + O.loc = src + scan = O + user << "You insert [O]." + else if(istype(O, /obj/item/weapon/disk/records) && !disk) + usr.drop_item() + O.loc = src + disk = O + user << "You insert [O]." + ..() /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) @@ -75,7 +78,24 @@ dat += text("Record Maintenance

", src) dat += text("{Log Out}",src) if(2.0) - dat += text("Records Maintenance
\nDelete All Records
\n
\nBack", src, src) + dat += "Records Maintenance
" + if(disk) + dat += "Disk Contents:Backup To Disk
" + if(disk.general && disk.security) + dat += "Restore From Disk
" + else + dat += "Disk does not contain security records.
" + dat += "Eject Disk
" + else + dat += "Please insert a records disk.
" + dat += "
Delete All Records

Back" if(3.0) dat += "
Security Record

" if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) @@ -172,7 +192,10 @@ What a mess.*/ if("Confirm Identity") if (scan) - scan.loc = loc + if(!usr.get_active_hand()) + usr.put_in_hand(scan) + else + scan.loc = get_turf(src) scan = null else var/obj/item/I = usr.equipped() @@ -435,6 +458,24 @@ What a mess.*/ temp += "" else alert(usr, "You do not have the required rank to do this!") + if ("eject_disk") + if (!disk) + return + if(!usr.get_active_hand()) + usr.put_in_hand(disk) + else + disk.loc = get_turf(src) + disk = null + if ("backup") + if (!disk) + return + disk.backup(0, 1) + temp = "Data backup complete." + if ("restore") + if (!disk) + return + disk.restore(0, 1) + temp = "Data restore complete." //TEMPORARY MENU FUNCTIONS else//To properly clear as per clear screen. temp=null @@ -476,3 +517,100 @@ What a mess.*/ updateUsrDialog() return +/obj/item/weapon/disk/records + name = "Crew Records Disk" + desc = "Stores security and medical records." + icon = 'cloning.dmi' + icon_state = "datadisk2" + item_state = "card-id" + w_class = 1.0 + var/list/general + var/list/security + var/list/medical + +/obj/item/weapon/disk/records/verb/label(t as text) + set name = "Label Disk" + set category = "Object" + set src in usr + + if (t) + src.name = text("Records Disk - '[]'", t) + else + src.name = "Crew Records Disk" + src.add_fingerprint(usr) + return + +/obj/item/weapon/disk/records/proc/backup(var/med, var/sec) + // have to manually copy each field so there's no references between data_core and the disk + general = new() + for(var/datum/data/record/E in data_core.general) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + general += G + + if(med) + medical = new() + for(var/datum/data/record/E in data_core.medical) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + medical += G + + if(sec) + security = new() + for(var/datum/data/record/E in data_core.security) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + security += G + +/obj/item/weapon/disk/records/proc/restore(var/med, var/sec) + // actually merge the content to not wipe new arrivals, etc + if(general) + for(var/datum/data/record/R in general) + for(var/datum/data/record/E in data_core.general) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.general -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.general += G + + if(med && medical) + for(var/datum/data/record/R in medical) + for(var/datum/data/record/E in data_core.medical) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.medical -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.medical += G + + if(sec && security) + for(var/datum/data/record/R in security) + for(var/datum/data/record/E in data_core.security) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.security -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.security += G + +/obj/item/weapon/storage/recordsbox + name = "Records Diskette Box" + icon_state = "disk_kit" + item_state = "syringe_kit" + +/obj/item/weapon/storage/recordsbox/New() + ..() + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index af9b7f5d126..7c737ebea74 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -1925,7 +1925,7 @@ "aLa" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aLb" = (/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aLc" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/bridge) -"aLd" = (/obj/structure/table/reinforced,/turf/simulated/floor,/area/bridge) +"aLd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/recordsbox,/turf/simulated/floor,/area/bridge) "aLe" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor,/area/bridge) "aLf" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/bridge) "aLg" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/bridge) @@ -5512,7 +5512,7 @@ "cbZ" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) "cca" = (/turf/unsimulated/wall{icon = 'icons/misc/fullscreen.dmi'; icon_state = "title"; name = "Space Station 13"},/area/start) "ccb" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership) -"ccc" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) +"ccc" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) "ccd" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership) "cce" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) "ccf" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) @@ -5584,8 +5584,8 @@ "cdt" = (/obj/structure/table,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cdu" = (/turf/unsimulated/wall,/area/centcom) "cdv" = (/obj/effect/landmark{name = "Nuclear-Closet"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) -"cdw" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) -"cdx" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) +"cdw" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) +"cdx" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) "cdy" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom) "cdz" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) "cdA" = (/obj/structure/stool/chair{dir = 4},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) @@ -5647,7 +5647,7 @@ "ceE" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/suppy) "ceF" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/suppy) "ceG" = (/turf/unsimulated/floor{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/centcom/suppy) -"ceH" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) +"ceH" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) "ceI" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "ceJ" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "ceK" = (/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) @@ -5664,7 +5664,7 @@ "ceV" = (/obj/structure/table,/obj/machinery/juicer{pixel_y = 6},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/living) "ceW" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) "ceX" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"ceY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) +"ceY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) "ceZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/supply/dock) "cfa" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/supply/dock) "cfb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/supply/dock) @@ -6036,7 +6036,7 @@ "cmd" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "cme" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cmf" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cmg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) +"cmg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) "cmh" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/ferry) "cmi" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "cmj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) @@ -6046,7 +6046,7 @@ "cmn" = (/obj/structure/stool/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "cmo" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cmp" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cmq" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) +"cmq" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) "cmr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/transport1/centcom) "cms" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) "cmt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/transport1/centcom)