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 c53e7823ca..85d5a8d0a0 100644 Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ 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 @@ -

Exosuit 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"