From 345c1616f29cdb1602dcc8e58c2c3fc65cc83a64 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 10 Feb 2022 18:49:24 +0200 Subject: [PATCH 1/7] Adds a way to build bodies using the limbgrower --- code/game/machinery/limbgrower.dm | 101 ++++++++++++++---- code/modules/mob/living/carbon/human/human.dm | 3 + .../research/designs/limbgrower_designs.dm | 9 ++ tgui/packages/tgui/interfaces/Limbgrower.js | 23 ++-- 4 files changed, 109 insertions(+), 27 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index dc87322b57..68270b11bf 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -52,23 +52,30 @@ /obj/machinery/limbgrower/ui_data(mob/user) var/list/data = list() - - for(var/datum/reagent/reagent_id in reagents.reagent_list) - var/list/reagent_data = list( - reagent_name = reagent_id.name, - reagent_amount = reagent_id.volume, - reagent_type = reagent_id.type - ) - data["reagents"] += list(reagent_data) - + if(reagents.reagent_list.len) + for(var/datum/reagent/reagent_id in reagents.reagent_list) + var/list/reagent_data = list( + reagent_name = reagent_id.name, + reagent_amount = reagent_id.volume, + reagent_type = reagent_id.type + ) + data["reagents"] += list(reagent_data) + else + data["reagents"] = list() data["total_reagents"] = reagents.total_volume data["max_reagents"] = reagents.maximum_volume data["busy"] = busy var/list/disk_data = list() disk_data["disk"] = dna_disk //Do i, the machine, have a disk? - disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one + if(dna_disk) + if(dna_disk.fields["name"]) + disk_data["name"] = dna_disk.fields["name"] + else if(dna_disk.genetic_makeup_buffer["name"]) + disk_data["name"] = dna_disk.genetic_makeup_buffer["name"] + else + disk_data["name"] = "No name" + //Name for the human saved if there is one data["disk"] = disk_data - return data /obj/machinery/limbgrower/ui_static_data(mob/user) @@ -119,6 +126,15 @@ if (busy) to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") return + if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) + var/obj/item/reagent_containers/blood/B = user_item + if(!B.reagents.get_reagents()) + to_chat(user, "You can't fill the [src] with a empty [B]!") + return + user.visible_message("[user] drains the [user_item] into the [src] using the blood bag port on [src].", + "You drain the [user_item] into the [src] using the blood bag port.") + B.reagents.trans_to(src, B.amount_per_transfer_from_this) + return if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item)) ui_close(user) @@ -180,7 +196,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return @@ -206,17 +222,13 @@ * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. */ /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) - for(var/reagent_id in modified_consumed_reagents_list) - if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - break - - reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) - + HandleReagentUsage(modified_consumed_reagents_list) var/built_typepath = being_built.build_path // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. - if(ispath(built_typepath, /obj/item/bodypart)) + if(ispath(built_typepath, /mob/living/carbon/human/chestonly)) + if(!build_mob_chest(built_typepath, FALSE)) + HandleReagentUsage(modified_consumed_reagents_list, FALSE) + else if(ispath(built_typepath, /obj/item/bodypart)) build_limb(built_typepath) else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable build_genital(built_typepath) @@ -227,6 +239,17 @@ flick("limbgrower_unfill", src) icon_state = "limbgrower_idleoff" +/obj/machinery/limbgrower/proc/HandleReagentUsage(modified_consumed_reagents_list, remove = TRUE) + for(var/reagent_id in modified_consumed_reagents_list) + if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + break + if(remove) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + else + reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + /* * The process of putting together a limb. * This is called from after we remove the reagents, so this proc is just initializing the limb type. @@ -306,6 +329,42 @@ else new built_typepath(loc) +/obj/machinery/limbgrower/proc/build_mob_chest(built_typepath) + // Create a mob with a chest, but nothing else + if(!ispath(built_typepath, /mob/living/carbon/human/chestonly)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + visible_message(src, "Buzzes, a error screen appearing on it's display.") + return FALSE + var/dna = dna_disk?.genetic_makeup_buffer["name"] + var/mob/living/carbon/human/chestonly/C = new(loc) + if(dna) + C.real_name = dna + else + C.dna.nameless = TRUE + C.real_name = "Synthetic Humanoid #[rand(10000, 99999)]" + C.set_resting(TRUE, TRUE) + C.stat = DEAD + C.adjustOxyLoss(200) + C.adjustCloneLoss(50) + C.med_hud_set_status() + C.med_hud_set_health() + C.underwear = "Nude" + C.undershirt = "Nude" + C.saved_underwear = "" + C.saved_undershirt = "" + C.hair_style = "bald" + C.skin_tone = "albino" + // Just enough to start reviving them, I hope + C.blood_volume = BLOOD_VOLUME_SURVIVE + // At some point, make a way to deal with species regenerate_organs + // Remove all the organs + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + O.Remove(organ) + + C.update_appearance() + return TRUE + /obj/machinery/limbgrower/RefreshParts() reagents.maximum_volume = 0 for(var/obj/item/reagent_containers/glass/our_beaker in component_parts) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4fc60cc6ac..3e7f2f59e3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -942,6 +942,9 @@ . += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) +/mob/living/carbon/human/chestonly + bodyparts = list(/obj/item/bodypart/chest) + /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 8da18c453c..39bba19176 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -2,6 +2,15 @@ //////////Limb Grower Designs /////// ///////////////////////////////////// + +/datum/design/chestmob + name = "Synthetic Humanoid Framework Chest" + id = "chestmob" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 100, /datum/reagent/blood = BLOOD_VOLUME_SURVIVE) + build_path = /mob/living/carbon/human/chestonly + category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno") + /datum/design/leftarm name = "Left Arm" id = "leftarm" diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index b91c7e4b45..004137782e 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -1,5 +1,5 @@ import { useBackend, useSharedState } from '../backend'; -import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs } from '../components'; +import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs, ProgressBar } from '../components'; import { Window } from '../layouts'; export const Limbgrower = (props, context) => { @@ -22,7 +22,7 @@ export const Limbgrower = (props, context) => { + height={760}> {!!busy && ( @@ -47,7 +47,16 @@ export const Limbgrower = (props, context) => {
- {total_reagents} / {max_reagents} reagent capacity used. + {!!total_reagents && max_reagents + ? ( +

+ {`Total Reagents/Maximum Reagents: + ${total_reagents}/${max_reagents}`} +

+ ) + : null} +
{reagents.map(reagent => ( @@ -56,13 +65,15 @@ export const Limbgrower = (props, context) => { label={reagent.reagent_name} buttons={( act('empty_reagent', { - reagent_type: reagent.reagent_type, - })} /> + onClick={() => { + act('empty_reagent', { reagent_type: reagent.reagent_type }); + + }} /> )}> {reagent.reagent_amount}u From fc6f3cdffc379d051547a28464e3a69e177b2074 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Fri, 11 Feb 2022 16:54:05 +0200 Subject: [PATCH 2/7] tested and done, seems to work --- code/game/machinery/limbgrower.dm | 32 +++++++++++++------ .../research/designs/limbgrower_designs.dm | 3 ++ tgui/packages/tgui/interfaces/Limbgrower.js | 12 +++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 68270b11bf..8014582eb0 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -129,10 +129,13 @@ if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) var/obj/item/reagent_containers/blood/B = user_item if(!B.reagents.get_reagents()) - to_chat(user, "You can't fill the [src] with a empty [B]!") + to_chat(user, "You can't fill [src] with a empty [B.name]!") return - user.visible_message("[user] drains the [user_item] into the [src] using the blood bag port on [src].", - "You drain the [user_item] into the [src] using the blood bag port.") + if(reagents.total_volume == reagents.maximum_volume) + to_chat(user, "\The [src] can't hold more blood!") + return + user.visible_message("[user] drains the [user_item] into [src] using the blood bag port on [src].", + "You drain the [user_item] into [src] using the blood bag port.") B.reagents.trans_to(src, B.amount_per_transfer_from_this) return @@ -335,13 +338,21 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) visible_message(src, "Buzzes, a error screen appearing on it's display.") return FALSE - var/dna = dna_disk?.genetic_makeup_buffer["name"] + // Fields is from cloning, a much fuller scan, genetic_makeup_buffer is less so + var/dna_genetics = dna_disk?.genetic_makeup_buffer + var/dna_cloning = dna_disk?.fields + var/datum/species/selected = GLOB.species_datums[selected_category] var/mob/living/carbon/human/chestonly/C = new(loc) - if(dna) - C.real_name = dna + C.real_name = length(dna_genetics) ? dna_genetics["name"] : "Synthetic Humanoid #[rand(10000, 99999)]" + if(length(dna_cloning)) + C.hardset_dna(dna_cloning["UI"], dna_cloning["SE"], dna_cloning["name"], dna_cloning["blood_type"], dna_cloning["mrace"], dna_cloning["features"]) + else if(length(dna_genetics)) + C.hardset_dna(dna_genetics["UI"], null, dna_genetics["name"], dna_genetics["blood_type"]) else - C.dna.nameless = TRUE C.real_name = "Synthetic Humanoid #[rand(10000, 99999)]" + C.hair_style = "bald" + C.skin_tone = "albino" + C.set_species(selected) C.set_resting(TRUE, TRUE) C.stat = DEAD C.adjustOxyLoss(200) @@ -352,8 +363,7 @@ C.undershirt = "Nude" C.saved_underwear = "" C.saved_undershirt = "" - C.hair_style = "bald" - C.skin_tone = "albino" + // Just enough to start reviving them, I hope C.blood_volume = BLOOD_VOLUME_SURVIVE // At some point, make a way to deal with species regenerate_organs @@ -361,7 +371,9 @@ for(var/organ in C.internal_organs) var/obj/item/organ/O = organ O.Remove(organ) - + C.update_body(TRUE) + C.update_hair() + C.update_body_parts() C.update_appearance() return TRUE diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 39bba19176..e30cdfb5ef 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -6,6 +6,9 @@ /datum/design/chestmob name = "Synthetic Humanoid Framework Chest" id = "chestmob" + // Mobs don't make very good roundstart icons + research_icon = 'icons/mob/human_parts.dmi' + research_icon_state = "default_human_chest" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/synthflesh = 100, /datum/reagent/blood = BLOOD_VOLUME_SURVIVE) build_path = /mob/living/carbon/human/chestonly diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index 004137782e..75b98f0d81 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -47,14 +47,10 @@ export const Limbgrower = (props, context) => {
- {!!total_reagents && max_reagents - ? ( -

- {`Total Reagents/Maximum Reagents: - ${total_reagents}/${max_reagents}`} -

- ) - : null} + {/* Total_reagents could be null or undefined, so let's be safe */ + `Total Reagents/Maximum Reagents: + ${total_reagents ? total_reagents : 0}/${max_reagents}` + }
From f404390c913d01c99b1909f3bb01cbe25b311906 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 16 Feb 2022 00:46:25 +0200 Subject: [PATCH 3/7] Edge case and documentation --- code/game/machinery/limbgrower.dm | 3 ++- tgui/packages/tgui/interfaces/Limbgrower.js | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 8014582eb0..ab93012ae4 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -356,7 +356,8 @@ C.set_resting(TRUE, TRUE) C.stat = DEAD C.adjustOxyLoss(200) - C.adjustCloneLoss(50) + // Limb replacement causes toxloss, which can cause too much suffering for the doctor that I don't want + C.adjustCloneLoss(45) C.med_hud_set_status() C.med_hud_set_health() C.underwear = "Nude" diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index 75b98f0d81..e7e04d4f51 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -42,6 +42,8 @@ export const Limbgrower = (props, context) => {
Containing data for {disk['name']},
Attempting to create genitalia will use the disk's data. + Any Synthetic Frameworks created will + overwrite the race category selected.
) : disk['disk'] ? "No data." : "No disk."}
From 50455227f13614e7c7474aa33642e82e6eb35da7 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 16 Feb 2022 00:49:46 +0200 Subject: [PATCH 4/7] More comments --- code/game/machinery/limbgrower.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index ab93012ae4..3570ce49a3 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -354,6 +354,7 @@ C.skin_tone = "albino" C.set_species(selected) C.set_resting(TRUE, TRUE) + // Don't want to cause it to deathgasp.. C.stat = DEAD C.adjustOxyLoss(200) // Limb replacement causes toxloss, which can cause too much suffering for the doctor that I don't want From 86c711a0030e88b34907d7880a5cd00a99cfd710 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Fri, 18 Feb 2022 23:44:03 +0200 Subject: [PATCH 5/7] Apply suggestions from code review Co-authored-by: Putnam3145 --- code/game/machinery/limbgrower.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 3570ce49a3..da1d294729 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -129,7 +129,7 @@ if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) var/obj/item/reagent_containers/blood/B = user_item if(!B.reagents.get_reagents()) - to_chat(user, "You can't fill [src] with a empty [B.name]!") + to_chat(user, "You can't fill [src] with an empty [B.name]!") return if(reagents.total_volume == reagents.maximum_volume) to_chat(user, "\The [src] can't hold more blood!") @@ -199,7 +199,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + audible_message("\The [src] buzzes and states "INSUFFICENT REAGENTS"") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return @@ -336,7 +336,7 @@ // Create a mob with a chest, but nothing else if(!ispath(built_typepath, /mob/living/carbon/human/chestonly)) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - visible_message(src, "Buzzes, a error screen appearing on it's display.") + visible_message(src, "Buzzes, an error screen appearing on its display.") return FALSE // Fields is from cloning, a much fuller scan, genetic_makeup_buffer is less so var/dna_genetics = dna_disk?.genetic_makeup_buffer From 2b11cfcc3335c4dc5f0223c4307dbc63d176b4b5 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Sat, 19 Feb 2022 12:55:35 +0200 Subject: [PATCH 6/7] Linz's suggestion Co-authored-by: Lin --- code/game/machinery/limbgrower.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index da1d294729..5b1bd91fc3 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -199,7 +199,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes and states "INSUFFICENT REAGENTS"") + audible_message("\The [src] buzzes and states \"INSUFFICENT REAGENTS\"") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return From 29a4e1059205b71d600179de83208365973291ab Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Mon, 21 Feb 2022 01:09:21 +0200 Subject: [PATCH 7/7] Looping performance tweaks --- code/game/machinery/limbgrower.dm | 32 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 3570ce49a3..d77e2e0aae 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -225,12 +225,12 @@ * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. */ /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) - HandleReagentUsage(modified_consumed_reagents_list) + reagent_usage(modified_consumed_reagents_list) var/built_typepath = being_built.build_path // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. if(ispath(built_typepath, /mob/living/carbon/human/chestonly)) if(!build_mob_chest(built_typepath, FALSE)) - HandleReagentUsage(modified_consumed_reagents_list, FALSE) + reagent_usage(modified_consumed_reagents_list, FALSE) else if(ispath(built_typepath, /obj/item/bodypart)) build_limb(built_typepath) else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable @@ -242,16 +242,24 @@ flick("limbgrower_unfill", src) icon_state = "limbgrower_idleoff" -/obj/machinery/limbgrower/proc/HandleReagentUsage(modified_consumed_reagents_list, remove = TRUE) - for(var/reagent_id in modified_consumed_reagents_list) - if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - break - if(remove) - reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) - else - reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) +/obj/machinery/limbgrower/proc/reagent_usage(modified_consumed_reagents_list, remove = TRUE) + // Apparently, having a boolean in a loop is worse than doing it twice + if(remove) + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + else + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + + +/obj/machinery/limbgrower/proc/reagent_sanity_check(reagent_id, amount) + if(reagents.has_reagent(reagent_id, amount)) + return TRUE + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + return FALSE /* * The process of putting together a limb.