From b8811f23e0b793b3154a348dbb31b56cfa6fd39d Mon Sep 17 00:00:00 2001 From: Ricotez Date: Sat, 27 Jun 2015 20:57:54 +0200 Subject: [PATCH] -Added two new types of mutant accessories for humans: tail_human and ears. These ears are considered mutant parts and don't override normal human ears. -Added one ear and one tail accessory to these categories, obtained from the kitty ears. The ears are obviously cat ears, but the tail can pass for a monkey tail without ears. -Humans can now also edit alien/mutant colours. They have access to the full range of colours, but if the player switches back to lizard and the colour is too dark, it'll be reset to the default. -Renamed the original tail to tail_lizard. All references are properly updated and nothing has to be changed. -Could not solve an annoying bug with the setup window, where a lizard tail is rendered whenever a human tail is set. This problem only exists in the setup window and does not affect the sprite in-game. --- code/__DEFINES/flags.dm | 2 + code/__HELPERS/global_lists.dm | 7 +- code/__HELPERS/mobs.dm | 11 +- code/_globalvars/lists/flavor_misc.dm | 7 +- code/modules/client/preferences.dm | 121 +++++++++++------- code/modules/client/preferences_savefile.dm | 12 +- code/modules/mob/living/carbon/human/emote.dm | 23 ++-- .../mob/living/carbon/human/species.dm | 61 +++++++-- .../mob/living/carbon/human/species_types.dm | 13 +- .../mob/new_player/preferences_setup.dm | 17 ++- .../mob/new_player/sprite_accessories.dm | 58 ++++++--- icons/mob/mutant_bodyparts.dmi | Bin 42885 -> 44110 bytes 12 files changed, 240 insertions(+), 92 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 2996b1af708..9ddae527eec 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -65,6 +65,8 @@ #define VIRUSIMMUNE 4096 #define PIERCEIMMUNE 8192 +#define MUTCOLORS_PARTSONLY 16384 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless. + /* These defines are used specifically with the atom/movable/languages bitmask. They are used in atom/movable/Hear() and atom/movable/say() to determine whether hearers can understand a message. diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a80a9bb9ebd..a35db68de44 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,10 +15,13 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) //lizard bodyparts (blizzard intensifies) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated, animated_tails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, tails_list_lizard) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, animated_tails_list_lizard) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, animated_tails_list_human) init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, ears_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 01f8d00be82..46a58da0fb6 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -37,12 +37,16 @@ else return pick(socks_list) /proc/random_features() - if(!tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list) + if(!tails_list_human.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, tails_list_human) + if(!tails_list_lizard.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, tails_list_lizard) if(!snouts_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, snouts_list) if(!horns_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_list) + if(!ears_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, horns_list) if(!frills_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list) if(!spines_list.len) @@ -50,7 +54,8 @@ if(!body_markings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list) - return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail" = pick(tails_list), "snout" = pick(snouts_list), "horns" = pick(horns_list), "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list))) + //For now we will always return none for tail_human and ears. + return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "snout" = pick(snouts_list), "horns" = pick(horns_list), "ears" = "None", "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list))) /proc/random_hair_style(gender) switch(gender) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index c3bc1e7c1f8..752dc718e94 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -20,10 +20,13 @@ var/global/list/socks_m = list() //stores only socks name var/global/list/socks_f = list() //stores only socks name //Lizard Bits (all datum lists indexed by name) var/global/list/body_markings_list = list() -var/global/list/tails_list = list() -var/global/list/animated_tails_list = list() +var/global/list/tails_list_lizard = list() +var/global/list/tails_list_human = list() +var/global/list/animated_tails_list_lizard = list() +var/global/list/animated_tails_list_human = list() var/global/list/snouts_list = list() var/global/list/horns_list = list() +var/global/list/ears_list = list() var/global/list/frills_list = list() var/global/list/spines_list = list() var/global/list/animated_spines_list = list() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1b737182ae9..6f800e074cd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -61,7 +61,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set var/skin_tone = "caucasian1" //Skin color var/eye_color = "000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") + var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") @@ -238,69 +238,90 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" - if(MUTCOLORS in pref_species.specflags) + if(config.mutant_races) //We don't allow mutant bodyparts for humans either unless this is true. - dat += "" + if((MUTCOLORS in pref_species.specflags) || (MUTCOLORS_PARTSONLY in pref_species.specflags)) - dat += "

Alien Color

" + dat += "" - dat += "    Change
" + dat += "

Alien/Mutant Color

" - dat += "" + dat += "    Change
" - if("tail" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Tail

" + if("tail_lizard" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["tail"]]
" + dat += "

Tail

" - dat += "" + dat += "[features["tail_lizard"]]
" - if("snout" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Snout

" + //If someone sets more than one tail category for a species, we assume it's a bug and display only one. Hence the else if. + else if("tail_human" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["snout"]]
" + dat += "

Tail

" - dat += "" + dat += "[features["tail_human"]]
" - if("horns" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Horns

" + if("snout" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["horns"]]
" + dat += "

Snout

" - dat += "" + dat += "[features["snout"]]
" - if("frills" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Frills

" + if("horns" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["frills"]]
" + dat += "

Horns

" - dat += "" + dat += "[features["horns"]]
" - if("spines" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Spines

" + if("ears" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["spines"]]
" + dat += "

Ears

" - dat += "" + dat += "[features["ears"]]
" - if("body_markings" in pref_species.mutant_bodyparts) - dat += "" + dat += "" - dat += "

Body Markings

" + if("frills" in pref_species.mutant_bodyparts) + dat += "" - dat += "[features["body_markings"]]
" + dat += "

Frills

" - dat += "" + dat += "[features["frills"]]
" + + dat += "" + + if("spines" in pref_species.mutant_bodyparts) + dat += "" + + dat += "

Spines

" + + dat += "[features["spines"]]
" + + dat += "" + + if("body_markings" in pref_species.mutant_bodyparts) + dat += "" + + dat += "

Body Markings

" + + dat += "[features["body_markings"]]
" + + dat += "" dat += "" @@ -791,24 +812,32 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set if(result) var/newtype = roundstart_species[result] pref_species = new newtype() - if(features["mcolor"] == "#000") + //Now that we changed our species, we must verify that the mutant colour is still allowed. + var/temp_hsv = RGBtoHSV(features["mcolor"]) + if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.specflags) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3])) features["mcolor"] = pref_species.default_color - if("mutant_color") - var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null + var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference") as color|null if(new_mutantcolor) var/temp_hsv = RGBtoHSV(new_mutantcolor) if(new_mutantcolor == "#000000") features["mcolor"] = pref_species.default_color - else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright + else if(MUTCOLORS_PARTSONLY in pref_species.specflags || ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright, but only if they affect the skin features["mcolor"] = sanitize_hexcolor(new_mutantcolor) else user << "Invalid color. Your color is not bright enough." - if("tail") + + if("tail_human") var/new_tail - new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list + new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_human if(new_tail) - features["tail"] = new_tail + features["tail_human"] = new_tail + + if("tail_lizard") + var/new_tail + new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_lizard + if(new_tail) + features["tail_lizard"] = new_tail if("snout") var/new_snout @@ -822,6 +851,12 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set if(new_horns) features["horns"] = new_horns + if("ears") + var/new_ears + new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in ears_list + if(new_ears) + features["ears"] = new_ears + if("frills") var/new_frills new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in frills_list diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a239561ede0..63b422d2212 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -187,9 +187,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["socks"] >> socks S["backbag"] >> backbag S["feature_mcolor"] >> features["mcolor"] - S["feature_lizard_tail"] >> features["tail"] + S["feature_lizard_tail"] >> features["tail_lizard"] + S["feature_human_tail"] >> features["tail_human"] S["feature_lizard_snout"] >> features["snout"] S["feature_lizard_horns"] >> features["horns"] + S["feature_human_ears"] >> features["ears"] S["feature_lizard_frills"] >> features["frills"] S["feature_lizard_spines"] >> features["spines"] S["feature_lizard_body_markings"] >> features["body_markings"] @@ -245,9 +247,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car skin_tone = sanitize_inlist(skin_tone, skin_tones) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) - features["tail"] = sanitize_inlist(features["tail"], tails_list) + features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], tails_list_lizard) + features["tail_human"] = sanitize_inlist(features["tail_human"], tails_list_human) features["snout"] = sanitize_inlist(features["snout"], snouts_list) features["horns"] = sanitize_inlist(features["horns"], horns_list) + features["ears"] = sanitize_inlist(features["ears"], ears_list) features["frills"] = sanitize_inlist(features["frills"], frills_list) features["spines"] = sanitize_inlist(features["spines"], spines_list) features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list) @@ -292,9 +296,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["backbag"] << backbag S["species"] << pref_species.name S["feature_mcolor"] << features["mcolor"] - S["feature_lizard_tail"] << features["tail"] + S["feature_lizard_tail"] << features["tail_lizard"] + S["feature_human_tail"] << features["tail_human"] S["feature_lizard_snout"] << features["snout"] S["feature_lizard_horns"] << features["horns"] + S["feature_human_ears"] << features["ears"] S["feature_lizard_frills"] << features["frills"] S["feature_lizard_spines"] << features["spines"] S["feature_lizard_body_markings"] << features["body_markings"] diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 9a718fb01bc..0c274d56ebf 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -309,12 +309,12 @@ m_type = 2 if("wag") - if(dna && dna.species && ("tail" in dna.species.mutant_bodyparts)) + if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || ("tail_human" in dna.species.mutant_bodyparts))) message = "[src] wags \his tail." startTailWag() if("stopwag") - if(dna && dna.species && ("waggingtail" in dna.species.mutant_bodyparts)) + if(dna && dna.species && (("waggingtail_lizard" in dna.species.mutant_bodyparts) || ("waggingtail_human" in dna.species.mutant_bodyparts))) message = "[src] stops wagging \his tail." endTailWag() @@ -353,21 +353,26 @@ /mob/living/carbon/human/proc/startTailWag() if(!dna || !dna.species) return - if("tail" in dna.species.mutant_bodyparts) - dna.species.mutant_bodyparts -= "tail" + if("tail_lizard" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "tail_lizard" dna.species.mutant_bodyparts -= "spines" - dna.species.mutant_bodyparts |= "waggingtail" + dna.species.mutant_bodyparts |= "waggingtail_lizard" dna.species.mutant_bodyparts |= "waggingspines" + if("tail_human" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "tail_human" + dna.species.mutant_bodyparts |= "waggingtail_human" update_body() /mob/living/carbon/human/proc/endTailWag() if(!dna || !dna.species) return - if("waggingtail" in dna.species.mutant_bodyparts) - dna.species.mutant_bodyparts -= "waggingtail" + if("waggingtail_lizard" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "waggingtail_lizard" dna.species.mutant_bodyparts -= "waggingspines" - dna.species.mutant_bodyparts |= "tail" + dna.species.mutant_bodyparts |= "tail_lizard" dna.species.mutant_bodyparts |= "spines" - + if("waggingtail_human" in dna.species.mutant_bodyparts) + dna.species.mutant_bodyparts -= "waggingtail_human" + dna.species.mutant_bodyparts |= "tail_human" update_body() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 67caa33abac..2dff13d89cf 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -39,6 +39,7 @@ var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids var/dangerous_existence = null //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!" var/say_mod = "says" // affects the speech message + var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have. var/list/mutant_bodyparts = list() // Parts of the body that are diferent enough from the standard human model that they cause clipping with some equipment @@ -236,16 +237,26 @@ if(!mutant_bodyparts) return - if("tail" in mutant_bodyparts) + if("tail_lizard" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "tail" + bodyparts_to_add -= "tail_lizard" + + if("waggingtail_lizard" in mutant_bodyparts) + if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) + bodyparts_to_add -= "waggingtail_lizard" + else if ("tail_lizard" in mutant_bodyparts) + bodyparts_to_add -= "waggingtail_lizard" + + if("tail_human" in mutant_bodyparts) + if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) + bodyparts_to_add -= "tail_human" - if("waggingtail" in mutant_bodyparts) + if("waggingtail_human" in mutant_bodyparts) if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) - bodyparts_to_add -= "waggingtail" - else if ("tail" in mutant_bodyparts) - bodyparts_to_add -= "waggingtail" + bodyparts_to_add -= "waggingtail_human" + else if ("tail_human" in mutant_bodyparts) + bodyparts_to_add -= "waggingtail_human" if("spines" in mutant_bodyparts) if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) @@ -269,6 +280,10 @@ if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags & BLOCKHAIR) || (H.wear_mask && (H.wear_mask.flags & BLOCKHAIR))) bodyparts_to_add -= "horns" + if("ears" in mutant_bodyparts) + if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags & BLOCKHAIR) || (H.wear_mask && (H.wear_mask.flags & BLOCKHAIR))) + bodyparts_to_add -= "ears" + if(!bodyparts_to_add) return @@ -280,10 +295,14 @@ for(var/bodypart in bodyparts_to_add) var/datum/sprite_accessory/S switch(bodypart) - if("tail") - S = tails_list[H.dna.features["tail"]] - if("waggingtail") - S.= animated_tails_list[H.dna.features["tail"]] + if("tail_lizard") + S = tails_list_lizard[H.dna.features["tail_lizard"]] + if("waggingtail_lizard") + S.= animated_tails_list_lizard[H.dna.features["tail_lizard"]] + if("tail_human") + S = tails_list_human[H.dna.features["tail_human"]] + if("waggingtail_human") + S.= animated_tails_list_human[H.dna.features["tail_human"]] if("spines") S = spines_list[H.dna.features["spines"]] if("waggingspines") @@ -294,12 +313,33 @@ S = frills_list[H.dna.features["frills"]] if("horns") S = horns_list[H.dna.features["horns"]] + if("ears") + S = ears_list[H.dna.features["ears"]] if("body_markings") S = body_markings_list[H.dna.features["body_markings"]] if(!S || S.icon_state == "none") continue + + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. + if(bodypart == "tail_lizard" || bodypart == "tail_human") + bodypart = "tail" + else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human") + bodypart = "waggingtail" + + var/icon_string + + if(S.hasinner) + if(S.gender_specific) + icon_string = "[id]_[g]_[bodypart]inner_[S.icon_state]_[layer]" + else + icon_string = "[id]_m_[bodypart]inner_[S.icon_state]_[layer]" + + I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer) + + standing += I + if(S.gender_specific) icon_string = "[id]_[g]_[bodypart]_[S.icon_state]_[layer]" else @@ -310,6 +350,7 @@ if(!(H.disabilities & HUSK)) I.color = "#[H.dna.features["mcolor"]]" standing += I + H.overlays_standing[layer] = standing.Copy() standing = list() diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 79f84797b28..b356e465c3b 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -5,8 +5,11 @@ /datum/species/human name = "Human" id = "human" + default_color = "FFFFFF" roundstart = 1 - specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + specflags = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS) + mutant_bodyparts = list("tail_human", "ears") + default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None") use_skintones = 1 /datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) @@ -18,6 +21,11 @@ H.faction |= "slime" return 1 +//Curiosity killed the cat's wagging tail. +datum/species/human/spec_death(var/gibbed, var/mob/living/carbon/human/H) + if(H) + H.endTailWag() + /* LIZARDPEOPLE */ @@ -30,7 +38,8 @@ default_color = "00FF00" roundstart = 1 specflags = list(MUTCOLORS,EYECOLOR,LIPS) - mutant_bodyparts = list("tail", "snout", "spines", "horns", "frills", "body_markings") + mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings") + default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e28dcc3adab..a223c5f807a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -78,8 +78,10 @@ for(var/layer in relevent_layers) for(var/bodypart in pref_species.mutant_bodyparts) switch(bodypart) - if("tail") - S = tails_list[features["tail"]] + if("tail_lizard") + S = tails_list_lizard[features["tail_lizard"]] + if("tail_human") + S = tails_list_human[features["tail_human"]] if("spines") S = spines_list[features["spines"]] if("snout") @@ -88,12 +90,23 @@ S = frills_list[features["frills"]] if("horns") S = horns_list[features["horns"]] + if("ears") + S = ears_list[features["ears"]] if("body_markings") S = body_markings_list[features["body_markings"]] if(!S || S.icon_state == "none") continue + + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. + if(bodypart == "tail_lizard" || bodypart == "tail_human") + bodypart = "tail" + + if(S.hasinner) + preview_icon.Blend(new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[pref_species.id]_m_[bodypart]inner_[S.icon_state]_[layer]"), ICON_OVERLAY) + var/icon_string + if(S.gender_specific) icon_string = "[pref_species.id]_[g]_[bodypart]_[S.icon_state]_[layer]" else diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index c28d4fd705c..b823de1280c 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -42,6 +42,7 @@ var/name //the preview name of the accessory var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations var/gender_specific //Something that can be worn by either gender, but looks different on each + var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. ////////////////////// // Hair Definitions // @@ -1094,70 +1095,86 @@ /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/tails/smooth +/datum/sprite_accessory/tails/lizard/smooth name = "Smooth" icon_state = "smooth" -/datum/sprite_accessory/tails_animated/smooth +/datum/sprite_accessory/tails_animated/lizard/smooth name = "Smooth" icon_state = "smooth" -/datum/sprite_accessory/tails/light +/datum/sprite_accessory/tails/lizard/light name = "Light" icon_state = "light" -/datum/sprite_accessory/tails_animated/light +/datum/sprite_accessory/tails_animated/lizard/light name = "Light" icon_state = "light" -/datum/sprite_accessory/tails/dstripe +/datum/sprite_accessory/tails/lizard/dstripe name = "Dark Stripe" icon_state = "dstripe" -/datum/sprite_accessory/tails_animated/dstripe +/datum/sprite_accessory/tails_animated/lizard/dstripe name = "Dark Stripe" icon_state = "dstripe" -/datum/sprite_accessory/tails/lstripe +/datum/sprite_accessory/tails/lizard/lstripe name = "Light Stripe" icon_state = "lstripe" -/datum/sprite_accessory/tails_animated/lstripe +/datum/sprite_accessory/tails_animated/lizard/lstripe name = "Light Stripe" icon_state = "lstripe" -/datum/sprite_accessory/tails/dtiger +/datum/sprite_accessory/tails/lizard/dtiger name = "Dark Tiger" icon_state = "dtiger" -/datum/sprite_accessory/tails_animated/dtiger +/datum/sprite_accessory/tails_animated/lizard/dtiger name = "Dark Tiger" icon_state = "dtiger" -/datum/sprite_accessory/tails/ltiger +/datum/sprite_accessory/tails/lizard/ltiger name = "Light Tiger" icon_state = "ltiger" -/datum/sprite_accessory/tails_animated/ltiger +/datum/sprite_accessory/tails_animated/lizard/ltiger name = "Light Tiger" icon_state = "ltiger" -/datum/sprite_accessory/tails/club +/datum/sprite_accessory/tails/lizard/club name = "Club" icon_state = "club" -/datum/sprite_accessory/tails_animated/club +/datum/sprite_accessory/tails_animated/lizard/club name = "Club" icon_state = "club" -/datum/sprite_accessory/tails/aqua +/datum/sprite_accessory/tails/lizard/aqua name = "Aquatic" icon_state = "aqua" -/datum/sprite_accessory/tails_animated/aqua +/datum/sprite_accessory/tails_animated/lizard/aqua name = "Aquatic" icon_state = "aqua" +/datum/sprite_accessory/tails/human/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/tails_animated/human/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/tails/human/longsmooth + name = "Long and Smooth" + icon_state = "longsmooth" + +/datum/sprite_accessory/tails_animated/human/longsmooth + name = "Long and Smooth" + icon_state = "longsmooth" + /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' @@ -1204,6 +1221,15 @@ name = "Angeler" icon_state = "angler" +/datum/sprite_accessory/ears/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/ears/cat + name = "Cat" + icon_state = "cat" + hasinner = 1 + /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 94acba1cbc59bca5a5e9b81cc87a72d4247a43fe..11be34ec75383029508feb48b665f353860304f9 100644 GIT binary patch delta 10996 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 delta 9761 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 M1C!m^JMGT>Kgoo#+W-In