From 196250c8f788d367d7bfeaf97c5aae0309229826 Mon Sep 17 00:00:00 2001 From: Y0SH1M4S73R Date: Mon, 25 Jul 2022 06:21:23 -0400 Subject: [PATCH] Concentrated barbers aid can give hairless species hair + fixes hair updating once and for all (probably) (#68580) Co-authored-by: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> --- .../datums/diseases/advance/symptoms/beard.dm | 2 +- .../diseases/advance/symptoms/shedding.dm | 2 +- code/datums/dna.dm | 5 +++- code/datums/quirks/neutral.dm | 4 +-- code/game/objects/structures/mirror.dm | 4 +-- code/modules/admin/create_mob.dm | 1 - code/modules/antagonists/blob/blob_mobs.dm | 2 +- .../changeling/powers/mutations.dm | 2 +- code/modules/antagonists/creep/creep.dm | 2 +- .../antagonists/revolution/revolution.dm | 2 +- code/modules/antagonists/thief/thief.dm | 1 - code/modules/clothing/outfits/event.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../living/carbon/human/human_update_icons.dm | 3 +- .../mob/living/carbon/human/species.dm | 4 +-- .../carbon/human/species_types/felinid.dm | 2 +- .../carbon/human/species_types/humans.dm | 2 +- code/modules/mob_spawn/mob_spawn.dm | 3 +- .../chemistry/reagents/alcohol_reagents.dm | 4 +-- .../chemistry/reagents/drug_reagents.dm | 3 +- .../chemistry/reagents/other_reagents.dm | 28 ++++++++++++++++-- .../reagents/withdrawal/generic_addictions.dm | 2 +- ...reenshot_antag_icons_headrevolutionary.png | Bin 2372 -> 2354 bytes .../screenshot_antag_icons_provocateur.png | Bin 2372 -> 2354 bytes 24 files changed, 50 insertions(+), 32 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 6ca83c118c9..b537c31edac 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -32,5 +32,5 @@ if(index > 0 && H.facial_hairstyle != beard_order[index]) to_chat(H, span_warning("Your chin itches.")) H.facial_hairstyle = beard_order[index] - H.update_hair() + H.update_hair(is_creating = TRUE) diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index fa23da69135..fe199c60ce3 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -45,4 +45,4 @@ H.hairstyle = "Bald" else H.hairstyle = "Balding Hair" - H.update_hair() + H.update_hair(is_creating = TRUE) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index caed19be8a3..61feaafe8b0 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -564,7 +564,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) eye_color_left = sanitize_hexcolor(get_uni_identity_block(structure, DNA_EYE_COLOR_LEFT_BLOCK)) eye_color_right = sanitize_hexcolor(get_uni_identity_block(structure, DNA_EYE_COLOR_RIGHT_BLOCK)) facial_hairstyle = GLOB.facial_hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_FACIAL_HAIRSTYLE_BLOCK), GLOB.facial_hairstyles_list.len)] - hairstyle = GLOB.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), GLOB.hairstyles_list.len)] + if(HAS_TRAIT(src, TRAIT_BALD)) + hairstyle = "Bald" + else + hairstyle = GLOB.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), GLOB.hairstyles_list.len)] var/features = dna.unique_features if(dna.features["mcolor"]) dna.features["mcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_BLOCK)) diff --git a/code/datums/quirks/neutral.dm b/code/datums/quirks/neutral.dm index 53cf158d4dd..38d136b2b2f 100644 --- a/code/datums/quirks/neutral.dm +++ b/code/datums/quirks/neutral.dm @@ -294,7 +294,7 @@ var/mob/living/carbon/human/human_holder = quirk_holder old_hair = human_holder.hairstyle human_holder.hairstyle = "Bald" - human_holder.update_hair() + human_holder.update_hair(is_creating = TRUE) RegisterSignal(human_holder, COMSIG_CARBON_EQUIP_HAT, .proc/equip_hat) RegisterSignal(human_holder, COMSIG_CARBON_UNEQUIP_HAT, .proc/unequip_hat) @@ -314,7 +314,7 @@ . = ..() var/mob/living/carbon/human/human_holder = quirk_holder human_holder.hairstyle = old_hair - human_holder.update_hair() + human_holder.update_hair(is_creating = TRUE) UnregisterSignal(human_holder, list(COMSIG_CARBON_EQUIP_HAT, COMSIG_CARBON_UNEQUIP_HAT)) SEND_SIGNAL(human_holder, COMSIG_CLEAR_MOOD_EVENT, "bad_hair_day") diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index f1452e03648..7473aa62f0d 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -203,9 +203,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) to_chat(amazed_human, span_notice("Invalid color. Your color is not bright enough.")) return TRUE - amazed_human.update_body() - amazed_human.update_hair() - amazed_human.update_body_parts() + amazed_human.update_body(is_creating = TRUE) amazed_human.update_mutations_overlay() // no hulk lizard if("gender") diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 5232fcec34e..434685bb210 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -42,5 +42,4 @@ human.dna.features["pod_hair"] = pick(GLOB.pod_hair_list) human.update_body(is_creating = TRUE) - human.update_hair(is_creating = TRUE) human.dna.species.spec_updatehealth(human) diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 74ea92cc87a..4ca41d463e2 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -188,7 +188,7 @@ icon = H.icon icon_state = "zombie" H.hairstyle = null - H.update_hair() + H.update_hair(is_creating = TRUE) H.forceMove(src) oldguy = H update_icons() diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 0c90f7e9732..ae12e196af7 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -95,7 +95,7 @@ H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_inv_wear_suit() H.update_inv_head() - H.update_hair() + H.update_hair(is_creating = TRUE) if(blood_on_castoff) H.add_splatter_floor() diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index 9d485013c08..83d6b6e6b9d 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -41,7 +41,7 @@ var/mob/living/carbon/human/dummy/consistent/victim_dummy = new victim_dummy.hair_color = "#bb9966" // Brown victim_dummy.hairstyle = "Messy" - victim_dummy.update_hair() + victim_dummy.update_hair(is_creating = TRUE) var/icon/obsessed_icon = render_preview_outfit(preview_outfit) obsessed_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 1824771ce21..d55c1ad8a53 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -206,7 +206,7 @@ /datum/antagonist/rev/head/proc/make_assistant_icon(hairstyle) var/mob/living/carbon/human/dummy/consistent/assistant = new assistant.hairstyle = hairstyle - assistant.update_hair() + assistant.update_hair(is_creating = TRUE) var/icon/assistant_icon = render_preview_outfit(/datum/outfit/job/assistant/consistent, assistant) assistant_icon.ChangeOpacity(0.5) diff --git a/code/modules/antagonists/thief/thief.dm b/code/modules/antagonists/thief/thief.dm index 24a01d1e0c1..181185ed6ac 100644 --- a/code/modules/antagonists/thief/thief.dm +++ b/code/modules/antagonists/thief/thief.dm @@ -169,7 +169,6 @@ thief.dna.update_ui_block(DNA_GENDER_BLOCK) thief.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) thief.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) - thief.update_hair(is_creating = TRUE) thief.update_body(is_creating = TRUE) // This outfit is used by the assets SS, which is ran before the atoms SS diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index 7fdc712038b..e17d725d7f5 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -25,4 +25,4 @@ H.facial_hairstyle = "Beard (Full)" H.hair_color = "#FFFFFF" H.facial_hair_color = "#FFFFFF" - H.update_hair() + H.update_hair(is_creating = TRUE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 5e02ee1b154..3005e0dc511 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -664,7 +664,7 @@ emote("scream") facial_hairstyle = "Shaved" hairstyle = "Bald" - update_hair() + update_hair(is_creating = TRUE) ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) update_damage_overlays() diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 7871e5a7541..6f2e3b26aa5 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -74,8 +74,7 @@ There are several things that need to be remembered: /mob/living/carbon/human/regenerate_icons() if(!..()) - update_body() - update_hair() + update_body(is_creating = TRUE) update_inv_w_uniform() update_inv_wear_id() update_inv_gloves() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 267017a39ad..cc4aa251ecf 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -783,7 +783,7 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Proc that will randomise the hair, or primary appearance element (i.e. for moths wings) of a species' associated mob /datum/species/proc/randomize_main_appearance_element(mob/living/carbon/human/human_mob) human_mob.hairstyle = random_hairstyle(human_mob.gender) - human_mob.update_hair() + human_mob.update_hair(is_creating = TRUE) ///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob /datum/species/proc/randomize_active_underwear(mob/living/carbon/human/human_mob) @@ -1032,7 +1032,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return target.facial_hairstyle = "Shaved" target.hairstyle = "Bald" - target.update_hair() + target.update_hair(is_creating = TRUE) ////////////////// // ATTACK PROCS // diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index b4331a06986..244f864b559 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -103,7 +103,7 @@ /datum/species/human/felinid/prepare_human_for_preview(mob/living/carbon/human/human) human.hairstyle = "Hime Cut" human.hair_color = "#ffcccc" // pink - human.update_hair() + human.update_hair(is_creating = TRUE) var/obj/item/organ/internal/ears/cat/cat_ears = human.getorgan(/obj/item/organ/internal/ears/cat) if (cat_ears) diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index f08ca038bd1..8172575b592 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -19,7 +19,7 @@ /datum/species/human/prepare_human_for_preview(mob/living/carbon/human/human) human.hairstyle = "Business Hair" human.hair_color = "#bb9966" // brown - human.update_hair() + human.update_hair(is_creating = TRUE) /datum/species/human/get_scream_sound(mob/living/carbon/human/human) if(human.gender == MALE) diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index 6db07990ae9..2348bef2a1f 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -74,8 +74,7 @@ spawned_human.skin_tone = skin_tone else spawned_human.skin_tone = random_skin_tone() - spawned_human.update_hair() - spawned_human.update_body() + spawned_human.update_body(is_creating = TRUE) /obj/effect/mob_spawn/proc/name_mob(mob/living/spawned_mob, forced_name) var/chosen_name diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index dd8b2914a70..e13186b5f01 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2388,12 +2388,12 @@ All effects don't start immediately, but rather get worse over time; the rate is if(metabolizer.age > 70) metabolizer.facial_hair_color = "#cccccc" metabolizer.hair_color = "#cccccc" - metabolizer.update_hair() + metabolizer.update_hair(is_creating = TRUE) if(metabolizer.age > 100) metabolizer.become_nearsighted(type) if(metabolizer.gender == MALE) metabolizer.facial_hairstyle = "Beard (Very Long)" - metabolizer.update_hair() + metabolizer.update_hair(is_creating = TRUE) if(metabolizer.age > 969) //Best not let people get older than this or i might incur G-ds wrath metabolizer.visible_message(span_notice("[metabolizer] becomes older than any man should be.. and crumbles into dust!")) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 797efddc8a9..40c5a926a8e 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -121,7 +121,7 @@ var/mob/living/carbon/human/H = M H.facial_hairstyle = "Shaved" H.hairstyle = "Bald" - H.update_hair() // makes you loose hair as well + H.update_hair(is_creating = TRUE) // makes you loose hair as well M.set_species(/datum/species/human/krokodil_addict) M.adjustBruteLoss(50*REM, 0) // holy shit your skin just FELL THE FUCK OFF ..() @@ -692,7 +692,6 @@ druggy_dna.species.species_traits += NOBLOODOVERLAY invisible_man.update_body() - invisible_man.update_hair() invisible_man.remove_from_all_data_huds() invisible_man.sound_environment_override = SOUND_ENVIROMENT_PHASED diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e9700c75212..ead19d86b8b 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2208,7 +2208,7 @@ to_chat(exposed_human, span_notice("Hair starts sprouting from your scalp.")) exposed_human.hairstyle = picked_hair exposed_human.facial_hairstyle = picked_beard - exposed_human.update_hair() + exposed_human.update_hair(is_creating = TRUE) /datum/reagent/concentrated_barbers_aid name = "Concentrated Barber's Aid" @@ -2228,7 +2228,29 @@ to_chat(exposed_human, span_notice("Your hair starts growing at an incredible speed!")) exposed_human.hairstyle = "Very Long Hair" exposed_human.facial_hairstyle = "Beard (Very Long)" - exposed_human.update_hair() + exposed_human.update_hair(is_creating = TRUE) + +/datum/reagent/concentrated_barbers_aid/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + . = ..() + if(current_cycle > 20 / creation_purity) + if(!ishuman(M)) + return + var/mob/living/carbon/human/human_mob = M + if(creation_purity == 1 && human_mob.has_quirk(/datum/quirk/item_quirk/bald)) + human_mob.remove_quirk(/datum/quirk/item_quirk/bald) + var/datum/species/species_datum = human_mob.dna?.species + if(!species_datum) + return + if(species_datum.species_traits.Find(HAIR)) + return + species_datum.species_traits |= HAIR + var/message + if(HAS_TRAIT(M, TRAIT_BALD)) + message = span_warning("You feel your scalp mutate, but you are still hopelessly bald.") + else + message = span_notice("Your scalp mutates, a full head of hair sprouting from it.") + to_chat(M, message) + human_mob.update_hair(is_creating = TRUE) /datum/reagent/baldium name = "Baldium" @@ -2248,7 +2270,7 @@ to_chat(exposed_human, span_danger("Your hair is falling out in clumps!")) exposed_human.hairstyle = "Bald" exposed_human.facial_hairstyle = "Shaved" - exposed_human.update_hair() + exposed_human.update_hair(is_creating = TRUE) /datum/reagent/saltpetre name = "Saltpetre" diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index d6b704f625e..8280950034b 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -111,7 +111,7 @@ if(affected_human.gender == MALE) to_chat(affected_human, span_warning("Your chin itches.")) affected_human.facial_hairstyle = "Beard (Full)" - affected_human.update_hair() + affected_human.update_hair(is_creating = TRUE) //Only like gross food affected_human.dna?.species.liked_food = GROSS affected_human.dna?.species.disliked_food = NONE diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png index 50be89b8a80ff60f7a35fa25e417eece09e18163..d339c634eba9b4e9c38934a466ba7329621c51c8 100644 GIT binary patch delta 2224 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