Files
CHOMPStation2/code/modules/resleeving/computers.dm
Arokha Sieyes 5cb6d250d0 Adds 'Subsleeving' into prey
Allows the resleever to sleeve minds into people inside the resleeving pod's occupant, aka if you want you can print a new body for the person (or if you're wiping some existing person, take a living person), have someone eat them, then get in resleeving pod and revive them in a gut. That'll keep them from walking around and tripping too much, yuh.

I'm sure there's a million crazy things you could do with this (eat person you want to impersonate, resleeve yourself into them while they're in your guts, then escape your own guts?) so have fun with that.

For technical reasons, for now, you cannot sleeve the PRED if they have prey in them in the resleeving pod. It has to do with wiping out their bellies and forgetting where their prey are. This would happen to prey if the prey has their own prey, as well, but... don't? Also you can always just OOC escape if you get trapped like that.
2017-04-10 01:33:40 -04:00

409 lines
13 KiB
Plaintext

/obj/machinery/computer/transhuman/resleeving
name = "resleeving control console"
icon = 'icons/obj/computer.dmi'
icon_keyboard = "med_key"
icon_screen = "dna"
light_color = "#315ab4"
circuit = /obj/item/weapon/circuitboard/resleeving_control
req_access = list(access_heads) //Only used for record deletion right now.
var/list/pods = list() //Linked grower pods.
var/list/spods = list()
var/list/sleevers = list() //Linked resleeving booths.
var/temp = ""
var/menu = 1 //Which menu screen to display
var/datum/transhuman/body_record/active_br = null
var/datum/transhuman/mind_record/active_mr = null
var/datum/transhuman/infocore/TC //Easy debugging access
var/organic_capable = 1
var/synthetic_capable = 1
var/obj/item/weapon/disk/transcore/disk
/obj/machinery/computer/transhuman/resleeving/initialize()
..()
updatemodules()
TC = transcore
/obj/machinery/computer/transhuman/resleeving/Destroy()
releasepods()
..()
/obj/machinery/computer/transhuman/resleeving/proc/updatemodules()
releasepods()
findpods()
/obj/machinery/computer/transhuman/resleeving/proc/releasepods()
for(var/obj/machinery/clonepod/transhuman/P in pods)
P.connected = null
P.name = initial(P.name)
pods.Cut()
for(var/obj/machinery/transhuman/synthprinter/P in spods)
P.connected = null
P.name = initial(P.name)
spods.Cut()
for(var/obj/machinery/transhuman/resleever/P in sleevers)
P.connected = null
P.name = initial(P.name)
sleevers.Cut()
/obj/machinery/computer/transhuman/resleeving/proc/findpods()
var/num = 1
var/area/A = get_area(src)
for(var/obj/machinery/clonepod/transhuman/P in A.get_contents())
if(!P.connected)
pods += P
P.connected = src
P.name = "[initial(P.name)] #[num++]"
for(var/obj/machinery/transhuman/synthprinter/P in A.get_contents())
if(!P.connected)
spods += P
P.connected = src
P.name = "[initial(P.name)] #[num++]"
for(var/obj/machinery/transhuman/resleever/P in A.get_contents())
if(!P.connected)
sleevers += P
P.connected = src
P.name = "[initial(P.name)] #[num++]"
/obj/machinery/computer/transhuman/resleeving/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/device/multitool))
var/obj/item/device/multitool/M = W
var/obj/machinery/clonepod/transhuman/P = M.connecting
if(istype(P) && !(P in pods))
pods += P
P.connected = src
P.name = "[initial(P.name)] #[pods.len]"
user << "<span class='notice'>You connect [P] to [src].</span>"
else if(istype(W, /obj/item/weapon/disk/transcore))
user.unEquip(W)
disk = W
disk.forceMove(src)
user << "<span class='notice'>You insert \the [W] into \the [src].</span>"
if(istype(W, /obj/item/weapon/disk/body_record))
var/obj/item/weapon/disk/body_record/brDisk = W
if(!brDisk.stored)
to_chat(user, "<span class='warning'>\The [W] does not contain a stored body record.</span>")
return
user.unEquip(W)
W.forceMove(get_turf(src)) // Drop on top of us
active_br = new /datum/transhuman/body_record(brDisk.stored) // Loads a COPY!
menu = 4
to_chat(user, "<span class='notice'>\The [src] loads the body record from \the [W] before ejecting it.</span>")
attack_hand(user)
else
..()
return
/obj/machinery/computer/transhuman/resleeving/attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user as mob)
user.set_machine(src)
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
updatemodules()
ui_interact(user)
/obj/machinery/computer/transhuman/resleeving/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
var/data[0]
var/bodyrecords_list_ui[0]
for(var/N in TC.body_scans)
var/datum/transhuman/body_record/BR = TC.body_scans[N]
bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
var/mindrecords_list_ui[0]
for(var/N in TC.backed_up)
var/datum/transhuman/mind_record/MR = TC.backed_up[N]
mindrecords_list_ui[++mindrecords_list_ui.len] = list("name" = N, "recref" = "\ref[MR]")
var/pods_list_ui[0]
for(var/obj/machinery/clonepod/transhuman/pod in pods)
pods_list_ui[++pods_list_ui.len] = list("pod" = pod, "biomass" = pod.biomass)
var/spods_list_ui[0]
for(var/obj/machinery/transhuman/synthprinter/spod in spods)
spods_list_ui[++spods_list_ui.len] = list("spod" = spod, "steel" = spod.stored_material[DEFAULT_WALL_MATERIAL], "glass" = spod.stored_material["glass"])
var/sleevers_list_ui[0]
for(var/obj/machinery/transhuman/resleever/resleever in sleevers)
sleevers_list_ui[++sleevers_list_ui.len] = list("sleever" = resleever, "occupant" = resleever.occupant ? resleever.occupant.real_name : "None")
if(pods)
data["pods"] = pods_list_ui
else
data["pods"] = null
if(spods)
data["spods"] = spods_list_ui
else
data["spods"] = null
if(sleevers)
data["sleevers"] = sleevers_list_ui
else
data["pods"] = null
if(bodyrecords_list_ui.len)
data["bodyrecords"] = bodyrecords_list_ui
else
data["bodyrecords"] = null
if(mindrecords_list_ui.len)
data["mindrecords"] = mindrecords_list_ui
else
data["mindrecords"] = null
if(active_br)
var/can_grow_active = 1
if(!synthetic_capable && active_br.synthetic) //Disqualified due to being synthetic in an organic only.
can_grow_active = 0
else if(!organic_capable && !active_br.synthetic) //Disqualified for the opposite.
can_grow_active = 0
else if(!synthetic_capable && !organic_capable) //What have you done??
can_grow_active = 0
else if(active_br.toocomplex)
can_grow_active = 0
data["activeBodyRecord"] = list("real_name" = active_br.mydna.name, \
"speciesname" = active_br.speciesname ? active_br.speciesname : active_br.mydna.dna.species, \
"gender" = active_br.bodygender, \
"synthetic" = active_br.synthetic ? "Yes" : "No", \
"locked" = active_br.locked ? "Low" : "High", \
"cando" = can_grow_active,
"booc" = active_br.body_oocnotes)
else
data["activeRecord"] = null
if(active_mr)
var/can_sleeve_current = 1
if(!sleevers.len)
can_sleeve_current = 0
data["activeMindRecord"] = list("charname" = active_mr.mindname, \
"obviously_dead" = active_mr.dead_state == MR_DEAD ? "Past-due" : "Current", \
"cando" = can_sleeve_current,
"mooc" = active_mr.mind_oocnotes)
else
data["activeMindRecord"] = null
data["menu"] = menu
data["podsLen"] = pods.len
data["spodsLen"] = spods.len
data["sleeversLen"] = sleevers.len
data["temp"] = temp
data["coredumped"] = transcore.core_dumped
data["emergency"] = disk ? 1 : 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "sleever.tmpl", "Resleeving Control Console", 400, 450)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(5)
/obj/machinery/computer/transhuman/resleeving/Topic(href, href_list)
if(..())
return 1
else if (href_list["view_brec"])
active_br = locate(href_list["view_brec"])
if(active_br && istype(active_br.mydna))
menu = 4
else
active_br = null
temp = "ERROR: Record missing."
else if (href_list["view_mrec"])
active_mr = locate(href_list["view_mrec"])
if(active_mr && istype(active_mr))
menu = 5
else
active_mr = null
temp = "ERROR: Record missing."
else if (href_list["boocnotes"])
menu = 6
else if (href_list["moocnotes"])
menu = 7
else if (href_list["refresh"])
updateUsrDialog()
else if (href_list["coredump"])
if(disk)
transcore.core_dump(disk)
disk.forceMove(get_turf(src))
disk = null
else if (href_list["ejectdisk"])
disk.forceMove(get_turf(src))
disk = null
else if (href_list["create"])
if(istype(active_br))
//Tried to grow a synth but no synth pods.
if(active_br.synthetic && !spods.len)
temp = "Error: No SynthFabs detected."
//Tried to grow an organic but no growpods.
else if(!active_br.synthetic && !pods.len)
temp = "Error: No growpods detected."
//We have the machines. We can rebuild them. Probably.
else
//We're cloning a synth.
if(active_br.synthetic)
var/obj/machinery/transhuman/synthprinter/spod = spods[1]
if (spods.len > 1)
spod = input(usr,"Select a SynthFab to use", "Printer selection") as anything in spods
//Already doing someone.
if(spod.busy)
temp = "Error: SynthFab is currently busy."
//Not enough steel or glass
else if(spod.stored_material[DEFAULT_WALL_MATERIAL] < spod.body_cost)
temp = "Error: Not enough [DEFAULT_WALL_MATERIAL] in SynthFab."
else if(spod.stored_material["glass"] < spod.body_cost)
temp = "Error: Not enough glass in SynthFab."
//Gross pod (broke mid-cloning or something).
else if(spod.broken)
temp = "Error: SynthFab malfunction."
//Do the cloning!
else if(spod.print(active_br))
temp = "Initiating printing cycle..."
menu = 1
else
temp = "Initiating printing cycle...<br>Error: Post-initialisation failed. Printing cycle aborted."
//We're cloning an organic.
else
var/obj/machinery/clonepod/transhuman/pod = pods[1]
if (pods.len > 1)
pod = input(usr,"Select a growing pod to use", "Pod selection") as anything in pods
//Already doing someone.
if(pod.occupant)
temp = "Error: Growpod is currently occupied."
//Not enough materials.
else if(pod.biomass < CLONE_BIOMASS)
temp = "Error: Not enough biomass."
//Gross pod (broke mid-cloning or something).
else if(pod.mess)
temp = "Error: Growpod malfunction."
//Disabled in config.
else if(!config.revival_cloning)
temp = "Error: Unable to initiate growing cycle."
//Do the cloning!
else if(pod.growclone(active_br))
temp = "Initiating growing cycle..."
menu = 1
else
temp = "Initiating growing cycle...<br>Error: Post-initialisation failed. Growing cycle aborted."
//The body record is broken somehow.
else
temp = "Error: Data corruption."
else if (href_list["sleeve"])
if(istype(active_mr))
if(!sleevers.len)
temp = "Error: No sleevers detected."
else
var/mode = text2num(href_list["sleeve"])
var/override
var/obj/machinery/transhuman/resleever/sleever = sleevers[1]
if (sleevers.len > 1)
sleever = input(usr,"Select a resleeving pod to use", "Resleever selection") as anything in sleevers
switch(mode)
if(1) //Body resleeving
//No body to sleeve into.
if(!sleever.occupant)
temp = "Error: Resleeving pod is not occupied."
//OOC body lock thing.
if(sleever.occupant.resleeve_lock && active_mr.ckey != sleever.occupant.resleeve_lock)
temp = "Error: Mind incompatible with body."
var/list/subtargets = list()
for(var/mob/living/carbon/human/H in sleever.occupant)
if(H.resleeve_lock && active_mr.ckey != H.resleeve_lock)
continue
subtargets += H
if(subtargets.len)
var/oc_sanity = sleever.occupant
override = input(usr,"Multiple bodies detected. Select target for resleeving of [active_mr.mindname] manually. Sleeving of primary body is unsafe with sub-contents, and is not listed.", "Resleeving Target") as null|anything in subtargets
if(!override || oc_sanity != sleever.occupant || !(override in sleever.occupant))
temp = "Error: Target selection aborted."
if(2) //Card resleeving
if(sleever.sleevecards <= 0)
temp = "Error: No available cards in resleever."
//Body to sleeve into, but mind is in another living body.
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. Do you want to abandon this body, and move there? You MAY suffer memory loss! (Same rules as CMD apply)","Resleeving","Yes","No")
//They declined to be moved.
if(answer == "No")
temp = "Initiating resleeving...<br>Error: Post-initialisation failed. Resleeving cycle aborted."
menu = 1
//They were dead, or otherwise available.
if(!temp)
sleever.putmind(active_mr,mode,override)
temp = "Initiating resleeving..."
menu = 1
//IDK but it broke somehow.
else
temp = "Error: Data corruption."
else if (href_list["menu"])
menu = href_list["menu"]
temp = ""
nanomanager.update_uis(src)
add_fingerprint(usr)
// In here because only relevant to computer
/obj/item/weapon/cmo_disk_holder
name = "cmo emergency packet"
desc = "A small paper packet with printing on one side. \"Tear open in case of Code Delta or Emergency Evacuation ONLY. Use in any other case is UNLAWFUL.\""
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "cmoemergency"
item_state = "card-id"
/obj/item/weapon/cmo_disk_holder/attack_self(var/mob/attacker)
playsound(src, 'sound/items/poster_ripped.ogg', 50)
attacker << "<span class='warning'>You tear open \the [name].</span>"
attacker.unEquip(src)
var/obj/item/weapon/disk/transcore/newdisk = new(get_turf(src))
attacker.put_in_any_hand_if_possible(newdisk)
qdel(src)
/obj/item/weapon/disk/transcore
name = "TransCore Dump Disk"
desc = "It has a small label. \n\
\"1.INSERT DISK INTO RESLEEVING CONSOLE\n\
2. BEGIN CORE DUMP PROCEDURE\n\
3. ENSURE DISK SAFETY WHEN EJECTED\""
icon = 'icons/obj/cloning.dmi'
icon_state = "harddisk"
item_state = "card-id"
w_class = ITEMSIZE_SMALL
var/datum/transhuman/mind_record/list/stored = list()