diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 3032d636d19..a5e0081e723 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -37,16 +37,20 @@
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
- if((H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
- to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
- return
+ if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(robohead.is_monitor)
+ to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
+ return
+ continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
- if((H.species.flags & ALL_RPARTS) && !robohead.is_monitor && ("Human" in tmp_facial.species_allowed)) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
- species_facial_hair += i
- else //Otherwise, they won't be getting any hairstyles.
- to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
- return
+ if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(!robohead.is_monitor)
+ if("Human" in tmp_facial.species_allowed)
+ species_facial_hair += i
+ else //Otherwise, they won't be getting any hairstyles.
+ to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
+ return
else
species_facial_hair = facial_hair_styles_list
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
@@ -56,16 +60,20 @@
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
- if((H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
- to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
- return
+ if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(robohead.is_monitor)
+ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
+ return
+ continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
- if((H.species.flags & ALL_RPARTS) && !robohead.is_monitor && ("Human" in tmp_hair.species_allowed)) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
- species_facial_hair += i
- else //Otherwise, they won't be getting any hairstyles.
- to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
- return
+ if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(!robohead.is_monitor)
+ if("Human" in tmp_hair.species_allowed)
+ species_hair += i
+ else //Otherwise, they won't be getting any hairstyles.
+ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
+ return
else
species_hair = hair_styles_list
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 767fa014910..546a7e5abf4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1496,23 +1496,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
organ_data[second_limb] = "amputated"
rlimb_data[second_limb] = null
if("Prosthesis")
- var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs
+ var/choice
var/subchoice
var/datum/robolimb/R = new()
var/in_model
+ var/robolimb_companies = list()
+ for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
+ R = new limb_type()
+ if(!R.unavailable_at_chargen)
+ if(limb in R.parts) //Ensures users can only choose companies that offer the parts they want.
+ robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
+ R = new() //Re-initialize R.
+
+ choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
if(!choice)
return
R.company = choice
R = all_robolimbs[R.company]
- if(R.has_subtypes == 1)
+ if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
var/list/robolimb_models = list()
- for(var/limb_type in typesof(R))
+ for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
var/datum/robolimb/L = new limb_type()
- if(limb in L.parts)
+ if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
robolimb_models[L.company] = L
- if(second_limb in L.parts)
+ if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
+ subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
+ if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
in_model = 1
- subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
+ if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
+ subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
if(subchoice)
choice = subchoice
if(limb == "head")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 0af960d9538..f2f533da59b 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1614,7 +1614,7 @@
var/list/hair = list()
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
- if(species.name in tmp_hair.species_allowed)
+ if((species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", h_style) as null|anything in hair
diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm
index f7a450d77f6..0229ee80cae 100644
--- a/code/modules/surgery/organs/robolimbs.dm
+++ b/code/modules/surgery/organs/robolimbs.dm
@@ -106,11 +106,13 @@ var/global/datum/robolimb/basic_robolimb
/datum/robolimb/xion/alt1
company = "Xion Manufacturing Group alt."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi'
+ parts = list("head")
has_subtypes = null
/datum/robolimb/xion/monitor
company = "Xion Manufacturing Group mtr."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi'
+ parts = list("head")
is_monitor = 1
has_subtypes = null
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 215499099f4..f0e351b1767 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ