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:"
+ if(disk.general)
+ dat += "- General
"
+ if(disk.medical)
+ dat += "- Medical
"
+ if(disk.security)
+ dat += "- Security
"
+ dat += "
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:"
+ if(disk.general)
+ dat += "- General
"
+ if(disk.medical)
+ dat += "- Medical
"
+ if(disk.security)
+ dat += "- Security
"
+ dat += "
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)