From b8811f23e0b793b3154a348dbb31b56cfa6fd39d Mon Sep 17 00:00:00 2001 From: Ricotez Date: Sat, 27 Jun 2015 20:57:54 +0200 Subject: [PATCH 1/6] -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 From 84231643c5022069fdfcf508baad5aece59c763e Mon Sep 17 00:00:00 2001 From: Ricotez Date: Sat, 27 Jun 2015 22:51:07 +0200 Subject: [PATCH 2/6] -Humans with tails and/or ears are considered not entirely human, and locked out of important positions. --- code/controllers/subsystem/jobs.dm | 6 +++--- code/modules/client/client procs.dm | 3 +++ code/modules/client/preferences.dm | 2 +- code/modules/mob/new_player/new_player.dm | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 6153cee7eb7..0da46ab4c5e 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -86,7 +86,7 @@ var/datum/subsystem/job/SSjob if(player.mind && job.title in player.mind.restricted_roles) Debug("FOC incompatible with antagonist role, Player: [player]") continue - if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) Debug("FOC non-human failed, Player: [player]") continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) @@ -118,7 +118,7 @@ var/datum/subsystem/job/SSjob Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") continue - if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) Debug("GRJ non-human failed, Player: [player]") continue @@ -291,7 +291,7 @@ var/datum/subsystem/job/SSjob Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") continue - if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) Debug("DO non-human failed, Player: [player], Job:[job.title]") continue diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index a7cc46fec17..40941e5cff4 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -52,6 +52,9 @@ return 0 return 1 +/client/proc/qualifies_for_human_authority() + return prefs.pref_species.id == "human" && prefs.features["tail_human"] == "None" && prefs.features["ears"] == "None" + /client/proc/handle_spam_prevention(var/message, var/mute_type) if(config.automute_on && !holder && src.last_message == message) src.last_message_count++ diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6f800e074cd..325806cb578 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -444,7 +444,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set if((job_civilian_low & ASSISTANT) && (rank != "Assistant") && !jobban_isbanned(user, "Assistant")) HTML += "[rank]" continue - if(config.enforce_human_authority && (rank in command_positions) && user.client.prefs.pref_species.id != "human") + if(config.enforce_human_authority && (rank in command_positions) && !user.client.qualifies_for_human_authority()) HTML += "[rank] \[NON-HUMAN\]" continue if((rank in command_positions) || (rank == "AI"))//Bold head jobs diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 66d67d45b70..d1d52349648 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -262,7 +262,7 @@ return 0 if(!job.player_old_enough(src.client)) return 0 - if(config.enforce_human_authority && (rank in command_positions) && client.prefs.pref_species.id != "human") + if(config.enforce_human_authority && (rank in command_positions) && !client.qualifies_for_human_authority()) return 0 return 1 From 44b795138c985e8b3589ce8f43f3398ee591837f Mon Sep 17 00:00:00 2001 From: Ricotez Date: Mon, 29 Jun 2015 22:13:25 +0200 Subject: [PATCH 3/6] -Adds new proc-based job check for species. If enforce_human_authority is set, the various pieces of code that deal with roundstart job stuff will call this proc on your preferred species with 2 arguments: the name of the job and the list of mutantparts you have currently set. -The proc is defined as proc/qualifies_for_rank(var/rank, var/list/features), and by default defined to always return 1. You must override it locally in your species definition to set special job properties. -Lizards will fail the check for jobs in command_positions and pass it for any other job. Just like before. -Humans will always pass the check if they don't have ears or tails. If they do have ears or tails, they will fail the check if the job is in command_positions, engineering_positions, science_positions, medical_positions, security_positions or equal to "Quartermaster", effectively limiting their job selection to civlian, lower supply and silicon jobs. --- code/controllers/subsystem/jobs.dm | 6 ++--- code/modules/client/client procs.dm | 3 --- code/modules/client/preferences.dm | 7 ++++-- .../mob/living/carbon/human/species.dm | 5 +++- .../mob/living/carbon/human/species_types.dm | 25 +++++++++++++++++++ code/modules/mob/new_player/new_player.dm | 2 +- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 0da46ab4c5e..5f85d3f162c 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -86,7 +86,7 @@ var/datum/subsystem/job/SSjob if(player.mind && job.title in player.mind.restricted_roles) Debug("FOC incompatible with antagonist role, Player: [player]") continue - if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) + if(config.enforce_human_authority && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) Debug("FOC non-human failed, Player: [player]") continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) @@ -118,7 +118,7 @@ var/datum/subsystem/job/SSjob Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") continue - if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) + if(config.enforce_human_authority && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) Debug("GRJ non-human failed, Player: [player]") continue @@ -291,7 +291,7 @@ var/datum/subsystem/job/SSjob Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") continue - if(config.enforce_human_authority && (job.title in command_positions) && !player.client.qualifies_for_human_authority()) + if(config.enforce_human_authority && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) Debug("DO non-human failed, Player: [player], Job:[job.title]") continue diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 40941e5cff4..a7cc46fec17 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -52,9 +52,6 @@ return 0 return 1 -/client/proc/qualifies_for_human_authority() - return prefs.pref_species.id == "human" && prefs.features["tail_human"] == "None" && prefs.features["ears"] == "None" - /client/proc/handle_spam_prevention(var/message, var/mute_type) if(config.automute_on && !holder && src.last_message == message) src.last_message_count++ diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 325806cb578..10f25c17057 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -444,8 +444,11 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set if((job_civilian_low & ASSISTANT) && (rank != "Assistant") && !jobban_isbanned(user, "Assistant")) HTML += "[rank]" continue - if(config.enforce_human_authority && (rank in command_positions) && !user.client.qualifies_for_human_authority()) - HTML += "[rank] \[NON-HUMAN\]" + if(config.enforce_human_authority && !user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features)) + if(user.client.prefs.pref_species.id == "human") + HTML += "[rank] \[MUTANT\]" + else + HTML += "[rank] \[NON-HUMAN\]" continue if((rank in command_positions) || (rank == "AI"))//Bold head jobs HTML += "[rank]" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2dff13d89cf..7525b80297d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -40,7 +40,6 @@ 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 var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster @@ -85,6 +84,10 @@ // PROCS // /////////// +//Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. +/datum/species/proc/qualifies_for_rank(var/rank, var/list/features) + return 1 + /datum/species/proc/update_base_icon_state(var/mob/living/carbon/human/H) if(H.disabilities & HUSK) H.remove_overlay(SPECIES_LAYER) // races lose their color diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index b356e465c3b..f7d8ee0661b 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -12,6 +12,26 @@ default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None") use_skintones = 1 +/datum/species/human/qualifies_for_rank(var/rank, var/list/features) + if(features["tail_human"] == "None" && features["ears"] == "None") + return 1 //Pure humans are always allowed in all roles. + + //Mutants are not allowed in most roles. + if(rank in command_positions) + return 0 + if(rank in security_positions) //This list does not include lawyers. + return 0 + if(rank in science_positions) + return 0 + if(rank in medical_positions) + return 0 + if(rank in engineering_positions) + return 0 + if(rank == "Quartermaster") //QM is not contained in command_positions but we still want to bar mutants from it. + return 0 + return 1 + + /datum/species/human/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "mutationtoxin") H << "Your flesh rapidly mutates!" @@ -45,6 +65,11 @@ datum/species/human/spec_death(var/gibbed, var/mob/living/carbon/human/H) miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard +/datum/species/lizard/qualifies_for_rank(var/rank, var/list/features) + if(rank in command_positions) + return 0 + return 1 + /datum/species/lizard/handle_speech(message) // jesus christ why if(copytext(message, 1, 2) != "*") diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index d1d52349648..05b6fdb0b8a 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -262,7 +262,7 @@ return 0 if(!job.player_old_enough(src.client)) return 0 - if(config.enforce_human_authority && (rank in command_positions) && !client.qualifies_for_human_authority()) + if(config.enforce_human_authority && !client.prefs.pref_species.qualifies_for_rank(rank, client.prefs.features)) return 0 return 1 From 3ea2eae81b0ad5136c58c74aa54751945766f222 Mon Sep 17 00:00:00 2001 From: Ricotez Date: Mon, 29 Jun 2015 23:49:55 +0200 Subject: [PATCH 4/6] -Removed roundstart access to ears and human tails. They are an admin only thing now. -You can now set which colour an accessory should use: HAIR, FACEHAIR, EYECOLOR, MUTCOLORS or its own (0). Right now only mutantparts use this. -Consequently, humans lost their ability to change mutant colours, although the special flag MUTCOLORS_PARTSONLY still exists. --- code/modules/client/preferences.dm | 31 ------------------- .../mob/living/carbon/human/species.dm | 13 +++++++- .../mob/living/carbon/human/species_types.dm | 2 +- .../mob/new_player/preferences_setup.dm | 14 ++++++++- .../mob/new_player/sprite_accessories.dm | 4 +++ html/changelogs/ricotez-human_mutantparts.yml | 9 ++++++ 6 files changed, 39 insertions(+), 34 deletions(-) create mode 100644 html/changelogs/ricotez-human_mutantparts.yml diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 10f25c17057..f1749221303 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -259,16 +259,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" - //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 += "

Tail

" - - dat += "[features["tail_human"]]
" - - dat += "" - if("snout" in pref_species.mutant_bodyparts) dat += "" @@ -287,15 +277,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" - if("ears" in pref_species.mutant_bodyparts) - dat += "" - - dat += "

Ears

" - - dat += "[features["ears"]]
" - - dat += "" - if("frills" in pref_species.mutant_bodyparts) dat += "" @@ -830,12 +811,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set else user << "Invalid color. Your color is not bright enough." - if("tail_human") - var/new_tail - new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_human - if(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 @@ -854,12 +829,6 @@ 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/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7525b80297d..72d7551506e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -351,7 +351,18 @@ I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer) if(!(H.disabilities & HUSK)) - I.color = "#[H.dna.features["mcolor"]]" + switch(S.color_src) + if(MUTCOLORS) + I.color = "#[H.dna.features["mcolor"]]" + if(HAIR) + if(hair_color == "mutcolor") + I.color = "#[H.dna.features["mcolor"]]" + else + I.color = "#[H.hair_color]" + if(FACEHAIR) + I.color = "#[H.facial_hair_color]" + if(EYECOLOR) + I.color = "#[H.eye_color]" standing += I H.overlays_standing[layer] = standing.Copy() diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index f7d8ee0661b..2fbd53dd373 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -7,7 +7,7 @@ id = "human" default_color = "FFFFFF" roundstart = 1 - specflags = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS) + specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS) mutant_bodyparts = list("tail_human", "ears") default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None") use_skintones = 1 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a223c5f807a..168ce5ce499 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -113,7 +113,19 @@ icon_string = "[pref_species.id]_m_[bodypart]_[S.icon_state]_[layer]" var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string) - part.Blend("#[features["mcolor"]]", ICON_MULTIPLY) + switch(S.color_src) + if(MUTCOLORS) + part.Blend("#[features["mcolor"]]", ICON_MULTIPLY) + if(HAIR) + if(hair_color == "mutcolor") + part.Blend("#[features["mcolor"]]", ICON_MULTIPLY) + else + part.Blend("#[hair_color]", ICON_MULTIPLY) + if(FACEHAIR) + part.Blend("#[facial_hair_color]", ICON_MULTIPLY) + if(EYECOLOR) + part.Blend("#[eye_color]", ICON_MULTIPLY) + preview_icon.Blend(part, ICON_OVERLAY) if(underwear) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index b823de1280c..614e8d8dd22 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/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none. var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears. ////////////////////// @@ -1170,10 +1171,12 @@ /datum/sprite_accessory/tails/human/longsmooth name = "Long and Smooth" icon_state = "longsmooth" + color_src = HAIR /datum/sprite_accessory/tails_animated/human/longsmooth name = "Long and Smooth" icon_state = "longsmooth" + color_src = HAIR /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' @@ -1229,6 +1232,7 @@ name = "Cat" icon_state = "cat" hasinner = 1 + color_src = HAIR /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' diff --git a/html/changelogs/ricotez-human_mutantparts.yml b/html/changelogs/ricotez-human_mutantparts.yml new file mode 100644 index 00000000000..c58b128f364 --- /dev/null +++ b/html/changelogs/ricotez-human_mutantparts.yml @@ -0,0 +1,9 @@ + author: Ricotez + + delete-after: True + + changes: + - rscadd: "Added two categories of mutant bodyparts for humans with the same system that lizards use: ears and tails. You cannot access these categories at round start, but admins can edit them in the DNA for special events." + - rscadd: "Updated the system that checks for which jobs your character qualifies to be species-dependant. At this moment you won't notice any differences, but in the future coders can use this to be more specific about which jobs a species is allowed in under which circumstances." + - imageadd: "Added one option to both categories, taken from the kitty ears: a long, simple tail and cat ears. An admin can give a human the tail by setting the value for 'tail_human' to 'Long and Smooth', and the ears by setting the value for 'ears' to 'Cat'. Mark the capital letters." + - wip: "Adding categories for tattoos and scars is in the works. (Read: I need sprites!)" \ No newline at end of file From acd297e7f511eac6858e24f8b35c7d4ba691397c Mon Sep 17 00:00:00 2001 From: Ricotez Date: Tue, 30 Jun 2015 20:17:55 +0200 Subject: [PATCH 5/6] -Added new option to the VV menu drop-down list: Toggle Purrbation. -Putting a human on purrbation gives them cat ears and a cat tail, and sends them the message 'You suddenly feel valid.' -Removing a human from purrbation reverses the effects, and sends them the message 'You suddenly don't feel valid anymore.' -Renamed "Long and Smooth" tail to "Cat" tail. I wasn't kitten anyone with the old name. -Updated changelog. Forgot to include these two in the last commit: -Cat ears and tail now use your hair colour instead of your mutant colour. -Added changelog. --- code/datums/datumvars.dm | 29 ++++++++++++++ code/modules/client/preferences.dm | 36 +++++++++++++++++- code/modules/client/preferences_savefile.dm | 12 +++--- .../mob/living/carbon/human/species.dm | 20 +++++----- .../mob/new_player/sprite_accessories.dm | 12 +++--- html/changelogs/ricotez-human_mutantparts.yml | 5 ++- icons/mob/mutant_bodyparts.dmi | Bin 44110 -> 44104 bytes 7 files changed, 88 insertions(+), 26 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index c4e3856e295..109a8f3c99c 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -254,6 +254,7 @@ if(ishuman(D)) body += "" body += "" + body += "" body += "" body += "" body += "" @@ -793,6 +794,34 @@ body hardset_dna(H, null, null, null, null, newtype) H.regenerate_icons() + else if(href_list["purrbation"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["purrbation"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(!H) + usr << "Mob doesn't exist anymore" + return + + if(H.dna && H.dna.species.id == "human") + if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") + usr << "Put [H] on purrbation." + H << "You suddenly feel valid." + H.dna.features["tail_human"] = "Cat" + H.dna.features["ears"] = "Cat" + else + usr << "Removed [H] from purrbation." + H << "You suddenly don't feel valid anymore." + H.dna.features["tail_human"] = "None" + H.dna.features["ears"] = "None" + H.regenerate_icons() + return + + usr << "You can only put humans on purrbation." + else if(href_list["adjustDamage"] && href_list["mobToDamage"]) if(!check_rights(0)) return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f1749221303..fc2e9c3263a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -259,6 +259,16 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" +/* + else if("tail_human" in pref_species.mutant_bodyparts) + dat += "" + + dat += "

Tail

" + + dat += "[features["tail_human"]]
" + + dat += "" +*/ if("snout" in pref_species.mutant_bodyparts) dat += "" @@ -276,6 +286,16 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "[features["horns"]]
" dat += "" +/* + if("ears" in pref_species.mutant_bodyparts) + dat += "" + + dat += "

Ears

" + + dat += "[features["ears"]]
" + + dat += "" +*/ if("frills" in pref_species.mutant_bodyparts) dat += "" @@ -816,7 +836,13 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set 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("tail_human") + var/new_tail + new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_human + if(new_tail) + features["tail_human"] = new_tail +*/ if("snout") var/new_snout new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list @@ -828,7 +854,13 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in horns_list 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 63b422d2212..7f04aa5b9ef 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -188,10 +188,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["backbag"] >> backbag S["feature_mcolor"] >> features["mcolor"] S["feature_lizard_tail"] >> features["tail_lizard"] - S["feature_human_tail"] >> features["tail_human"] +// 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_human_ears"] >> features["ears"] S["feature_lizard_frills"] >> features["frills"] S["feature_lizard_spines"] >> features["spines"] S["feature_lizard_body_markings"] >> features["body_markings"] @@ -248,10 +248,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], tails_list_lizard) - features["tail_human"] = sanitize_inlist(features["tail_human"], tails_list_human) +// 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["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) @@ -297,10 +297,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["species"] << pref_species.name S["feature_mcolor"] << features["mcolor"] S["feature_lizard_tail"] << features["tail_lizard"] - S["feature_human_tail"] << features["tail_human"] +// 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_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/species.dm b/code/modules/mob/living/carbon/human/species.dm index 72d7551506e..79236fae144 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -333,16 +333,6 @@ 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 @@ -365,6 +355,16 @@ I.color = "#[H.eye_color]" standing += I + 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 + H.overlays_standing[layer] = standing.Copy() standing = list() diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 614e8d8dd22..31735f73fbd 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1168,14 +1168,14 @@ name = "None" icon_state = "none" -/datum/sprite_accessory/tails/human/longsmooth - name = "Long and Smooth" - icon_state = "longsmooth" +/datum/sprite_accessory/tails/human/cat + name = "Cat" + icon_state = "cat" color_src = HAIR -/datum/sprite_accessory/tails_animated/human/longsmooth - name = "Long and Smooth" - icon_state = "longsmooth" +/datum/sprite_accessory/tails_animated/human/cat + name = "Cat" + icon_state = "cat" color_src = HAIR /datum/sprite_accessory/snouts diff --git a/html/changelogs/ricotez-human_mutantparts.yml b/html/changelogs/ricotez-human_mutantparts.yml index c58b128f364..df56e2dd6a4 100644 --- a/html/changelogs/ricotez-human_mutantparts.yml +++ b/html/changelogs/ricotez-human_mutantparts.yml @@ -3,7 +3,8 @@ delete-after: True changes: - - rscadd: "Added two categories of mutant bodyparts for humans with the same system that lizards use: ears and tails. You cannot access these categories at round start, but admins can edit them in the DNA for special events." + - rscadd: "Added two categories of mutant bodyparts for humans with the same system that lizards use: ears and tails. Right now only admins can edit these." - rscadd: "Updated the system that checks for which jobs your character qualifies to be species-dependant. At this moment you won't notice any differences, but in the future coders can use this to be more specific about which jobs a species is allowed in under which circumstances." - - imageadd: "Added one option to both categories, taken from the kitty ears: a long, simple tail and cat ears. An admin can give a human the tail by setting the value for 'tail_human' to 'Long and Smooth', and the ears by setting the value for 'ears' to 'Cat'. Mark the capital letters." + - imageadd: "Added one option to both categories, taken from the kitty ears: a cat tail and cat ears." + - rscadd: "Added a new button to the VV menu drop-down list for admins: Toggle Purrbation. Putting a human on purrbation will give them cat ears and a cat tail, and send them the message 'You suddenly feel valid.' Using the button a second time removes the effects." - wip: "Adding categories for tattoos and scars is in the works. (Read: I need sprites!)" \ No newline at end of file diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 11be34ec75383029508feb48b665f353860304f9..5e293d3fa114c0fa1b66a1fa5f9ceff8d2429f77 100644 GIT binary patch delta 653 zcmV;80&@M%*aFDd0+1wsW_naubVOxyV{&P5bZKvH004NLy_wB&+AtJG*Y;Crk}cC| zfGoQ3rbDK~B6$UkK*G{gKdvN~p-B>mD=8=4V`LTT?o7Zjm zTlk=yB^6nJ`C1l7#iJw@SuM*#3RTP4eF>38K`Qc~)gR_LH8e7RrD-tEMM;;>4`soX z52PaNvN(8VL?9J;8sb(+4v1-0%Lq@|W6+R22Bdh1UNr)q@(e8B^n8?sdC^hwLb5#Et?&>{rX+0XqsBu%pI9!MZlmAenDK zvX1kvwH(0($$SHU-~Fy(Tw<*Ge;8nv&f7qPGL439GCe4r#|ZbW*8;XW9q5@sP|VgE z_^Us7r8TND?0Lv$jOlHfhlJqH_S2Az8lAT#5$50=aTQhIP z271I?>vEr(4ejH(HS?}adNa>#nfWP8Hl(?hU5)pr*F~03ZNKL_t(|ob27Rr2?s`$*Vv< delta 653 zcmV;80&@Mx*aFVj0+1wsYuCp$;09KbSaU%(j)o)@?-l(Hm}?A zx9~wZODeMd^0h3EibqK*vRamf6snf7`x7FIf>h)|t3S+hYG`DCO4DGRi;^y%AIgF& zA4o;kWpVJ#h(IdxG{mit91zp0mJyz^$Dkp53`p@1y=nwJp+VNah=V`095J;}T=dA7Ox5I&T9F$}}3b$n>Ce9wXehUJKalbf9MjK`~ov z;8TC_N^4YQ-brw2dJz0@g+^I%7DDcv3lM2E!oc>mYZz|U&ej-d$Kia~3;oB!z2N2f zf&=(=j-RMu{-?5aK%I{+N5Gt0K4pOK@V5q#g7FE1AkGp&C7jiHnfiC*33II>BT&=W#+pq*^uU%mb(;epeN64nN^bP_p>_YEmrDXLMBD> zXq(kBZ>ds$Z#AYXM)h{1HHCCBG%k{gtQO1lVzhW_36bJt%aymd$qp@>D%rPYw%p@d z?lVDy9dtI+%!|^P?i_BBtzniLDwq#+&&GU5xkiRN!*{0JO`WYre_8ryQ`QO(OnI@5 n4~m~}6tH|GFK-*NdEJ(O0m<`sT|sHUegFU<07*o%nF6n=!Er&B From 79a41996f50192f82cca756e7007512a01d7da94 Mon Sep 17 00:00:00 2001 From: Ricotez Date: Tue, 30 Jun 2015 23:53:13 +0200 Subject: [PATCH 6/6] - Added new confic option: JOIN_WITH_MUTANT_HUMANS - Uncommented all stuff that was commented in the last commit. - Added a check in front of it that blocks them from showing up in the setup window if JOIN_WITH_MUTANT_HUMANS is not set. - Included new game_options.txt as an example. The tgstation server has never used the example game_options.txt so the new config option will not be enabled on it. Even if it did, the option starts commented out in the file. --- code/controllers/configuration.dm | 3 ++ code/modules/client/preferences.dm | 48 ++++++++++----------- code/modules/client/preferences_savefile.dm | 8 ++-- config/game_options.txt | 5 ++- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 3f314079849..78dfe3e2a66 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -106,6 +106,7 @@ var/shuttle_refuel_delay = 12000 var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen var/mutant_races = 0 //players can choose their mutant race before joining the game + var/mutant_humans = 0 //players can pick mutant bodyparts for humans before joining the game var/no_summon_guns //No var/no_summon_magic //Fun @@ -475,6 +476,8 @@ config.silicon_max_law_amount = text2num(value) if("join_with_mutant_race") config.mutant_races = 1 + if("join_with_mutant_humans") + config.mutant_humans = 1 if("assistant_cap") config.assistant_cap = text2num(value) if("starlight") diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index fc2e9c3263a..011fe1a6015 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -259,16 +259,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" -/* - else if("tail_human" in pref_species.mutant_bodyparts) - dat += "" - - dat += "

Tail

" - - dat += "[features["tail_human"]]
" - - dat += "" -*/ if("snout" in pref_species.mutant_bodyparts) dat += "" @@ -286,16 +276,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "[features["horns"]]
" dat += "" -/* - if("ears" in pref_species.mutant_bodyparts) - dat += "" - - dat += "

Ears

" - - dat += "[features["ears"]]
" - - dat += "" -*/ if("frills" in pref_species.mutant_bodyparts) dat += "" @@ -324,6 +304,26 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set dat += "" + if(config.mutant_humans) + + if("tail_human" in pref_species.mutant_bodyparts) + dat += "" + + dat += "

Tail

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

Ears

" + + dat += "[features["ears"]]
" + + dat += "" + dat += "" @@ -836,13 +836,13 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set 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("tail_human") var/new_tail new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list_human if(new_tail) features["tail_human"] = new_tail -*/ + if("snout") var/new_snout new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list @@ -854,13 +854,13 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in horns_list 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 7f04aa5b9ef..28dffc5bddc 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -188,10 +188,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["backbag"] >> backbag S["feature_mcolor"] >> features["mcolor"] S["feature_lizard_tail"] >> features["tail_lizard"] -// S["feature_human_tail"] >> features["tail_human"] + 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_human_ears"] >> features["ears"] S["feature_lizard_frills"] >> features["frills"] S["feature_lizard_spines"] >> features["spines"] S["feature_lizard_body_markings"] >> features["body_markings"] @@ -248,10 +248,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], tails_list_lizard) -// features["tail_human"] = sanitize_inlist(features["tail_human"], tails_list_human) + 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["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) diff --git a/config/game_options.txt b/config/game_options.txt index ff0e47dc246..e7d12f57dc6 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -249,9 +249,12 @@ DEFAULT_LAWS 1 ## Attempting to upload laws past this point will fail unless the AI is reset SILICON_MAX_LAW_AMOUNT 12 -## Uncoment to give players the choice of their species before they join the game +## Uncomment to give players the choice of their species before they join the game #JOIN_WITH_MUTANT_RACE +## Uncomment to give players the choice of joining as a human with mutant bodyparts before they join the game +#JOIN_WITH_MUTANT_HUMANS + ## Assistant slot cap. Set to -1 for unlimited. ASSISTANT_CAP -1