mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Merge pull request #2087 from CHOMPStationBot/upstream-merge-10450
[MIRROR] Allow multiple SStranscore databases
This commit is contained in:
@@ -63,7 +63,8 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
|||||||
#define INIT_ORDER_PLANETS 18
|
#define INIT_ORDER_PLANETS 18
|
||||||
#define INIT_ORDER_JOB 17
|
#define INIT_ORDER_JOB 17
|
||||||
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
|
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
|
||||||
#define INIT_ORDER_ATOMS 15
|
#define INIT_ORDER_TRANSCORE 15 // VOREStation Edit
|
||||||
|
#define INIT_ORDER_ATOMS 14 // VOREStation Edit
|
||||||
#define INIT_ORDER_MACHINES 10
|
#define INIT_ORDER_MACHINES 10
|
||||||
#define INIT_ORDER_SHUTTLES 3
|
#define INIT_ORDER_SHUTTLES 3
|
||||||
#define INIT_ORDER_TIMER 1
|
#define INIT_ORDER_TIMER 1
|
||||||
|
|||||||
@@ -10,25 +10,34 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
name = "Transcore"
|
name = "Transcore"
|
||||||
priority = 20
|
priority = 20
|
||||||
wait = 3 MINUTES
|
wait = 3 MINUTES
|
||||||
flags = SS_BACKGROUND|SS_NO_INIT
|
flags = SS_BACKGROUND
|
||||||
runlevels = RUNLEVEL_GAME
|
runlevels = RUNLEVEL_GAME
|
||||||
|
init_order = INIT_ORDER_TRANSCORE
|
||||||
|
|
||||||
// THINGS
|
// THINGS
|
||||||
var/overdue_time = 15 MINUTES
|
var/overdue_time = 15 MINUTES
|
||||||
var/core_dumped = FALSE // Core has been dumped! Also set can_fire = 0 when you set this.
|
|
||||||
|
|
||||||
var/current_step = SSTRANSCORE_IMPLANTS
|
var/current_step = SSTRANSCORE_IMPLANTS
|
||||||
|
|
||||||
var/cost_backups = 0
|
var/cost_backups = 0
|
||||||
var/cost_implants = 0
|
var/cost_implants = 0
|
||||||
|
|
||||||
var/list/datum/transhuman/mind_record/backed_up = list() // All known mind records, indexed by MR.mindname/mind.name
|
var/list/datum/transcore_db/databases = list() // Holds instances of each database
|
||||||
var/list/datum/transhuman/mind_record/has_left = list() // Why do we even have this?
|
var/datum/transcore_db/default_db // The default if no specific one is used
|
||||||
var/list/datum/transhuman/body_record/body_scans = list() // All known body records, indexed by BR.mydna.name
|
|
||||||
var/list/obj/item/weapon/implant/backup/implants = list() // All OPERATING implants that are being ticked
|
|
||||||
|
|
||||||
var/list/current_run = list()
|
var/list/current_run = list()
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/Initialize()
|
||||||
|
default_db = new()
|
||||||
|
databases["default"] = default_db
|
||||||
|
for(var/t in subtypesof(/datum/transcore_db))
|
||||||
|
var/datum/transcore_db/db = new t()
|
||||||
|
if(!db.key)
|
||||||
|
warning("Instantiated transcore DB without a key: [t]")
|
||||||
|
continue
|
||||||
|
databases[db.key] = db
|
||||||
|
return ..()
|
||||||
|
|
||||||
/datum/controller/subsystem/transcore/fire(resumed = 0)
|
/datum/controller/subsystem/transcore/fire(resumed = 0)
|
||||||
var/timer = TICK_USAGE
|
var/timer = TICK_USAGE
|
||||||
|
|
||||||
@@ -37,30 +46,36 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
|
|
||||||
/datum/controller/subsystem/transcore/proc/process_implants(resumed = 0)
|
/datum/controller/subsystem/transcore/proc/process_implants(resumed = 0)
|
||||||
if (!resumed)
|
if (!resumed)
|
||||||
src.current_run = implants.Copy()
|
// Create a flat list of every implant in every db with a value of the db they're in
|
||||||
|
src.current_run.Cut()
|
||||||
|
for(var/key in databases)
|
||||||
|
var/datum/transcore_db/db = databases[key]
|
||||||
|
for(var/obj/item/weapon/implant/backup/imp as anything in db.implants)
|
||||||
|
src.current_run[imp] = db
|
||||||
|
|
||||||
var/list/current_run = src.current_run
|
var/list/current_run = src.current_run
|
||||||
while(current_run.len)
|
while(current_run.len)
|
||||||
var/obj/item/weapon/implant/backup/imp = current_run[current_run.len]
|
var/obj/item/weapon/implant/backup/imp = current_run[current_run.len]
|
||||||
|
var/datum/transcore_db/db = current_run[imp]
|
||||||
current_run.len--
|
current_run.len--
|
||||||
|
|
||||||
//Remove if not in a human anymore.
|
//Remove if not in a human anymore.
|
||||||
if(!imp || !isorgan(imp.loc))
|
if(!imp || !isorgan(imp.loc))
|
||||||
implants -= imp
|
db.implants -= imp
|
||||||
continue
|
continue
|
||||||
|
|
||||||
//We're in an organ, at least.
|
//We're in an organ, at least.
|
||||||
var/obj/item/organ/external/EO = imp.loc
|
var/obj/item/organ/external/EO = imp.loc
|
||||||
var/mob/living/carbon/human/H = EO.owner
|
var/mob/living/carbon/human/H = EO.owner
|
||||||
if(!H)
|
if(!H)
|
||||||
implants -= imp
|
db.implants -= imp
|
||||||
continue
|
continue
|
||||||
|
|
||||||
//In a human
|
//In a human
|
||||||
BITSET(H.hud_updateflag, BACKUP_HUD)
|
BITSET(H.hud_updateflag, BACKUP_HUD)
|
||||||
|
|
||||||
if(H == imp.imp_in && H.mind && H.stat < DEAD)
|
if(H == imp.imp_in && H.mind && H.stat < DEAD)
|
||||||
SStranscore.m_backup(H.mind,H.nif)
|
db.m_backup(H.mind,H.nif)
|
||||||
persist_nif_data(H)
|
persist_nif_data(H)
|
||||||
|
|
||||||
if(MC_TICK_CHECK)
|
if(MC_TICK_CHECK)
|
||||||
@@ -68,18 +83,24 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
|
|
||||||
/datum/controller/subsystem/transcore/proc/process_backups(resumed = 0)
|
/datum/controller/subsystem/transcore/proc/process_backups(resumed = 0)
|
||||||
if (!resumed)
|
if (!resumed)
|
||||||
src.current_run = backed_up.Copy()
|
// Create a flat list of every implant in every db with a value of the db they're in
|
||||||
|
src.current_run.Cut()
|
||||||
|
for(var/key in databases)
|
||||||
|
var/datum/transcore_db/db = databases[key]
|
||||||
|
for(var/name in db.backed_up)
|
||||||
|
var/datum/transhuman/mind_record/mr = db.backed_up[name]
|
||||||
|
src.current_run[mr] = db
|
||||||
|
|
||||||
var/list/current_run = src.current_run
|
var/list/current_run = src.current_run
|
||||||
while(current_run.len)
|
while(current_run.len)
|
||||||
var/name = current_run[current_run.len]
|
var/datum/transhuman/mind_record/curr_MR = current_run[current_run.len]
|
||||||
var/datum/transhuman/mind_record/curr_MR = current_run[name]
|
var/datum/transcore_db/db = current_run[curr_MR]
|
||||||
current_run -= name
|
current_run.len--
|
||||||
|
|
||||||
//Invalid record
|
//Invalid record
|
||||||
if(!curr_MR)
|
if(!curr_MR)
|
||||||
log_debug("Tried to process [name] in transcore w/o a record!")
|
log_debug("Tried to process [name] in transcore w/o a record!")
|
||||||
backed_up -= name
|
db.backed_up -= curr_MR.mindname
|
||||||
continue
|
continue
|
||||||
|
|
||||||
//Onetimes do not get processing or notifications
|
//Onetimes do not get processing or notifications
|
||||||
@@ -92,7 +113,7 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
curr_MR.dead_state = MR_NORMAL
|
curr_MR.dead_state = MR_NORMAL
|
||||||
else
|
else
|
||||||
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
|
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
|
||||||
notify(name)
|
db.notify(curr_MR.mindname)
|
||||||
curr_MR.last_notification = world.time
|
curr_MR.last_notification = world.time
|
||||||
curr_MR.dead_state = MR_DEAD
|
curr_MR.dead_state = MR_DEAD
|
||||||
|
|
||||||
@@ -101,30 +122,100 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
|
|
||||||
/datum/controller/subsystem/transcore/stat_entry()
|
/datum/controller/subsystem/transcore/stat_entry()
|
||||||
var/msg = list()
|
var/msg = list()
|
||||||
if(core_dumped)
|
|
||||||
msg += "CORE DUMPED | "
|
|
||||||
msg += "$:{"
|
msg += "$:{"
|
||||||
msg += "IM:[round(cost_implants,1)]|"
|
msg += "IM:[round(cost_implants,1)]|"
|
||||||
msg += "BK:[round(cost_backups,1)]"
|
msg += "BK:[round(cost_backups,1)]"
|
||||||
msg += "} "
|
msg += "} "
|
||||||
msg += "#:{"
|
msg += "#:{"
|
||||||
msg += "IM:[implants.len]|"
|
msg += "DB:[databases.len]|"
|
||||||
msg += "BK:[backed_up.len]"
|
if(!default_db)
|
||||||
|
msg += "DEFAULT DB MISSING"
|
||||||
|
else
|
||||||
|
msg += "DFM:[default_db.backed_up.len]|"
|
||||||
|
msg += "DFB:[default_db.body_scans.len]|"
|
||||||
|
msg += "DFI:[default_db.implants.len]"
|
||||||
msg += "} "
|
msg += "} "
|
||||||
..(jointext(msg, null))
|
..(jointext(msg, null))
|
||||||
|
|
||||||
/datum/controller/subsystem/transcore/Recover()
|
/datum/controller/subsystem/transcore/Recover()
|
||||||
if (istype(SStranscore.body_scans))
|
for(var/key in SStranscore.databases)
|
||||||
for(var/N in SStranscore.body_scans)
|
if(!SStranscore.databases[key])
|
||||||
if(N && SStranscore.body_scans[N]) body_scans[N] = SStranscore.body_scans[N]
|
warning("SStranscore recovery found missing database value for key: [key]")
|
||||||
if(SStranscore.core_dumped)
|
continue
|
||||||
core_dumped = TRUE
|
if(key == "default")
|
||||||
can_fire = FALSE
|
default_db = SStranscore.databases[key]
|
||||||
else if (istype(SStranscore.backed_up))
|
|
||||||
for(var/N in SStranscore.backed_up)
|
|
||||||
if(N && SStranscore.backed_up[N]) backed_up[N] = SStranscore.backed_up[N]
|
|
||||||
|
|
||||||
/datum/controller/subsystem/transcore/proc/m_backup(var/datum/mind/mind, var/obj/item/device/nif/nif, var/one_time = FALSE)
|
databases[key] = SStranscore.databases[key]
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/leave_round(var/mob/M)
|
||||||
|
if(!istype(M))
|
||||||
|
warning("Non-mob asked to be removed from transcore: [M] [M?.type]")
|
||||||
|
return
|
||||||
|
if(!M.mind)
|
||||||
|
warning("No mind mob asked to be removed from transcore: [M] [M?.type]")
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/key in databases)
|
||||||
|
var/datum/transcore_db/db = databases[key]
|
||||||
|
if(M.mind.name in db.backed_up)
|
||||||
|
var/datum/transhuman/mind_record/MR = db.backed_up[M.mind.name]
|
||||||
|
db.stop_backup(MR)
|
||||||
|
if(M.mind.name in db.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans.
|
||||||
|
var/datum/transhuman/body_record/BR = db.body_scans[M.mind.name]
|
||||||
|
db.remove_body(BR)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/db_by_key(var/key)
|
||||||
|
if(isnull(key))
|
||||||
|
return default_db
|
||||||
|
if(!databases[key])
|
||||||
|
warning("Tried to find invalid transcore database: [key]")
|
||||||
|
return default_db
|
||||||
|
return databases[key]
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/db_by_mind_name(var/name)
|
||||||
|
if(isnull(name))
|
||||||
|
return null
|
||||||
|
for(var/key in databases)
|
||||||
|
var/datum/transcore_db/db = databases[key]
|
||||||
|
if(name in db.backed_up)
|
||||||
|
return db
|
||||||
|
|
||||||
|
// These are now just interfaces to databases
|
||||||
|
/datum/controller/subsystem/transcore/proc/m_backup(var/datum/mind/mind, var/obj/item/device/nif/nif, var/one_time = FALSE, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.m_backup(mind=mind, nif=nif, one_time=one_time)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.add_backup(MR=MR)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/stop_backup(var/datum/transhuman/mind_record/MR, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.stop_backup(MR=MR)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/add_body(var/datum/transhuman/body_record/BR, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.add_body(BR=BR)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/remove_body(var/datum/transhuman/body_record/BR, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.remove_body(BR=BR)
|
||||||
|
|
||||||
|
/datum/controller/subsystem/transcore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk, var/database_key)
|
||||||
|
var/datum/transcore_db/db = db_by_key(database_key)
|
||||||
|
db.core_dump(disk=disk)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/transcore_db
|
||||||
|
var/list/datum/transhuman/mind_record/backed_up = list() // All known mind records, indexed by MR.mindname/mind.name
|
||||||
|
var/list/datum/transhuman/mind_record/has_left = list() // Why do we even have this?
|
||||||
|
var/list/datum/transhuman/body_record/body_scans = list() // All known body records, indexed by BR.mydna.name
|
||||||
|
var/list/obj/item/weapon/implant/backup/implants = list() // All OPERATING implants that are being ticked
|
||||||
|
|
||||||
|
var/core_dumped = FALSE
|
||||||
|
var/key // Key for this DB
|
||||||
|
|
||||||
|
/datum/transcore_db/proc/m_backup(var/datum/mind/mind, var/obj/item/device/nif/nif, var/one_time = FALSE)
|
||||||
ASSERT(mind)
|
ASSERT(mind)
|
||||||
if(!mind.name || core_dumped)
|
if(!mind.name || core_dumped)
|
||||||
return 0
|
return 0
|
||||||
@@ -154,12 +245,12 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
MR.nif_savedata = null
|
MR.nif_savedata = null
|
||||||
|
|
||||||
else
|
else
|
||||||
MR = new(mind, mind.current, add_to_db = TRUE, one_time = one_time)
|
MR = new(mind, mind.current, add_to_db = TRUE, one_time = one_time, database_key = src.key)
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// Send a past-due notification to the medical radio channel.
|
// Send a past-due notification to the medical radio channel.
|
||||||
/datum/controller/subsystem/transcore/proc/notify(var/name, var/repeated = FALSE)
|
/datum/transcore_db/proc/notify(var/name, var/repeated = FALSE)
|
||||||
ASSERT(name)
|
ASSERT(name)
|
||||||
if(repeated)
|
if(repeated)
|
||||||
global_announcer.autosay("This is a repeat notification that [name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
|
global_announcer.autosay("This is a repeat notification that [name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
|
||||||
@@ -167,14 +258,14 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
|
global_announcer.autosay("[name] is past-due for a mind backup.", "TransCore Oversight", "Medical")
|
||||||
|
|
||||||
// Called from mind_record to add itself to the transcore.
|
// Called from mind_record to add itself to the transcore.
|
||||||
/datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR)
|
/datum/transcore_db/proc/add_backup(var/datum/transhuman/mind_record/MR)
|
||||||
ASSERT(MR)
|
ASSERT(MR)
|
||||||
backed_up[MR.mindname] = MR
|
backed_up[MR.mindname] = MR
|
||||||
backed_up = sortAssoc(backed_up)
|
backed_up = sortAssoc(backed_up)
|
||||||
log_debug("Added [MR.mindname] to transcore DB.")
|
log_debug("Added [MR.mindname] to transcore DB.")
|
||||||
|
|
||||||
// Remove a mind_record from the backup-checking list. Keeps track of it in has_left // Why do we do that? ~Leshana
|
// Remove a mind_record from the backup-checking list. Keeps track of it in has_left // Why do we do that? ~Leshana
|
||||||
/datum/controller/subsystem/transcore/proc/stop_backup(var/datum/transhuman/mind_record/MR)
|
/datum/transcore_db/proc/stop_backup(var/datum/transhuman/mind_record/MR)
|
||||||
ASSERT(MR)
|
ASSERT(MR)
|
||||||
has_left[MR.mindname] = MR
|
has_left[MR.mindname] = MR
|
||||||
backed_up.Remove("[MR.mindname]")
|
backed_up.Remove("[MR.mindname]")
|
||||||
@@ -182,20 +273,20 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
log_debug("Put [MR.mindname] in transcore suspended DB.")
|
log_debug("Put [MR.mindname] in transcore suspended DB.")
|
||||||
|
|
||||||
// Called from body_record to add itself to the transcore.
|
// Called from body_record to add itself to the transcore.
|
||||||
/datum/controller/subsystem/transcore/proc/add_body(var/datum/transhuman/body_record/BR)
|
/datum/transcore_db/proc/add_body(var/datum/transhuman/body_record/BR)
|
||||||
ASSERT(BR)
|
ASSERT(BR)
|
||||||
body_scans[BR.mydna.name] = BR
|
body_scans[BR.mydna.name] = BR
|
||||||
body_scans = sortAssoc(body_scans)
|
body_scans = sortAssoc(body_scans)
|
||||||
log_debug("Added [BR.mydna.name] to transcore body DB.")
|
log_debug("Added [BR.mydna.name] to transcore body DB.")
|
||||||
|
|
||||||
// Remove a body record from the database (Usually done when someone cryos) // Why? ~Leshana
|
// Remove a body record from the database (Usually done when someone cryos) // Why? ~Leshana
|
||||||
/datum/controller/subsystem/transcore/proc/remove_body(var/datum/transhuman/body_record/BR)
|
/datum/transcore_db/proc/remove_body(var/datum/transhuman/body_record/BR)
|
||||||
ASSERT(BR)
|
ASSERT(BR)
|
||||||
body_scans.Remove("[BR.mydna.name]")
|
body_scans.Remove("[BR.mydna.name]")
|
||||||
log_debug("Removed [BR.mydna.name] from transcore body DB.")
|
log_debug("Removed [BR.mydna.name] from transcore body DB.")
|
||||||
|
|
||||||
// Moves all mind records from the databaes into the disk and shuts down all backup canary processing.
|
// Moves all mind records from the databaes into the disk and shuts down all backup canary processing.
|
||||||
/datum/controller/subsystem/transcore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk)
|
/datum/transcore_db/proc/core_dump(var/obj/item/weapon/disk/transcore/disk)
|
||||||
ASSERT(disk)
|
ASSERT(disk)
|
||||||
global_announcer.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command")
|
global_announcer.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command")
|
||||||
global_announcer.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical")
|
global_announcer.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical")
|
||||||
@@ -203,7 +294,6 @@ SUBSYSTEM_DEF(transcore)
|
|||||||
disk.stored += backed_up
|
disk.stored += backed_up
|
||||||
backed_up.Cut()
|
backed_up.Cut()
|
||||||
core_dumped = TRUE
|
core_dumped = TRUE
|
||||||
can_fire = FALSE
|
|
||||||
return disk.stored.len
|
return disk.stored.len
|
||||||
|
|
||||||
#undef SSTRANSCORE_BACKUPS
|
#undef SSTRANSCORE_BACKUPS
|
||||||
|
|||||||
@@ -461,12 +461,7 @@
|
|||||||
|
|
||||||
//VOREStation Edit - Resleeving.
|
//VOREStation Edit - Resleeving.
|
||||||
if(to_despawn.mind)
|
if(to_despawn.mind)
|
||||||
if(to_despawn.mind.name in SStranscore.backed_up)
|
SStranscore.leave_round(to_despawn)
|
||||||
var/datum/transhuman/mind_record/MR = SStranscore.backed_up[to_despawn.mind.name]
|
|
||||||
SStranscore.stop_backup(MR)
|
|
||||||
if(to_despawn.mind.name in SStranscore.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans.
|
|
||||||
var/datum/transhuman/body_record/BR = SStranscore.body_scans[to_despawn.mind.name]
|
|
||||||
SStranscore.remove_body(BR)
|
|
||||||
//VOREStation Edit End - Resleeving.
|
//VOREStation Edit End - Resleeving.
|
||||||
|
|
||||||
//Handle job slot/tater cleanup.
|
//Handle job slot/tater cleanup.
|
||||||
|
|||||||
@@ -19,7 +19,14 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
|
|||||||
|
|
||||||
var/ooc_notes = null //For holding prefs
|
var/ooc_notes = null //For holding prefs
|
||||||
|
|
||||||
|
// Resleeving database this machine interacts with. Blank for default database
|
||||||
|
// Needs a matching /datum/transcore_db with key defined in code
|
||||||
|
var/db_key
|
||||||
|
var/datum/transcore_db/our_db // These persist all round and are never destroyed, just keep a hard ref
|
||||||
|
|
||||||
|
/obj/item/device/sleevemate/Initialize()
|
||||||
|
. = ..()
|
||||||
|
our_db = SStranscore.db_by_key(db_key)
|
||||||
|
|
||||||
//These don't perform any checks and need to be wrapped by checks
|
//These don't perform any checks and need to be wrapped by checks
|
||||||
/obj/item/device/sleevemate/proc/clear_mind()
|
/obj/item/device/sleevemate/proc/clear_mind()
|
||||||
@@ -77,7 +84,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
|
|||||||
clear_mind()
|
clear_mind()
|
||||||
if("Backup")
|
if("Backup")
|
||||||
to_chat(user,"<span class='notice'>Internal copy of [stored_mind.name] backed up to database.</span>")
|
to_chat(user,"<span class='notice'>Internal copy of [stored_mind.name] backed up to database.</span>")
|
||||||
SStranscore.m_backup(stored_mind,null,one_time = TRUE)
|
our_db.m_backup(stored_mind,null,one_time = TRUE)
|
||||||
if("Cancel")
|
if("Cancel")
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -183,7 +190,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
|
|||||||
|
|
||||||
usr.visible_message("[usr] begins scanning [target]'s mind.","<span class='notice'>You begin scanning [target]'s mind.</span>")
|
usr.visible_message("[usr] begins scanning [target]'s mind.","<span class='notice'>You begin scanning [target]'s mind.</span>")
|
||||||
if(do_after(usr,8 SECONDS,target))
|
if(do_after(usr,8 SECONDS,target))
|
||||||
SStranscore.m_backup(target.mind,nif,one_time = TRUE)
|
our_db.m_backup(target.mind,nif,one_time = TRUE)
|
||||||
to_chat(usr,"<span class='notice'>Mind backed up!</span>")
|
to_chat(usr,"<span class='notice'>Mind backed up!</span>")
|
||||||
else
|
else
|
||||||
to_chat(usr,"<span class='warning'>You must remain close to your target!</span>")
|
to_chat(usr,"<span class='warning'>You must remain close to your target!</span>")
|
||||||
@@ -200,7 +207,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
|
|||||||
usr.visible_message("[usr] begins scanning [target]'s body.","<span class='notice'>You begin scanning [target]'s body.</span>")
|
usr.visible_message("[usr] begins scanning [target]'s body.","<span class='notice'>You begin scanning [target]'s body.</span>")
|
||||||
if(do_after(usr,8 SECONDS,target))
|
if(do_after(usr,8 SECONDS,target))
|
||||||
var/datum/transhuman/body_record/BR = new()
|
var/datum/transhuman/body_record/BR = new()
|
||||||
BR.init_from_mob(H, TRUE, TRUE)
|
BR.init_from_mob(H, TRUE, TRUE, database_key = db_key)
|
||||||
to_chat(usr,"<span class='notice'>Body scanned!</span>")
|
to_chat(usr,"<span class='notice'>Body scanned!</span>")
|
||||||
else
|
else
|
||||||
to_chat(usr,"<span class='warning'>You must remain close to your target!</span>")
|
to_chat(usr,"<span class='warning'>You must remain close to your target!</span>")
|
||||||
|
|||||||
@@ -32,12 +32,8 @@ var/global/list/prevent_respawns = list()
|
|||||||
qdel(O)
|
qdel(O)
|
||||||
|
|
||||||
//Resleeving cleanup
|
//Resleeving cleanup
|
||||||
if(src.mind.name in SStranscore.backed_up)
|
if(mind)
|
||||||
var/datum/transhuman/mind_record/MR = SStranscore.backed_up[src.mind.name]
|
SStranscore.leave_round(src)
|
||||||
SStranscore.stop_backup(MR)
|
|
||||||
if(src.mind.name in SStranscore.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans.
|
|
||||||
var/datum/transhuman/body_record/BR = SStranscore.body_scans[src.mind.name]
|
|
||||||
SStranscore.remove_body(BR)
|
|
||||||
|
|
||||||
//Job slot cleanup
|
//Job slot cleanup
|
||||||
var/job = src.mind.assigned_role
|
var/job = src.mind.assigned_role
|
||||||
|
|||||||
@@ -62,18 +62,22 @@
|
|||||||
set name = "Notify Transcore"
|
set name = "Notify Transcore"
|
||||||
set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one."
|
set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one."
|
||||||
|
|
||||||
if(src.mind && (src.mind.name in SStranscore.backed_up))
|
if(!mind)
|
||||||
var/datum/transhuman/mind_record/record = SStranscore.backed_up[src.mind.name]
|
to_chat(src,"<span class='warning'>Your ghost is missing game values that allow this functionality, sorry.</span>")
|
||||||
|
return
|
||||||
|
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
|
||||||
|
if(db)
|
||||||
|
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
|
||||||
if(!(record.dead_state == MR_DEAD))
|
if(!(record.dead_state == MR_DEAD))
|
||||||
to_chat(src, "<span class='warning'>Your backup is not past-due yet.</span>")
|
to_chat(src, "<span class='warning'>Your backup is not past-due yet.</span>")
|
||||||
else if((world.time - record.last_notification) < 10 MINUTES)
|
else if((world.time - record.last_notification) < 10 MINUTES)
|
||||||
to_chat(src, "<span class='warning'>Too little time has passed since your last notification.</span>")
|
to_chat(src, "<span class='warning'>Too little time has passed since your last notification.</span>")
|
||||||
else
|
else
|
||||||
SStranscore.notify(record.mindname, TRUE)
|
db.notify(record.mindname, TRUE)
|
||||||
record.last_notification = world.time
|
record.last_notification = world.time
|
||||||
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
|
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
|
||||||
else
|
else
|
||||||
to_chat(src, "<span class='warning'>No mind record found!</span>")
|
to_chat(src,"<span class='warning'>No backup record could be found, sorry.</span>")
|
||||||
|
|
||||||
/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
||||||
set category = "Ghost"
|
set category = "Ghost"
|
||||||
|
|||||||
@@ -38,11 +38,11 @@
|
|||||||
|
|
||||||
for(var/obj/item/organ/external/E in organs)
|
for(var/obj/item/organ/external/E in organs)
|
||||||
for(var/obj/item/weapon/implant/I in E.implants)
|
for(var/obj/item/weapon/implant/I in E.implants)
|
||||||
if(I.implanted)
|
if(I.implanted && istype(I,/obj/item/weapon/implant/backup))
|
||||||
if(istype(I,/obj/item/weapon/implant/backup))
|
var/obj/item/weapon/implant/backup/B = I
|
||||||
if(!mind)
|
if(!mind)
|
||||||
holder.icon_state = "hud_backup_nomind"
|
holder.icon_state = "hud_backup_nomind"
|
||||||
else if(!(mind.name in SStranscore.body_scans))
|
else if(!(mind.name in B.our_db.body_scans))
|
||||||
holder.icon_state = "hud_backup_nobody"
|
holder.icon_state = "hud_backup_nobody"
|
||||||
else
|
else
|
||||||
holder.icon_state = "hud_backup_norm"
|
holder.icon_state = "hud_backup_norm"
|
||||||
|
|||||||
@@ -25,11 +25,17 @@
|
|||||||
var/obj/machinery/transhuman/synthprinter/selected_printer
|
var/obj/machinery/transhuman/synthprinter/selected_printer
|
||||||
var/obj/machinery/transhuman/resleever/selected_sleever
|
var/obj/machinery/transhuman/resleever/selected_sleever
|
||||||
|
|
||||||
|
// Resleeving database this machine interacts with. Blank for default database
|
||||||
|
// Needs a matching /datum/transcore_db with key defined in code
|
||||||
|
var/db_key
|
||||||
|
var/datum/transcore_db/our_db // These persist all round and are never destroyed, just keep a hard ref
|
||||||
|
|
||||||
/obj/machinery/computer/transhuman/resleeving/Initialize()
|
/obj/machinery/computer/transhuman/resleeving/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
pods = list()
|
pods = list()
|
||||||
spods = list()
|
spods = list()
|
||||||
sleevers = list()
|
sleevers = list()
|
||||||
|
our_db = SStranscore.db_by_key(db_key)
|
||||||
updatemodules()
|
updatemodules()
|
||||||
|
|
||||||
/obj/machinery/computer/transhuman/resleeving/Destroy()
|
/obj/machinery/computer/transhuman/resleeving/Destroy()
|
||||||
@@ -82,7 +88,7 @@
|
|||||||
P.connected = src
|
P.connected = src
|
||||||
P.name = "[initial(P.name)] #[pods.len]"
|
P.name = "[initial(P.name)] #[pods.len]"
|
||||||
to_chat(user, "<span class='notice'>You connect [P] to [src].</span>")
|
to_chat(user, "<span class='notice'>You connect [P] to [src].</span>")
|
||||||
else if(istype(W, /obj/item/weapon/disk/transcore) && SStranscore && !SStranscore.core_dumped)
|
else if(istype(W, /obj/item/weapon/disk/transcore) && !our_db.core_dumped)
|
||||||
user.unEquip(W)
|
user.unEquip(W)
|
||||||
disk = W
|
disk = W
|
||||||
disk.forceMove(src)
|
disk.forceMove(src)
|
||||||
@@ -172,7 +178,7 @@
|
|||||||
data["sleevers"] = temppods.Copy()
|
data["sleevers"] = temppods.Copy()
|
||||||
temppods.Cut()
|
temppods.Cut()
|
||||||
|
|
||||||
data["coredumped"] = SStranscore.core_dumped
|
data["coredumped"] = our_db.core_dumped
|
||||||
data["emergency"] = disk
|
data["emergency"] = disk
|
||||||
data["temp"] = temp
|
data["temp"] = temp
|
||||||
data["selected_pod"] = "\ref[selected_pod]"
|
data["selected_pod"] = "\ref[selected_pod]"
|
||||||
@@ -180,14 +186,14 @@
|
|||||||
data["selected_sleever"] = "\ref[selected_sleever]"
|
data["selected_sleever"] = "\ref[selected_sleever]"
|
||||||
|
|
||||||
var/bodyrecords_list_ui[0]
|
var/bodyrecords_list_ui[0]
|
||||||
for(var/N in SStranscore.body_scans)
|
for(var/N in our_db.body_scans)
|
||||||
var/datum/transhuman/body_record/BR = SStranscore.body_scans[N]
|
var/datum/transhuman/body_record/BR = our_db.body_scans[N]
|
||||||
bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
|
bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
|
||||||
data["bodyrecords"] = bodyrecords_list_ui
|
data["bodyrecords"] = bodyrecords_list_ui
|
||||||
|
|
||||||
var/mindrecords_list_ui[0]
|
var/mindrecords_list_ui[0]
|
||||||
for(var/N in SStranscore.backed_up)
|
for(var/N in our_db.backed_up)
|
||||||
var/datum/transhuman/mind_record/MR = SStranscore.backed_up[N]
|
var/datum/transhuman/mind_record/MR = our_db.backed_up[N]
|
||||||
mindrecords_list_ui[++mindrecords_list_ui.len] = list("name" = N, "recref" = "\ref[MR]")
|
mindrecords_list_ui[++mindrecords_list_ui.len] = list("name" = N, "recref" = "\ref[MR]")
|
||||||
data["mindrecords"] = mindrecords_list_ui
|
data["mindrecords"] = mindrecords_list_ui
|
||||||
|
|
||||||
@@ -251,7 +257,7 @@
|
|||||||
set_temp("Error: Record missing.", "danger")
|
set_temp("Error: Record missing.", "danger")
|
||||||
if("coredump")
|
if("coredump")
|
||||||
if(disk)
|
if(disk)
|
||||||
SStranscore.core_dump(disk)
|
our_db.core_dump(disk)
|
||||||
sleep(5)
|
sleep(5)
|
||||||
visible_message("<span class='warning'>\The [src] spits out \the [disk].</span>")
|
visible_message("<span class='warning'>\The [src] spits out \the [disk].</span>")
|
||||||
disk.forceMove(get_turf(src))
|
disk.forceMove(get_turf(src))
|
||||||
@@ -407,7 +413,7 @@
|
|||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
//They were dead, or otherwise available.
|
//They were dead, or otherwise available.
|
||||||
sleever.putmind(active_mr,mode,override)
|
sleever.putmind(active_mr,mode,override,db_key = db_key)
|
||||||
set_temp("Initiating resleeving...")
|
set_temp("Initiating resleeving...")
|
||||||
tgui_modal_clear(src)
|
tgui_modal_clear(src)
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,11 @@
|
|||||||
var/mob/living/carbon/human/dummy/mannequin/mannequin = null
|
var/mob/living/carbon/human/dummy/mannequin/mannequin = null
|
||||||
var/obj/item/weapon/disk/body_record/disk = null
|
var/obj/item/weapon/disk/body_record/disk = null
|
||||||
|
|
||||||
|
// Resleeving database this machine interacts with. Blank for default database
|
||||||
|
// Needs a matching /datum/transcore_db with key defined in code
|
||||||
|
var/db_key
|
||||||
|
var/datum/transcore_db/our_db // These persist all round and are never destroyed, just keep a hard ref
|
||||||
|
|
||||||
/obj/machinery/computer/transhuman/designer/Initialize()
|
/obj/machinery/computer/transhuman/designer/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
map_name = "transhuman_designer_[REF(src)]_map"
|
map_name = "transhuman_designer_[REF(src)]_map"
|
||||||
@@ -51,6 +56,8 @@
|
|||||||
west_preview.del_on_map_removal = FALSE
|
west_preview.del_on_map_removal = FALSE
|
||||||
west_preview.screen_loc = "[map_name]:0,1"
|
west_preview.screen_loc = "[map_name]:0,1"
|
||||||
|
|
||||||
|
our_db = SStranscore.db_by_key(db_key)
|
||||||
|
|
||||||
/obj/machinery/computer/transhuman/designer/Destroy()
|
/obj/machinery/computer/transhuman/designer/Destroy()
|
||||||
active_br = null
|
active_br = null
|
||||||
mannequin = null
|
mannequin = null
|
||||||
@@ -100,8 +107,8 @@
|
|||||||
|
|
||||||
if(menu == MENU_BODYRECORDS)
|
if(menu == MENU_BODYRECORDS)
|
||||||
var/bodyrecords_list_ui[0]
|
var/bodyrecords_list_ui[0]
|
||||||
for(var/N in SStranscore.body_scans)
|
for(var/N in our_db.body_scans)
|
||||||
var/datum/transhuman/body_record/BR = SStranscore.body_scans[N]
|
var/datum/transhuman/body_record/BR = our_db.body_scans[N]
|
||||||
bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
|
bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
|
||||||
if(bodyrecords_list_ui.len)
|
if(bodyrecords_list_ui.len)
|
||||||
data["bodyrecords"] = bodyrecords_list_ui
|
data["bodyrecords"] = bodyrecords_list_ui
|
||||||
|
|||||||
@@ -13,6 +13,11 @@
|
|||||||
icon_state = "backup_implant"
|
icon_state = "backup_implant"
|
||||||
known_implant = TRUE
|
known_implant = TRUE
|
||||||
|
|
||||||
|
// Resleeving database this machine interacts with. Blank for default database
|
||||||
|
// Needs a matching /datum/transcore_db with key defined in code
|
||||||
|
var/db_key
|
||||||
|
var/datum/transcore_db/our_db // These persist all round and are never destroyed, just keep a hard ref
|
||||||
|
|
||||||
/obj/item/weapon/implant/backup/get_data()
|
/obj/item/weapon/implant/backup/get_data()
|
||||||
var/dat = {"
|
var/dat = {"
|
||||||
<b>Implant Specifications:</b><BR>
|
<b>Implant Specifications:</b><BR>
|
||||||
@@ -26,14 +31,22 @@
|
|||||||
<b>Integrity:</b> Generally very survivable. Susceptible to being destroyed by acid."}
|
<b>Integrity:</b> Generally very survivable. Susceptible to being destroyed by acid."}
|
||||||
return dat
|
return dat
|
||||||
|
|
||||||
|
/obj/item/weapon/implant/backup/New(newloc, db_key)
|
||||||
|
. = ..()
|
||||||
|
src.db_key = db_key
|
||||||
|
|
||||||
|
/obj/item/weapon/implant/backup/Initialize()
|
||||||
|
. = ..()
|
||||||
|
our_db = SStranscore.db_by_key(db_key)
|
||||||
|
|
||||||
/obj/item/weapon/implant/backup/Destroy()
|
/obj/item/weapon/implant/backup/Destroy()
|
||||||
SStranscore.implants -= src
|
our_db.implants -= src
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/obj/item/weapon/implant/backup/post_implant(var/mob/living/carbon/human/H)
|
/obj/item/weapon/implant/backup/post_implant(var/mob/living/carbon/human/H)
|
||||||
if(istype(H))
|
if(istype(H))
|
||||||
BITSET(H.hud_updateflag, BACKUP_HUD)
|
BITSET(H.hud_updateflag, BACKUP_HUD)
|
||||||
SStranscore.implants |= src
|
our_db.implants |= src
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -53,10 +66,12 @@
|
|||||||
var/list/obj/item/weapon/implant/backup/imps = list()
|
var/list/obj/item/weapon/implant/backup/imps = list()
|
||||||
var/max_implants = 4 //Iconstates need to exist due to the update proc!
|
var/max_implants = 4 //Iconstates need to exist due to the update proc!
|
||||||
|
|
||||||
|
var/db_key // To give to the baby implants
|
||||||
|
|
||||||
/obj/item/weapon/backup_implanter/New()
|
/obj/item/weapon/backup_implanter/New()
|
||||||
..()
|
..()
|
||||||
for(var/i = 1 to max_implants)
|
for(var/i = 1 to max_implants)
|
||||||
var/obj/item/weapon/implant/backup/imp = new(src)
|
var/obj/item/weapon/implant/backup/imp = new(src, db_key)
|
||||||
imps |= imp
|
imps |= imp
|
||||||
imp.germ_level = 0
|
imp.germ_level = 0
|
||||||
update()
|
update()
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
var/one_time = FALSE
|
var/one_time = FALSE
|
||||||
|
|
||||||
/datum/transhuman/mind_record/New(var/datum/mind/mind, var/mob/living/carbon/human/M, var/add_to_db = TRUE, var/one_time = FALSE)
|
/datum/transhuman/mind_record/New(var/datum/mind/mind, var/mob/living/carbon/human/M, var/add_to_db = TRUE, var/one_time = FALSE, var/database_key)
|
||||||
ASSERT(mind)
|
ASSERT(mind)
|
||||||
|
|
||||||
src.one_time = one_time
|
src.one_time = one_time
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
last_update = world.time
|
last_update = world.time
|
||||||
|
|
||||||
if(add_to_db)
|
if(add_to_db)
|
||||||
SStranscore.add_backup(src)
|
SStranscore.add_backup(src, database_key = database_key)
|
||||||
|
|
||||||
/////// Body Record ///////
|
/////// Body Record ///////
|
||||||
/datum/transhuman/body_record
|
/datum/transhuman/body_record
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
organ_data.Cut()
|
organ_data.Cut()
|
||||||
return QDEL_HINT_HARDDEL // For now at least there is no easy way to clear references to this in machines etc.
|
return QDEL_HINT_HARDDEL // For now at least there is no easy way to clear references to this in machines etc.
|
||||||
|
|
||||||
/datum/transhuman/body_record/proc/init_from_mob(var/mob/living/carbon/human/M, var/add_to_db = 0, var/ckeylock = 0)
|
/datum/transhuman/body_record/proc/init_from_mob(var/mob/living/carbon/human/M, var/add_to_db = 0, var/ckeylock = 0, var/database_key)
|
||||||
ASSERT(!QDELETED(M))
|
ASSERT(!QDELETED(M))
|
||||||
ASSERT(istype(M))
|
ASSERT(istype(M))
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@
|
|||||||
genetic_modifiers.Add(mod.type)
|
genetic_modifiers.Add(mod.type)
|
||||||
|
|
||||||
if(add_to_db)
|
if(add_to_db)
|
||||||
SStranscore.add_body(src)
|
SStranscore.add_body(src, database_key = database_key)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ var/list/infomorph_emotions = list(
|
|||||||
|
|
||||||
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
|
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
|
||||||
var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded
|
var/silence_time // Timestamp when we were silenced (normally via EMP burst), set to null after silence has faded
|
||||||
|
var/db_key
|
||||||
|
|
||||||
// Various software-specific vars
|
// Various software-specific vars
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ var/list/infomorph_emotions = list(
|
|||||||
var/datum/data/record/securityActive1 // Could probably just combine all these into one
|
var/datum/data/record/securityActive1 // Could probably just combine all these into one
|
||||||
var/datum/data/record/securityActive2
|
var/datum/data/record/securityActive2
|
||||||
|
|
||||||
/mob/living/silicon/infomorph/New(var/obj/item/device/sleevecard/SC, var/name = "Unknown")
|
/mob/living/silicon/infomorph/New(var/obj/item/device/sleevecard/SC, var/name = "Unknown", var/db_key)
|
||||||
ASSERT(SC)
|
ASSERT(SC)
|
||||||
name = "[initial(name)] ([name])"
|
name = "[initial(name)] ([name])"
|
||||||
src.forceMove(SC)
|
src.forceMove(SC)
|
||||||
@@ -95,6 +96,8 @@ var/list/infomorph_emotions = list(
|
|||||||
card.radio = new (card)
|
card.radio = new (card)
|
||||||
radio = card.radio
|
radio = card.radio
|
||||||
|
|
||||||
|
src.db_key = db_key
|
||||||
|
|
||||||
//Default languages without universal translator software
|
//Default languages without universal translator software
|
||||||
add_language(LANGUAGE_EAL, 1)
|
add_language(LANGUAGE_EAL, 1)
|
||||||
add_language(LANGUAGE_SIGN, 0)
|
add_language(LANGUAGE_SIGN, 0)
|
||||||
@@ -406,9 +409,7 @@ var/list/infomorph_emotions = list(
|
|||||||
close_up()
|
close_up()
|
||||||
|
|
||||||
//Resleeving 'cryo'
|
//Resleeving 'cryo'
|
||||||
if(mind && (mind.name in SStranscore.backed_up))
|
SStranscore.leave_round(src)
|
||||||
var/datum/transhuman/mind_record/MR = SStranscore.backed_up[mind.name]
|
|
||||||
SStranscore.stop_backup(MR)
|
|
||||||
|
|
||||||
card.removePersonality()
|
card.removePersonality()
|
||||||
clear_client()
|
clear_client()
|
||||||
@@ -588,7 +589,7 @@ var/global/list/default_infomorph_software = list()
|
|||||||
|
|
||||||
//Only every so often
|
//Only every so often
|
||||||
if(air_master.current_cycle%30 == 1)
|
if(air_master.current_cycle%30 == 1)
|
||||||
SStranscore.m_backup(mind)
|
SStranscore.m_backup(mind, database_key = db_key)
|
||||||
|
|
||||||
if(health <= 0)
|
if(health <= 0)
|
||||||
death(null,"gives one shrill beep before falling lifeless.")
|
death(null,"gives one shrill beep before falling lifeless.")
|
||||||
|
|||||||
@@ -539,13 +539,13 @@
|
|||||||
|
|
||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
|
|
||||||
/obj/machinery/transhuman/resleever/proc/putmind(var/datum/transhuman/mind_record/MR, mode = 1, var/mob/living/carbon/human/override = null)
|
/obj/machinery/transhuman/resleever/proc/putmind(var/datum/transhuman/mind_record/MR, mode = 1, var/mob/living/carbon/human/override = null, var/db_key)
|
||||||
if((!occupant || !istype(occupant) || occupant.stat >= DEAD) && mode == 1)
|
if((!occupant || !istype(occupant) || occupant.stat >= DEAD) && mode == 1)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(mode == 2 && sleevecards) //Card sleeving
|
if(mode == 2 && sleevecards) //Card sleeving
|
||||||
var/obj/item/device/sleevecard/card = new /obj/item/device/sleevecard(get_turf(src))
|
var/obj/item/device/sleevecard/card = new /obj/item/device/sleevecard(get_turf(src))
|
||||||
card.sleeveInto(MR)
|
card.sleeveInto(MR, db_key = db_key)
|
||||||
sleevecards--
|
sleevecards--
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -53,8 +53,8 @@
|
|||||||
to_chat(user,"<span class='notice'>\The [src] displays the name '[infomorph]'.</span>")
|
to_chat(user,"<span class='notice'>\The [src] displays the name '[infomorph]'.</span>")
|
||||||
|
|
||||||
//This is a 'hard' proc, it does no permission checking, do that on the computer
|
//This is a 'hard' proc, it does no permission checking, do that on the computer
|
||||||
/obj/item/device/sleevecard/proc/sleeveInto(var/datum/transhuman/mind_record/MR)
|
/obj/item/device/sleevecard/proc/sleeveInto(var/datum/transhuman/mind_record/MR, var/db_key)
|
||||||
infomorph = new(src,MR.mindname)
|
infomorph = new(src,MR.mindname,db_key=db_key)
|
||||||
|
|
||||||
for(var/datum/language/L in MR.languages)
|
for(var/datum/language/L in MR.languages)
|
||||||
infomorph.add_language(L.name)
|
infomorph.add_language(L.name)
|
||||||
|
|||||||
Reference in New Issue
Block a user