mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 19:47:47 +01:00
Merge pull request #1034 from VOREStation/implantreuse
More mind-centric resleeve code
This commit is contained in:
@@ -417,16 +417,6 @@
|
||||
qdel(R)
|
||||
qdel(W)
|
||||
|
||||
//VOREStation Edit - Resleeving.
|
||||
if(istype(W,/obj/item/weapon/implant/backup))
|
||||
for(var/record in transcore.backed_up)
|
||||
var/datum/transhuman/mind_record/MR = transcore.backed_up[record]
|
||||
if(MR.imp_ref == W)
|
||||
MR.cryo_at = world.time
|
||||
MR.imp_ref = null
|
||||
transcore.stop_backup(MR)
|
||||
qdel(W)
|
||||
//VOREStation Edit End - Resleeving.
|
||||
if(!preserve)
|
||||
qdel(W)
|
||||
else
|
||||
@@ -445,6 +435,12 @@
|
||||
O.owner.current << "<span class='warning'>You get the feeling your target is no longer within your reach...</span>"
|
||||
qdel(O)
|
||||
|
||||
//VOREStation Edit - Resleeving.
|
||||
if(occupant.mind && (occupant.mind.name in transcore.backed_up))
|
||||
var/datum/transhuman/mind_record/MR = transcore.backed_up[occupant.mind.name]
|
||||
transcore.stop_backup(MR)
|
||||
//VOREStation Edit End - Resleeving.
|
||||
|
||||
//Handle job slot/tater cleanup.
|
||||
var/job = occupant.mind.assigned_role
|
||||
|
||||
@@ -453,6 +449,7 @@
|
||||
if(occupant.mind.objectives.len)
|
||||
qdel(occupant.mind.objectives)
|
||||
occupant.mind.special_role = null
|
||||
|
||||
//else
|
||||
//if(ticker.mode.name == "AutoTraitor")
|
||||
//var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
var/can_sleeve_current = 1
|
||||
if(!sleevers.len)
|
||||
can_sleeve_current = 0
|
||||
data["activeMindRecord"] = list("charname" = active_mr.charname, \
|
||||
data["activeMindRecord"] = list("charname" = active_mr.mindname, \
|
||||
"obviously_dead" = active_mr.dead_state == MR_DEAD ? "Past-due" : "Current", \
|
||||
"cando" = can_sleeve_current)
|
||||
else
|
||||
@@ -298,8 +298,8 @@
|
||||
temp = "Error: Mind incompatible with body."
|
||||
|
||||
//Body to sleeve into, but mind is in another living body.
|
||||
else if(active_mr.mind.current && active_mr.mind.current.stat != DEAD) //Mind is in a body already that's alive
|
||||
var/answer = alert(active_mr.mind.current,"Someone is attempting to restore a backup of your mind into another body. Do you want to move to that body? You MAY suffer memory loss! (Same rules as CMD apply)","Resleeving","Yes","No")
|
||||
else if(active_mr.mind_ref.current && active_mr.mind_ref.current.stat < DEAD) //Mind is in a body already that's alive
|
||||
var/answer = alert(active_mr.mind_ref.current,"Someone is attempting to restore a backup of your mind into another body. Do you want to move to that body? You MAY suffer memory loss! (Same rules as CMD apply)","Resleeving","Yes","No")
|
||||
|
||||
//They declined to be moved.
|
||||
if(answer == "No")
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
////////////////////////////////
|
||||
//// General resleeving stuff common to
|
||||
//// robotics and medical both
|
||||
//// Resleeving implant
|
||||
//// for both organic and synthetic crew
|
||||
////////////////////////////////
|
||||
|
||||
//The backup implant itself
|
||||
/obj/item/weapon/implant/backup
|
||||
name = "backup implant"
|
||||
desc = "Do you wanna live forever?"
|
||||
var/datum/transhuman/mind_record/my_record
|
||||
desc = "A mindstate backup implant that occasionally stores a copy of one's mind on a central server for backup purposes."
|
||||
var/last_attempt
|
||||
var/attempt_delay = 5 MINUTES
|
||||
|
||||
/obj/item/weapon/implant/backup/get_data()
|
||||
var/dat = {"
|
||||
@@ -25,9 +26,29 @@
|
||||
/obj/item/weapon/implant/backup/implanted(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(istype(H))
|
||||
my_record = new(H,src,1)
|
||||
var/obj/item/weapon/implant/backup/other_imp = locate(/obj/item/weapon/implant/backup,H)
|
||||
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
|
||||
transcore.m_backup(H.mind)
|
||||
last_attempt = world.time
|
||||
|
||||
backup()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implant/backup/proc/backup()
|
||||
last_attempt = world.time
|
||||
var/mob/living/carbon/human/H = loc
|
||||
|
||||
//Okay we're in a human with a mind at least
|
||||
if(istype(H) && H == imp_in && H.mind && H.stat < DEAD)
|
||||
transcore.m_backup(H.mind)
|
||||
|
||||
spawn(attempt_delay)
|
||||
backup()
|
||||
|
||||
//The glass case for the implant
|
||||
/obj/item/weapon/implantcase/backup
|
||||
name = "glass case - 'backup'"
|
||||
@@ -50,4 +71,9 @@
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/implantcase/backup(src)
|
||||
new /obj/item/weapon/implanter(src)
|
||||
new /obj/item/weapon/implanter(src)
|
||||
|
||||
//Purely for fluff
|
||||
/obj/item/weapon/implant/backup/full
|
||||
name = "khi backup implant"
|
||||
desc = "A normal KHI wireless cortical stack with neutrino and QE transmission for constant-stream consciousness upload."
|
||||
@@ -4,12 +4,14 @@
|
||||
////////////////////////////////
|
||||
|
||||
/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/ping_time = 5 MINUTES
|
||||
var/overdue_time = 15 MINUTES
|
||||
var/process_time = 1 MINUTE
|
||||
|
||||
var/datum/transhuman/mind_record/list/backed_up = list()
|
||||
var/datum/transhuman/mind_record/list/has_left = list()
|
||||
@@ -19,30 +21,38 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
|
||||
process()
|
||||
|
||||
/datum/transhuman/infocore/proc/process()
|
||||
|
||||
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
|
||||
|
||||
switch(curr_MR.dead_state)
|
||||
if(MR_NORMAL)
|
||||
if(!curr_MR.ping())
|
||||
curr_MR.dead_state = MR_UNSURE
|
||||
if(MR_UNSURE)
|
||||
if(curr_MR.ping())
|
||||
curr_MR.dead_state = MR_NORMAL
|
||||
else
|
||||
curr_MR.dead_state = MR_DEAD
|
||||
notify(N)
|
||||
if(MR_DEAD)
|
||||
if(curr_MR.ping())
|
||||
curr_MR.dead_state = MR_NORMAL
|
||||
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(ping_time)
|
||||
spawn(process_time)
|
||||
process()
|
||||
|
||||
/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind)
|
||||
ASSERT(mind)
|
||||
if(!mind.name) //Name is critical to everything here
|
||||
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)
|
||||
@@ -51,14 +61,15 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
|
||||
|
||||
/datum/transhuman/infocore/proc/add_backup(var/datum/transhuman/mind_record/MR)
|
||||
ASSERT(MR)
|
||||
backed_up[MR.charname] = MR
|
||||
log_debug("Added [MR.charname] to transcore DB.")
|
||||
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.charname] = MR
|
||||
backed_up.Remove("[MR.charname]")
|
||||
log_debug("Put [MR.charname] in transcore suspended DB.")
|
||||
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)
|
||||
@@ -68,56 +79,43 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
|
||||
/////// Mind-backup record ///////
|
||||
/datum/transhuman/mind_record
|
||||
//User visible
|
||||
var/charname = "!!ERROR!!"
|
||||
var/implanted_at
|
||||
var/body_type
|
||||
var/id_gender
|
||||
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/obj/item/weapon/implant/backup/imp_ref
|
||||
var/ckey = ""
|
||||
var/mob/living/carbon/human/mob_ref
|
||||
var/client/client
|
||||
var/datum/mind/mind
|
||||
var/id_gender
|
||||
var/datum/mind/mind_ref
|
||||
var/cryo_at
|
||||
var/languages
|
||||
var/mind_oocnotes
|
||||
|
||||
/datum/transhuman/mind_record/New(var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1)
|
||||
ASSERT(M && imp)
|
||||
/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.
|
||||
|
||||
//Scrape info from mob.
|
||||
mob_ref = M
|
||||
charname = M.real_name
|
||||
implanted_at = world.time
|
||||
body_type = M.isSynthetic()
|
||||
id_gender = M.identifying_gender
|
||||
//The mind!
|
||||
mind_ref = mind
|
||||
mindname = mind.name
|
||||
ckey = mind.key
|
||||
|
||||
imp_ref = imp
|
||||
ckey = M.ckey
|
||||
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
|
||||
|
||||
//If these are gone then it's a problemmmm.
|
||||
client = M.client
|
||||
mind = M.mind
|
||||
last_update = world.time
|
||||
|
||||
if(add_to_db)
|
||||
transcore.add_backup(src)
|
||||
|
||||
/datum/transhuman/mind_record/proc/ping()
|
||||
if(!imp_ref || !mob_ref || imp_ref.loc != mob_ref || mob_ref.stat >= DEAD) //Ways you can be considered past-due
|
||||
return 0
|
||||
|
||||
return 1 //Ping replied
|
||||
|
||||
/////// Body Record ///////
|
||||
/datum/transhuman/body_record
|
||||
var/datum/dna2/record/mydna
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
|
||||
//Apply DNA
|
||||
H.dna = R.dna.Clone()
|
||||
H.original_player = current_project.ckey
|
||||
|
||||
//Apply damage
|
||||
H.adjustCloneLoss(150)
|
||||
@@ -261,6 +262,7 @@
|
||||
|
||||
//Apply DNA
|
||||
H.dna = R.dna.Clone()
|
||||
H.original_player = current_project.ckey
|
||||
|
||||
//Apply damage
|
||||
H.adjustBruteLoss(20)
|
||||
@@ -388,10 +390,10 @@
|
||||
else
|
||||
health_text = "[round(src.occupant.health,0.1)]"
|
||||
|
||||
if(src.occupant.client)
|
||||
mind_text = "Mind present"
|
||||
if(src.occupant.mind)
|
||||
mind_text = "Mind present: [occupant.mind.name]"
|
||||
else
|
||||
mind_text = "Mind absent"
|
||||
mind_text = "Mind absent."
|
||||
|
||||
var/dat ="<B>Resleever Status</B><BR>"
|
||||
dat +="<B>Current occupant:</B> [src.occupant ? "<BR>Name: [src.occupant]<BR>Health: [health_text]<BR>" : "<FONT color=red>None</FONT>"]<BR>"
|
||||
@@ -428,18 +430,16 @@
|
||||
|
||||
//In case they already had a mind!
|
||||
occupant << "<span class='warning'>You feel your mind being overwritten...</span>"
|
||||
|
||||
//Try to briefly find their mind and null it out on their current mob to prevent debraining pulling them back to it.
|
||||
if(MR.mind.current)
|
||||
MR.mind.current.mind = null
|
||||
if(occupant.mind)
|
||||
log_and_message_admins("was resleeve-wiped from their body.",occupant.mind)
|
||||
occupant.ghostize()
|
||||
|
||||
//Attach as much stuff as possible to the mob.
|
||||
for(var/datum/language/L in MR.languages)
|
||||
occupant.add_language(L.name)
|
||||
MR.mind_ref.active = 1 //Well, it's about to be.
|
||||
MR.mind_ref.transfer_to(occupant) //Does mind+ckey+client.
|
||||
occupant.identifying_gender = MR.id_gender
|
||||
occupant.client = MR.client
|
||||
occupant.mind = MR.mind
|
||||
occupant.ckey = MR.ckey
|
||||
occupant.ooc_notes = MR.mind_oocnotes
|
||||
occupant.apply_vore_prefs() //Cheap hack for now to give them SOME bellies.
|
||||
|
||||
@@ -454,15 +454,13 @@
|
||||
affected.implants += new_imp
|
||||
new_imp.part = affected
|
||||
|
||||
//Update the database record
|
||||
MR.mob_ref = occupant
|
||||
MR.imp_ref = new_imp
|
||||
MR.dead_state = MR_NORMAL
|
||||
|
||||
//Inform them and make them a little dizzy.
|
||||
occupant << "<span class='warning'>You feel a small pain in your head as you're given a new backup implant. Oh, and a new body. It's disorienting, to say the least.</span>"
|
||||
occupant.confused = max(occupant.confused, 25)
|
||||
occupant.eye_blurry = max(occupant.eye_blurry, 25)
|
||||
occupant.confused = max(occupant.confused, 30)
|
||||
occupant.eye_blurry = max(occupant.eye_blurry, 30)
|
||||
|
||||
if(occupant.original_player != occupant.ckey)
|
||||
log_and_message_admins("is now a cross-sleeved character. Body originally belonged to [occupant.original_player]. Mind is now [occupant.mind.name].",occupant)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
+1
-1
@@ -2105,7 +2105,7 @@
|
||||
#include "code\modules\resleeving\circuitboards.dm"
|
||||
#include "code\modules\resleeving\computers.dm"
|
||||
#include "code\modules\resleeving\documents.dm"
|
||||
#include "code\modules\resleeving\general.dm"
|
||||
#include "code\modules\resleeving\implant.dm"
|
||||
#include "code\modules\resleeving\infocore.dm"
|
||||
#include "code\modules\resleeving\machines.dm"
|
||||
#include "code\modules\rogueminer_vr\asteroid.dm"
|
||||
|
||||
Reference in New Issue
Block a user