diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index 2f59728128..81baddd719 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -25,6 +25,8 @@ var/list/categories = list() var/category = null var/manufacturer = null + var/species_types = list("Human") + var/species = "Human" var/sync_message = "" /obj/machinery/pros_fabricator/New() @@ -100,11 +102,14 @@ data["buildable"] = get_build_options() data["category"] = category data["categories"] = categories + data["species_types"] = species_types + data["species"] = species 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 + if(species in R.species_cannot_use) continue T += list(list("id" = A, "company" = R.company)) data["manufacturers"] = T data["manufacturer"] = manufacturer @@ -135,6 +140,10 @@ if(href_list["category"] in categories) category = href_list["category"] + if(href_list["species"]) + if(href_list["species"] in species_types) + species = href_list["species"] + if(href_list["manufacturer"]) if(href_list["manufacturer"] in all_robolimbs) manufacturer = href_list["manufacturer"] @@ -173,6 +182,18 @@ qdel(I) return + if(istype(I,/obj/item/weapon/disk/species)) + var/obj/item/weapon/disk/species/D = I + if(!D.species || !(D.species in GLOB.all_species)) + to_chat(user, "This disk seems to be corrupted!") + else + to_chat(user, "Uploading modification files for [D.species]...") + if(do_after(user,50,src)) + species_types |= D.species + to_chat(user, "Uploaded [D.species] files!") + qdel(I) + return + if(istype(I,/obj/item/stack/material)) var/obj/item/stack/material/S = I if(!(S.material.name in materials)) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index f24ad350a1..cb053663e0 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -178,9 +178,28 @@ for(var/obj/item/W in src) drop_from_inventory(W) - visible_message("\The [src] quivers slightly, then splits apart with a wet slithering noise.") + var/obj/item/organ/external/Chest = organs_by_name[BP_TORSO] - qdel(src) + if(Chest.robotic >= 2) + visible_message("\The [src] shudders slightly, then ejects a cluster of nymphs with a wet slithering noise.") + species = GLOB.all_species[SPECIES_HUMAN] // This is hard-set to default the body to a normal FBP, without changing anything. + + // Bust it + src.death() + + for(var/obj/item/organ/internal/diona/Org in internal_organs) // Remove Nymph organs. + qdel(Org) + + // Purge the diona verbs. + verbs -= /mob/living/carbon/human/proc/diona_split_nymph + verbs -= /mob/living/carbon/human/proc/regenerate + + for(var/obj/item/organ/external/E in organs) // Just fall apart. + E.droplimb(TRUE) + + else + visible_message("\The [src] quivers slightly, then splits apart with a wet slithering noise.") + qdel(src) /mob/living/carbon/human/proc/self_diagnostics() set name = "Self-Diagnostics" diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 7c02077f4d..3383e7bdfb 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -482,6 +482,7 @@ has_organ = list( O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, O_STRATA = /obj/item/organ/internal/diona/strata, + O_BRAIN = /obj/item/organ/internal/brain/cephalon, O_RESPONSE = /obj/item/organ/internal/diona/node, O_GBLADDER = /obj/item/organ/internal/diona/bladder, O_POLYP = /obj/item/organ/internal/diona/polyp, @@ -555,6 +556,16 @@ if(H.isSynthetic()) H.visible_message("\The [H] collapses into parts, revealing a solitary diona nymph at the core.") + + H.species = GLOB.all_species[SPECIES_HUMAN] // This is hard-set to default the body to a normal FBP, without changing anything. + + for(var/obj/item/organ/internal/diona/Org in H.internal_organs) // Remove Nymph organs. + qdel(Org) + + // Purge the diona verbs. + H.verbs -= /mob/living/carbon/human/proc/diona_split_nymph + H.verbs -= /mob/living/carbon/human/proc/regenerate + return for(var/mob/living/carbon/alien/diona/D in H.contents) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 4445f1ed67..1a79b2b14a 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -18,7 +18,7 @@ var/global/list/limb_icon_cache = list() h_col = null if(robotic >= ORGAN_ROBOT) var/datum/robolimb/franchise = all_robolimbs[model] - if(!(franchise && franchise.skin_tone)) + if(!(franchise && franchise.skin_tone) && !(franchise && franchise.skin_color)) if(human.synth_color) s_col = list(human.r_synth, human.g_synth, human.b_synth) return @@ -36,7 +36,7 @@ var/global/list/limb_icon_cache = list() h_col = null if(robotic >= ORGAN_ROBOT) var/datum/robolimb/franchise = all_robolimbs[model] - if(!(franchise && franchise.skin_tone)) + if(!(franchise && franchise.skin_tone) && !(franchise && franchise.skin_color)) return if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE)) s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 4541fcfd95..5062bff160 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -33,6 +33,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ if(!R.unavailable_at_chargen) chargen_robolimbs[R.company] = R //List only main brands and solo parts. + for(var/company in all_robolimbs) + var/datum/robolimb/R = all_robolimbs[company] + if(R.species_alternates) + for(var/species in R.species_alternates) + var/species_company = R.species_alternates[species] + if(species_company in all_robolimbs) + R.species_alternates[species] = all_robolimbs[species_company] + /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. @@ -40,9 +48,11 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/unavailable_at_chargen // If set, not available at chargen. var/unavailable_to_build // If set, can't be constructed. var/lifelike // If set, appears organic. - var/skin_tone // If set, applies skin tone rather than part color + var/skin_tone // If set, applies skin tone rather than part color Overrides color. + var/skin_color // If set, applies skin color rather than part color. var/blood_color = "#030303" var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_XENOCHIMERA) //VOREStation Edit + var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") //"Species Name" = "Robolimb Company" , List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites. var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors. var/parts = BP_ALL //Defines what parts said brand can replace on a body. var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. @@ -72,10 +82,45 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi' unavailable_to_build = 1 +/datum/robolimb/unbranded_tajaran + company = "Unbranded - Tajaran" + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT) + suggested_species = SPECIES_TAJ + desc = "A simple robotic limb with feline design. Seems rather stiff." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi' + unavailable_to_build = 1 + +/datum/robolimb/unbranded_unathi + company = "Unbranded - Unathi" + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT) + suggested_species = SPECIES_UNATHI + desc = "A simple robotic limb with reptilian design. Seems rather stiff." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi' + unavailable_to_build = 1 + /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_main.dmi' + species_alternates = list(SPECIES_TAJ = "NanoTrasen - Tajaran", SPECIES_UNATHI = "NanoTrasen - Unathi") + +/datum/robolimb/nanotrasen_tajaran + company = "NanoTrasen - Tajaran" + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT) + species_alternates = list(SPECIES_HUMAN = "NanoTrasen") + suggested_species = SPECIES_TAJ + desc = "A simple but efficient robotic limb, created by NanoTrasen." + icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi' + unavailable_to_build = 1 + +/datum/robolimb/nanotrasen_unathi + company = "NanoTrasen - Unathi" + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT) + species_alternates = list(SPECIES_HUMAN = "NanoTrasen") + suggested_species = SPECIES_UNATHI + desc = "A simple but efficient robotic limb, created by NanoTrasen." + icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi' + unavailable_to_build = 1 /datum/robolimb/bishop company = "Bishop" @@ -104,6 +149,19 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ parts = list(BP_HEAD) monitor_styles = standard_monitor_styles +/datum/robolimb/gestaltframe + company = "Skrellian Exoskeleton" + desc = "This limb looks to be more like a strange.. puppet, than a prosthetic." + icon = 'icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi' + blood_color = "#63b521" + speech_bubble_appearance = "machine" + unavailable_to_build = 1 + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT) + suggested_species = SPECIES_DIONA + // Dionaea are naturally very tanky, so the robotic limbs are actually far weaker than their normal bodies. + robo_brute_mod = 1.3 + robo_burn_mod = 1.3 + /datum/robolimb/cybersolutions company = "Cyber Solutions" desc = "This limb is grey and rough, with little in the way of aesthetic." @@ -224,11 +282,25 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 lifelike = 1 skin_tone = 1 + species_alternates = list(SPECIES_SKRELL = "Vey-Med - Skrell") blood_color = "#CCCCCC" speech_bubble_appearance = "normal" //robo_brute_mod = 1.1 //VOREStation Edit //robo_burn_mod = 1.1 //VOREStation Edit +/datum/robolimb/veymed_skrell + company = "Vey-Med - Skrell" + desc = "This high quality limb is nearly indistinguishable from an organic one." + icon = 'icons/mob/human_races/cyberlimbs/veymed/veymed_skrell.dmi' + unavailable_to_build = 1 + lifelike = 1 + skin_color = TRUE + species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_DIONA, SPECIES_ZADDAT) + blood_color = "#4451cf" + speech_bubble_appearance = "normal" + robo_brute_mod = 1.05 + robo_burn_mod = 1.05 + /datum/robolimb/wardtakahashi company = "Ward-Takahashi" desc = "This limb features sleek black and white polymers." @@ -343,6 +415,10 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ company = "Vey-Med" catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) +// Bus disk for Diona mech parts. +/obj/item/weapon/disk/limb/veymed/diona + company = "Skrellian Exoskeleton" + /obj/item/weapon/disk/limb/wardtakahashi company = "Ward-Takahashi" catalogue_data = list(/datum/category_item/catalogue/information/organization/ward_takahashi) @@ -358,3 +434,34 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ /obj/item/weapon/disk/limb/nanotrasen company = "NanoTrasen" catalogue_data = list(/datum/category_item/catalogue/information/organization/nanotrasen) + +/obj/item/weapon/disk/species + name = "Species Bioprints" + desc = "A disk containing the blueprints for species-specific prosthetics." + icon = 'icons/obj/cloning.dmi' + icon_state = "datadisk2" + var/species = SPECIES_HUMAN + +/obj/item/weapon/disk/species/Initialize() + ..() + if(species) + name = "[species] [initial(name)]" + +/obj/item/weapon/disk/species/skrell + species = SPECIES_SKRELL + +/obj/item/weapon/disk/species/unathi + species = SPECIES_UNATHI + +/obj/item/weapon/disk/species/tajaran + species = SPECIES_TAJ + +/obj/item/weapon/disk/species/teshari + species = SPECIES_TESHARI + +// In case of bus, presently. +/obj/item/weapon/disk/species/diona + species = SPECIES_DIONA + +/obj/item/weapon/disk/species/zaddat + species = SPECIES_ZADDAT diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index c0e4e60c98..7d43baf757 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -205,6 +205,37 @@ /obj/item/organ/internal/diona/node/removed() return +// A 'brain' for the tree, still becomes a mindless nymph when removed like any other. Satisfies the FBP code. +/obj/item/organ/internal/brain/cephalon + name = "cephalon mass" + parent_organ = BP_TORSO + vital = TRUE + +/obj/item/organ/internal/brain/cephalon/Initialize() + ..() + spawn(30 SECONDS) // FBP Dionaea need some way to be disassembled through surgery, if absolutely necessary. + if(!owner.isSynthetic()) + vital = FALSE + +/obj/item/organ/internal/brain/cephalon/robotize() + return + +/obj/item/organ/internal/brain/cephalon/mechassist() + return + +/obj/item/organ/internal/brain/cephalon/digitize() + return + +/obj/item/organ/internal/brain/cephalon/removed(var/mob/living/user, var/skip_nymph) + if(robotic >= ORGAN_ROBOT) + return ..() + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death() + if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src))) + qdel(src) + /obj/item/organ/external/head/no_eyes/diona max_damage = 50 min_broken_damage = 25 diff --git a/code/modules/research/designs/circuits/disks.dm b/code/modules/research/designs/circuits/disks.dm new file mode 100644 index 0000000000..2a3c2df83f --- /dev/null +++ b/code/modules/research/designs/circuits/disks.dm @@ -0,0 +1,46 @@ + +/datum/design/circuit/disk + build_type = IMPRINTER + req_tech = list(TECH_DATA = 3) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 1000) + chemicals = list("pacid" = 10) + time = 5 + +/datum/design/circuit/disk/AssembleDesignName() + ..() + if(build_path) + var/obj/item/weapon/disk/D = build_path + if(istype(D, /obj/item/weapon/disk/species)) + name = "Species Prosthetic design ([item_name])" + else if(istype(D, /obj/item/weapon/disk/limb)) + name = "Transtellar Prosthetic design ([item_name])" + else + name = "Disk design ([item_name])" + +/datum/design/circuit/disk/skrellprint + name = SPECIES_SKRELL + id = "prosthetic_skrell" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/disk/species/skrell + sort_string = "DBAAA" + +/datum/design/circuit/disk/tajprint + name = SPECIES_TAJ + id = "prosthetic_tajaran" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/disk/species/tajaran + sort_string = "DBAAB" + +/datum/design/circuit/disk/unathiprint + name = SPECIES_UNATHI + id = "prosthetic_unathi" + req_tech = list(TECH_DATA = 3, TECH_BIO = 4) + build_path = /obj/item/weapon/disk/species/unathi + sort_string = "DBAAC" + +/datum/design/circuit/disk/teshariprint + name = SPECIES_TESHARI + id = "prosthetic_teshari" + req_tech = list(TECH_DATA = 3, TECH_BIO = 4) + build_path = /obj/item/weapon/disk/species/teshari + sort_string = "DBAAD" diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 50a5d6db0d..d038736b96 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -11,20 +11,21 @@ if(istype(fabricator, /obj/machinery/pros_fabricator)) var/obj/machinery/pros_fabricator/prosfab = fabricator var/obj/item/organ/O = new build_path(newloc) - //VOREStation Edit - Suggesting a species - var/newspecies = "Human" if(prosfab.manufacturer) var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer] - newspecies = manf.suggested_species - O.species = GLOB.all_species[newspecies] - if(istype(O,/obj/item/organ/external)) - var/obj/item/organ/external/EO = O - if(EO.species.base_color) - var/r_skin = hex2num(copytext(EO.species.base_color,2,4)) - var/g_skin = hex2num(copytext(EO.species.base_color,4,6)) - var/b_skin = hex2num(copytext(EO.species.base_color,6,8)) - EO.s_col = list(r_skin, g_skin, b_skin) - //VOREStation Edit End + + if(!(O.organ_tag in manf.parts)) // Make sure we're using an actually present icon. + manf = all_robolimbs["Unbranded"] + + if(prosfab.species in manf.species_alternates) // If the prosthetics fab is set to say, Unbranded, and species set to 'Tajaran', it will make the Taj variant of Unbranded, if it exists. + manf = manf.species_alternates[prosfab.species] + + if(!prosfab.species || (prosfab.species in manf.species_cannot_use)) // Fabricator ensures the manufacturer can make parts for the species we're set to. + O.species = GLOB.all_species["[manf.suggested_species]"] + else + O.species = GLOB.all_species[prosfab.species] + else + O.species = GLOB.all_species["Human"] O.robotize(prosfab.manufacturer) O.dna = new/datum/dna() //Uuughhhh... why do I have to do this? O.dna.ResetUI() @@ -38,13 +39,20 @@ /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 - //VOREStation Edit - Suggesting a species var/newspecies = "Human" - if(prosfab.manufacturer) - var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer] - newspecies = manf.suggested_species + + var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer] + + if(manf) + if(prosfab.species in manf.species_alternates) // If the prosthetics fab is set to say, Unbranded, and species set to 'Tajaran', it will make the Taj variant of Unbranded, if it exists. + manf = manf.species_alternates[prosfab.species] + + if(!prosfab.species || (prosfab.species in manf.species_cannot_use)) + newspecies = manf.suggested_species + else + newspecies = prosfab.species + var/mob/living/carbon/human/H = new(newloc,newspecies) - //VOREStation Edit End H.stat = DEAD H.gender = gender for(var/obj/item/organ/external/EO in H.organs) @@ -55,11 +63,26 @@ for(var/obj/item/organ/external/O in H.organs) O.species = GLOB.all_species[newspecies] - O.robotize(prosfab.manufacturer) + + if(!(O.organ_tag in manf.parts)) // Make sure we're using an actually present icon. + manf = all_robolimbs["Unbranded"] + + O.robotize(manf.company) O.dna = new/datum/dna() O.dna.ResetUI() O.dna.ResetSE() + // Skincolor weirdness. + O.s_col[1] = 0 + O.s_col[2] = 0 + O.s_col[3] = 0 + + // Resetting the UI does strange things for the skin of a non-human robot, which should be controlled by a whole different thing. + H.r_skin = 0 + H.g_skin = 0 + H.b_skin = 0 + H.dna.ResetUIFrom(H) + H.real_name = "Synthmorph #[rand(100,999)]" H.name = H.real_name H.dir = 2 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 4a791ccfea..0f59be6a2b 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -483,3 +483,96 @@ /datum/surgery_step/robotics/install_mmi/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.") + +/* + * Install a Diona Nymph into a Nymph Mech + */ + +/datum/surgery_step/robotics/install_nymph + allowed_tools = list( + /obj/item/weapon/holder/diona = 100 + ) + + min_duration = 60 + max_duration = 80 + +/datum/surgery_step/robotics/install_nymph/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(target_zone != BP_TORSO) + return + + var/obj/item/weapon/holder/diona/N = tool + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + if(!(affected && affected.open == 3)) + return 0 + + if(!istype(N)) + return 0 + + if(!N.held_mob.client || N.held_mob.stat >= DEAD) + to_chat(user, "That nymph is not viable.") + return SURGERY_FAILURE + + if(!(affected.robotic >= ORGAN_ROBOT)) + to_chat(user, "You cannot install a nymph into a meat puppet.") + return SURGERY_FAILURE + + if(!(affected.model != "Skrellian Exoskeleton")) + to_chat(user, "You're fairly certain a nymph can't pilot a normal robot.") + return SURGERY_FAILURE + + if(!target.should_have_organ("brain")) + to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.") + return SURGERY_FAILURE + + if(!isnull(target.internal_organs["brain"])) + to_chat(user, "Your subject already has a cephalon.") + return SURGERY_FAILURE + + return 1 + +/datum/surgery_step/robotics/install_nymph/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts setting \the [tool] into [target]'s [affected.name].", \ + "You start setting \the [tool] into [target]'s [affected.name].") + ..() + +/datum/surgery_step/robotics/install_nymph/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \ + "You have installed \the [tool] into [target]'s [affected.name].") + + var/obj/item/weapon/holder/diona/N = tool + var/obj/item/organ/internal/brain/cephalon/cephalon = new(target, 1) + target.internal_organs_by_name["brain"] = cephalon + var/mob/living/carbon/alien/diona/D = N.held_mob + user.drop_from_inventory(tool) + + if(D && D.mind) + D.mind.transfer_to(target) + target.languages |= D.languages + + qdel(D) + + target.species = GLOB.all_species[SPECIES_DIONA] + + target.verbs |= /mob/living/carbon/human/proc/diona_split_nymph + target.verbs |= /mob/living/carbon/human/proc/regenerate + + 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, allow_numbers = TRUE) + if(clean_name) + var/okay = alert(target,"New name will be '[clean_name]', ok?", "Confirmation","Cancel","Ok") + if(okay == "Ok") + new_name = clean_name + + target.name = new_name + target.real_name = target.name + +/datum/surgery_step/robotics/install_nymph/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/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi b/icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi new file mode 100644 index 0000000000..5abac25088 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi b/icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi new file mode 100644 index 0000000000..545064c263 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi new file mode 100644 index 0000000000..0ac5a1e16f Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi new file mode 100644 index 0000000000..1546d3f747 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi b/icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi new file mode 100644 index 0000000000..243d9fde59 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/veymed/veymed_skrell.dmi b/icons/mob/human_races/cyberlimbs/veymed/veymed_skrell.dmi new file mode 100644 index 0000000000..71a5f9020d Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/veymed/veymed_skrell.dmi differ diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index 29afe23cf9..bc218c8125 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -4,6 +4,14 @@ {{:data.sync}}