From 05f8a69821222b169e48d626a77889faefb7be6a Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Mon, 30 May 2016 02:13:55 -0400 Subject: [PATCH] Make FBPs Constructable Print 'em out, slap an MMI or Posibrain in. They come from a new machine, the Prosthetics Fabricator. You can order license discs from cargo to print the proprietary limbs. Making FBPs requires a bit of research as well, otherwise you only get arms/legs. Also requires a bit of plasteel to make the critical parts. Mostly just need every limb, plus eyes. Torso comes with the snowflakey FBP battery. Also adds an FBP 'self-diagnostics' verb. More vague than an analyzer. **This adds a machine that needs to be placed on the map. "/obj/machinery/pros_fabricator"** Personally, I would replace the right-side exosuit fab with it. I can add this to my PR but I'm unsure how you guys feel about non-devs submitting map changes. --- code/__defines/research.dm | 9 +- code/datums/supplypacks.dm | 29 ++ code/game/mecha/mech_fabricator.dm | 17 +- code/game/mecha/mech_prosthetics.dm | 365 ++++++++++++++++++ code/game/objects/items/robot/robot_parts.dm | 22 +- .../circuitboards/machinery/research.dm | 11 + .../mob/living/carbon/brain/posibrain.dm | 1 + code/modules/mob/living/carbon/human/death.dm | 9 +- .../mob/living/carbon/human/human_helpers.dm | 1 + .../mob/living/carbon/human/human_powers.dm | 23 ++ code/modules/organs/organ.dm | 2 + code/modules/organs/organ_external.dm | 3 +- code/modules/organs/robolimbs.dm | 55 ++- code/modules/research/designs.dm | 67 +--- code/modules/research/mechfab_designs.dm | 151 +------- code/modules/research/prosfab_designs.dm | 294 ++++++++++++++ code/modules/surgery/robotics.dm | 14 + icons/obj/robotics.dmi | Bin 5054 -> 6173 bytes nano/templates/mechfab.tmpl | 4 +- polaris.dme | 2 + 20 files changed, 828 insertions(+), 251 deletions(-) create mode 100644 code/game/mecha/mech_prosthetics.dm create mode 100644 code/modules/research/prosfab_designs.dm 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 e257dc968d..c8b88c2b06 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,13 +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] - 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 @@ -133,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"])) @@ -254,7 +241,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) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm new file mode 100644 index 0000000000..0c03b634d4 --- /dev/null +++ b/code/game/mecha/mech_prosthetics.dm @@ -0,0 +1,365 @@ +/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) + 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 + + 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(/obj/item/stack/material/plasteel) + material = "plasteel" + else + return ..() + + + var/obj/item/stack/material/stack = I + var/sname = "[stack.name]" + var/amnt = stack.perunit + + if(materials[material] + amnt <= res_max_amount) + if(stack && stack.amount >= 1) + var/count = 0 + overlays += "pros-load-metal" + spawn(10) + overlays -= "pros-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/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 + 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 + if("plasteel") + mattype = /obj/item/stack/material/plasteel + else + return + var/obj/item/stack/material/S = new mattype(loc) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[material] / 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) + 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/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..da5b05aafc 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..a0efd8ebe2 --- /dev/null +++ b/code/modules/research/prosfab_designs.dm @@ -0,0 +1,294 @@ +/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 + build_path = /obj/item/organ/external/chest + 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" + gender = MALE + +/datum/design/item/prosfab/pros/torso/female + name = "FBP torso (F)" + id = "pros_torso_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/icons/obj/robotics.dmi b/icons/obj/robotics.dmi index c53e7823cab7da35300147d2b26fa7c85421cc7d..85d5a8d0a0bd4162e60b41a5e769702670803e50 100644 GIT binary patch literal 6173 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 Fabricator
{{:helper.link("Sync", null, {'sync' : 1})}} {{:data.sync}}
+
{{if data.manufacturers}}
{{for data.manufacturers}} {{:helper.link(value.company, null, {'manufacturer' : value.id}, value.id == data.manufacturer ? 'selected' : null)}} {{/for}}
+
{{/if}}
{{for data.categories}} @@ -18,6 +19,7 @@ There are no known designs {{/for}}
+
{{for data.buildable}} {{if value.category == data.category}}
diff --git a/polaris.dme b/polaris.dme index c09bd6af43..c9bcdb41a1 100644 --- a/polaris.dme +++ b/polaris.dme @@ -550,6 +550,7 @@ #include "code\game\magic\Uristrunes.dm" #include "code\game\mecha\mech_bay.dm" #include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mech_prosthetics.dm" #include "code\game\mecha\mech_sensor.dm" #include "code\game\mecha\mecha.dm" #include "code\game\mecha\mecha_construction_paths.dm" @@ -1727,6 +1728,7 @@ #include "code\modules\research\destructive_analyzer.dm" #include "code\modules\research\mechfab_designs.dm" #include "code\modules\research\message_server.dm" +#include "code\modules\research\prosfab_designs.dm" #include "code\modules\research\protolathe.dm" #include "code\modules\research\rd-readme.dm" #include "code\modules\research\rdconsole.dm"