diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm new file mode 100644 index 00000000000..c0bd1391bc9 --- /dev/null +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -0,0 +1,211 @@ +var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob + +//SleeveMate! +/obj/item/device/sleevemate + name = "\improper SleeveMate 3200" + desc = "A hand-held sleeve management tool for performing one-time backups and managing mindstates." + icon = 'icons/obj/device_alt.dmi' + icon_state = "sleevemate" + item_state = "healthanalyzer" + flags = CONDUCT + slot_flags = SLOT_BELT + throwforce = 3 + w_class = ITEMSIZE_SMALL + throw_speed = 5 + throw_range = 10 + matter = list(DEFAULT_WALL_MATERIAL = 200) + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + + var/datum/mind/stored_mind + +/obj/item/device/sleevemate/attack(mob/living/M, mob/living/user) + if(ishuman(M)) + scan_mob(M, user) + else + to_chat(user,"Not a compatible subject to work with!") + +/obj/item/device/sleevemate/attack_self(mob/living/user) + if(!stored_mind) + to_chat(user,"No stored mind in \the [src].") + return + + var/choice = alert(user,"What would you like to do?","Stored: [stored_mind.name]","Delete","Backup","Cancel") + if(!stored_mind || user.get_active_hand() != src) + return + switch(choice) + if("Delete") + to_chat(user,"Internal copy of [stored_mind.name] deleted.") + stored_mind = null + update_icon() + if("Backup") + to_chat(user,"Internal copy of [stored_mind.name] backed up to database.") + transcore.m_backup(stored_mind,null,one_time = TRUE) + if("Cancel") + return + +/obj/item/device/sleevemate/proc/scan_mob(mob/living/carbon/human/H, mob/living/user) + var/output = "" + + output += "

[src.name] Scan Results
" + + //Mind name + output += "Sleeved Mind: " + if(H.mind) + output += "[H.mind.name]
" + else + output += "Unknown/None
" + + //Mind status + output += "Mind Status: " + if(H.client) + output += "Healthy
" + else + output += "Space Sleep Disorder
" + + //Body status + output += "Sleeve Status: " + switch(H.stat) + if(CONSCIOUS) + output += "Alive
" + if(UNCONSCIOUS) + output += "Unconscious
" + if(DEAD) + output += "Deceased
" + else + output += "Unknown
" + + //Mind/body comparison + output += "Sleeve Pair: " + if(H.mind && ckey(H.mind.key) != H.ckey) + output += "May not be correct body
" + else if(H.mind && ckey(H.mind.key) == H.ckey) + output += "Appears to be correct mind in body
" + else + output += "Unable to perform comparison
" + + //Actions + output += "
-- Possible Actions --
" + output += "Mind-Scan (One Time): \[Perform\]
" + output += "Body-Scan (One Time): \[Perform\]
" + + //Saving a mind + output += "Store Full Mind: " + if(stored_mind) + output += "Already Stored ([stored_mind.name])
" + else if(H.mind) + output += "\[Perform\]
" + else + output += "Unable
" + + //Soulcatcher transfer + if(stored_mind && H.nif) + var/datum/nifsoft/soulcatcher/SC = H.nif.imp_check(NIF_SOULCATCHER) + if(SC) + output += "Store in Soulcatcher: \[Perform\]
" + + to_chat(user,output) + +/obj/item/device/sleevemate/Topic(href, href_list) + usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + + //Sanity checking/href-hacking checking + if(usr.get_active_hand() != src) + to_chat(usr,"You're not holding \the [src].") + return + + var/target_ref = href_list["target"] + var/mob/living/target = locate(target_ref) in mob_list + if(!target) + to_chat(usr,"Unable to operate on that target.") + return + + if(!usr.Adjacent(target)) + to_chat(usr,"You are too far from that target.") + return + + //The actual options + if(href_list["mindscan"]) + if(!target.mind) + to_chat(usr,"Target seems totally braindead.") + return + + var/nif + if(ishuman(target)) + var/mob/living/carbon/human/H = target + nif = H.nif + + usr.visible_message("[usr] begins scanning [target]'s mind.","You begin scanning [target]'s mind.") + if(do_after(usr,8 SECONDS,target)) + transcore.m_backup(target.mind,nif,one_time = TRUE) + to_chat(usr,"Mind backed up!") + else + to_chat(usr,"You must remain close to your target!") + + return + + if(href_list["bodyscan"]) + if(!ishuman(target)) + to_chat(usr,"Target is not of an acceeptable body type.") + return + + var/mob/living/carbon/human/H = target + + usr.visible_message("[usr] begins scanning [target]'s body.","You begin scanning [target]'s body.") + if(do_after(usr,8 SECONDS,target)) + var/datum/transhuman/body_record/BR = new() + BR.init_from_mob(H, TRUE, TRUE) + to_chat(usr,"Body scanned!") + else + to_chat(usr,"You must remain close to your target!") + + return + + if(href_list["mindsteal"]) + if(!target.mind) + to_chat(usr,"Target seems totally braindead.") + return + + usr.visible_message("[usr] begins downloading [target]'s mind!","You begin downloading [target]'s mind!") + if(do_after(usr,35 SECONDS,target)) //This is powerful, yo. + if(!stored_mind && target.mind) + stored_mind = target.mind + target.ghostize() + stored_mind.current = null + update_icon() + to_chat(usr,"Mind downloaded!") + + return + + if(href_list["mindput"]) + if(!stored_mind) + to_chat(usr,"\The [src] no longer has a stored mind.") + return + + var/mob/living/carbon/human/H = target + + if(!istype(target)) + return //href hacking only + + if(!H.nif) + return //Lost it? or href hacking + + var/datum/nifsoft/soulcatcher/SC = H.nif.imp_check(NIF_SOULCATCHER) + if(!SC) + return //Uninstalled it? + + //Lazzzyyy. + if(!sleevemate_mob) + sleevemate_mob = new() + + stored_mind.active = TRUE //Setting this causes transfer_to, to key them into the mob + stored_mind.transfer_to(sleevemate_mob) + SC.catch_mob(sleevemate_mob) + stored_mind = null + to_chat(usr,"Mind transferred into Soulcatcher!") + update_icon() + +/obj/item/device/sleevemate/update_icon() + if(stored_mind) + icon_state = "[initial(icon_state)]_on" + else + icon_state = initial(icon_state) diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index cf669bf1461..f1684c4cf5f 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -227,7 +227,8 @@ prob(2);/obj/item/weapon/grenade/anti_photon, prob(1);/obj/item/weapon/cell/hyper/empty, prob(1);/obj/item/weapon/disk/nifsoft/compliance, - prob(1);/obj/item/device/nif/bad) + prob(1);/obj/item/device/nif/bad, + prob(1);/obj/item/device/sleevemate) var/obj/item/I = new path() return I diff --git a/code/modules/client/preference_setup/vore/04_resleeving.dm b/code/modules/client/preference_setup/vore/04_resleeving.dm index 08a25ef3636..22fba4e6a7a 100644 --- a/code/modules/client/preference_setup/vore/04_resleeving.dm +++ b/code/modules/client/preference_setup/vore/04_resleeving.dm @@ -27,7 +27,7 @@ if(QDELETED(character) || QDELETED(pref)) return // They might have been deleted during the wait if(pref.resleeve_scan) - var/datum/transhuman/body_record/BR = new() //Clearly related to size. + var/datum/transhuman/body_record/BR = new() BR.init_from_mob(character, pref.resleeve_scan, pref.resleeve_lock) if(pref.resleeve_lock) character.resleeve_lock = character.ckey diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 2d6b1c0351d..26ef3f619e5 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -37,6 +37,14 @@ build_path = /obj/item/clothing/under/bluespace sort_string = "TAAAC" +/datum/design/item/sleevemate + name = "SleeveMate 3200" + id = "sleevemate" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/sleevemate + sort_string = "TAAAD" + /datum/design/item/item/pressureinterlock name = "APP pressure interlock" id = "pressureinterlock" diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index e6dd47b7050..6a3628a3cfe 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -32,7 +32,7 @@ if(other_imp && other_imp.imp_in == H) qdel(other_imp) //implant fight - if(H.mind) //One out here just in case they are dead + if(H.mind && H.stat < DEAD) //One right now, on implanting. transcore.m_backup(H.mind) last_attempt = world.time diff --git a/code/modules/resleeving/infocore.dm b/code/modules/resleeving/infocore.dm index 6ca1bdf4f33..faeabe82c81 100644 --- a/code/modules/resleeving/infocore.dm +++ b/code/modules/resleeving/infocore.dm @@ -28,7 +28,8 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore if(!curr_MR) log_debug("Tried to process [N] in transcore w/o a record!") continue - + if(curr_MR.one_time) + continue var/since_backup = world.time - curr_MR.last_update if(since_backup < overdue_time) curr_MR.dead_state = MR_NORMAL @@ -40,7 +41,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore spawn(process_time) process() -/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind,var/obj/item/device/nif/nif) +/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind,var/obj/item/device/nif/nif,var/one_time = FALSE) ASSERT(mind) if(!mind.name || core_dumped) return 0 @@ -50,6 +51,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore if(mind.name in backed_up) MR = backed_up[mind.name] MR.last_update = world.time + MR.one_time = one_time //Pass a 0 to not change NIF status (because the elseif is checking for null) if(nif) @@ -67,7 +69,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore MR.nif_software = null else - MR = new(mind, mind.current, 1) + MR = new(mind, mind.current, TRUE, one_time) return 1 @@ -134,9 +136,13 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore var/nif_durability var/list/nif_software -/datum/transhuman/mind_record/New(var/datum/mind/mind,var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1) + var/one_time = FALSE + +/datum/transhuman/mind_record/New(var/datum/mind/mind,var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1,var/one_time = FALSE) ASSERT(mind) + src.one_time = one_time + //The mind! mind_ref = mind mindname = mind.name diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 4216f6fb0a0..c36f32f109a 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -503,6 +503,10 @@ occupant.identifying_gender = MR.id_gender occupant.ooc_notes = MR.mind_oocnotes occupant.apply_vore_prefs() //Cheap hack for now to give them SOME bellies. + if(MR.one_time) + var/how_long = round((world.time - MR.last_update)/10/60) + to_chat(occupant,"Your mind backup was a 'one-time' backup. \ + You will not be able to remember anything since the backup, [how_long] minutes ago.") //Re-supply a NIF if one was backed up with them. if(MR.nif_path) diff --git a/icons/obj/device_alt.dmi b/icons/obj/device_alt.dmi index 1a256c07b06..9c4d2f6b7b3 100644 Binary files a/icons/obj/device_alt.dmi and b/icons/obj/device_alt.dmi differ diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm index 0d59cd6c94b..4ad4ce5a987 100644 --- a/maps/tether/tether-01-surface.dmm +++ b/maps/tether/tether-01-surface.dmm @@ -3547,7 +3547,7 @@ "bql" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tether/surfacebase/security/breakroom) "bqm" = (/turf/simulated/wall/r_wall,/area/vacant/vacant_site2) "bqn" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/maintenance/engi,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"bqo" = (/obj/structure/table/glass,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) +"bqo" = (/obj/structure/table/glass,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) "bqp" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/obj/structure/closet/hydrant{pixel_x = 32},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) "bqq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tether/surfacebase/reading_room) "bqr" = (/obj/structure/table/glass,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/tether/surfacebase/reading_room) diff --git a/maps/tether/tether-03-station.dmm b/maps/tether/tether-03-station.dmm index 4af06a94b1c..3faca8be54d 100644 --- a/maps/tether/tether-03-station.dmm +++ b/maps/tether/tether-03-station.dmm @@ -3302,7 +3302,7 @@ "blz" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/bridge_hallway) "blA" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/crew{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "blB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 5},/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) -"blC" = (/obj/structure/table/glass,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/reception) +"blC" = (/obj/structure/table/glass,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/medical/reception) "blD" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5; icon_state = "intact"; tag = "icon-intact (NORTHEAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/hallway/secondary/escape/medical_escape_pod_hallway) "blE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/escape/medical_escape_pod_hallway) "blF" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/medical/virologyaccess) @@ -4749,7 +4749,7 @@ "bNq" = (/obj/machinery/status_display/supply_display{pixel_y = -32},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "bNr" = (/obj/machinery/conveyor{dir = 5; id = "mining_inbound"},/turf/simulated/floor,/area/quartermaster/storage) "bNs" = (/obj/structure/table/glass,/obj/item/device/flashlight/pen{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/pen{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/resleeving) -"bNt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bNt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bNu" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bNv" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/resleeving) "bNw" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/medical/resleeving) @@ -4800,7 +4800,7 @@ "bOp" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bOq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bOr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor/tiled/white,/area/medical/morgue) -"bOs" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor/tiled,/area/medical/biostorage) +"bOs" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/item/device/sleevemate,/turf/simulated/floor/tiled,/area/medical/biostorage) "bOt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/item/weapon/hand_labeler,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bOu" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/obj/item/weapon/cane,/obj/item/weapon/cane,/turf/simulated/floor/tiled,/area/medical/biostorage) "bOv" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/structure/table/standard,/obj/item/clothing/gloves/sterile/nitrile,/obj/item/clothing/gloves/sterile/nitrile,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/floor/tiled,/area/medical/biostorage) diff --git a/vorestation.dme b/vorestation.dme index 17631a1faf0..9e5c46d5f59 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -844,6 +844,7 @@ #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\scanners_vr.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\t_scanner.dm"