Files
CHOMPStation2/code/modules/resleeving/infocore.dm
Arokha Sieyes 5d6a7ed0fc Merge pull request #1038 from VOREStation/aro-lockkey
Fix sleeve lock resleeving
2017-02-25 01:49:03 -05:00

228 lines
6.2 KiB
Plaintext

////////////////////////////////
//// Mind/body data storage system
//// for the resleeving tech
////////////////////////////////
/mob/living/carbon/human/var/resleeve_lock
/mob/living/carbon/human/var/original_player
var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
//Mind-backup database
/datum/transhuman/infocore
var/overdue_time = 15 MINUTES
var/process_time = 1 MINUTE
var/core_dumped = 0
var/datum/transhuman/mind_record/list/backed_up = list()
var/datum/transhuman/mind_record/list/has_left = list()
var/datum/transhuman/body_record/list/body_scans = list()
/datum/transhuman/infocore/New()
process()
/datum/transhuman/infocore/proc/process()
if(core_dumped) return
for(var/N in backed_up)
var/datum/transhuman/mind_record/curr_MR = backed_up[N]
if(!curr_MR)
log_debug("Tried to process [N] in transcore w/o a record!")
continue
var/since_backup = world.time - curr_MR.last_update
if(since_backup < overdue_time)
curr_MR.dead_state = MR_NORMAL
else
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
notify(N)
curr_MR.dead_state = MR_DEAD
spawn(process_time)
process()
/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind)
ASSERT(mind)
if(!mind.name || core_dumped)
return 0
var/datum/transhuman/mind_record/MR
if(mind.name in backed_up)
MR = backed_up[mind.name]
MR.last_update = world.time
else
MR = new(mind, mind.current, 1)
return 1
/datum/transhuman/infocore/proc/notify(var/name)
ASSERT(name)
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
a.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical")
qdel(a)
/datum/transhuman/infocore/proc/add_backup(var/datum/transhuman/mind_record/MR)
ASSERT(MR)
backed_up[MR.mindname] = MR
log_debug("Added [MR.mindname] to transcore DB.")
/datum/transhuman/infocore/proc/stop_backup(var/datum/transhuman/mind_record/MR)
ASSERT(MR)
has_left[MR.mindname] = MR
backed_up.Remove("[MR.mindname]")
MR.cryo_at = world.time
log_debug("Put [MR.mindname] in transcore suspended DB.")
/datum/transhuman/infocore/proc/add_body(var/datum/transhuman/body_record/BR)
ASSERT(BR)
body_scans[BR.mydna.name] = BR
log_debug("Added [BR.mydna.name] to transcore body DB.")
/datum/transhuman/infocore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk)
ASSERT(disk)
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command")
a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical")
qdel(a)
disk.stored += backed_up
backed_up.Cut()
core_dumped = 1
return disk.stored.len
/////// Mind-backup record ///////
/datum/transhuman/mind_record
//User visible
var/mindname = "!!ERROR!!"
//0: Normal, 1: Might be dead, 2: Definitely dead, show on console
var/dead_state = 0
var/last_update = 0
//Backend
var/ckey = ""
var/id_gender
var/datum/mind/mind_ref
var/cryo_at
var/languages
var/mind_oocnotes
/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)
ASSERT(mind && M && imp)
if(!istype(M))
return //Only works with humanoids.
//The mind!
mind_ref = mind
mindname = mind.name
ckey = ckey(mind.key)
cryo_at = 0
//Mental stuff the game doesn't keep mentally
id_gender = M.identifying_gender
languages = M.languages.Copy()
mind_oocnotes = M.ooc_notes
last_update = world.time
if(add_to_db)
transcore.add_backup(src)
/////// Body Record ///////
/datum/transhuman/body_record
var/datum/dna2/record/mydna
//These may or may not be set, mostly irrelevant since it's just a body record.
var/ckey
var/locked
var/client/client_ref
var/datum/mind/mind_ref
var/synthetic
var/speciesname
var/bodygender
var/body_oocnotes
var/list/limb_data = list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)
var/list/organ_data = list(O_HEART, O_EYES, O_LUNGS, O_BRAIN)
var/toocomplex
var/sizemult
/datum/transhuman/body_record/New(var/mob/living/carbon/human/M,var/add_to_db = 1,var/ckeylock = 0)
ASSERT(M)
//Person OOCly doesn't want people impersonating them
locked = ckeylock
//Prevent people from printing restricted and whitelisted species
var/datum/species/S = all_species["[M.dna.species]"]
if(S)
toocomplex = (S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED)
//General stuff about them
synthetic = M.isSynthetic()
speciesname = M.custom_species ? M.custom_species : null
bodygender = M.gender
body_oocnotes = M.ooc_notes
sizemult = M.size_multiplier
//Probably should
M.dna.check_integrity()
//The DNA2 stuff
mydna = new ()
mydna.dna = M.dna.Clone()
mydna.ckey = M.ckey
mydna.id = copytext(md5(M.real_name), 2, 6)
mydna.name = M.dna.real_name
mydna.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
mydna.flavor = M.flavor_texts.Copy()
//My stuff
client_ref = M.client
ckey = M.ckey
mind_ref = M.mind
//External organ status. 0:gone, 1:normal, "string":manufacturer
for(var/limb in limb_data)
var/obj/item/organ/external/O = M.organs_by_name[limb]
//Missing limb.
if(!O)
limb_data[limb] = 0
//Has model set, is pros.
else if(O.model)
limb_data[limb] = O.model
//Nothing special, present and normal.
else
limb_data[limb] = 1
//Internal organ status
for(var/org in organ_data)
var/obj/item/organ/I = M.internal_organs_by_name[org]
//Who knows? Missing lungs maybe on synths, etc.
if(!I)
continue
//This needs special handling because brains never think they are 'robotic', even posibrains
if(org == O_BRAIN)
switch(I.type)
if(/obj/item/organ/internal/mmi_holder) //Assisted
organ_data[org] = 1
if(/obj/item/organ/internal/mmi_holder/posibrain) //Mechanical
organ_data[org] = 2
if(/obj/item/organ/internal/mmi_holder/robot) //Digital
organ_data[org] = 3
else //Anything else just give a brain to
organ_data[org] = 0
continue
//Just set the data to this. 0:normal, 1:assisted, 2:mechanical, 3:digital
organ_data[org] = I.robotic
if(add_to_db)
transcore.add_body(src)