diff --git a/code/__defines/research.dm b/code/__defines/research.dm
index d40722d0cf..9c3bec3066 100644
--- a/code/__defines/research.dm
+++ b/code/__defines/research.dm
@@ -12,7 +12,8 @@
#define TECH_ILLEGAL "syndicate"
#define TECH_ARCANE "arcane"
-#define IMPRINTER 0x1 //For circuits. Uses glass/chemicals.
-#define PROTOLATHE 0x2 //New stuff. Uses glass/metal/chemicals
-#define MECHFAB 0x4 //Mechfab
-#define CHASSIS 0x8 //For protolathe, but differently
+#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
+#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
+#define MECHFAB 0x0004 //Mechfab
+#define CHASSIS 0x0008 //For protolathe, but differently
+#define PROSFAB 0x0010 //For prosthetics fab
\ No newline at end of file
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index aec056f7f6..11c1fa87fc 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -618,6 +618,35 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
access = access_robotics
group = "Engineering"
+/datum/supply_packs/robolimbs_basic
+ name = "Basic robolimb blueprints"
+ contains = list(
+ /obj/item/weapon/disk/limb/morpheus,
+ /obj/item/weapon/disk/limb/xion
+ )
+ cost = 15
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "Robolimb blueprints (basic)"
+ access = access_robotics
+ group = "Engineering"
+
+/datum/supply_packs/robolimbs_adv
+ name = "All robolimb blueprints"
+ contains = list(
+ /obj/item/weapon/disk/limb/bishop,
+ /obj/item/weapon/disk/limb/hesphiastos,
+ /obj/item/weapon/disk/limb/morpheus,
+ /obj/item/weapon/disk/limb/veymed,
+ /obj/item/weapon/disk/limb/wardtakahashi,
+ /obj/item/weapon/disk/limb/xion,
+ /obj/item/weapon/disk/limb/zenghu,
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "Robolimb blueprints (adv)"
+ access = access_robotics
+ group = "Engineering"
+
/datum/supply_packs/phoron
name = "Phoron assembly crate"
contains = list(
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 4872e21ac7..5a024fb782 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -2,7 +2,7 @@
icon = 'icons/obj/robotics.dmi'
icon_state = "fab-idle"
name = "Exosuit Fabricator"
- desc = "A machine used for construction of robotcs and mechas."
+ desc = "A machine used for construction of mechas."
density = 1
anchored = 1
use_power = 1
@@ -23,7 +23,6 @@
var/list/categories = list()
var/category = null
- var/manufacturer = null
var/sync_message = ""
/obj/machinery/mecha_part_fabricator/New()
@@ -41,7 +40,6 @@
return
/obj/machinery/mecha_part_fabricator/initialize()
- manufacturer = basic_robolimb.company
update_categories()
/obj/machinery/mecha_part_fabricator/process()
@@ -99,14 +97,6 @@
data["buildable"] = get_build_options()
data["category"] = category
data["categories"] = categories
- if(all_robolimbs)
- var/list/T = list()
- for(var/A in all_robolimbs)
- var/datum/robolimb/R = all_robolimbs[A]
- if(!R.unavailable_to_build) //VOREStation Edit
- T += list(list("id" = A, "company" = R.company))
- data["manufacturers"] = T
- data["manufacturer"] = manufacturer
data["materials"] = get_materials()
data["maxres"] = res_max_amount
data["sync"] = sync_message
@@ -134,10 +124,6 @@
if(href_list["category"] in categories)
category = href_list["category"]
- if(href_list["manufacturer"])
- if(href_list["manufacturer"] in all_robolimbs)
- manufacturer = href_list["manufacturer"]
-
if(href_list["eject"])
eject_materials(href_list["eject"], text2num(href_list["amount"]))
@@ -159,43 +145,32 @@
if(default_part_replacement(user, I))
return
- var/material
- switch(I.type)
- if(/obj/item/stack/material/gold)
- material = "gold"
- if(/obj/item/stack/material/silver)
- material = "silver"
- if(/obj/item/stack/material/diamond)
- material = "diamond"
- if(/obj/item/stack/material/phoron)
- material = "phoron"
- if(/obj/item/stack/material/steel)
- material = DEFAULT_WALL_MATERIAL
- if(/obj/item/stack/material/glass)
- material = "glass"
- if(/obj/item/stack/material/uranium)
- material = "uranium"
+ if(istype(I,/obj/item/stack/material))
+ var/obj/item/stack/material/S = I
+ if(!(S.material in materials))
+ user << "The [src] doesn't accept [S.material]!"
+ return
+
+ var/sname = "[S.name]"
+ var/amnt = S.perunit
+ if(materials[S.material.name] + amnt <= res_max_amount)
+ if(S && S.amount >= 1)
+ var/count = 0
+ overlays += "fab-load-metal"
+ spawn(10)
+ overlays -= "fab-load-metal"
+ while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
+ materials[S.material.name] += amnt
+ S.use(1)
+ count++
+ user << "You insert [count] [sname] into the fabricator."
+ update_busy()
else
- return ..()
+ user << "The fabricator cannot hold more [sname]."
- var/obj/item/stack/material/stack = I
- var/sname = "[stack.name]"
- var/amnt = stack.perunit
+ return
- if(materials[material] + amnt <= res_max_amount)
- if(stack && stack.amount >= 1)
- var/count = 0
- overlays += "fab-load-metal"
- spawn(10)
- overlays -= "fab-load-metal"
- while(materials[material] + amnt <= res_max_amount && stack.amount >= 1)
- materials[material] += amnt
- stack.use(1)
- count++
- user << "You insert [count] [sname] into the fabricator."
- update_busy()
- else
- user << "The fabricator cannot hold more [sname]."
+ ..()
/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user)
switch(emagged)
@@ -255,7 +230,7 @@
for(var/M in D.materials)
materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
if(D.build_path)
- var/obj/new_item = D.Fabricate(loc, src)
+ var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src)
visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.")
if(mat_efficiency != 1)
if(new_item.matter && new_item.matter.len > 0)
@@ -302,36 +277,20 @@
/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
- material = lowertext(material)
- var/mattype
- switch(material)
- if(DEFAULT_WALL_MATERIAL)
- mattype = /obj/item/stack/material/steel
- if("glass")
- mattype = /obj/item/stack/material/glass
- if("gold")
- mattype = /obj/item/stack/material/gold
- if("silver")
- mattype = /obj/item/stack/material/silver
- if("diamond")
- mattype = /obj/item/stack/material/diamond
- if("phoron")
- mattype = /obj/item/stack/material/phoron
- if("uranium")
- mattype = /obj/item/stack/material/uranium
- else
- return
- var/obj/item/stack/material/S = new mattype(loc)
+ var/matstring = lowertext(material)
+ var/material/M = get_material_by_name(matstring)
+
+ var/obj/item/stack/material/S = M.place_sheet(get_turf(src))
if(amount <= 0)
amount = S.max_amount
- var/ejected = min(round(materials[material] / S.perunit), amount)
+ var/ejected = min(round(materials[matstring] / S.perunit), amount)
S.amount = min(ejected, amount)
if(S.amount <= 0)
qdel(S)
return
- materials[material] -= ejected * S.perunit
- if(recursive && materials[material] >= S.perunit)
- eject_materials(material, -1)
+ materials[matstring] -= ejected * S.perunit
+ if(recursive && materials[matstring] >= S.perunit)
+ eject_materials(matstring, -1)
update_busy()
/obj/machinery/mecha_part_fabricator/proc/sync()
diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm
new file mode 100644
index 0000000000..173fd00012
--- /dev/null
+++ b/code/game/mecha/mech_prosthetics.dm
@@ -0,0 +1,333 @@
+/obj/machinery/pros_fabricator
+ icon = 'icons/obj/robotics.dmi'
+ icon_state = "pros-idle"
+ name = "Prosthetics Fabricator"
+ desc = "A machine used for construction of prosthetics."
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 20
+ active_power_usage = 5000
+ req_access = list(access_robotics)
+ circuit = /obj/item/weapon/circuitboard/prosthetics
+
+ var/speed = 1
+ var/mat_efficiency = 1
+ var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
+ var/res_max_amount = 200000
+
+ var/datum/research/files
+ var/list/datum/design/queue = list()
+ var/progress = 0
+ var/busy = 0
+
+ var/list/categories = list()
+ var/category = null
+ var/manufacturer = null
+ var/sync_message = ""
+
+/obj/machinery/pros_fabricator/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ RefreshParts()
+
+ files = new /datum/research(src) //Setup the research data holder.
+ return
+
+/obj/machinery/pros_fabricator/initialize()
+ manufacturer = basic_robolimb.company
+ update_categories()
+
+/obj/machinery/pros_fabricator/process()
+ ..()
+ if(stat)
+ return
+ if(busy)
+ use_power = 2
+ progress += speed
+ check_build()
+ else
+ use_power = 1
+ update_icon()
+
+/obj/machinery/pros_fabricator/update_icon()
+ overlays.Cut()
+ if(panel_open)
+ icon_state = "pros-o"
+ else
+ icon_state = "pros-idle"
+ if(busy)
+ overlays += "pros-active"
+
+/obj/machinery/pros_fabricator/dismantle()
+ for(var/f in materials)
+ eject_materials(f, -1)
+ ..()
+
+/obj/machinery/pros_fabricator/RefreshParts()
+ res_max_amount = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ res_max_amount += M.rating * 100000 // 200k -> 600k
+ var/T = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ T += M.rating
+ mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5
+ for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both
+ T += M.rating
+ speed = T / 2 // 1 -> 3
+
+/obj/machinery/pros_fabricator/attack_hand(var/mob/user)
+ if(..())
+ return
+ if(!allowed(user))
+ return
+ ui_interact(user)
+
+/obj/machinery/pros_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+
+ var/datum/design/current = queue.len ? queue[1] : null
+ if(current)
+ data["current"] = current.name
+ data["queue"] = get_queue_names()
+ data["buildable"] = get_build_options()
+ data["category"] = category
+ data["categories"] = categories
+ if(all_robolimbs)
+ var/list/T = list()
+ for(var/A in all_robolimbs)
+ var/datum/robolimb/R = all_robolimbs[A]
+ if(R.unavailable_to_build) continue
+ T += list(list("id" = A, "company" = R.company))
+ data["manufacturers"] = T
+ data["manufacturer"] = manufacturer
+ data["materials"] = get_materials()
+ data["maxres"] = res_max_amount
+ data["sync"] = sync_message
+ if(current)
+ data["builtperc"] = round((progress / current.time) * 100)
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/pros_fabricator/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["build"])
+ add_to_queue(text2num(href_list["build"]))
+
+ if(href_list["remove"])
+ remove_from_queue(text2num(href_list["remove"]))
+
+ if(href_list["category"])
+ if(href_list["category"] in categories)
+ category = href_list["category"]
+
+ if(href_list["manufacturer"])
+ if(href_list["manufacturer"] in all_robolimbs)
+ manufacturer = href_list["manufacturer"]
+
+ if(href_list["eject"])
+ eject_materials(href_list["eject"], text2num(href_list["amount"]))
+
+ if(href_list["sync"])
+ sync()
+ else
+ sync_message = ""
+
+ return 1
+
+/obj/machinery/pros_fabricator/attackby(var/obj/item/I, var/mob/user)
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+ if(default_part_replacement(user, I))
+ return
+
+ if(istype(I,/obj/item/weapon/disk/limb))
+ var/obj/item/weapon/disk/limb/D = I
+ if(!D.company || !(D.company in all_robolimbs))
+ user << "This disk seems to be corrupted!"
+ else
+ user << "Installing blueprint files for [D.company]..."
+ if(do_after(user,50,src))
+ var/datum/robolimb/R = all_robolimbs[D.company]
+ R.unavailable_to_build = 0
+ user << "Installed [D.company] blueprints!"
+ qdel(I)
+ return
+
+ if(istype(I,/obj/item/stack/material))
+ var/obj/item/stack/material/S = I
+ if(!(S.material in materials))
+ user << "The [src] doesn't accept [S.material]!"
+ return
+
+ var/sname = "[S.name]"
+ var/amnt = S.perunit
+ if(materials[S.material.name] + amnt <= res_max_amount)
+ if(S && S.amount >= 1)
+ var/count = 0
+ overlays += "pros-load-metal"
+ spawn(10)
+ overlays -= "pros-load-metal"
+ while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
+ materials[S.material.name] += amnt
+ S.use(1)
+ count++
+ user << "You insert [count] [sname] into the fabricator."
+ update_busy()
+ else
+ user << "The fabricator cannot hold more [sname]."
+
+ return
+
+ ..()
+
+/obj/machinery/pros_fabricator/emag_act(var/remaining_charges, var/mob/user)
+ switch(emagged)
+ if(0)
+ emagged = 0.5
+ visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"")
+ sleep(10)
+ visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"")
+ sleep(15)
+ visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
+ sleep(30)
+ visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"")
+ req_access = null
+ emagged = 1
+ return 1
+ if(0.5)
+ visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"")
+ if(1)
+ visible_message("\icon[src] [src] beeps: \"No records in User DB\"")
+
+/obj/machinery/pros_fabricator/proc/update_busy()
+ if(queue.len)
+ if(can_build(queue[1]))
+ busy = 1
+ else
+ busy = 0
+ else
+ busy = 0
+
+/obj/machinery/pros_fabricator/proc/add_to_queue(var/index)
+ var/datum/design/D = files.known_designs[index]
+ queue += D
+ update_busy()
+
+/obj/machinery/pros_fabricator/proc/remove_from_queue(var/index)
+ if(index == 1)
+ progress = 0
+ queue.Cut(index, index + 1)
+ update_busy()
+
+/obj/machinery/pros_fabricator/proc/can_build(var/datum/design/D)
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ return 0
+ return 1
+
+/obj/machinery/pros_fabricator/proc/check_build()
+ if(!queue.len)
+ progress = 0
+ return
+ var/datum/design/D = queue[1]
+ if(!can_build(D))
+ progress = 0
+ return
+ if(D.time > progress)
+ return
+ for(var/M in D.materials)
+ materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
+ if(D.build_path)
+ var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src)
+ visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.")
+ if(mat_efficiency != 1)
+ if(new_item.matter && new_item.matter.len > 0)
+ for(var/i in new_item.matter)
+ new_item.matter[i] = new_item.matter[i] * mat_efficiency
+ remove_from_queue(1)
+
+/obj/machinery/pros_fabricator/proc/get_queue_names()
+ . = list()
+ for(var/i = 2 to queue.len)
+ var/datum/design/D = queue[i]
+ . += D.name
+
+/obj/machinery/pros_fabricator/proc/get_build_options()
+ . = list()
+ for(var/i = 1 to files.known_designs.len)
+ var/datum/design/D = files.known_designs[i]
+ if(D.build_path && (D.build_type & PROSFAB))
+ . += list(list("name" = D.name, "id" = i, "category" = D.category, "resourses" = get_design_resourses(D), "time" = get_design_time(D)))
+
+/obj/machinery/pros_fabricator/proc/get_design_resourses(var/datum/design/D)
+ var/list/F = list()
+ for(var/T in D.materials)
+ F += "[capitalize(T)]: [D.materials[T] * mat_efficiency]"
+ return english_list(F, and_text = ", ")
+
+/obj/machinery/pros_fabricator/proc/get_design_time(var/datum/design/D)
+ return time2text(round(10 * D.time / speed), "mm:ss")
+
+/obj/machinery/pros_fabricator/proc/update_categories()
+ categories = list()
+ for(var/datum/design/D in files.known_designs)
+ if(!D.build_path || !(D.build_type & PROSFAB))
+ continue
+ categories |= D.category
+ if(!category || !(category in categories))
+ category = categories[1]
+
+/obj/machinery/pros_fabricator/proc/get_materials()
+ . = list()
+ for(var/T in materials)
+ . += list(list("mat" = capitalize(T), "amt" = materials[T]))
+
+/obj/machinery/pros_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
+ var/recursive = amount == -1 ? 1 : 0
+ var/matstring = lowertext(material)
+ var/material/M = get_material_by_name(matstring)
+
+ var/obj/item/stack/material/S = M.place_sheet(get_turf(src))
+ if(amount <= 0)
+ amount = S.max_amount
+ var/ejected = min(round(materials[matstring] / S.perunit), amount)
+ S.amount = min(ejected, amount)
+ if(S.amount <= 0)
+ qdel(S)
+ return
+ materials[matstring] -= ejected * S.perunit
+ if(recursive && materials[matstring] >= S.perunit)
+ eject_materials(matstring, -1)
+ update_busy()
+
+/obj/machinery/pros_fabricator/proc/sync()
+ sync_message = "Error: no console found."
+ for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src)))
+ if(!RDC.sync)
+ continue
+ for(var/datum/tech/T in RDC.files.known_tech)
+ files.AddTech2Known(T)
+ for(var/datum/design/D in RDC.files.known_designs)
+ files.AddDesign2Known(D)
+ files.RefreshResearch()
+ sync_message = "Sync complete."
+ update_categories()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 11c312048d..ebdd95791d 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -15,47 +15,37 @@
/obj/item/robot_parts/New(var/newloc, var/model)
..(newloc)
- if(model_info && model)
- model_info = model
- var/datum/robolimb/R = all_robolimbs[model]
- if(R)
- name = "[R.company] [initial(name)]"
- desc = "[R.desc]"
- if(icon_state in icon_states(R.icon))
- icon = R.icon
- else
- name = "robot [initial(name)]"
/obj/item/robot_parts/l_arm
- name = "left arm"
+ name = "cyborg left arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "l_arm"
part = list(BP_L_ARM, BP_L_HAND)
model_info = 1
/obj/item/robot_parts/r_arm
- name = "right arm"
+ name = "cyborg right arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "r_arm"
part = list(BP_R_ARM, BP_R_HAND)
model_info = 1
/obj/item/robot_parts/l_leg
- name = "left leg"
+ name = "cyborg left leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "l_leg"
part = list(BP_L_LEG, BP_L_FOOT)
model_info = 1
/obj/item/robot_parts/r_leg
- name = "right leg"
+ name = "cyborg leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
icon_state = "r_leg"
part = list(BP_R_LEG, BP_R_FOOT)
model_info = 1
/obj/item/robot_parts/chest
- name = "chest"
+ name = "cyborg chest"
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list(BP_GROIN,BP_TORSO)
@@ -63,7 +53,7 @@
var/obj/item/weapon/cell/cell = null
/obj/item/robot_parts/head
- name = "head"
+ name = "cyborg head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
icon_state = "head"
part = list(BP_HEAD)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
index bf0eb357f4..c871bd3dc5 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
@@ -61,3 +61,14 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/prosthetics
+ name = "Circuit board (Prosthetics Fabricator)"
+ build_path = "/obj/machinery/pros_fabricator"
+ board_type = "machine"
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index e8a66117cc..a90373d219 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -57,10 +57,18 @@
display_name = "tie, blue with clip"
path = /obj/item/clothing/accessory/blue_clip
+/datum/gear/accessory/tie/blue_long
+ display_name = "tie, blue long"
+ path = /obj/item/clothing/accessory/blue_long
+
/datum/gear/accessory/tie/red
display_name = "tie, red"
path = /obj/item/clothing/accessory/red
+/datum/gear/accessory/tie/red_clip
+ display_name = "tie, red with clip"
+ path = /obj/item/clothing/accessory/red_clip
+
/datum/gear/accessory/tie/red_long
display_name = "tie, red long"
path = /obj/item/clothing/accessory/red_long
@@ -137,6 +145,30 @@
display_name = "scarf, striped blue"
path = /obj/item/clothing/accessory/stripedbluescarf
+/datum/gear/accessory/suitjacket
+ display_name = "suit jacket, tan"
+ path = /obj/item/clothing/accessory/tan_jacket
+
+/datum/gear/accessory/suitjacket/charcoal
+ display_name = "suit jacket, charcoal"
+ path = /obj/item/clothing/accessory/charcoal_jacket
+
+/datum/gear/accessory/suitjacket/navy
+ display_name = "suit jacket, navy blue"
+ path = /obj/item/clothing/accessory/navy_jacket
+
+/datum/gear/accessory/suitjacket/burgundy
+ display_name = "suit jacket, burgundy"
+ path = /obj/item/clothing/accessory/burgundy_jacket
+
+/datum/gear/accessory/suitjacket/checkered
+ display_name = "suit jacket, checkered"
+ path = /obj/item/clothing/accessory/checkered_jacket
+
+/datum/gear/accessory/suitvest
+ display_name = "suit vest"
+ path = /obj/item/clothing/accessory/vest
+
/datum/gear/accessory/brown_vest
display_name = "webbing, engineering"
path = /obj/item/clothing/accessory/storage/brown_vest
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index d4ab2e4d0f..c9ac0fb4f4 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -84,6 +84,14 @@
name = "blue tie with a clip"
icon_state = "bluecliptie"
+/obj/item/clothing/accessory/blue_long
+ name = "blue long tie"
+ icon_state = "bluelongtie"
+
+/obj/item/clothing/accessory/red_clip
+ name = "red tie with a clip"
+ icon_state = "redcliptie"
+
/obj/item/clothing/accessory/red_long
name = "red long tie"
icon_state = "redlongtie"
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 6f4f82b8b8..9115fea244 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -337,12 +337,50 @@
return impact
+/datum/seed/proc/generate_name()
+ var/prefix = ""
+ var/name = ""
+ if(prob(50)) //start with a prefix.
+ //These are various plant/mushroom genuses.
+ //I realize these might not be entirely accurate, but it could facilitate RP.
+ var/list/possible_prefixes
+ if(seed_noun == "cuttings" || seed_noun == "seeds" || (seed_noun == "nodes" && prob(50)))
+ possible_prefixes = list("amelanchier", "saskatoon",
+ "magnolia", "angiosperma", "osmunda", "scabiosa", "spigelia", "psydrax", "chastetree",
+ "strychnos", "treebine", "caper", "justica", "ragwortus", "everlasting", "combretum",
+ "loganiaceae", "gelsemium", "logania", "sabadilla", "neuburgia", "canthium", "rytigynia",
+ "chaste", "vitex", "cissus", "capparis", "senecio", "curry", "cycad", "liverwort", "charophyta",
+ "glaucophyte", "pinidae", "vascular", "embryophyte", "lillopsida")
+ else
+ possible_prefixes = list("bisporus", "bitorquis", "campestris", "crocodilinus", "agaricus",
+ "armillaria", "matsutake", "mellea", "ponderosa", "auricularia", "auricala",
+ "polytricha", "boletus", "badius", "edulis", "mirabilis", "zelleri",
+ "calvatia", "gigantea", "clitopilis", "prumulus", "entoloma", "abortivum",
+ "suillus", "tuber", "aestivum", "volvacea", "delica", "russula", "rozites")
+
+ possible_prefixes |= list("butter", "shad", "sugar", "june", "wild", "rigus", "curry", "hard", "soft", "dark", "brick", "stone", "red", "brown",
+ "black", "white", "paper", "slippery", "honey", "bitter")
+ prefix = pick(possible_prefixes)
+
+ var/num = rand(2,5)
+ var/list/possible_name = list("rhon", "cus", "quam", "met", "eget", "was", "reg", "zor", "fra", "rat", "sho", "ghen", "pa",
+ "eir", "lip", "sum", "lor", "em", "tem", "por", "invi", "dunt", "ut", "la", "bore", "mag", "na",
+ "al", "i", "qu", "yam", "er", "at", "sed", "di", "am", "vol", "up", "tua", "at", "ve", "ro", "eos",
+ "et", "ac", "cus")
+ for(var/i in 1 to num)
+ var/syl = pick(possible_name)
+ possible_name -= syl
+ name += syl
+
+ if(prefix)
+ name = "[prefix] [name]"
+ seed_name = name
+ display_name = name
+
//Creates a random seed. MAKE SURE THE LINE HAS DIVERGED BEFORE THIS IS CALLED.
/datum/seed/proc/randomize()
roundstart = 0
- seed_name = "strange plant" // TODO: name generator.
- display_name = "strange plants" // TODO: name generator.
mysterious = 1
seed_noun = pick("spores","nodes","cuttings","seeds")
@@ -390,49 +428,18 @@
var/additional_chems = rand(0,5)
if(additional_chems)
- var/list/possible_chems = list(
- "woodpulp",
- "bicaridine",
- "hyperzine",
- "cryoxadone",
- "blood",
- "water",
- "potassium",
- "plasticide",
- "mutationtoxin",
- "docilitytoxin",
- "inaprovaline",
- "space_drugs",
- "paroxetine",
- "mercury",
- "sugar",
- "radium",
- "ryetalyn",
- "alkysine",
- "thermite",
- "tramadol",
- "cryptobiolin",
- "dermaline",
- "dexalin",
- "phoron",
- "synaptizine",
- "impedrezene",
- "hyronalin",
- "peridaxon",
- "toxin",
- "rezadone",
- "ethylredoxrazine",
- "slimejelly",
- "cyanide",
- "mindbreaker",
- "stoxin"
+
+ var/list/banned_chems = list(
+ "adminordrazine",
+ "nutriment"
)
for(var/x=1;x<=additional_chems;x++)
- if(!possible_chems.len)
- break
- var/new_chem = pick(possible_chems)
- possible_chems -= new_chem
+
+ var/new_chem = pick(chemical_reagents_list)
+ if(new_chem in banned_chems)
+ continue
+ banned_chems += new_chem
chems[new_chem] = list(rand(1,10),rand(10,20))
if(prob(90))
@@ -487,6 +494,8 @@
set_trait(TRAIT_MATURATION,rand(5,15))
set_trait(TRAIT_PRODUCTION,get_trait(TRAIT_MATURATION)+rand(2,5))
+ generate_name()
+
//Returns a key corresponding to an entry in the global seed list.
/datum/seed/proc/get_mutant_variant()
if(!mutants || !mutants.len || get_trait(TRAIT_IMMUTABLE) > 0) return 0
diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm
index dc69e5448e..47e6b82ba6 100644
--- a/code/modules/hydroponics/trays/tray_update_icons.dm
+++ b/code/modules/hydroponics/trays/tray_update_icons.dm
@@ -3,7 +3,7 @@
// Update name.
if(seed)
if(mechanical)
- name = "[base_name] (#[seed.uid])"
+ name = "[base_name] ([seed.seed_name])"
else
name = "[seed.seed_name]"
else
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index cf83cef983..aebcacc91b 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -17,6 +17,7 @@
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
if(hardness>50)
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index e783853aa8..13c744fdd8 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -43,7 +43,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
"Bland" = "ghost",
"Robed-B" = "ghost1",
"Robed-BAlt" = "ghost2",
- "Corgi" = "ghostian",
+ "Corgi" = "corgi",
"King" = "ghostking",
"Shade" = "shade",
"Hecate" = "ghost-narsie",
@@ -65,7 +65,15 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
"Pink Elemental" = "magicPink",
"Orange Elemental" = "magicOrange",
"Green Elemental" = "magicGreen",
- "Daemon" = "daemon"
+ "Daemon" = "daemon",
+ "Guard Spider" = "guard",
+ "Hunter Spider" = "hunter",
+ "Nurse Spider" = "nurse",
+ "Carp" = "carp",
+ "Space Bear" = "bear",
+ "Rogue Drone" = "drone",
+ "ED-209" = "ed209",
+ "Beepsky" = "secbot"
)
/mob/observer/dead/New(mob/body)
@@ -817,6 +825,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
set name = "Choose Sprite"
icon = 'icons/mob/ghost.dmi'
+ overlays.Cut()
var/choice
var/finalized = "No"
while(finalized == "No" && src.client)
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index c065cbdc54..c61659261d 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -74,6 +74,7 @@
/obj/item/device/mmi/digital/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
if(src.brainmob && src.brainmob.key) return
+ world.log << "Resetting Posibrain: [brainmob][brainmob ? ", [brainmob.key]" : ""]"
src.searching = 0
icon_state = "posibrain"
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 6a45483251..8cb9cca614 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -36,12 +36,13 @@
animate_tail_stop()
//Handle brain slugs.
- var/obj/item/organ/external/head = get_organ(BP_HEAD)
+ var/obj/item/organ/external/Hd = get_organ(BP_HEAD)
var/mob/living/simple_animal/borer/B
- for(var/I in head.implants)
- if(istype(I,/mob/living/simple_animal/borer))
- B = I
+ if(Hd)
+ for(var/I in Hd.implants)
+ if(istype(I,/mob/living/simple_animal/borer))
+ B = I
if(B)
if(!B.ckey && ckey && B.controlling)
B.ckey = ckey
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index db0f44ce31..7682f675b0 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -64,6 +64,7 @@
if(synthetic) return synthetic //Your synthetic-ness is not going away
var/obj/item/organ/external/T = organs_by_name[BP_TORSO]
if(T && T.robotic >= ORGAN_ROBOT)
+ src.verbs += /mob/living/carbon/human/proc/self_diagnostics
var/datum/robolimb/R = all_robolimbs[T.model]
synthetic = R
return synthetic
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 48b668a501..948f338297 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -145,4 +145,27 @@
qdel(src)
+/mob/living/carbon/human/proc/self_diagnostics()
+ set name = "Self-Diagnostics"
+ set desc = "Run an internal self-diagnostic to check for damage."
+ set category = "IC"
+ if(stat == DEAD) return
+
+ src << "Performing self-diagnostic, please wait..."
+ sleep(50)
+ var/output = "Self-Diagnostic Results:\n"
+
+ for(var/obj/item/organ/external/EO in organs)
+ if(EO.brute_dam || EO.burn_dam)
+ output += "[EO.name] - [EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]\n"
+ else
+ output += "[EO.name] - OK\n"
+
+ for(var/obj/item/organ/IO in internal_organs)
+ if(IO.damage)
+ output += "[IO.name] - [IO.damage > 10 ? "Heavy Damage" : "Light Damage"]\n"
+ else
+ output += "[IO.name] - OK\n"
+
+ src << output
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 5c096aa9d6..13eef2eaf4 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -70,6 +70,8 @@ var/list/organ_cache = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
if(internal)
holder.internal_organs |= src
+ else
+ species = all_species["Human"]
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 419d82ea64..c084c06170 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -44,7 +44,7 @@
var/list/wounds = list() // wound datum list.
var/number_wounds = 0 // number of wounds, which is NOT wounds.len!
var/obj/item/organ/external/parent // Master-limb.
- var/list/children // Sub-limbs.
+ var/list/children = list() // Sub-limbs.
var/list/internal_organs = list() // Internal organs of this body part
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/list/implants = list() // Currently implanted objects.
@@ -1275,7 +1275,6 @@ Note that amputating the affected organ does in fact remove the infection from t
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
-
/obj/item/organ/external/groin
name = "lower body"
organ_tag = BP_GROIN
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 6738b2b20a..5241747f12 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -47,17 +47,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Bishop"
desc = "This limb has a white polymer casing with blue holo-displays."
icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi'
+ unavailable_to_build = 1
/datum/robolimb/bishop_alt1
company = "Bishop - Glyph"
desc = "This limb has a white polymer casing with blue holo-displays."
icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/bishop_monitor
company = "Bishop Monitor"
desc = "Bishop Cybernetics' unique spin on a popular prosthetic head model. The themes conflict in an intriguing way."
icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
@@ -65,11 +68,13 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Hesphiastos"
desc = "This limb has a militaristic black and green casing with gold stripes."
icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi'
+ unavailable_to_build = 1
/datum/robolimb/hesphiastos_alt1
company = "Hesphiastos - Frontier"
desc = "A rugged prosthetic head featuring the standard Hesphiastos theme, a visor and an external display."
icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = "blank=hesphiastos_alt_off;\
pink=hesphiastos_alt_pink;\
@@ -83,6 +88,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Hesphiastos Monitor"
desc = "Hesphiastos' unique spin on a popular prosthetic head model. It looks rugged and sturdy."
icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
@@ -90,37 +96,42 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Morpheus"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi'
+ unavailable_to_build = 1
monitor_styles = standard_monitor_styles
/datum/robolimb/morpheus_alt1
company = "Morpheus - Zenith"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
- unavailable_at_chargen = null
/datum/robolimb/veymed
- lifelike = 1
- blood_color = "#CCCCCC"
company = "Vey-Med"
desc = "This high quality limb is nearly indistinguishable from an organic one."
icon = 'icons/mob/human_races/cyberlimbs/veymed/veymed_main.dmi'
+ unavailable_to_build = 1
+ lifelike = 1
+ blood_color = "#CCCCCC"
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi'
+ unavailable_to_build = 1
/datum/robolimb/wardtakahashi_alt1
company = "Ward-Takahashi - Shroud"
desc = "This limb features sleek black and white polymers. This one looks more like a helmet of some sort."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/wardtakahashi_monitor
company = "Ward-Takahashi Monitor"
desc = "Ward-Takahashi's unique spin on a popular prosthetic head model. It looks sleek and modern."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
@@ -128,17 +139,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Xion"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi'
+ unavailable_to_build = 1
/datum/robolimb/xion_alt1
company = "Xion Mfg. - Breach"
desc = "This limb has a minimalist black and red casing. Looks a bit menacing."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/xion_monitor
company = "Xion Mfg. Monitor"
desc = "Xion Mfg.'s unique spin on a popular prosthetic head model. It looks and minimalist and utilitarian."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi'
+ unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
@@ -146,3 +160,38 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Zeng-Hu"
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi'
+ unavailable_to_build = 1
+
+/obj/item/weapon/disk/limb
+ name = "Limb Blueprints"
+ desc = "A disk containing the blueprints for prosthetics."
+ icon = 'icons/obj/cloning.dmi'
+ icon_state = "datadisk2"
+ var/company = ""
+
+ //I'm normally opposed to relative pathing, but pls.
+ bishop
+ company = "Bishop"
+
+ hesphiastos
+ company = "Hesphiastos"
+
+ morpheus
+ company = "Morpheus"
+
+ veymed
+ company = "Vey-Med"
+
+ wardtakahashi
+ company = "Ward-Takahashi"
+
+ xion
+ company = "Xion"
+
+ zenghu
+ company = "Zeng-Hu"
+
+/obj/item/weapon/disk/limb/New(var/newloc)
+ ..()
+ if(company)
+ name = "[company] [initial(name)]"
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 92ba843274..5c1bf634c8 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -206,60 +206,6 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/storage/part_replacer
sort_string = "CBAAA"
-/datum/design/item/powercell
- build_type = PROTOLATHE | MECHFAB
-
-/datum/design/item/powercell/AssembleDesignName()
- name = "Power cell model ([item_name])"
-
-/datum/design/item/powercell/AssembleDesignDesc()
- if(build_path)
- var/obj/item/weapon/cell/C = build_path
- desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy."
-
-/datum/design/item/powercell/Fabricate()
- var/obj/item/weapon/cell/C = ..()
- C.charge = 0 //shouldn't produce power out of thin air.
- return C
-
-/datum/design/item/powercell/basic
- name = "basic"
- build_type = PROTOLATHE | MECHFAB
- id = "basic_cell"
- req_tech = list(TECH_POWER = 1)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
- build_path = /obj/item/weapon/cell
- category = "Misc"
- sort_string = "DAAAA"
-
-/datum/design/item/powercell/high
- name = "high-capacity"
- build_type = PROTOLATHE | MECHFAB
- id = "high_cell"
- req_tech = list(TECH_POWER = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
- build_path = /obj/item/weapon/cell/high
- category = "Misc"
- sort_string = "DAAAB"
-
-/datum/design/item/powercell/super
- name = "super-capacity"
- id = "super_cell"
- req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
- build_path = /obj/item/weapon/cell/super
- category = "Misc"
- sort_string = "DAAAC"
-
-/datum/design/item/powercell/hyper
- name = "hyper-capacity"
- id = "hyper_cell"
- req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70)
- build_path = /obj/item/weapon/cell/hyper
- category = "Misc"
- sort_string = "DAAAD"
-
/datum/design/item/hud
materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
@@ -651,7 +597,7 @@ other types of metals and chemistry for reagents).
name = "Positronic brain"
id = "posibrain"
req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
- build_type = PROTOLATHE | MECHFAB
+ build_type = PROTOLATHE | PROSFAB
materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
build_path = /obj/item/device/mmi/digital/posibrain
category = "Misc"
@@ -661,7 +607,7 @@ other types of metals and chemistry for reagents).
name = "Man-machine interface"
id = "mmi"
req_tech = list(TECH_DATA = 2, TECH_BIO = 3)
- build_type = PROTOLATHE | MECHFAB
+ build_type = PROTOLATHE | PROSFAB
materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500)
build_path = /obj/item/device/mmi
category = "Misc"
@@ -671,7 +617,7 @@ other types of metals and chemistry for reagents).
name = "Radio-enabled man-machine interface"
id = "mmi_radio"
req_tech = list(TECH_DATA = 2, TECH_BIO = 4)
- build_type = PROTOLATHE | MECHFAB
+ build_type = PROTOLATHE | PROSFAB
materials = list(DEFAULT_WALL_MATERIAL = 1200, "glass" = 500)
build_path = /obj/item/device/mmi/radio_enabled
category = "Misc"
@@ -946,6 +892,13 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/mechfab
sort_string = "HABAE"
+/datum/design/circuit/prosfab
+ name = "prosthetics fabricator"
+ id = "prosfab"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
+ build_path = /obj/item/weapon/circuitboard/prosthetics
+ sort_string = "HABAF"
+
/datum/design/circuit/mech_recharger
name = "mech recharger"
id = "mech_recharger"
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index 85ace41452..35f064321c 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -1,101 +1,8 @@
/datum/design/item/mechfab
build_type = MECHFAB
- category = "Misc"
+ category = "Other"
req_tech = list(TECH_MATERIAL = 1)
-/datum/design/item/mechfab/robot
- category = "Robot"
-
-//if the fabricator is a mech fab pass the manufacturer info over to the robot part constructor
-/datum/design/item/mechfab/robot/Fabricate(var/newloc, var/fabricator)
- if(istype(fabricator, /obj/machinery/mecha_part_fabricator))
- var/obj/machinery/mecha_part_fabricator/mechfab = fabricator
- return new build_path(newloc, mechfab.manufacturer)
- return ..()
-
-/datum/design/item/mechfab/robot/exoskeleton
- name = "Robot exoskeleton"
- id = "robot_exoskeleton"
- build_path = /obj/item/robot_parts/robot_suit
- time = 50
- materials = list(DEFAULT_WALL_MATERIAL = 50000)
-
-/datum/design/item/mechfab/robot/torso
- name = "Robot torso"
- id = "robot_torso"
- build_path = /obj/item/robot_parts/chest
- time = 35
- materials = list(DEFAULT_WALL_MATERIAL = 40000)
-
-/datum/design/item/mechfab/robot/head
- name = "Robot head"
- id = "robot_head"
- build_path = /obj/item/robot_parts/head
- time = 35
- materials = list(DEFAULT_WALL_MATERIAL = 25000)
-
-/datum/design/item/mechfab/robot/l_arm
- name = "Robot left arm"
- id = "robot_l_arm"
- build_path = /obj/item/robot_parts/l_arm
- time = 20
- materials = list(DEFAULT_WALL_MATERIAL = 18000)
-
-/datum/design/item/mechfab/robot/r_arm
- name = "Robot right arm"
- id = "robot_r_arm"
- build_path = /obj/item/robot_parts/r_arm
- time = 20
- materials = list(DEFAULT_WALL_MATERIAL = 18000)
-
-/datum/design/item/mechfab/robot/l_leg
- name = "Robot left leg"
- id = "robot_l_leg"
- build_path = /obj/item/robot_parts/l_leg
- time = 20
- materials = list(DEFAULT_WALL_MATERIAL = 15000)
-
-/datum/design/item/mechfab/robot/r_leg
- name = "Robot right leg"
- id = "robot_r_leg"
- build_path = /obj/item/robot_parts/r_leg
- time = 20
- materials = list(DEFAULT_WALL_MATERIAL = 15000)
-
-/datum/design/item/mechfab/robot/component
- time = 20
- materials = list(DEFAULT_WALL_MATERIAL = 5000)
-
-/datum/design/item/mechfab/robot/component/binary_communication_device
- name = "Binary communication device"
- id = "binary_communication_device"
- build_path = /obj/item/robot_parts/robot_component/binary_communication_device
-
-/datum/design/item/mechfab/robot/component/radio
- name = "Radio"
- id = "radio"
- build_path = /obj/item/robot_parts/robot_component/radio
-
-/datum/design/item/mechfab/robot/component/actuator
- name = "Actuator"
- id = "actuator"
- build_path = /obj/item/robot_parts/robot_component/actuator
-
-/datum/design/item/mechfab/robot/component/diagnosis_unit
- name = "Diagnosis unit"
- id = "diagnosis_unit"
- build_path = /obj/item/robot_parts/robot_component/diagnosis_unit
-
-/datum/design/item/mechfab/robot/component/camera
- name = "Camera"
- id = "camera"
- build_path = /obj/item/robot_parts/robot_component/camera
-
-/datum/design/item/mechfab/robot/component/armour
- name = "Armour plating"
- id = "armour"
- build_path = /obj/item/robot_parts/robot_component/armour
-
/datum/design/item/mechfab/ripley
category = "Ripley"
@@ -316,60 +223,6 @@
time = 60
materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000)
-/datum/design/item/robot_upgrade
- build_type = MECHFAB
- time = 12
- materials = list(DEFAULT_WALL_MATERIAL = 10000)
- category = "Cyborg Upgrade Modules"
-
-/datum/design/item/robot_upgrade/rename
- name = "Rename module"
- desc = "Used to rename a cyborg."
- id = "borg_rename_module"
- build_path = /obj/item/borg/upgrade/rename
-
-/datum/design/item/robot_upgrade/reset
- name = "Reset module"
- desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
- id = "borg_reset_module"
- build_path = /obj/item/borg/upgrade/reset
-
-/datum/design/item/robot_upgrade/restart
- name = "Emergency restart module"
- desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
- id = "borg_restart_module"
- materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000)
- build_path = /obj/item/borg/upgrade/restart
-
-/datum/design/item/robot_upgrade/vtec
- name = "VTEC module"
- desc = "Used to kick in a robot's VTEC systems, increasing their speed."
- id = "borg_vtec_module"
- materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000)
- build_path = /obj/item/borg/upgrade/vtec
-
-/datum/design/item/robot_upgrade/tasercooler
- name = "Rapid taser cooling module"
- desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
- id = "borg_taser_module"
- materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500)
- build_path = /obj/item/borg/upgrade/tasercooler
-
-/datum/design/item/robot_upgrade/jetpack
- name = "Jetpack module"
- desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
- id = "borg_jetpack_module"
- materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000)
- build_path = /obj/item/borg/upgrade/jetpack
-
-/datum/design/item/robot_upgrade/syndicate
- name = "Illegal upgrade"
- desc = "Allows for the construction of lethal upgrades for cyborgs."
- id = "borg_syndicate_module"
- req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000)
- build_path = /obj/item/borg/upgrade/syndicate
-
/datum/design/item/mecha_tracking
name = "Exosuit tracking beacon"
build_type = MECHFAB
@@ -407,7 +260,7 @@
name = "Cable layer"
id = "mech_cable_layer"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer
-
+
/datum/design/item/mecha/flaregun
name = "Flare launcher"
id = "mecha_flare_gun"
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
new file mode 100644
index 0000000000..c12434536b
--- /dev/null
+++ b/code/modules/research/prosfab_designs.dm
@@ -0,0 +1,297 @@
+/datum/design/item/prosfab
+ build_type = PROSFAB
+ category = "Misc"
+ req_tech = list(TECH_MATERIAL = 1)
+
+/datum/design/item/prosfab/pros
+ category = "Prosthetics"
+
+// Make new external organs and make 'em robotish
+/datum/design/item/prosfab/pros/Fabricate(var/newloc, var/fabricator)
+ if(istype(fabricator, /obj/machinery/pros_fabricator))
+ var/obj/machinery/pros_fabricator/prosfab = fabricator
+ var/obj/item/organ/O = new build_path(newloc)
+ O.species = all_species["Human"]
+ O.robotize(prosfab.manufacturer)
+ O.dna = new/datum/dna() //Uuughhhh... why do I have to do this?
+ O.dna.ResetUI()
+ O.dna.ResetSE()
+ spawn(10) //Limbs love to flop around. Who am I to deny them?
+ O.dir = 2
+ return O
+ return ..()
+
+// Deep Magic for the torso since it needs to be a new mob
+/datum/design/item/prosfab/pros/torso/Fabricate(var/newloc, var/fabricator)
+ if(istype(fabricator, /obj/machinery/pros_fabricator))
+ var/obj/machinery/pros_fabricator/prosfab = fabricator
+ var/mob/living/carbon/human/H = new(newloc,"Human")
+ H.stat = DEAD
+ H.gender = gender
+ for(var/obj/item/organ/external/EO in H.organs)
+ if(EO.organ_tag == BP_TORSO || EO.organ_tag == BP_GROIN)
+ continue //Roboticizing a torso does all the children and wastes time, do it later
+ else
+ EO.remove_rejuv()
+
+ for(var/obj/item/organ/external/O in H.organs)
+ O.species = all_species["Human"]
+ O.robotize(prosfab.manufacturer)
+ O.dna = new/datum/dna()
+ O.dna.ResetUI()
+ O.dna.ResetSE()
+
+ H.real_name = "Synthmorph #[rand(100,999)]"
+ H.name = H.real_name
+ H.dir = 2
+ return H
+
+//////////////////// Prosthetics ////////////////////
+/datum/design/item/prosfab/pros/torso
+ time = 35
+ materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 10000, "plasteel" = 2000)
+ req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3)
+ var/gender = MALE
+
+/datum/design/item/prosfab/pros/torso/male
+ name = "FBP torso (M)"
+ id = "pros_torso_m"
+ build_path = /obj/item/organ/external/chest
+ gender = MALE
+
+/obj/item/organ/external/chest/f //To satisfy Travis. :|
+
+/datum/design/item/prosfab/pros/torso/female
+ name = "FBP torso (F)"
+ id = "pros_torso_f"
+ build_path = /obj/item/organ/external/chest/f
+ gender = FEMALE
+
+/datum/design/item/prosfab/pros/head
+ name = "Prosthetic head"
+ id = "pros_head"
+ build_path = /obj/item/organ/external/head
+ time = 30
+ materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 5000, "plasteel" = 1000)
+ req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3)
+
+/datum/design/item/prosfab/pros/l_arm
+ name = "Prosthetic left arm"
+ id = "pros_l_arm"
+ build_path = /obj/item/organ/external/arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/prosfab/pros/l_hand
+ name = "Prosthetic left hand"
+ id = "pros_l_hand"
+ build_path = /obj/item/organ/external/hand
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/pros/l_leg
+ name = "Prosthetic left leg"
+ id = "pros_l_leg"
+ build_path = /obj/item/organ/external/leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/prosfab/pros/l_foot
+ name = "Prosthetic left foot"
+ id = "pros_l_foot"
+ build_path = /obj/item/organ/external/foot
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/pros/r_arm
+ name = "Prosthetic right arm"
+ id = "pros_r_arm"
+ build_path = /obj/item/organ/external/arm/right
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/prosfab/pros/r_hand
+ name = "Prosthetic right hand"
+ id = "pros_r_hand"
+ build_path = /obj/item/organ/external/hand/right
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/pros/r_leg
+ name = "Prosthetic right leg"
+ id = "pros_r_leg"
+ build_path = /obj/item/organ/external/leg/right
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/prosfab/pros/r_foot
+ name = "Prosthetic right foot"
+ id = "pros_r_foot"
+ build_path = /obj/item/organ/external/foot/right
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/pros/cell
+ name = "Prosthetic powercell"
+ id = "pros_cell"
+ build_path = /obj/item/organ/internal/cell
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 4000, "plasteel" = 2000)
+ req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/eyes
+ name = "Prosthetic eyes"
+ id = "pros_eyes"
+ build_path = /obj/item/organ/internal/eyes/robot
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 7500, "glass" = 7500)
+ req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+//////////////////// Cyborg Parts ////////////////////
+/datum/design/item/prosfab/cyborg
+ category = "Cyborg Parts"
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 5000)
+
+/datum/design/item/prosfab/cyborg/exoskeleton
+ name = "Robot exoskeleton"
+ id = "robot_exoskeleton"
+ build_path = /obj/item/robot_parts/robot_suit
+ time = 50
+ materials = list(DEFAULT_WALL_MATERIAL = 50000)
+
+/datum/design/item/prosfab/cyborg/torso
+ name = "Robot torso"
+ id = "robot_torso"
+ build_path = /obj/item/robot_parts/chest
+ time = 35
+ materials = list(DEFAULT_WALL_MATERIAL = 40000)
+
+/datum/design/item/prosfab/cyborg/head
+ name = "Robot head"
+ id = "robot_head"
+ build_path = /obj/item/robot_parts/head
+ time = 35
+ materials = list(DEFAULT_WALL_MATERIAL = 25000)
+
+/datum/design/item/prosfab/cyborg/l_arm
+ name = "Robot left arm"
+ id = "robot_l_arm"
+ build_path = /obj/item/robot_parts/l_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/prosfab/cyborg/r_arm
+ name = "Robot right arm"
+ id = "robot_r_arm"
+ build_path = /obj/item/robot_parts/r_arm
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 18000)
+
+/datum/design/item/prosfab/cyborg/l_leg
+ name = "Robot left leg"
+ id = "robot_l_leg"
+ build_path = /obj/item/robot_parts/l_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+/datum/design/item/prosfab/cyborg/r_leg
+ name = "Robot right leg"
+ id = "robot_r_leg"
+ build_path = /obj/item/robot_parts/r_leg
+ time = 20
+ materials = list(DEFAULT_WALL_MATERIAL = 15000)
+
+
+//////////////////// Cyborg Internals ////////////////////
+/datum/design/item/prosfab/cyborg/component
+ category = "Cyborg Internals"
+ build_type = PROSFAB
+ time = 12
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/cyborg/component/binary_communication_device
+ name = "Binary communication device"
+ id = "binary_communication_device"
+ build_path = /obj/item/robot_parts/robot_component/binary_communication_device
+
+/datum/design/item/prosfab/cyborg/component/radio
+ name = "Radio"
+ id = "radio"
+ build_path = /obj/item/robot_parts/robot_component/radio
+
+/datum/design/item/prosfab/cyborg/component/actuator
+ name = "Actuator"
+ id = "actuator"
+ build_path = /obj/item/robot_parts/robot_component/actuator
+
+/datum/design/item/prosfab/cyborg/component/diagnosis_unit
+ name = "Diagnosis unit"
+ id = "diagnosis_unit"
+ build_path = /obj/item/robot_parts/robot_component/diagnosis_unit
+
+/datum/design/item/prosfab/cyborg/component/camera
+ name = "Camera"
+ id = "camera"
+ build_path = /obj/item/robot_parts/robot_component/camera
+
+/datum/design/item/prosfab/cyborg/component/armour
+ name = "Armour plating"
+ id = "armour"
+ build_path = /obj/item/robot_parts/robot_component/armour
+
+
+//////////////////// Cyborg Modules ////////////////////
+/datum/design/item/prosfab/robot_upgrade
+ category = "Cyborg Modules"
+ build_type = PROSFAB
+ time = 12
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+
+/datum/design/item/prosfab/robot_upgrade/rename
+ name = "Rename module"
+ desc = "Used to rename a cyborg."
+ id = "borg_rename_module"
+ build_path = /obj/item/borg/upgrade/rename
+
+/datum/design/item/prosfab/robot_upgrade/reset
+ name = "Reset module"
+ desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
+ id = "borg_reset_module"
+ build_path = /obj/item/borg/upgrade/reset
+
+/datum/design/item/prosfab/robot_upgrade/restart
+ name = "Emergency restart module"
+ desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
+ id = "borg_restart_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000)
+ build_path = /obj/item/borg/upgrade/restart
+
+/datum/design/item/prosfab/robot_upgrade/vtec
+ name = "VTEC module"
+ desc = "Used to kick in a robot's VTEC systems, increasing their speed."
+ id = "borg_vtec_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000)
+ build_path = /obj/item/borg/upgrade/vtec
+
+/datum/design/item/prosfab/robot_upgrade/tasercooler
+ name = "Rapid taser cooling module"
+ desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
+ id = "borg_taser_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500)
+ build_path = /obj/item/borg/upgrade/tasercooler
+
+/datum/design/item/prosfab/robot_upgrade/jetpack
+ name = "Jetpack module"
+ desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
+ id = "borg_jetpack_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000)
+ build_path = /obj/item/borg/upgrade/jetpack
+
+/datum/design/item/prosfab/robot_upgrade/syndicate
+ name = "Illegal upgrade"
+ desc = "Allows for the construction of lethal upgrades for cyborgs."
+ id = "borg_syndicate_module"
+ req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000)
+ build_path = /obj/item/borg/upgrade/syndicate
\ No newline at end of file
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index cc4143658c..6635753ed9 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -424,6 +424,20 @@
if(M.brainmob && M.brainmob.mind)
M.brainmob.mind.transfer_to(target)
+ spawn(0) //Name yourself on your own damn time
+ var/new_name = ""
+ while(!new_name)
+ if(!target) return
+ var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
+ var/clean_name = sanitizeName(try_name)
+ if(clean_name)
+ var/okay = alert(target,"New name will be '[clean_name]', ok?", "Cancel", "Ok")
+ if(okay == "Ok")
+ new_name = clean_name
+
+ target.name = new_name
+ target.real_name = target.name
+
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user]'s hand slips.", \
"Your hand slips.")
diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm
index 8ef1efb5cc..b214b34630 100644
--- a/code/modules/xenobio2/mob/slime/slime.dm
+++ b/code/modules/xenobio2/mob/slime/slime.dm
@@ -12,12 +12,12 @@ Slime definitions, Life and New live here.
icon_living = "slime adult"
icon_dead = "slime adult dead"
internal_vol = 200
- mut_max = 200
+ mut_max = 50
mutable = COLORMUT
var/is_child = 1
var/cores = 3
var/growthcounter = 0
- var/growthpoint = 150 //At what point they grow up.
+ var/growthpoint = 50 //At what point they grow up.
var/shiny = 0
move_to_delay = 17 //Slimes shouldn't be able to go faster than humans.
default_chems = list("slimejelly" = 5)
diff --git a/code/modules/xenobio2/tools/xeno_trait_scanner.dm b/code/modules/xenobio2/tools/xeno_trait_scanner.dm
index 6913e7514d..8063b6071b 100644
--- a/code/modules/xenobio2/tools/xeno_trait_scanner.dm
+++ b/code/modules/xenobio2/tools/xeno_trait_scanner.dm
@@ -41,11 +41,19 @@
var/datum/xeno/traits/trait_info
var/datum/reagents/prod_reagents
var/targetName
+ var/growth_level
+ var/growth_max
if(istype(target,/obj/structure/table))
return ..()
else if(istype(target,/mob/living/simple_animal/xeno))
var/mob/living/simple_animal/xeno/X = target
+ if(istype(X, /mob/living/simple_animal/xeno/slime))
+ var/mob/living/simple_animal/xeno/slime/S = X
+ if(S.is_child)
+ growth_level = S.growthcounter
+ growth_max = S.growthpoint
+
targetName = X.name
trait_info = X.traitdat
@@ -101,6 +109,16 @@
dat += "It bears characteristics that indicate susceptibility to damage.
"
else
dat += "It bears no characters indicating resilience to damage.
"
+
+ if(growth_max)
+ if(growth_level < 25)
+ dat += "It appears to be far to growing up.
"
+ else if(growth_level > 40)
+ dat += "It appears to be close to growing up.
"
+ else
+ dat += "It appears to be growing.
"
+ else
+ dat += "It appears to be fully grown.
"
if(trait_info.get_trait(TRAIT_XENO_COLDRES))
if(trait_info.get_trait(TRAIT_XENO_COLDRES) < 10)
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index d968c6ed57..daba63e2e9 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/ghost.dmi b/icons/mob/ghost.dmi
index 5f61e7a1e7..34dacd25a3 100644
Binary files a/icons/mob/ghost.dmi and b/icons/mob/ghost.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index aebba43430..33f7790f88 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi
index 547ea932e3..39dbbdcc67 100644
Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ
diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi
index c53e7823ca..85d5a8d0a0 100644
Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index 23fd1e1026..3936d9803a 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -433,7 +433,7 @@
"iq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"ir" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"is" = (/obj/machinery/chemical_dispenser/full{density = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"it" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
+"it" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
@@ -1590,6 +1590,7 @@
"ED" = (/obj/machinery/xenobio/extractor,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"EE" = (/obj/structure/bed/chair/office/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"EF" = (/obj/machinery/recharger/wallcharger/map{pixel_x = 32},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
+"EG" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1679,7 +1680,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeeWaqeXaiaqeYeZfafbfcfdeCeUfeEcfgdRacacacacacacacacaceVfhfhfieVfhfhfieVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefsfkaqaqaeaeflaeaeeTeBfmfyfofoacacacacacacacaceVeVeVfhfhfqeVfhfhfqeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaefrfraegYftfuaefvfwfofofofxdldlacacdlacaceVeVjeeVfpfhfzeVfpfhfzeVfAeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlaeaeaeaefBfCfDaedRdRfofEfxfFdldldldldlaceVeVfGhWeVfIfJfKeVfLfMfNeVfOgdeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlaeaeaeaefBfCfDaedRdRfofEfxfFdldldldldlaceVeVfGhWeVfIfJfKeVfLfMfNeVfOiteVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaeaefQfRaeaedRaafEfSfFfFdldldldldleVeVfTfOfUfVfWfXfYfZgafXgbgcgdfOfAeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlgegfggghgiaaaafSfSfSfSaadldldldlgjgkfOglfOfHgngogpgqgrgogsfOgmeVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtgugvgwgxaaaagygzgygzaaaaaaaadlgAfAgCgDgdgEgFgGgGgHgGgGgGgIgJgKfpgLfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1688,7 +1689,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohphqhrhshshthuhshshshvhshshwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLkkeVhNhNhNeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOguorhPhQhQhQhRhQhQhQhShQhQhQhTeVhUhVkreVgWgTgWhXhYhZgWgdiaibicididideVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPieifigiiihijijijijijijijijijikeVeVeVeVeVilgTimgoingogVgdgWgXmrfhfPfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOipiUiqdldlaaaaaaaaaaaaaaaaaagjiriEitisiuiviwiwixiwiwiwiyhkiziAiBiCeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOipiUiqdldlaaaaaaaaaaaaaaaaaagjiriEEGisiuiviwiwixiwiwiwiyhkiziAiBiCeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiDiUiqdldldlaaaaaaaaaaaaaaaagAiFfOfOEEfOiGgoiHiIingoiJfOEFeVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiDiUiqdldldlaaaaaaaaaaaaaaaaeVeViRiKgdiLiMiNiOhMiPiNiQiSgdfOiVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiTjgiqdldldlaaaaaaaaaaaaaaaaaaeVeVjdECeViWiXiYeViZjajbeVfOjceVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl
index 8fcc82f877..29afe23cf9 100644
--- a/nano/templates/mechfab.tmpl
+++ b/nano/templates/mechfab.tmpl
@@ -1,15 +1,16 @@
-