From 3b435c023a0e33fc2ac0fbacac6a612db95a6ca3 Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Thu, 21 Apr 2016 04:35:07 -0400 Subject: [PATCH] Refactor scissors, fix and finalize prefs, fix missing part definition for xion models, etc. continued: Monitor changing verb will now only show a list of monitor styles available for the monitor head brand you are using. For example, if you chose any of the regular monitor heads (default morpheus or anything suffixed with mtr.) you will get a list of IPC standard monitor styles and nothing else. However, if you chose the hesphiastos alt head (which is also a monitor, but of a different style) the list will be populated with the monitor styles suitable for that hesphiastos head, but none others (not even the ipc standard ones, since those don't fit and hesphiastos alt. isn't in the models_allowed list) --- code/game/objects/items/weapons/scissors.dm | 40 +++++++++++------- code/modules/client/preferences.dm | 24 ++++++++--- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/surgery/organs/robolimbs.dm | 2 + icons/mob/human_face.dmi | Bin 70884 -> 70843 bytes 5 files changed, 45 insertions(+), 23 deletions(-) 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 215499099f419dafec60a7bf74a3576dbd488ea2..f0e351b17674a95c834ceadde5da2c39f6627b1b 100644 GIT binary patch delta 6722 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 delta 6667 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 lzf#hBwvp-kIg(-=03#EM75cM#0qW