From b642a271e12756cdf3db978dc6d5864a19b2b5b6 Mon Sep 17 00:00:00 2001 From: Burzah <116982774+Burzah@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:17:35 -0700 Subject: [PATCH] Reverts Slime/IPC Imitation Cosmetics (#28695) * Initial commit * Removes unused define * oops --- SQL/paradise_schema.sql | 1 - SQL/updates/65-66.sql | 5 + code/__DEFINES/flags.dm | 7 +- code/__DEFINES/misc_defines.dm | 2 +- code/__HELPERS/iconprocs.dm | 9 - code/datums/diseases/advance/symptoms/hair.dm | 6 +- code/game/dna/dna2_helpers.dm | 2 +- .../miniantags/tourist/tourist_arrivals.dm | 4 +- code/game/objects/structures/dresser.dm | 6 +- code/modules/awaymissions/mob_spawn.dm | 4 +- .../login_processing/20-load_characters.dm | 3 +- code/modules/client/preference/character.dm | 106 ++++------ .../client/preference/link_processing.dm | 190 +++++++----------- code/modules/client/preference/preferences.dm | 7 - code/modules/clothing/clothing.dm | 4 +- code/modules/customitems/item_defines.dm | 2 +- .../mob/living/carbon/human/appearance.dm | 20 +- .../living/carbon/human/body_accessories.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 - .../living/carbon/human/human_update_icons.dm | 67 ++---- .../living/carbon/human/species/_species.dm | 21 +- .../living/carbon/human/species/machine.dm | 62 +----- .../carbon/human/species/slimepeople.dm | 100 +-------- .../chemistry/reagents/misc_reagents.dm | 12 +- code/modules/response_team/ert.dm | 4 +- code/modules/surgery/organs/organ_icon.dm | 8 +- code/modules/surgery/robotics.dm | 21 +- .../tgui/modules/appearance_changer.dm | 10 +- config/example/config.toml | 2 +- 29 files changed, 182 insertions(+), 507 deletions(-) create mode 100644 SQL/updates/65-66.sql diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index e3e87c05b06..ac44ede929c 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -83,7 +83,6 @@ CREATE TABLE `characters` ( `runechat_color` VARCHAR(7) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '#FFFFFF', `cyborg_brain_type` ENUM('MMI', 'Robobrain', 'Positronic') NOT NULL DEFAULT 'MMI', `pda_ringtone` VARCHAR(16) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci', - `species_subtype` VARCHAR(45) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'None', PRIMARY KEY (`id`), KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=125467 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/SQL/updates/65-66.sql b/SQL/updates/65-66.sql new file mode 100644 index 00000000000..62b0b1ada0e --- /dev/null +++ b/SQL/updates/65-66.sql @@ -0,0 +1,5 @@ +# Updates DB from 64 to 65 ~Burzah +# Removes column species_subtype on the characters table + +ALTER TABLE `characters` +DROP COLUMN `species_subtype`; diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b1ecfca2fe3..63fddee3745 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -110,10 +110,9 @@ #define HAS_ALT_HEADS (1<<11) #define HAS_WING (1<<12) #define HAS_BODYACC_COLOR (1<<13) -#define HAS_SPECIES_SUBTYPE (1<<14) -#define BALD (1<<15) -#define ALL_RPARTS (1<<16) -#define SHAVED (1<<17) +#define BALD (1<<14) +#define ALL_RPARTS (1<<15) +#define SHAVED (1<<16) //Pre-baked combinations of the above body flags #define HAS_BODY_ACCESSORY (HAS_TAIL | HAS_WING) diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm index 3ecb0231cc6..d485a10f8d7 100644 --- a/code/__DEFINES/misc_defines.dm +++ b/code/__DEFINES/misc_defines.dm @@ -437,7 +437,7 @@ #define INVESTIGATE_WIRES "wires" // The SQL version required by this version of the code -#define SQL_VERSION 65 +#define SQL_VERSION 66 // Vending machine stuff #define CAT_NORMAL (1<<0) diff --git a/code/__HELPERS/iconprocs.dm b/code/__HELPERS/iconprocs.dm index 41975d1a354..92bff1512b4 100644 --- a/code/__HELPERS/iconprocs.dm +++ b/code/__HELPERS/iconprocs.dm @@ -547,12 +547,3 @@ GLOBAL_LIST_EMPTY(bicon_cache) "x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0, "y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0, ) - -/// Slimifies an icon by painting a color onto the icon, then changing the alpha. -/icon/proc/slimify(color = "#FFFFFF", alpha = "FF") - GrayScale() - var/list/hsl = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8))) - hsl[3] = clamp(hsl[3], 0, 0.4) // Clamps luminance. - var/rgb = hsl2rgb(arglist(hsl)) - var/new_color = "#[num2hex(rgb[1], 2)][num2hex(rgb[2], 2)][num2hex(rgb[3], 2)]" - Blend("[new_color][alpha]", ICON_ADD) diff --git a/code/datums/diseases/advance/symptoms/hair.dm b/code/datums/diseases/advance/symptoms/hair.dm index b1f56f177be..60419bd5b25 100644 --- a/code/datums/diseases/advance/symptoms/hair.dm +++ b/code/datums/diseases/advance/symptoms/hair.dm @@ -37,13 +37,13 @@ BONUS switch(A.stage) if(1, 2, 3) to_chat(H, "Your scalp itches.") - head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name) else to_chat(H, "Hair bursts forth from your scalp!") var/datum/sprite_accessory/tmp_hair_style = GLOB.hair_styles_full_list["Very Long Hair"] - if(head_organ.dna.species.sprite_sheet_name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. + if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. head_organ.h_style = "Very Long Hair" else //Otherwise, give them a random hair style. - head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name) H.update_hair() diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 202e491e1d8..73973a1944d 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -241,7 +241,7 @@ var/list/available = list() for(var/head_accessory in GLOB.head_accessory_styles_list) var/datum/sprite_accessory/S = GLOB.head_accessory_styles_list[head_accessory] - if(!(head_organ.dna.species.sprite_sheet_name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list. + if(!(head_organ.dna.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list. continue available += head_accessory var/list/sorted = sortTim(available, GLOBAL_PROC_REF(cmp_text_asc)) diff --git a/code/game/gamemodes/miniantags/tourist/tourist_arrivals.dm b/code/game/gamemodes/miniantags/tourist/tourist_arrivals.dm index ca69243d9da..545b67f3a9d 100644 --- a/code/game/gamemodes/miniantags/tourist/tourist_arrivals.dm +++ b/code/game/gamemodes/miniantags/tourist/tourist_arrivals.dm @@ -118,8 +118,8 @@ head_organ.sec_hair_colour = hair_c M.change_eye_color(eye_c) M.s_tone = skin_tone - head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.sprite_sheet_name) - head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name) + head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name) M.regenerate_icons() M.update_body() diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index e93f865cc7e..5bc31b1d050 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -21,7 +21,7 @@ var/list/valid_underwear = list() for(var/underwear in GLOB.underwear_list) var/datum/sprite_accessory/S = GLOB.underwear_list[underwear] - if(!(H.dna.species.sprite_sheet_name in S.species_allowed)) + if(!(H.dna.species.name in S.species_allowed)) continue valid_underwear[underwear] = GLOB.underwear_list[underwear] var/new_underwear = tgui_input_list(user, "Choose your underwear:", "Changing", valid_underwear) @@ -32,7 +32,7 @@ var/list/valid_undershirts = list() for(var/undershirt in GLOB.undershirt_list) var/datum/sprite_accessory/S = GLOB.undershirt_list[undershirt] - if(!(H.dna.species.sprite_sheet_name in S.species_allowed)) + if(!(H.dna.species.name in S.species_allowed)) continue valid_undershirts[undershirt] = GLOB.undershirt_list[undershirt] var/new_undershirt = tgui_input_list(user, "Choose your undershirt:", "Changing", valid_undershirts) @@ -43,7 +43,7 @@ var/list/valid_sockstyles = list() for(var/sockstyle in GLOB.socks_list) var/datum/sprite_accessory/S = GLOB.socks_list[sockstyle] - if(!(H.dna.species.sprite_sheet_name in S.species_allowed)) + if(!(H.dna.species.name in S.species_allowed)) continue valid_sockstyles[sockstyle] = GLOB.socks_list[sockstyle] var/new_socks = tgui_input_list(user, "Choose your socks:", "Changing", valid_sockstyles) diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm index 7914faf1762..3836b267eef 100644 --- a/code/modules/awaymissions/mob_spawn.dm +++ b/code/modules/awaymissions/mob_spawn.dm @@ -247,12 +247,12 @@ if(hair_style) D.h_style = hair_style else - D.h_style = random_hair_style(gender, D.dna.species.sprite_sheet_name) + D.h_style = random_hair_style(gender, D.dna.species.name) D.hair_colour = rand_hex_color() if(facial_hair_style) D.f_style = facial_hair_style else - D.f_style = random_facial_hair_style(gender, D.dna.species.sprite_sheet_name) + D.f_style = random_facial_hair_style(gender, D.dna.species.name) D.facial_colour = rand_hex_color() if(skin_tone) H.s_tone = skin_tone diff --git a/code/modules/client/login_processing/20-load_characters.dm b/code/modules/client/login_processing/20-load_characters.dm index 97432d0e97d..641f4c68260 100644 --- a/code/modules/client/login_processing/20-load_characters.dm +++ b/code/modules/client/login_processing/20-load_characters.dm @@ -64,8 +64,7 @@ height, cyborg_brain_type, body_type, - pda_ringtone, - species_subtype + pda_ringtone FROM characters WHERE ckey=:ckey"}, list( "ckey" = C.ckey )) diff --git a/code/modules/client/preference/character.dm b/code/modules/client/preference/character.dm index 1c37334b5dd..9b713ca89f4 100644 --- a/code/modules/client/preference/character.dm +++ b/code/modules/client/preference/character.dm @@ -37,8 +37,6 @@ var/e_colour = "#000000" //Eye color var/alt_head = "None" //Alt head style. var/species = "Human" - /// Used for DNA species to allow select species to imitate / morph into different species. - var/species_subtype = "None" var/language = "None" //Secondary language var/autohiss_mode = AUTOHISS_OFF //Species autohiss level. OFF, BASIC, FULL. /// If a spawned cyborg should have an MMI, a positronic, or a robobrain. MMI by default @@ -204,8 +202,7 @@ runechat_color=:runechat_color, cyborg_brain_type=:cyborg_brain_type, body_type=:body_type, - pda_ringtone=:pda_ringtone, - species_subtype=:species_subtype + pda_ringtone=:pda_ringtone WHERE ckey=:ckey AND slot=:slot"}, list( // OH GOD SO MANY PARAMETERS @@ -269,7 +266,6 @@ "runechat_color" = runechat_color, "cyborg_brain_type" = cyborg_brain_type, "pda_ringtone" = pda_ringtone, - "species_subtype" = species_subtype, "ckey" = C.ckey, "slot" = slot_number )) @@ -310,7 +306,7 @@ player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, physique, height, speciesprefs, socks, body_accessory, gear, autohiss, - hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes, runechat_color, cyborg_brain_type, body_type, pda_ringtone, species_subtype) + hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes, runechat_color, cyborg_brain_type, body_type, pda_ringtone) VALUES (:ckey, :slot, :metadata, :name, :be_random_name, :gender, :age, :species, :language, @@ -337,7 +333,7 @@ :playertitlelist, :disabilities, :organ_list, :rlimb_list, :nanotrasen_relation, :physique, :height, :speciesprefs, :socks, :body_accessory, :gearlist, :autohiss_mode, - :h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes, :runechat_color, :cyborg_brain_type, :body_type, :pda_ringtone, :species_subtype) + :h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes, :runechat_color, :cyborg_brain_type, :body_type, :pda_ringtone) "}, list( // This has too many params for anyone to look at this without going insae "ckey" = C.ckey, @@ -401,8 +397,7 @@ "custom_emotes" = json_encode(custom_emotes), "runechat_color" = runechat_color, "cyborg_brain_type" = cyborg_brain_type, - "pda_ringtone" = pda_ringtone, - "species_subtype" = species_subtype + "pda_ringtone" = pda_ringtone )) if(!query.warn_execute()) @@ -497,7 +492,7 @@ cyborg_brain_type = query.item[59] body_type = query.item[60] pda_ringtone = query.item[61] - species_subtype = query.item[62] + //Sanitize var/datum/species/SP = GLOB.all_species[species] if(!SP) @@ -511,9 +506,6 @@ species = "Human" stack_trace("Character doesn't have a species, character name is [real_name]. Defaulting to human.") - if(isnull(species_subtype)) - species_subtype = "None" - if(isnull(language)) language = "None" @@ -833,74 +825,60 @@ var/icon/icobase var/datum/species/current_species = GLOB.all_species[species] - var/will_slimify = FALSE //Icon-based species colour. var/coloured_tail if(current_species) - var/mob/living/carbon/human/fake/H = new - H.dna.species = current_species - if(species_subtype != "None" && current_species.bodyflags & HAS_SPECIES_SUBTYPE) - var/datum/species/subtype_species = GLOB.all_species[species_subtype] - if(subtype_species) // Take certain attributes from our subtype to apply to our current species. - H.dna.species.updatespeciessubtype(H, subtype_species) - current_species = H.dna.species - icobase = current_species.icobase - else if(current_species.bodyflags & HAS_ICON_SKIN_TONE) //Handling species-specific icon-based skin tones by flagged race. + if(current_species.bodyflags & HAS_ICON_SKIN_TONE) //Handling species-specific icon-based skin tones by flagged race. + var/mob/living/carbon/human/fake/H = new + H.dna.species = current_species H.s_tone = s_tone H.dna.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive. var/obj/item/organ/external/chest/C = H.get_organ("chest") icobase = C.icobase ? C.icobase : C.dna.species.icobase if(H.dna.species.bodyflags & HAS_TAIL) coloured_tail = H.tail ? H.tail : H.dna.species.tail + + qdel(H) else icobase = current_species.icobase - will_slimify = (istype(current_species, /datum/species/slime) && current_species.species_subtype != "None") - qdel(H) else icobase = 'icons/mob/human_races/r_human.dmi' preview_icon = new /icon(icobase, "torso_[g]") preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY) + var/head = "head" + if(alt_head && current_species.bodyflags & HAS_ALT_HEADS) + var/datum/sprite_accessory/alt_heads/H = GLOB.alt_heads_list[alt_head] + if(H.icon_state) + head = H.icon_state + preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY) + for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand")) if(organ_data[name] == "amputated") continue - var/icon/bodypart = new /icon(icobase, "[name]") - if(name == "head") // Head nonsense. - var/head = "head" - if(alt_head && current_species.bodyflags & HAS_ALT_HEADS) - var/datum/sprite_accessory/alt_heads/H = GLOB.alt_heads_list[alt_head] - if(H.icon_state) - head = H.icon_state - bodypart = new /icon(icobase, "[head]_[g]") // head_state _ gender - if(name in list("chest", "groin")) // Groin and Chest nonsense - if(name == "chest") - name = "torso" - bodypart = new /icon(icobase, "[name]_[g]") // groin/torso _ gender - if(organ_data[name] == "cyborg") // Robotic limbs. + if(organ_data[name] == "cyborg") var/datum/robolimb/R - if(rlimb_data[name]) R = GLOB.all_robolimbs[rlimb_data[name]] - if(!R) R = GLOB.basic_robolimb + if(rlimb_data[name]) + R = GLOB.all_robolimbs[rlimb_data[name]] + if(!R) + R = GLOB.basic_robolimb if(name == "chest") name = "torso" - if(length(R.sprite_sheets) && R.sprite_sheets[current_species.sprite_sheet_name]) // Species specific augmented limbs - R.icon = R.sprite_sheets[current_species.sprite_sheet_name] - bodypart.Blend(new /icon(R.icon, "[name]"), ICON_OVERLAY) - preview_icon.Blend(bodypart, ICON_OVERLAY) + preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic. continue - if(will_slimify) // Applies to limbs that are not robotic. - bodypart.slimify(s_colour, "A0") + preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY) + + // Skin color + if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR)) + preview_icon.Blend(s_colour, ICON_ADD) + + // Skin tone + if(current_species && (current_species.bodyflags & HAS_SKIN_TONE)) + if(s_tone >= 0) + preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) else - // Skin color - if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR)) - bodypart.Blend(s_colour, ICON_ADD) - // Skin tone - if(current_species && (current_species.bodyflags & HAS_SKIN_TONE)) - if(s_tone >= 0) - bodypart.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - bodypart.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - preview_icon.Blend(bodypart, ICON_OVERLAY) + preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) // Body accessory if(current_species && (current_species.bodyflags & HAS_BODY_ACCESSORY)) @@ -941,10 +919,6 @@ t_marking_s.Blend(m_colours["tail"], ICON_ADD) temp.Blend(t_marking_s, ICON_OVERLAY) - if(will_slimify) - temp.slimify(s_colour, "A0") - if(underlay) - underlay.slimify(s_colour, "A0") // Body accessory has an underlay, add it too. if(underlay) ICON_SHIFT_XY(underlay, offset_x, offset_y) @@ -961,8 +935,6 @@ if(body_marking_style && body_marking_style.species_allowed) var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") b_marking_s.Blend(m_colours["body"], ICON_ADD) - if(will_slimify) - b_marking_s.slimify(s_colour, "A0") preview_icon.Blend(b_marking_s, ICON_OVERLAY) if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings. var/head_marking = m_styles["head"] @@ -970,8 +942,6 @@ if(head_marking_style && head_marking_style.species_allowed) var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") h_marking_s.Blend(m_colours["head"], ICON_ADD) - if(will_slimify) - h_marking_s.slimify(s_colour, "A0") preview_icon.Blend(h_marking_s, ICON_OVERLAY) var/icon/hands_icon = icon(preview_icon) @@ -1018,8 +988,6 @@ if(head_accessory_style && head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") head_accessory_s.Blend(hacc_colour, ICON_ADD) - if(will_slimify) - head_accessory_s.slimify(s_colour, "A0") face_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hair_styles_list[f_style] @@ -1880,16 +1848,10 @@ /datum/character_save/proc/copy_to(mob/living/carbon/human/character) var/datum/species/S = GLOB.all_species[species] character.set_species(S.type, delay_icon_update = TRUE) // Yell at me if this causes everything to melt - var/datum/species/subtype = GLOB.all_species[species_subtype] - if(!isnull(subtype)) - character.dna.species.updatespeciessubtype(character, new subtype.type(), TRUE, FALSE) - else - character.species_subtype = "None" if(be_random_name) real_name = random_name(gender, species) character.add_language(language) - character.real_name = real_name character.dna.real_name = real_name character.name = character.real_name diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm index c9fa5752ac0..2564fdb6843 100644 --- a/code/modules/client/preference/link_processing.dm +++ b/code/modules/client/preference/link_processing.dm @@ -3,13 +3,6 @@ return var/datum/species/S = GLOB.all_species[active_character.species] - var/datum/species/subtype = GLOB.all_species[active_character.species_subtype] - if(isnull(subtype)) // Set the subtype to be the same as Species in the case we don't have one, saves alot of headaches when we're checking for valid markings etc. - subtype = S - else - S = new S.type() - S.bodyflags |= subtype.bodyflags // Used for finding valid styles. - S.species_subtype = subtype.name // Used for finding valid styles. if(href_list["preference"] == "job") switch(href_list["task"]) if("close") @@ -204,33 +197,73 @@ to_chat(user, "Invalid species, please pick something else.") return if(prev_species != active_character.species) - if(isnull(NS)) - NS = GLOB.all_species[active_character.species] - S = new NS.type() - active_character.species_subtype = "None" - active_character.age = clamp(active_character.age, S.min_age, S.max_age) - subtype = GLOB.all_species[active_character.species_subtype] // Changing species resets subtype. - if(isnull(subtype)) - subtype = GLOB.all_species[active_character.species] - subtype = new subtype.type() - reset_styles(S) - if("species_subtype") - if(S.bodyflags & HAS_SPECIES_SUBTYPE) - var/new_subtype = tgui_input_list(user, "Choose your character's species subtype:", "Character Preference", S.allowed_species_subtypes) - if(isnull(new_subtype) || active_character.species_subtype == new_subtype) - return - active_character.species_subtype = new_subtype - subtype = GLOB.all_species[active_character.species_subtype] - if(isnull(subtype)) - subtype = GLOB.all_species[active_character.species] - subtype = new subtype.type() - S = new S.type() // Always make a new species before editing it, as datums get messy. - if(S.name != subtype.name) - S.bodyflags |= subtype.bodyflags // Add our body flags of the new subtype. - S.species_subtype = subtype.name - reset_styles(subtype, S) + active_character.age = clamp(active_character.age, NS.min_age, NS.max_age) + var/datum/robolimb/robohead + if(NS.bodyflags & ALL_RPARTS) + var/head_model = "[!active_character.rlimb_data["head"] ? "Morpheus Cyberkinetics" : active_character.rlimb_data["head"]]" + robohead = GLOB.all_robolimbs[head_model] + //grab one of the valid hair styles for the newly chosen species + active_character.h_style = random_hair_style(active_character.gender, active_character.species, robohead) + + //grab one of the valid facial hair styles for the newly chosen species + active_character.f_style = random_facial_hair_style(active_character.gender, active_character.species, robohead) + + if(NS.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. + active_character.ha_style = random_head_accessory(active_character.species) else - reset_styles(S) + active_character.ha_style = "None" // No Vulp ears on Unathi + active_character.hacc_colour = rand_hex_color() + + if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. + active_character.m_styles["head"] = random_marking_style("head", active_character.species, robohead, null, active_character.alt_head) + else + active_character.m_styles["head"] = "None" + active_character.m_colours["head"] = "#000000" + + if(NS.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. + active_character.m_styles["body"] = random_marking_style("body", active_character.species) + else + active_character.m_styles["body"] = "None" + active_character.m_colours["body"] = "#000000" + + if(NS.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. + active_character.m_styles["tail"] = random_marking_style("tail", active_character.species, null, active_character.body_accessory) + else + active_character.m_styles["tail"] = "None" + active_character.m_colours["tail"] = "#000000" + + // Don't wear another species' underwear! + var/datum/sprite_accessory/SA = GLOB.underwear_list[active_character.underwear] + if(!SA || !(active_character.species in SA.species_allowed)) + active_character.underwear = random_underwear(active_character.body_type, active_character.species) + + SA = GLOB.undershirt_list[active_character.undershirt] + if(!SA || !(active_character.species in SA.species_allowed)) + active_character.undershirt = random_undershirt(active_character.body_type, active_character.species) + + SA = GLOB.socks_list[active_character.socks] + if(!SA || !(active_character.species in SA.species_allowed)) + active_character.socks = random_socks(active_character.body_type, active_character.species) + + //reset skin tone and colour + if(NS.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) + random_skin_tone(active_character.species) + else + active_character.s_tone = 0 + + if(!(NS.bodyflags & HAS_SKIN_COLOR)) + active_character.s_colour = "#000000" + + active_character.alt_head = "None" //No alt heads on species that don't have them. + active_character.speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks. + active_character.body_accessory = random_body_accessory(NS.name, NS.optional_body_accessory) + + //Reset prosthetics. + active_character.organ_data = list() + active_character.rlimb_data = list() + + if(!(NS.autohiss_basic_map)) + active_character.autohiss_mode = AUTOHISS_OFF if("speciesprefs") active_character.speciesprefs = !active_character.speciesprefs //Starts 0, so if someone clicks the button up top there, this won't be 0 anymore. If they click it again, it'll go back to 0. if("language") @@ -302,7 +335,7 @@ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */ valid_hairstyles += hairstyle else //If the user is not a species who can have robotic heads, use the default handling. - if((active_character.species in SA.species_allowed) || (subtype.name in SA.species_allowed)) //If the user's head is of a species the hairstyle allows, add it to the list. + if(active_character.species in SA.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. valid_hairstyles += hairstyle sortTim(valid_hairstyles, GLOBAL_PROC_REF(cmp_text_asc)) //this alphabetizes the list @@ -354,7 +387,7 @@ var/list/valid_head_accessory_styles = list() for(var/head_accessory_style in GLOB.head_accessory_styles_list) var/datum/sprite_accessory/H = GLOB.head_accessory_styles_list[head_accessory_style] - if(!(active_character.species in H.species_allowed) && !(subtype.name in H.species_allowed)) + if(!(active_character.species in H.species_allowed)) continue valid_head_accessory_styles += head_accessory_style @@ -371,7 +404,7 @@ var/list/valid_alt_heads = list() for(var/alternate_head in GLOB.alt_heads_list) var/datum/sprite_accessory/alt_heads/head = GLOB.alt_heads_list[alternate_head] - if(!(active_character.species in head.species_allowed) && !(subtype.name in head.species_allowed)) + if(!(active_character.species in head.species_allowed)) continue valid_alt_heads += alternate_head @@ -390,7 +423,7 @@ var/list/valid_markings = list() for(var/markingstyle in GLOB.marking_styles_list) var/datum/sprite_accessory/body_markings/head/M = GLOB.marking_styles_list[markingstyle] - if(!(active_character.species in M.species_allowed) && !(subtype.name in M.species_allowed)) + if(!(active_character.species in M.species_allowed)) continue if(M.marking_location != "head") continue @@ -435,7 +468,7 @@ var/list/valid_markings = list() for(var/markingstyle in GLOB.marking_styles_list) var/datum/sprite_accessory/M = GLOB.marking_styles_list[markingstyle] - if(!(active_character.species in M.species_allowed) && !(subtype.name in M.species_allowed)) + if(!(active_character.species in M.species_allowed)) continue if(M.marking_location != "body") continue @@ -460,7 +493,7 @@ var/datum/sprite_accessory/body_markings/tail/M = GLOB.marking_styles_list[markingstyle] if(M.marking_location != "tail") continue - if(!(active_character.species in M.species_allowed) && !(subtype.name in M.species_allowed)) + if(!(active_character.species in M.species_allowed)) continue if(!active_character.body_accessory) if(M.tails_allowed) @@ -491,7 +524,7 @@ var/datum/body_accessory/accessory = GLOB.body_accessory_by_name[B] if(isnull(accessory)) // None continue - if((active_character.species in accessory.allowed_species) || (subtype.name in accessory.allowed_species)) + if(active_character.species in accessory.allowed_species) possible_body_accessories += B if(S.optional_body_accessory) possible_body_accessories += "None" //the only null entry should be the "None" option @@ -557,7 +590,7 @@ continue if(active_character.body_type == FEMALE && SA.body_type == MALE) continue - if(!(active_character.species in SA.species_allowed) && !(subtype.name in SA.species_allowed)) + if(!(active_character.species in SA.species_allowed)) continue valid_underwear[underwear] = GLOB.underwear_list[underwear] sortTim(valid_underwear, GLOBAL_PROC_REF(cmp_text_asc)) @@ -569,7 +602,7 @@ var/list/valid_undershirts = list() for(var/undershirt in GLOB.undershirt_list) var/datum/sprite_accessory/SA = GLOB.undershirt_list[undershirt] - if(!(active_character.species in SA.species_allowed) && !(subtype.name in SA.species_allowed)) + if(!(active_character.species in SA.species_allowed)) continue if(active_character.body_type == MALE && SA.body_type == FEMALE) continue @@ -586,7 +619,7 @@ var/list/valid_sockstyles = list() for(var/sockstyle in GLOB.socks_list) var/datum/sprite_accessory/SA = GLOB.socks_list[sockstyle] - if(!(active_character.species in SA.species_allowed) && !(subtype.name in SA.species_allowed)) + if(!(active_character.species in SA.species_allowed)) continue if(active_character.body_type == MALE && SA.body_type == FEMALE) continue @@ -1280,74 +1313,3 @@ ShowChoices(user) return TRUE - -/// Reset the styles what is available to the NS (new species) parameter. Parent Species is for subtype changing. -/datum/preferences/proc/reset_styles(datum/species/NS, datum/species/parent_species) - var/datum/robolimb/robohead - if(!isnull(parent_species)) - NS.bodyflags |= parent_species.bodyflags - if(NS.bodyflags & ALL_RPARTS) - var/head_model = "[!active_character.rlimb_data["head"] ? "Morpheus Cyberkinetics" : active_character.rlimb_data["head"]]" - robohead = GLOB.all_robolimbs[head_model] - //grab one of the valid hair styles for the newly chosen species - active_character.h_style = random_hair_style(active_character.gender, NS.name, robohead) - - //grab one of the valid facial hair styles for the newly chosen species - active_character.f_style = random_facial_hair_style(active_character.gender, NS.name, robohead) - - if(NS.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories. - active_character.ha_style = random_head_accessory(NS.name) - else - active_character.ha_style = "None" // No Vulp ears on Unathi - active_character.hacc_colour = rand_hex_color() - - if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings. - active_character.m_styles["head"] = random_marking_style("head", NS.name, robohead, null, active_character.alt_head) - else - active_character.m_styles["head"] = "None" - active_character.m_colours["head"] = "#000000" - - if(NS.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos. - active_character.m_styles["body"] = random_marking_style("body", NS.name) - else - active_character.m_styles["body"] = "None" - active_character.m_colours["body"] = "#000000" - - if(NS.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. - active_character.m_styles["tail"] = random_marking_style("tail", NS.name, null, active_character.body_accessory) - else - active_character.m_styles["tail"] = "None" - active_character.m_colours["tail"] = "#000000" - - // Don't wear another species' underwear! - var/datum/sprite_accessory/SA = GLOB.underwear_list[active_character.underwear] - if(!SA || !(NS.name in SA.species_allowed)) - active_character.underwear = random_underwear(active_character.body_type, NS.name) - - SA = GLOB.undershirt_list[active_character.undershirt] - if(!SA || !(NS.name in SA.species_allowed)) - active_character.undershirt = random_undershirt(active_character.body_type, NS.name) - - SA = GLOB.socks_list[active_character.socks] - if(!SA || !(NS.name in SA.species_allowed)) - active_character.socks = random_socks(active_character.body_type, NS.name) - - //reset skin tone and colour - if(NS.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) - random_skin_tone(NS.name) - else - active_character.s_tone = 0 - - if(!(NS.bodyflags & HAS_SKIN_COLOR)) - active_character.s_colour = "#000000" - - active_character.alt_head = "None" //No alt heads on species that don't have them. - active_character.speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks. - active_character.body_accessory = random_body_accessory(NS.name, NS.optional_body_accessory) - - //Reset prosthetics. - active_character.organ_data = list() - active_character.rlimb_data = list() - - if(!(NS.autohiss_basic_map)) - active_character.autohiss_mode = AUTOHISS_OFF diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 815339890bd..3299b3d1cef 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -182,11 +182,6 @@ GLOBAL_LIST_INIT(special_role_times, list( switch(current_tab) if(TAB_CHAR) // Character Settings var/datum/species/S = GLOB.all_species[active_character.species] - var/datum/species/subtype = GLOB.all_species[active_character.species_subtype] - if(istype(S) && istype(subtype)) - subtype = new subtype.type() - S = new S.type() - S.bodyflags |= subtype.bodyflags if(!istype(S)) //The species was invalid. Set the species to the default, fetch the datum for that species and generate a random character. active_character.species = initial(active_character.species) S = GLOB.all_species[active_character.species] @@ -212,8 +207,6 @@ GLOBAL_LIST_INIT(special_role_times, list( dat += "Age: [active_character.age]
" dat += "Body: (Randomize)
" dat += "Species: [active_character.species]
" - if(S.bodyflags & HAS_SPECIES_SUBTYPE) - dat += "Species Sub-Type: [active_character.species_subtype]
" dat += "Gender: [active_character.gender == MALE ? "Male" : (active_character.gender == FEMALE ? "Female" : "Genderless")]
" dat += "Body Type: [active_character.body_type == MALE ? "Masculine" : "Feminine"]" dat += "
" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 6352a682b90..b698eee9954 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -104,10 +104,10 @@ if(H.dna.species) if(exclusive) - if(!(H.dna.species.sprite_sheet_name in species_restricted)) + if(!(H.dna.species.name in species_restricted)) wearable = TRUE else - if(H.dna.species.sprite_sheet_name in species_restricted) + if(H.dna.species.name in species_restricted) wearable = TRUE if(!wearable) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 70af5f6053d..60c558837e2 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -64,7 +64,7 @@ return var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = GLOB.marking_styles_list[tattoo_icon] - if(!(target.dna.species.sprite_sheet_name in temp_tatt.species_allowed)) + if(!(target.dna.species.name in temp_tatt.species_allowed)) to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.") return diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 0dc9de25b33..afff179cc2f 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -389,14 +389,14 @@ continue if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = GLOB.all_robolimbs[H.model] - if((H.dna.species.sprite_sheet_name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. valid_hairstyles += hairstyle //Give them their hairstyles if they do. else if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */ valid_hairstyles += hairstyle else //If the user is not a species who can have robotic heads, use the default handling. - if(H.dna.species.sprite_sheet_name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. + if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. valid_hairstyles += hairstyle return sortTim(valid_hairstyles, GLOBAL_PROC_REF(cmp_text_asc)) @@ -415,15 +415,15 @@ continue if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = GLOB.all_robolimbs[H.model] - if(H.dna.species.sprite_sheet_name in S.species_allowed) //If this is a facial hair style native to the user's species... - if((H.dna.species.sprite_sheet_name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. - valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do. + if(H.dna.species.name in S.species_allowed) //If this is a facial hair style native to the user's species... + if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. + valid_facial_hairstyles += facialhairstyle else if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it. But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */ valid_facial_hairstyles += facialhairstyle else //If the user is not a species who can have robotic heads, use the default handling. - if(H.dna.species.sprite_sheet_name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. + if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. valid_facial_hairstyles += facialhairstyle return sortTim(valid_facial_hairstyles, GLOBAL_PROC_REF(cmp_text_asc)) @@ -437,7 +437,7 @@ for(var/head_accessory in GLOB.head_accessory_styles_list) var/datum/sprite_accessory/S = GLOB.head_accessory_styles_list[head_accessory] - if(!(H.dna.species.sprite_sheet_name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list. + if(!(H.dna.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list. continue valid_head_accessories += head_accessory @@ -456,7 +456,7 @@ continue if(S.marking_location != location) //If the marking isn't for the location we desire, skip. continue - if(!(dna.species.sprite_sheet_name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list. + if(!(dna.species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list. continue if(location == "tail") if(!body_accessory) @@ -490,7 +490,7 @@ else if(check_rights(R_ADMIN, FALSE, src)) valid_body_accessories = GLOB.body_accessory_by_name.Copy() break - else if(dna.species.sprite_sheet_name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. + else if(dna.species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. valid_body_accessories += B if(dna.species.optional_body_accessory) valid_body_accessories += "None" @@ -505,7 +505,7 @@ valid_alt_heads["None"] = GLOB.alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option. for(var/alternate_head in GLOB.alt_heads_list) var/datum/sprite_accessory/alt_heads/head = GLOB.alt_heads_list[alternate_head] - if(!(H.dna.species.sprite_sheet_name in head.species_allowed)) + if(!(H.dna.species.name in head.species_allowed)) continue valid_alt_heads += alternate_head diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index ca3adfbdcca..364626c0dff 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(body_accessory_by_species) var/has_behind = FALSE /datum/body_accessory/proc/try_restrictions(mob/living/carbon/human/H) - return (H.dna.species.sprite_sheet_name in allowed_species) + return (H.dna.species.name in allowed_species) /datum/body_accessory/proc/get_animated_icon() //return animated if it has it, return static if it does not. if(animated_icon) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2a12927a205..40e9f883cf3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -21,8 +21,6 @@ var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None. var/s_tone = 0 //Skin tone - /// Species Sub-Type - overrites the species_sheet_name when it's not "None", acts the same as a skin tone. - var/species_subtype = "None" //Skin colour var/skin_colour = "#000000" 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 f4f7e5d8b84..97ea7a361ef 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -172,15 +172,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/hulk = HAS_TRAIT(src, TRAIT_HULK) var/skeleton = HAS_TRAIT(src, TRAIT_SKELETONIZED) - if(dna.species) - if(dna.species.bodyflags & HAS_ICON_SKIN_TONE) - dna.species.updatespeciescolor(src) - if(dna.species.bodyflags & HAS_SPECIES_SUBTYPE) - var/datum/species/species_subtype = GLOB.all_species[dna.species.species_subtype] - if(isnull(species_subtype)) - species_subtype = GLOB.all_species[dna.species.name] - if(dna.species.species_subtype != "None" && dna.species.species_subtype != species_subtype.name) - dna.species.updatespeciessubtype(src, new species_subtype.type(), TRUE, FALSE) + if(dna.species && dna.species.bodyflags & HAS_ICON_SKIN_TONE) + dna.species.updatespeciescolor(src) + //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. //Create a new, blank icon for our mob to use. @@ -201,7 +195,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //BEGIN CACHED ICON GENERATION. var/obj/item/organ/external/chest = get_organ("chest") base_icon = chest.get_icon(skeleton) - var/slimify = istype(src.dna.species, /datum/species/slime) && species_subtype != "None" + for(var/obj/item/organ/external/part in bodyparts) var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST @@ -214,16 +208,13 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) if(!(part.icon_position & RIGHT)) temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) - slimify_limb(part, temp2, slimify) base_icon.Blend(temp2, ICON_OVERLAY) if(part.icon_position & LEFT) temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) if(part.icon_position & RIGHT) temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) - slimify_limb(part, temp2, slimify) base_icon.Blend(temp2, ICON_UNDERLAY) else - slimify_limb(part, temp, slimify) base_icon.Blend(temp, ICON_OVERLAY) @@ -310,20 +301,16 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/icon/b_marking_s = icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s") if(body_marking_style.do_colouration) b_marking_s.Blend(m_colours["body"], ICON_ADD) - if(istype(src.dna.species, /datum/species/slime)) - b_marking_s.slimify(skin_colour, "A0") markings_standing.Blend(b_marking_s, ICON_OVERLAY) //Head markings. var/obj/item/organ/external/head/head_organ = get_organ("head") if(istype(head_organ) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example. var/head_marking = m_styles["head"] var/datum/sprite_accessory/head_marking_style = GLOB.marking_styles_list[head_marking] - if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.species.sprite_sheet_name in head_marking_style.species_allowed)) + if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.species.name in head_marking_style.species_allowed)) var/icon/h_marking_s = icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") if(head_marking_style.do_colouration) h_marking_s.Blend(m_colours["head"], ICON_ADD) - if(istype(src.dna.species, /datum/species/slime)) - h_marking_s.slimify(skin_colour, "A0") markings_standing.Blend(h_marking_s, ICON_OVERLAY) overlays_standing[MARKINGS_LAYER] = mutable_appearance(markings_standing, layer = -MARKINGS_LAYER) @@ -348,12 +335,10 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(head_organ.ha_style && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)) var/datum/sprite_accessory/head_accessory/head_accessory_style = GLOB.head_accessory_styles_list[head_organ.ha_style] if(head_accessory_style && head_accessory_style.species_allowed) - if(head_organ.dna.species.sprite_sheet_name in head_accessory_style.species_allowed) + if(head_organ.dna.species.name in head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") if(head_accessory_style.do_colouration) head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies head acc - head_accessory_s.slimify(skin_colour, "A0") if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) head_accessory_s.ColorTone(COLORTONE_DEAD_EXT_ORGAN) head_accessory_s.SetIntensity(0.7) @@ -385,7 +370,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) MA.layer = -HAIR_LAYER if(O.h_style && !(head?.flags & BLOCKHEADHAIR && !ismachineperson(src))) var/datum/sprite_accessory/hair/hair = GLOB.hair_styles_full_list[O.h_style] - if(hair?.species_allowed && ((O.dna.species.sprite_sheet_name in hair.species_allowed) || (O.dna.species.bodyflags & ALL_RPARTS))) + if(hair?.species_allowed && ((O.dna.species.name in hair.species_allowed) || (O.dna.species.bodyflags & ALL_RPARTS))) // Base hair var/icon/hair_icon = new /icon(hair.icon, "[hair.icon_state]_s") if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) @@ -434,7 +419,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) return var/species_name = "" - if(dna.species.sprite_sheet_name in list("Drask", "Grey", "Vox", "Kidan")) + if(dna.species.name in list("Drask", "Grey", "Vox", "Kidan")) species_name = "_[lowertext(dna.species.sprite_sheet_name)]" var/icon/hands_mask = icon('icons/mob/body_accessory.dmi', "accessory_none_s") //Needs a blank icon, not actually related to markings at all @@ -480,7 +465,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if((head_organ.dna.species.sprite_sheet_name in facial_hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(istype(head_organ.dna.species, /datum/species/slime)) // I am el worstos - facial_s.slimify(skin_colour, "A0") + facial_s.Blend("[skin_colour]A0", ICON_AND) else if(facial_hair_style.do_colouration) facial_s.Blend(head_organ.facial_colour, ICON_ADD) @@ -1304,8 +1289,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) wings_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN) wings_icon.SetIntensity(0.7) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the wings - wings_icon.slimify(skin_colour, "A0") var/mutable_appearance/wings = mutable_appearance(wings_icon, layer = -WING_LAYER) wings.pixel_x = body_accessory.pixel_x_offset wings.pixel_y = body_accessory.pixel_y_offset @@ -1316,8 +1299,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) under_wing_icon.ColorTone(COLORTONE_DEAD_EXT_ORGAN) under_wing_icon.SetIntensity(0.7) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the wings - under_wing_icon.slimify(skin_colour, "A0") var/mutable_appearance/under_wing = mutable_appearance(under_wing_icon, layer = -WING_UNDERLIMBS_LAYER) under_wing.pixel_x = body_accessory.pixel_x_offset under_wing.pixel_y = body_accessory.pixel_y_offset @@ -1353,9 +1334,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the body acc - accessory_s.slimify(skin_colour, "A0") - if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") @@ -1395,9 +1373,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(tail_marking_icon && !tail_marking_style.tails_allowed) tail_s.Blend(tail_marking_icon, ICON_OVERLAY) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the tail - tail_s.slimify(skin_colour, "A0") - if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank") @@ -1437,8 +1412,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state()) if(dna.species.bodyflags & HAS_SKIN_COLOR) accessory_s.Blend(skin_colour, body_accessory.blend_mode) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the wings - accessory_s.slimify(skin_colour, "A0") if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed)) accessory_s.Blend(tail_marking_icon, ICON_OVERLAY) @@ -1446,8 +1419,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay") - if(body_accessory.allowed_species && (dna.species.sprite_sheet_name in body_accessory.allowed_species)) - under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.sprite_sheet_name]_tail_delay") + if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species)) + under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") + under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH) under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) @@ -1459,9 +1433,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay") - if(body_accessory.allowed_species && (dna.species.sprite_sheet_name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank - over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.sprite_sheet_name]_tail_delay") - over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) + if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank + over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") var/mutable_appearance/tail = mutable_appearance(over, layer = -TAIL_LAYER) tail.pixel_x = body_accessory.pixel_x_offset @@ -1477,13 +1450,11 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s") if(dna.species.bodyflags & HAS_SKIN_COLOR) tailw_s.Blend(skin_colour, ICON_ADD) - if(istype(src.dna.species, /datum/species/slime)) // Slimifies the tail - tailw_s.slimify(skin_colour, "A0") if(tail_marking_icon && !tail_marking_style.tails_allowed) tailw_s.Blend(tail_marking_icon, ICON_OVERLAY) if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this) // Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway. - var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.sprite_sheet_name]_tail_delay") + var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH) under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST) under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST) @@ -1491,7 +1462,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) overlays_standing[TAIL_UNDERLIMBS_LAYER] = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such. - var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.sprite_sheet_name]_tail_delay") + var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH) overlays_standing[TAIL_LAYER] = mutable_appearance(over, layer = -TAIL_LAYER) @@ -1649,9 +1620,3 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) . += "[part.s_tone]" . = "[.][!!husk][!!hulk][!!skeleton]" - -/// Slimifies a limb by painting a color onto the icon, then changing the alpha -/mob/living/carbon/human/proc/slimify_limb(obj/item/organ/external/L, icon/I, slimify) - if(slimify) // Used for a when slime morphs into another species. Makes them slightly transparent. - if(!L.is_robotic()) - I.slimify(skin_colour) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 6e109b801aa..845c76e83fe 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -3,11 +3,6 @@ var/name /// Pluralized name (since "[name]s" is not always valid) var/name_plural - /// Sub-type of the species. Used for when slimes imitate a species or when an IPC has augments that look like another species. This will affect sprite_sheet_name - var/species_subtype = "None" - /// List of available sub-types for the species to imitate / morph into (Machine / Slime) - var/allowed_species_subtypes = list() - /// The corresponding key for spritesheets var/sprite_sheet_name /// Article to use when referring to an individual of the species, if pronunciation is different from expected. /// Because it's unathi's turn to be special snowflakes. @@ -205,9 +200,7 @@ /datum/species/New() unarmed = new unarmed_type() - if(!isnull(species_subtype) && species_subtype != "None") - sprite_sheet_name = species_subtype - else if(!sprite_sheet_name) + if(!sprite_sheet_name) sprite_sheet_name = name /datum/species/proc/get_random_name(gender) @@ -408,18 +401,6 @@ /datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors. return -/** Handles changing icobase for species that can imitate/morph into other species - * Arguments: - * - H: The human of which was are updating. - * - new_subtype: Our imitate species, by datum reference. - * - owner_sensitive: Always leave at TRUE, this is for updating our icon. (change_icobase) - * - reset_styles: If true, resets styles, hair, and other appearance styles. - * - forced: If true, will set the subspecies type even if it is the same as the current species. - */ -/// -/datum/species/proc/updatespeciessubtype(mob/living/carbon/human/H, datum/species/new_subtype, owner_sensitive = TRUE, reset_styles = TRUE, forced = FALSE) - return - // Do species-specific reagent handling here // Return 1 if it should do normal processing too // Return the parent value if processing does not explicitly stop diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index dd3042f1982..89b4b307df0 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -24,7 +24,7 @@ inherent_traits = list(TRAIT_VIRUSIMMUNE, TRAIT_NOBREATH, TRAIT_NOGERMS, TRAIT_NODECAY, TRAIT_NOPAIN, TRAIT_GENELESS) //Computers that don't decay? What a lie! inherent_biotypes = MOB_ROBOTIC | MOB_HUMANOID clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS | SHAVED | HAS_SPECIES_SUBTYPE + bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS | SHAVED dietflags = 0 //IPCs can't eat, so no diet taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE blood_color = COLOR_BLOOD_MACHINE @@ -75,65 +75,7 @@ "is blocking their ventilation port!") plushie_type = /obj/item/toy/plushie/ipcplushie - allowed_species_subtypes = list( - 1 = "None", - 2 = "Vox", - 3 = "Unathi", - 4 = "Tajaran", - 5 = "Nian", - 6 = "Vulpkanin", - 7 = "Kidan", - 8 = "Grey", - 9 = "Drask" - ) - var/static_bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS | SHAVED | HAS_SPECIES_SUBTYPE - -/datum/species/machine/updatespeciessubtype(mob/living/carbon/human/H, datum/species/new_subtype, owner_sensitive = TRUE, reset_styles = TRUE, forced = FALSE) //Handling species-subtype and imitation - if(H.dna.species.bodyflags & HAS_SPECIES_SUBTYPE) - var/datum/species/temp_species = new type() - if(isnull(new_subtype) || (temp_species.name == new_subtype.name && !forced)) // Back to our original species. - H.species_subtype = "None" - temp_species.species_subtype = "None" // Update our species subtype to match the Mob's subtype. - var/datum/species/S = GLOB.all_species[temp_species.name] - new_subtype = new S.type() // Resets back to original. We use initial in the case the datum is var edited. - else - H.species_subtype = new_subtype.name - temp_species.species_subtype = H.species_subtype // Update our species subtype to match the Mob's subtype. - - // Copy over new species variables to our temp holder. - temp_species.icobase = new_subtype.icobase - temp_species.tail = new_subtype.tail - temp_species.wing = new_subtype.wing - temp_species.default_headacc = new_subtype.default_headacc - temp_species.default_bodyacc = new_subtype.default_bodyacc - temp_species.bodyflags = new_subtype.bodyflags - temp_species.bodyflags |= static_bodyflags // Add our static bodyflags that slime must always have. - temp_species.sprite_sheet_name = new_subtype.sprite_sheet_name - temp_species.icon_template = new_subtype.icon_template - // Set our DNA to the temp holder. - H.dna.species = temp_species - - for(var/obj/item/organ/external/limb in H.bodyparts) - limb.icobase = temp_species.icobase // update their icobase for when we apply the slimfy effect - limb.dna.species = temp_species // Update limb to match our newly modified species - limb.set_company(limb.model, temp_species.sprite_sheet_name) // Robotic limbs always update to our new subtype. - - // Update misc parts that are stored as reference in species and used on the mob. Also resets stylings to none to prevent anything wacky... - - if(reset_styles) - H.body_accessory = GLOB.body_accessory_by_name[temp_species.default_bodyacc] - H.tail = temp_species.tail - H.wing = temp_species.wing - var/obj/item/organ/external/head/head = H.get_organ("head") - head.h_style = "Bald" - head.f_style = "Shaved" - head.ha_style = "None" - H.s_tone = 0 - H.m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None". - H.m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings. - H.change_head_accessory(GLOB.head_accessory_styles_list[temp_species.default_headacc]) - H.change_icobase(temp_species.icobase, owner_sensitive) //Update the icobase of all our organs, but make sure we don't mess with frankenstein limbs in doing so. /datum/species/machine/on_species_gain(mob/living/carbon/human/H) ..() var/datum/action/innate/change_monitor/monitor = new() @@ -222,7 +164,7 @@ var/list/hair = list() for(var/i in GLOB.hair_styles_public_list) var/datum/sprite_accessory/hair/tmp_hair = GLOB.hair_styles_public_list[i] - if((head_organ.dna.species.sprite_sheet_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. + if((head_organ.dna.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 diff --git a/code/modules/mob/living/carbon/human/species/slimepeople.dm b/code/modules/mob/living/carbon/human/species/slimepeople.dm index 72bdc7b415a..32c1a498b91 100644 --- a/code/modules/mob/living/carbon/human/species/slimepeople.dm +++ b/code/modules/mob/living/carbon/human/species/slimepeople.dm @@ -6,7 +6,6 @@ #define SLIMEPERSON_MINHUNGER 250 #define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds -#define SLIMEPERSON_MORPH_FORM 10 SECONDS /datum/species/slime name = "Slime People" @@ -38,7 +37,7 @@ species_traits = list(LIPS, NO_CLONESCAN, EXOTIC_COLOR) inherent_traits = list(TRAIT_WATERBREATH, TRAIT_NO_BONES) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | NO_EYES | HAS_SPECIES_SUBTYPE + bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN reagent_tag = PROCESS_ORG @@ -59,20 +58,8 @@ "is ripping out their own core!", "is turning a dull, brown color and melting into a puddle!") - allowed_species_subtypes = list( - 1 = "None", - 2 = "Vox", - 3 = "Unathi", - 4 = "Tajaran", - 5 = "Nian", - 6 = "Vulpkanin", - 7 = "Kidan", - 8 = "Grey", - 9 = "Drask" - ) - var/reagent_skin_coloring = FALSE - var/static_bodyflags = HAS_SKIN_COLOR | NO_EYES | HAS_SPECIES_SUBTYPE + var/static_bodyflags = HAS_SKIN_COLOR | NO_EYES plushie_type = /obj/item/toy/plushie/slimeplushie @@ -82,8 +69,6 @@ grow.Grant(H) var/datum/action/innate/slimecolor/recolor = new() recolor.Grant(H) - var/datum/action/innate/morphform/reform = new() - reform.Grant(H) RegisterSignal(H, COMSIG_HUMAN_UPDATE_DNA, PROC_REF(blend)) blend(H) @@ -95,58 +80,8 @@ i.Remove(H) if(istype(i, /datum/action/innate/regrow)) i.Remove(H) - if(istype(i, /datum/action/innate/morphform)) - i.Remove(H) UnregisterSignal(H, COMSIG_HUMAN_UPDATE_DNA) -/datum/species/slime/updatespeciessubtype(mob/living/carbon/human/H, datum/species/new_subtype, owner_sensitive = TRUE, reset_styles = TRUE, forced = FALSE) //Handling species-subtype and imitation - if(H.dna.species.bodyflags & HAS_SPECIES_SUBTYPE) - var/datum/species/temp_species = new type() - if(isnull(new_subtype) || (temp_species.name == new_subtype.name && !forced)) // Back to our original species. - H.species_subtype = "None" - temp_species.species_subtype = "None" // Update our species subtype to match the Mob's subtype. - var/datum/species/S = GLOB.all_species[temp_species.name] - new_subtype = new S.type() // Resets back to original. We use initial in the case the datum is var edited. - else - H.species_subtype = new_subtype.name - temp_species.species_subtype = H.species_subtype // Update our species subtype to match the Mob's subtype. - - // Copy over new species variables to our current species. - temp_species.icobase = new_subtype.icobase - temp_species.tail = new_subtype.tail - temp_species.wing = new_subtype.wing - temp_species.eyes = new_subtype.eyes - temp_species.scream_verb = new_subtype.scream_verb - temp_species.male_scream_sound = new_subtype.male_scream_sound - temp_species.female_scream_sound = new_subtype.female_scream_sound - temp_species.default_headacc = new_subtype.default_headacc - temp_species.default_bodyacc = new_subtype.default_bodyacc - temp_species.bodyflags = new_subtype.bodyflags - temp_species.bodyflags |= static_bodyflags // Add our static bodyflags that slime must always have. - temp_species.sprite_sheet_name = new_subtype.sprite_sheet_name - temp_species.icon_template = new_subtype.icon_template - H.dna.species = temp_species - - for(var/obj/item/organ/external/limb in H.bodyparts) - limb.icobase = temp_species.icobase // update their icobase for when we apply the slimfy effect - limb.dna.species = temp_species // Update limb to match our newly modified species - limb.set_company(limb.model, temp_species.sprite_sheet_name) // Robotic limbs always update to our new subtype. - - // Update misc parts that are stored as reference in species and used on the mob. Also resets stylings to none to prevent anything wacky... - - if(reset_styles) - H.body_accessory = GLOB.body_accessory_by_name[temp_species.default_bodyacc] - H.tail = temp_species.tail - H.wing = temp_species.wing - var/obj/item/organ/external/head/head = H.get_organ("head") - head.h_style = "Bald" - head.f_style = "Shaved" - head.ha_style = "None" - H.s_tone = 0 - H.m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None". - H.m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings. - H.change_head_accessory(GLOB.head_accessory_styles_list[temp_species.default_headacc]) - H.change_icobase(temp_species.icobase, owner_sensitive) //Update the icobase of all our organs, but make sure we don't mess with frankenstein limbs in doing so. /datum/species/slime/proc/blend(mob/living/carbon/human/H) var/new_color = BlendRGB(H.skin_colour, "#acacac", 0.5) // Blends this to make it work better @@ -267,35 +202,6 @@ else to_chat(H, "You need to hold still in order to regrow a limb!") -/datum/action/innate/morphform - name = "Morph Form" - check_flags = AB_CHECK_CONSCIOUS - button_overlay_icon = 'icons/effects/effects.dmi' - button_overlay_icon_state = "acid" - -/datum/action/innate/morphform/Activate() - - var/mob/living/carbon/human/H = owner - if(H.nutrition < SLIMEPERSON_MINHUNGER) - to_chat(H, "You're too hungry to morph your form!") - return - var/new_subtype = tgui_input_list(H, "Choose a species to imitate", "Select Subtype", H.dna.species.allowed_species_subtypes) - if(H.species_subtype == new_subtype) - return to_chat(H, "You stand there as your body shifts and then returns to its original form.") - H.visible_message("[H] begins to hold still and concentrate on [H.p_their()] form as it begins to shift and contort...", "You begin to focus on changing your form... (This will take [round(SLIMEPERSON_MORPH_FORM/10)] seconds, and you must hold still.)") - if(do_after(H, SLIMEPERSON_MORPH_FORM, FALSE, H, extra_checks = list(CALLBACK(H, TYPE_PROC_REF(/mob/living, IsStunned))), use_default_checks = FALSE)) // Override the check for weakness, only check for stunned - if(H.nutrition < SLIMEPERSON_MINHUNGER) - to_chat(H, "You're too hungry to morph your form!") - return - var/datum/species/species_subtype = GLOB.all_species[new_subtype] - if(isnull(species_subtype)) - species_subtype = GLOB.all_species[H.dna.species.name] - H.dna.species.updatespeciessubtype(H, new species_subtype.type()) - H.regenerate_icons() - H.adjust_nutrition(-SLIMEPERSON_HUNGERCOST) - else - to_chat(H, "You need to hold still in order to shift your form!") - #undef SLIMEPERSON_COLOR_SHIFT_TRIGGER #undef SLIMEPERSON_ICON_UPDATE_PERIOD #undef SLIMEPERSON_BLOOD_SCALING_FACTOR @@ -303,5 +209,3 @@ #undef SLIMEPERSON_HUNGERCOST #undef SLIMEPERSON_MINHUNGER #undef SLIMEPERSON_REGROWTHDELAY - -#undef SLIMEPERSON_MORPH_FORM diff --git a/code/modules/reagents/chemistry/reagents/misc_reagents.dm b/code/modules/reagents/chemistry/reagents/misc_reagents.dm index 4e328e31356..0f39d90d25d 100644 --- a/code/modules/reagents/chemistry/reagents/misc_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/misc_reagents.dm @@ -362,8 +362,8 @@ var/obj/item/organ/external/head/head_organ = H.get_organ("head") if(!istype(head_organ)) return ..() - head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) - head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name) + head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name) H.update_hair() H.update_fhair() ..() @@ -386,14 +386,14 @@ var/datum/sprite_accessory/tmp_hair_style = GLOB.hair_styles_full_list["Very Long Hair"] var/datum/sprite_accessory/tmp_facial_hair_style = GLOB.facial_hair_styles_list["Very Long Beard"] - if(head_organ.dna.species.sprite_sheet_name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. + if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them. head_organ.h_style = "Very Long Hair" else //Otherwise, give them a random hair style. - head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) - if(head_organ.dna.species.sprite_sheet_name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them. + head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name) + if(head_organ.dna.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them. head_organ.f_style = "Very Long Beard" else //Otherwise, give them a random facial hair style. - head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name) H.update_hair() H.update_fhair() if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache)) diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index a85e7028aea..af4e6265621 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -196,8 +196,8 @@ GLOBAL_LIST_EMPTY(ert_request_messages) M.change_eye_color(eye_c) M.s_tone = skin_tone head_organ.headacc_colour = pick("#1f138b", "#272525", "#07a035", "#8c00ff", "#a80c0c") - head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.sprite_sheet_name) - head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.sprite_sheet_name) + head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name) + head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name) M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(GLOB.last_names)]") M.age = rand(23,35) diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index da64ad73ddf..ac9808d5bcb 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -108,7 +108,7 @@ var/head_marking = owner.m_styles["head"] if(head_marking) var/datum/sprite_accessory/head_marking_style = GLOB.marking_styles_list[head_marking] - if(head_marking_style && head_marking_style.species_allowed && (dna.species.sprite_sheet_name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head") + if(head_marking_style && head_marking_style.species_allowed && (dna.species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head") var/icon/h_marking_s = new /icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s") if(head_marking_style.do_colouration) h_marking_s.Blend(owner.m_colours["head"], ICON_ADD) @@ -117,7 +117,7 @@ if(!((owner.head && (owner.head.flags & BLOCKHAIR)) || (owner.wear_mask && (owner.wear_mask.flags & BLOCKHAIR)))) //Common restriction for all the below features. if(ha_style) var/datum/sprite_accessory/head_accessory_style = GLOB.head_accessory_styles_list[ha_style] - if(head_accessory_style && head_accessory_style.species_allowed && (dna.species.sprite_sheet_name in head_accessory_style.species_allowed)) + if(head_accessory_style && head_accessory_style.species_allowed && (dna.species.name in head_accessory_style.species_allowed)) var/icon/head_accessory_s = new /icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") if(head_accessory_style.do_colouration) head_accessory_s.Blend(headacc_colour, ICON_ADD) @@ -125,7 +125,7 @@ if(f_style) var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hair_styles_list[f_style] - if(facial_hair_style && ((facial_hair_style.species_allowed && (dna.species.sprite_sheet_name in facial_hair_style.species_allowed)) || (dna.species.bodyflags & ALL_RPARTS))) + if(facial_hair_style && ((facial_hair_style.species_allowed && (dna.species.name in facial_hair_style.species_allowed)) || (dna.species.bodyflags & ALL_RPARTS))) var/icon/facial_s = new /icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(istype(dna.species, /datum/species/slime)) // I am el worstos facial_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha. @@ -136,7 +136,7 @@ if(h_style) if(!ismachineperson(owner) || (ismachineperson(owner) && ((owner.head && (owner.head.flags & BLOCKHEADHAIR)) || (owner.wear_mask && (owner.wear_mask.flags & BLOCKHEADHAIR))))) var/datum/sprite_accessory/hair_style = GLOB.hair_styles_full_list[h_style] - if(hair_style && ((dna.species.sprite_sheet_name in hair_style.species_allowed) || (dna.species.bodyflags & ALL_RPARTS))) + if(hair_style && ((dna.species.name in hair_style.species_allowed) || (dna.species.bodyflags & ALL_RPARTS))) var/icon/hair_s = new /icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(istype(dna.species, /datum/species/slime)) // I am el worstos hair_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha. diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 07fb8745987..e815107f622 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -751,31 +751,14 @@ to_chat(user, "The multitool is out of range! Please try again.") return SURGERY_STEP_INCOMPLETE - var/new_subtype = tgui_input_list(user, "Choose a species look-alike for this machine", "Select Subtype", target.dna.species.allowed_species_subtypes) - if(isnull(new_subtype)) - to_chat(user, "You must choose a subtype! Please try again.") - return SURGERY_STEP_INCOMPLETE - else if(!target.Adjacent(user)) - to_chat(user, "The multitool is out of range! Please try again.") - return SURGERY_STEP_INCOMPLETE - var/new_gender = gender_list[gender_key] var/old_name = target.real_name target.real_name = new_name target.gender = new_gender user.visible_message( - "[user] edits [old_name]'s identity parameters with [tool], changing their appearance; [target.p_they()] [target.p_are()] now known as [new_name].", - "You alter [old_name]'s identity parameters with [tool], changing their appearance; [target.p_they()] [target.p_are()] now known as [new_name].", + "[user] edits [old_name]'s identity parameters with [tool]; [target.p_they()] [target.p_are()] now known as [new_name].", + "You alter [old_name]'s identity parameters with [tool]; [target.p_they()] [target.p_are()] now known as [new_name].", chat_message_type = MESSAGE_TYPE_COMBAT ) - if(!isnull(target.dna)) - var/datum/species/subtype = GLOB.all_species[new_subtype] - if(isnull(subtype)) - subtype = GLOB.all_species[target.dna.species.name] - target.dna.species.updatespeciessubtype(target, new subtype.type()) - for(var/obj/item/organ/external/limb in target.bodyparts) // Update robotic limbs to match new sub species - limb.set_company(limb.model, target.dna.species.sprite_sheet_name) // Update the limbs to properly use their new sprite sheet. - target.regenerate_icons() - return SURGERY_STEP_CONTINUE diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index d82fcec4efb..cacf106a791 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -17,13 +17,9 @@ var/list/whitelist var/list/blacklist - /// Temporary holder when we first initialize the TGUI, we store this as our owner's previous subtype so we can tell when it updates. - var/owner_subtype - /datum/ui_module/appearance_changer/New(datum/host, mob/living/carbon/human/H, check_species_whitelist = TRUE, list/species_whitelist = list(), list/species_blacklist = list()) ..() owner = H - owner_subtype = owner.dna.species.species_subtype head_organ = owner.get_organ("head") check_whitelist = check_species_whitelist whitelist = species_whitelist @@ -218,11 +214,7 @@ ui.open() /datum/ui_module/appearance_changer/ui_data(mob/user) - if(user.dna.species.species_subtype != owner_subtype) - owner_subtype = user.dna.species.species_subtype - cut_and_generate_data() - else - generate_data(check_whitelist, whitelist, blacklist) + generate_data(check_whitelist, whitelist, blacklist) var/list/data = list() data["specimen"] = owner.dna.species.name diff --git a/config/example/config.toml b/config/example/config.toml index 9d1098b1a89..cebcdd46909 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -173,7 +173,7 @@ ipc_screens = [ # Enable/disable the database on a whole sql_enabled = false # SQL version. If this is a mismatch, round start will be delayed -sql_version = 65 +sql_version = 66 # SQL server address. Can be an IP or DNS name sql_address = "127.0.0.1" # SQL server port