diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm
index a06b306e41..a8beeee075 100644
--- a/code/modules/resleeving/computers.dm
+++ b/code/modules/resleeving/computers.dm
@@ -7,6 +7,7 @@
circuit = /obj/item/weapon/circuitboard/cloning
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
@@ -14,7 +15,7 @@
var/datum/transhuman/mind_record/active_mr = null
var/datum/transhuman/infocore/TC //Easy debugging access
var/organic_capable = 1
- var/synthetic_capable = 0
+ var/synthetic_capable = 1
/obj/machinery/computer/transhuman/resleeving/initialize()
..()
@@ -34,6 +35,10 @@
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)
@@ -47,6 +52,11 @@
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
@@ -99,6 +109,10 @@
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.steel, "glass" = spod.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")
@@ -108,6 +122,11 @@
else
data["pods"] = null
+ if(spods)
+ data["spods"] = spods_list_ui
+ else
+ data["spods"] = null
+
if(sleevers)
data["sleevers"] = sleevers_list_ui
else
@@ -126,14 +145,12 @@
if(active_br)
var/can_grow_active = 1
- if(!synthetic_capable && active_br.synthetic) //Disqualified due to being synthetic in an organic pod.
+ 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(!pods.len)
- can_grow_active = 0
data["activeBodyRecord"] = list("real_name" = active_br.mydna.name, \
"speciesname" = active_br.speciesname, \
@@ -156,6 +173,7 @@
data["menu"] = menu
data["podsLen"] = pods.len
+ data["spodsLen"] = spods.len
data["sleeversLen"] = sleevers.len
data["temp"] = temp
@@ -189,27 +207,73 @@
else if (href_list["refresh"])
updateUsrDialog()
- else if (href_list["grow"])
+ else if (href_list["create"])
if(istype(active_br))
- if(!pods.len)
+ //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
- 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
- if(pod.occupant)
- temp = "Error: Growpod is currently occupied."
- else if(pod.biomass < CLONE_BIOMASS)
- temp = "Error: Not enough biomass."
- else if(pod.mess)
- temp = "Error: Growpod malfunction."
- else if(!config.revival_cloning)
- temp = "Error: Unable to initiate growing cycle."
- else if(pod.growclone(active_br.mydna))
- temp = "Initiating growing cycle..."
- menu = 1
+ //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.steel < spod.body_cost)
+ temp = "Error: Not enough steel in SynthFab."
+ else if(spod.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...
Error: Post-initialisation failed. Printing cycle aborted."
+
+ //We're cloning an organic.
else
- temp = "Initiating growing cycle...
Error: Post-initialisation failed. Growing cycle aborted."
+ 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...
Error: Post-initialisation failed. Growing cycle aborted."
+
+ //The body record is broken somehow.
else
temp = "Error: Data corruption."
@@ -228,7 +292,7 @@
//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 CURRENT backup of your mind into another body. Do you want to move to that body? You should suffer no memory loss.","Resleeving","Yes","No")
+ 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")
//They declined to be moved.
if(answer == "No")
diff --git a/code/modules/resleeving/infocore.dm b/code/modules/resleeving/infocore.dm
index c8d6d31519..0df9bb6c42 100644
--- a/code/modules/resleeving/infocore.dm
+++ b/code/modules/resleeving/infocore.dm
@@ -118,6 +118,8 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
var/synthetic
var/speciesname
var/bodygender
+ 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)
/datum/transhuman/body_record/New(var/mob/living/carbon/human/M,var/add_to_db = 1)
ASSERT(M)
@@ -143,5 +145,32 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore
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
+
+ //Just set the data to this. 0:normal, 1:assisted, 2:robotic, 3:crazy
+ organ_data[org] = I.robotic
+
if(add_to_db)
transcore.add_body(src)
\ No newline at end of file
diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm
index f190eabf29..dd54c8fc90 100644
--- a/code/modules/resleeving/machines.dm
+++ b/code/modules/resleeving/machines.dm
@@ -7,7 +7,8 @@
/obj/machinery/clonepod/transhuman
name = "grower pod"
-/obj/machinery/clonepod/transhuman/growclone(var/datum/dna2/record/R)
+/obj/machinery/clonepod/transhuman/growclone(var/datum/transhuman/body_record/current_project)
+ var/datum/dna2/record/R = current_project.mydna
if(mess || attempting)
return 0
@@ -19,6 +20,45 @@
eject_wait = 0
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
+
+ //Fix the external organs
+ for(var/part in current_project.limb_data)
+
+ var/status = current_project.limb_data[part]
+ if(status == null) continue //Species doesn't have limb? Child of amputated limb?
+
+ var/obj/item/organ/external/O = H.organs_by_name[part]
+ if(!O) continue //Not an organ. Perhaps another amputation removed it already.
+
+ if(status == 1) //Normal limbs
+ continue
+ else if(status == 0) //Missing limbs
+ O.remove_rejuv()
+ else if(status) //Anything else is a manufacturer
+ O.remove_rejuv() //Don't robotize them, leave them removed so robotics can attach a part.
+
+ //Look, this machine can do this because [reasons] okay?!
+ for(var/part in current_project.organ_data)
+
+ var/status = current_project.organ_data[part]
+ if(status == null) continue //Species doesn't have organ? Child of missing part?
+
+ var/obj/item/organ/I = H.internal_organs_by_name[name]
+ if(!I) continue//Not an organ. Perhaps external conversion changed it already?
+
+ if(part == BP_EYES && status > 0) //But not eyes. The only non-essential internal organ.
+ qdel(I)
+ continue
+
+ if(status == 0) //Normal organ
+ continue
+ else if(status == 1) //Assisted organ
+ I.mechassist()
+ else if(status == 2) //Mechanical organ
+ I.robotize()
+ else if(status == 3) //Digital organ
+ I.digitize()
+
occupant = H
if(!R.dna.real_name)
@@ -64,7 +104,6 @@
return
else if(occupant.health < heal_level && occupant.getCloneLoss() > 0)
- occupant.Paralyse(4)
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-2 * heal_rate)
@@ -75,7 +114,7 @@
//So clones don't die of oxyloss in a running pod.
if(occupant.reagents.get_reagent_amount("inaprovaline") < 30)
occupant.reagents.add_reagent("inaprovaline", 60)
- occupant.Sleeping(30)
+
//Also heal some oxyloss ourselves because inaprovaline is so bad at preventing it!!
occupant.adjustOxyLoss(-4)
@@ -98,7 +137,124 @@
return
+//Synthetic version
+/obj/machinery/transhuman/synthprinter
+ name = "SynthFab 3000"
+ desc = "A rapid fabricator for synthetic bodies."
+ icon = 'icons/obj/machines/synthpod.dmi'
+ icon_state = "pod_0"
+ density = 1
+ anchored = 1
+ var/steel = 30000 //Starting steel
+ var/glass = 30000 //Starting glass
+ var/connected //What console it's done up with
+ var/busy = 0 //Busy cloning
+ var/body_cost = 15000 //Cost of a cloned body (metal and glass ea.)
+ var/datum/transhuman/body_record/current_project
+ var/broken = 0
+
+/obj/machinery/transhuman/synthprinter/process()
+ if(stat & NOPOWER)
+ if(busy)
+ busy = 0
+ current_project = null
+ update_icon()
+ return
+
+ if(busy > 0 && busy <= 95)
+ busy += 5
+
+ if(busy >= 100)
+ make_body()
+
+ return
+
+/obj/machinery/transhuman/synthprinter/proc/print(var/datum/transhuman/body_record/BR)
+ if(!istype(BR) || busy)
+ return 0
+
+ if(steel < body_cost || glass < body_cost)
+ return 0
+
+ current_project = BR
+ busy = 5
+ update_icon()
+
+ return 1
+
+/obj/machinery/transhuman/synthprinter/proc/make_body()
+ if(!current_project)
+ busy = 0
+ update_icon()
+ return
+
+ //Blep us a new blank body to robotize (based on their original species choice).
+ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, current_project.mydna.dna.species)
+ H.name = current_project.mydna.dna.real_name
+ H.real_name = H.name
+
+ //First the external organs
+ for(var/part in current_project.limb_data)
+
+ var/status = current_project.limb_data[part]
+ if(status == null) continue //Species doesn't have limb? Child of amputated limb?
+
+ var/obj/item/organ/external/O = H.organs_by_name[part]
+ if(!O) continue //Not an organ. Perhaps another amputation removed it already.
+
+ if(status == 1) //Normal limbs
+ continue
+ else if(status == 0) //Missing limbs
+ O.remove_rejuv()
+ else if(status) //Anything else is a manufacturer
+ O.robotize(status)
+
+ //Then the internal organs
+ for(var/part in current_project.organ_data)
+
+ var/status = current_project.organ_data[part]
+ if(status == null) continue //Species doesn't have organ? Child of missing part?
+
+ var/obj/item/organ/I = H.internal_organs_by_name[name]
+ if(!I) continue//Not an organ. Perhaps external conversion changed it already?
+
+ if(status == 0) //Normal organ
+ continue
+ else if(status == 1) //Assisted organ
+ I.mechassist()
+ else if(status == 2) //Mechanical organ
+ I.robotize()
+ else if(status == 3) //Digital organ
+ I.digitize()
+
+ H.adjustBruteLoss(20)
+ H.adjustFireLoss(20)
+
+ //Cha-ching.
+ steel -= body_cost
+ glass -= body_cost
+
+ //Plonk them here.
+ H.loc = get_turf(src)
+
+ //Reset stuff.
+ busy = 0
+ update_icon()
+
+/obj/machinery/transhuman/synthprinter/attack_hand(mob/user as mob)
+ if((busy == 0) || (stat & NOPOWER))
+ return
+ user << "Current print cycle is [busy]% complete."
+ return
+
+/obj/machinery/transhuman/synthprinter/update_icon()
+ ..()
+ icon_state = "pod_0"
+ if(busy && !(stat & NOPOWER))
+ icon_state = "pod_1"
+ else if(broken)
+ icon_state = "pod_g"
/////// Resleever Pod ///////
/obj/machinery/transhuman/resleever
diff --git a/icons/obj/machines/synthpod.dmi b/icons/obj/machines/synthpod.dmi
new file mode 100644
index 0000000000..2684ddcbe5
Binary files /dev/null and b/icons/obj/machines/synthpod.dmi differ
diff --git a/maps/virgo-1.dmm b/maps/virgo-1.dmm
index b236080596..1ab2ad111a 100644
--- a/maps/virgo-1.dmm
+++ b/maps/virgo-1.dmm
@@ -4801,7 +4801,7 @@
"bOq" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay)
"bOr" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay)
"bOs" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/medical/medbay_emt_bay)
-"bOt" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
+"bOt" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - Resleeving"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bOu" = (/turf/simulated/floor/carpet/blue,/area/medical/psych)
"bOv" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bOw" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
@@ -4943,7 +4943,7 @@
"bRc" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/scalpel{pixel_y = 12},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/retractor,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRd" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRe" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bRf" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/weapon/weldingtool/hugetank,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"bRf" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRi" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/bed/chair/office/light{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
@@ -4989,7 +4989,7 @@
"bRW" = (/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/iv_drip,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_c)
"bRX" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/medical/patient_c)
"bRY" = (/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/structure/closet{name = "spare clothes"},/obj/item/clothing/under/color/black,/obj/item/clothing/under/color/black,/obj/item/clothing/under/color/grey,/obj/item/clothing/under/color/grey,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/blue,/obj/item/clothing/under/color/green,/obj/item/clothing/under/color/lightpurple,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/resleeving)
-"bRZ" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Resleeving"; dir = 1},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/transhuman/resleever,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
+"bRZ" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/transhuman/resleever,/turf/simulated/floor/tiled/white,/area/medical/resleeving)
"bSa" = (/obj/effect/floor_decal/corner/pink{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bSb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/pink{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bSc" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr2_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr2_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr2_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr2_window_tint"},/turf/simulated/floor,/area/medical/patient_b)
@@ -5029,8 +5029,8 @@
"bSK" = (/obj/structure/table/standard,/obj/machinery/light,/obj/structure/closet/secure_closet/medical_wall{name = "anesthetic closet"; pixel_x = -32; req_access = list(29)},/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/storage/box/gloves,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bSL" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bSM" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bSN" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
-"bSO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light,/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"bSN" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/transhuman/resleeving,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
+"bSO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light,/obj/machinery/transhuman/resleever,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bSP" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bSQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_four)
"bSR" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
@@ -5374,6 +5374,7 @@
"bZr" = (/obj/random/obstruction,/turf/simulated/floor,/area/maintenance/medbay_aft)
"bZs" = (/obj/structure/window/reinforced/polarized{dir = 1; id = "pr5_window_tint"},/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/polarized{dir = 2; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "pr5_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "pr5_window_tint"},/turf/simulated/floor,/area/medical/patient_c)
"bZt" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/bed/chair/office/light,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/medbay{c_tag = "MED - Patient Room E"; dir = 4},/turf/simulated/floor/tiled/white,/area/medical/patient_c)
+"bZu" = (/obj/machinery/transhuman/synthprinter,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bZw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bZx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bZy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Patient Room D"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/patient_d)
@@ -10119,7 +10120,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaaaaeaaaaaaaaaaaeaaeaaeaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeaafaafaafbMXbMYbMZbNabNbbNcbMXbNdaaiaaiaafaafbrmbNebGqbNfbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbNgbNhbNibNjbNkbNlbxKbNmbNnbNobNpbNqbNrbNsbGubGvbGwbNtbNubJFbNvbFebNwbNxbNybNzbNzbNAbNBbNybNCbNDbFeaaiaaibIlbbiaZhbbibNEbFibDxbNFbIpbNGbNHbIpbLJbNIbDxbNJbNKbNLbLObNMbNNbNObNPbLObNQbLObLOaafaVeaVObClbNRbNSbNTbNTbNUbNTbNTbNVbDMbNWbClbNXbNYbNZbOabObbOcbNXbNYbNZbCobNXbNZaOKaVkbiVbFJaOKaOKaaibKpbOfbOgbOhbOibOjbOkbOlbOmbOnbOobOpbOqbOrbOsbEubMwbKzbMAbMxbOtbMBbOwbOvbQwbOAbOBbOCbODbOEbOFbOGbOHbOIbOEbOJbOKbOLbOMbKVbONbOObOPbKZbLabOQbORbMVbOSbOTbOUbMVbOVbJlaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayacvacvaazaayaaeaaeaaeaayaaeaaeaaeaaeaaaaaaaaaaaeaaeaaeaazaaeaaaaafaafaafbLlbOWbOXbOYbOYbOZbLlaaiaaiaaiaafaafbrmbPabPbbPcbPcbPcbPdbPcbPcbPcbPcbPcbPcbPcbPcbPcbPcbPebPfbPgbPhbPibPjbPkbPlbPmbPnbPobPpbPqbPrbwhbIbbPsbPtbPubPvbPwbFebPxbNBbNBbNBbNBbNBbNBbNBbNCbPybFeaaiaaibIlbbiaZhbPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbDxbPKbNKbPLbLObPMbPNbPObPObPPbPQbPRbLOaafaVeaVObClbPSbPTbDMbPUbPVbDMbDMbDMbDMbPWbClbPXbPYbPZbQabQbbQcbQbbQcbQdbQebQfbQfbQgbQhbbyaPQbQiaOKaaibKpbQjbQkbQlbMibQmbQnbQobQpbQqbQrbQsbQtbQubQvbEubRibQybKzbRRbEubEubEubEubEubQzbQAbQBbQBbQBbQBbQBbQCbQDbQCbQCbQCbQCbQCbQEbQFbQGbQHbQIbQIbQIbJlbJlbZGbQKbQLbZGbJlbJlaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbMXbQMbOXbOYbOYbQNbMXbNdaaiaaiaafaafbrmbQObGqbQPbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbrmbQQbQQbQRbQSbQQbQTbQUbQVbQWbQXbQYbQZbRabRbbQXbQXbQXbQXbQXbFebRcbRdbRebNBbNBbRfbRgbRhbNCbRSbFeaaiaaibIlbbiaZhbRjaXOaXObDxbDxbDxbDxbDxbRkbDxbDxbDxbRlbRmbRnbLObRobRpbRqbRrbLObRsbRtbLOaafaVeaVObClbDPbRubClbClbRvbRwbRwbRwbRwbClbClbRxbPZbPYbRybRzbPZbPYbPZbRAbRBaPQaPQaPQaPQbRCbRDbREaOKaaibKpbRFbRGbRHbRGbRIbQnbRJbRKcRbbRMbRNbRObRPbRQbEubRUbRTbRZbRYbEubKDbKEbTGbVBbSabSbbScbSdbSebSfbQBbSgbShbSibSjbSkbSlbQCbSmbSnbQGbSobSpbSqbQGaafaafbZGbSrbSsbZGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbLjbLkbLlbStbLlbLkbLjbJraaiaaiaafaafbrmbrmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbSubSvbSwbSxbQQbSybSzbSzbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbFebSKbSLbSMbNBbNBbSNbSLbSObNCbSPbFeaaiaaibIlbbiaZhaVGbSQaaibSRbSSbSTbSUbSVbSWbSXbSYbSRbSZbTabTbbLObLObTcbLObLObLObLObLObLOaafaVeaVOaVebTdbTebTfbTgbThbThbThbThbThbTibTjbPZbPYbTkbTlbTmbTnbPZbPYbTobTpaPQaPQbTqbTrbaBaPQbTsaOKaaibKpbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbQubTEbTFbEubEubEubEubEubEubXSbMybMzbXTbTKbTLbTMbTNbTObTPbQBbTQbTRbTSbTTbTTbTUbQCbTVbTWbQGbTXbTYbTZbQGaafaafbZGbUabUbbZGaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbLjbLkbLlbStbLlbLkbLjbJraaiaaiaafaafbrmbrmbGqbrmbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbSubSvbSwbSxbQQbSybSzbSzbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbFebSKbSLbSMbNBbNBbSNbZubSObNCbSPbFeaaiaaibIlbbiaZhaVGbSQaaibSRbSSbSTbSUbSVbSWbSXbSYbSRbSZbTabTbbLObLObTcbLObLObLObLObLObLOaafaVeaVOaVebTdbTebTfbTgbThbThbThbThbThbTibTjbPZbPYbTkbTlbTmbTnbPZbPYbTobTpaPQaPQbTqbTrbaBaPQbTsaOKaaibKpbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTDbQubTEbTFbEubEubEubEubEubEubXSbMybMzbXTbTKbTLbTMbTNbTObTPbQBbTQbTRbTSbTTbTTbTUbQCbTVbTWbQGbTXbTYbTZbQGaafaafbZGbUabUbbZGaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafbJrbJsbUcbUdbUebUfbUgbJtbJraaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUtbUubUvbUvbUwbUxbUybUzbUAbUzbUBbUBbUzbUCbUzbUDbUzbUyaaiaaibIlbUEaZhaVGaWEaaibUFbUGbUHbUIbUGbSWbSWbUJbUKbULbUMbTbblubUObUPbUQbuwbUSbUTbQJbLOaafaVebUVbUWbUXbUYbUZbVabVbbVcbVdbVcbVbbVcbUZbPYbPZbVebVfbTlbVgbPYbPZbVhbVibOdbOeaOKbFJbiVbFJaOKaOKaaibKpbVjbVkbKpbVjbVkbKpbKpbKpbIUbVlbVmbVnbIUbIUbIUaafaafaafaafbJdbOxbOybOzbVBbVrbVsbScbVtbVubVvbQBcYzbVxbVybVzbVAbXUbQCbVCbVDbVEbVFbVGbQGbQGaafaafbZGbVHbVIbZGbZGaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaaiaaibVJbVKbVLbVMbVJaaiaaiaaiaafaafaafaafbrmbGqbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbVNbVObVPbVQbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebUybWfbWgbWhbWibWibWfbWgbWfbWjbWkbUyaaiaaibIlbWlbeHbWmaWEaaibWnbWobWpbWqbWrbWsbWtbWubSRbWvbWwbWMbWybWybWzbWAbWBbWCbWCbUNbLOaafaVebWEaVebWFbPZbPYbUZbWGbUZbWGbUZbWGbUZbWHbPZbPYbTkbWIbTmbTnbPZbPYbWJbViaaiaaiaOKbWKbbybWLaOKaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaibIUbXAbWNbIUbIUaafaafaafaafaafaafbJdbJdbJdbJdbJdbWObWPbQBbQBbQBbQBbQBbQCbQCbQCbQCbQCbQCbQCbWQbWRbQGbQGbQGbQGaafaafaafbZGbWSbWTbWUbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaibWVbWWbWXbWYbWVaaiaaiaaiaafaafaafaafbrmbWZbrmaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbQQbXabXbbXcbXdbXebXfbWdbXgbXhbXibXjbXkbXhbXgbWdbWdbWdbXlbUybXmbXnbXmbXobWibXmbXnbXmbWjbWkbUyaaiaaibXpbbibBRbXqaWEaaibXrbXsbXtbXubXvbSWbXwbXxbXybWvbXzbYQbXBbXCbXDbXEbXFbXGbXHbXIbLOaafaVebWEaVeaVebPYbPZbPYbPZbPYbPZbPYbPZbPYbPZbXJbPZbPYbXKbRxbXLbPYbPZbRxbXMbXNaaibHnaPQbbyaPQbHnaaibXObXObXObXObXObXObXObXObXOaaibXPbXQbXRbXPaawaawaawaawaawbXVaafbRVbRWbRXbXWbZsbSabSbbXXbXYbXZbYabYbaafaafaafaafaafaafbYcbYdbYebYfbYgbYcaafaafaafaafbZGbYhbYibYjbZGaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/nano/templates/sleever.tmpl b/nano/templates/sleever.tmpl
index df60daea8a..e0fd519c34 100644
--- a/nano/templates/sleever.tmpl
+++ b/nano/templates/sleever.tmpl
@@ -5,18 +5,22 @@