diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index f171be733e9..a80a9bb9ebd 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -13,6 +13,16 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
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/snouts, snouts_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, horns_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)
+
//Species
for(var/spath in typesof(/datum/species))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 20c38174275..01f8d00be82 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -36,6 +36,22 @@
if(FEMALE) return pick(socks_f)
else return pick(socks_list)
+/proc/random_features()
+ if(!tails_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, tails_list)
+ 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(!frills_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
+ if(!spines_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ 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)))
+
/proc/random_hair_style(gender)
switch(gender)
if(MALE) return pick(hair_styles_male_list)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 6271cceb754..c3bc1e7c1f8 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -18,6 +18,15 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
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/snouts_list = list()
+var/global/list/horns_list = list()
+var/global/list/frills_list = list()
+var/global/list/spines_list = list()
+var/global/list/animated_spines_list = list()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel")
//Female Uniforms
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 78728738681..ae0df9ac76d 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -260,7 +260,7 @@ var/record_id_num = 1001
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
L.fields["species"] = H.dna.species.type
- L.fields["mcolor"] = H.dna.mutant_color
+ L.fields["features"] = H.dna.features
L.fields["image"] = image
locked += L
return
@@ -272,7 +272,7 @@ var/record_id_num = 1001
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 7645552a3b8..60fa4a6ca9d 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -21,7 +21,7 @@
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
- var/mutant_color = "FFF" // What color you are if you have certain speciess
+ var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/list/mutations = list() //All mutations are from now on here
var/mob/living/carbon/holder
@@ -36,7 +36,7 @@
destination.dna.uni_identity = uni_identity
destination.dna.blood_type = blood_type
hardset_dna(destination, null, null, null, null, species)
- destination.dna.mutant_color = mutant_color
+ destination.dna.features = features
destination.dna.real_name = real_name
destination.dna.mutations = mutations
@@ -46,7 +46,7 @@
new_dna.uni_identity = uni_identity
new_dna.blood_type = blood_type
new_dna.species = new species.type
- new_dna.mutant_color = mutant_color
+ new_dna.features = features
new_dna.real_name = real_name
new_dna.mutations = mutations
@@ -131,7 +131,7 @@
spans |= M.get_spans()
return spans
-/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
+/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, features)
if(!ismonkey(owner) && !ishuman(owner))
return
if(!owner.dna)
@@ -143,8 +143,8 @@
owner.reagents.del_reagent(exotic_blood.id)
owner.dna.species = new mrace()
- if(mcolor)
- owner.dna.mutant_color = mcolor
+ if(features)
+ owner.dna.features = features
if(real_name)
owner.real_name = real_name
@@ -193,6 +193,7 @@
character.dna.uni_identity = character.dna.generate_uni_identity(character)
character.dna.struc_enzymes = character.dna.generate_struc_enzymes(character)
character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character)
+ character.dna.features = character.features
return character.dna
/proc/create_dna(mob/living/carbon/C, datum/species/S) //don't use this unless you're about to use hardset_dna or ready_dna
@@ -972,7 +973,7 @@
/datum/dna/proc/is_same_as(var/datum/dna/D)
if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
- if(species == D.species && mutant_color == D.mutant_color && blood_type == D.blood_type)
+ if(species == D.species && features == D.features && blood_type == D.blood_type)
return 1
return 0
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
index ccb60820159..264d0d3a445 100644
--- a/code/game/gamemodes/abduction/gland.dm
+++ b/code/game/gamemodes/abduction/gland.dm
@@ -213,7 +213,7 @@
/obj/effect/cocoon/abductor/proc/Copy(var/mob/living/carbon/human/H)
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
- hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.mutant_color)
+ hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm
index 3d79a64b56b..bfa6d9b2a53 100644
--- a/code/game/gamemodes/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/abduction/machinery/experiment.dm
@@ -43,7 +43,7 @@
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
else
photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
- photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+ photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY)
var/icon/eyes_s
if(EYECOLOR in H.dna.species.specflags)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 913b6dd295d..516a407cbef 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -92,7 +92,7 @@
new_dna.struc_enzymes = T.dna.struc_enzymes
new_dna.real_name = T.dna.real_name
new_dna.species = T.dna.species
- new_dna.mutant_color = T.dna.mutant_color
+ new_dna.features = T.dna.features
new_dna.blood_type = T.dna.blood_type
absorbedcount++
store_dna(new_dna, user)
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 936f3f47662..bbadbcd6cac 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -91,7 +91,7 @@
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "We stealthily sting [target.name]."
- hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.mutant_color)
+ hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
return 1
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 7b13ecf03da..2f57a81ebb7 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -17,8 +17,7 @@
user.dna = chosen_dna
user.real_name = chosen_dna.real_name
- hardset_dna(user, null, null, null, null, chosen_dna.species.type)
- user.dna.mutant_color = chosen_dna.mutant_color
+ hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
updateappearance(user)
domutcheck(user)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 00a8bde3ac0..adb2c039ce8 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -124,7 +124,7 @@
//Clonepod
//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/mcolor, var/factions)
+/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/list/features, var/factions)
if(panel_open)
return 0
if(mess || attempting)
@@ -185,7 +185,7 @@
H.ckey = ckey
H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?"
- hardset_dna(H, ui, se, null, null, mrace, mcolor)
+ hardset_dna(H, ui, se, null, null, mrace, features)
H.faction |= factions
H.set_cloned_appearance()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 68e5b03f423..ff893a987a0 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -35,7 +35,7 @@
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
- if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["mcolor"], R.fields["factions"]))
+ if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
@@ -329,7 +329,7 @@
temp = "Clonepod malfunction."
else if(!config.revival_cloning)
temp = "Unable to initiate cloning cycle."
- else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["mcolor"], C.fields["factions"]))
+ else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"]))
temp = "[C.fields["name"]] => Cloning cycle in progress..."
records.Remove(C)
if(active_record == C)
@@ -380,7 +380,7 @@
R.fields["UI"] = subject.dna.uni_identity
R.fields["SE"] = subject.dna.struc_enzymes
R.fields["blood_type"] = subject.dna.blood_type
- R.fields["mcolor"] = subject.dna.mutant_color
+ R.fields["features"] = subject.dna.features
R.fields["factions"] = subject.faction
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index ffe58681ab0..a5414196e9d 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -163,7 +163,7 @@
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- H.dna.mutant_color = sanitize_hexcolor(new_mutantcolor)
+ H.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
H << "Invalid color. Your color is not bright enough."
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 87ebd141d1d..8a455d9e69c 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -298,7 +298,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//DNA
if(record_found)//Pull up their name from database records if they did have a mind.
- hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["mcolor"])
+ hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
ready_dna(new_character)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 47cfb2c51db..4728a49daf9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -61,7 +61,8 @@ 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/mutant_color = "FFF" //Mutant race skin color
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -243,7 +244,61 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
dat += "
Alien Color
"
- dat += " Change
"
+ dat += " Change
"
+
+ dat += ""
+
+ if("tail" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Tail"
+
+ dat += "[features["tail"]] "
+
+ dat += " | "
+
+ if("snout" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Snout"
+
+ dat += "[features["snout"]] "
+
+ dat += " | "
+
+ if("horns" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Horns"
+
+ dat += "[features["horns"]] "
+
+ dat += " | "
+
+ if("frills" in pref_species.mutant_bodyparts)
+ dat += ""
+
+ dat += "Frills"
+
+ 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 += " | "
@@ -736,19 +791,54 @@ 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(mutant_color == "#000")
- mutant_color = pref_species.default_color
+ if(features["mcolor"] == "#000")
+ 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
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
- mutant_color = pref_species.default_color
+ features["mcolor"] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- mutant_color = sanitize_hexcolor(new_mutantcolor)
+ features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
user << "Invalid color. Your color is not bright enough."
+ if("tail")
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in tails_list
+ if(new_tail)
+ features["tail"] = new_tail
+
+ if("snout")
+ var/new_snout
+ new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snouts_list
+ if(new_snout)
+ features["snout"] = new_snout
+
+ if("horns")
+ var/new_horns
+ 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("frills")
+ var/new_frills
+ new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in frills_list
+ if(new_frills)
+ features["frills"] = new_frills
+
+ if("spines")
+ var/new_spines
+ new_spines = input(user, "Choose your character's spines:", "Character Preference") as null|anything in spines_list
+ if(new_spines)
+ features["spines"] = new_spines
+
+ if("body_markings")
+ var/new_body_markings
+ new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in body_markings_list
+ if(new_body_markings)
+ features["body_markings"] = new_body_markings
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
@@ -919,10 +1009,9 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
if(character.dna)
character.dna.real_name = character.real_name
if(pref_species != /datum/species/human && config.mutant_races)
- hardset_dna(character, null, null, null, null, pref_species.type)
+ hardset_dna(character, null, null, null, null, pref_species.type, features)
else
- hardset_dna(character, null, null, null, null, /datum/species/human)
- character.dna.mutant_color = mutant_color
+ hardset_dna(character, null, null, null, null, /datum/species/human, features)
character.update_mutcolor()
character.gender = gender
@@ -940,6 +1029,8 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
character.undershirt = undershirt
character.socks = socks
+ character.features = features
+
if(backbag > 3 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index f2da84ddd52..e4b0d1c0781 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -166,8 +166,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else
pref_species = new /datum/species/human()
- if(!S["mutant_color"] || S["mutant_color"] == "#000")
- S["mutant_color"] << "#FFF"
+ if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
+ S["features["mcolor"]"] << "#FFF"
//Character
S["OOC_Notes"] >> metadata
@@ -186,7 +186,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
- S["mutant_color"] >> mutant_color
+ S["features"] >> features
S["clown_name"] >> custom_names["clown"]
S["mime_name"] >> custom_names["mime"]
S["ai_name"] >> custom_names["ai"]
@@ -213,8 +213,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
- if(!mutant_color || mutant_color == "#000")
- mutant_color = "#FFF"
+ if(!features["mcolor"] || features["mcolor"] == "#000")
+ features["mcolor"] = "#FFF"
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
@@ -238,7 +238,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, skin_tones)
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
- mutant_color = sanitize_hexcolor(mutant_color, 3, 0)
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
+ features["tail"] = sanitize_inlist(features["tail"], tails_list)
+ features["snout"] = sanitize_inlist(features["snout"], snouts_list)
+ features["horns"] = sanitize_inlist(features["horns"], horns_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)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -279,7 +285,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] << socks
S["backbag"] << backbag
S["species"] << pref_species.name
- S["mutant_color"] << mutant_color
+ S["features"] << features
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 608414b38c2..57f0d0b7e0c 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -863,9 +863,9 @@
podman.ckey = ckey_holder
podman.gender = blood_gender
podman.faction |= factions
- if(!mutant_color)
- mutant_color = "#59CE00"
- hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,mutant_color)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
+ if(!features["mcolor"])
+ features["mcolor"] = "#59CE00"
+ hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
podman.set_cloned_appearance()
else //else, one packet of seeds. maybe two
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 05369322619..17f0e3a7eff 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -90,7 +90,7 @@
var/datum/mind/mind = null
var/blood_gender = null
var/blood_type = null
- var/mutant_color = null
+ var/list/features = null
var/factions = null
var/contains_sample = 0
@@ -104,7 +104,7 @@
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
- mutant_color = bloodSample.data["mutant_color"]
+ features = bloodSample.data["features"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
user << "You inject the contents of the syringe into the seeds."
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 4026083e1ac..50a9c2c47fe 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -9,6 +9,9 @@
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ var/list/features = list("mcolor" = "FFF", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+
+
//inventory slots
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index e8b46b5ca51..289fb8e5ee8 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -30,7 +30,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/proc/fixblood()
for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == "blood")
- B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"mutant_color"=null, "factions"=null)
+ B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"features"=null, "factions"=null)
/mob/living/carbon/human/proc/suppress_bloodloss(var/amount)
if(bleedsuppress)
@@ -172,7 +172,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B.data["blood_type"] = copytext(src.dna.blood_type,1,0)
B.data["gender"] = src.gender
B.data["real_name"] = src.real_name
- B.data["mutant_color"] = src.dna.mutant_color
+ B.data["features"] = src.dna.features
B.data["factions"] = src.faction
return B
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 1fda3b351f4..9a718fb01bc 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -355,7 +355,9 @@
return
if("tail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "tail"
+ dna.species.mutant_bodyparts -= "spines"
dna.species.mutant_bodyparts |= "waggingtail"
+ dna.species.mutant_bodyparts |= "waggingspines"
update_body()
@@ -364,5 +366,8 @@
return
if("waggingtail" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail"
+ dna.species.mutant_bodyparts -= "waggingspines"
dna.species.mutant_bodyparts |= "tail"
+ dna.species.mutant_bodyparts |= "spines"
+
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 caa356eb117..e9cee838880 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -113,7 +113,7 @@
spec_base = image("icon" = 'icons/mob/human.dmi', "icon_state" = icon_state_string, "layer" = -SPECIES_LAYER)
- spec_base.color = "#[H.dna.mutant_color]"
+ spec_base.color = "#[H.dna.features["mcolor"]]"
standing = spec_base
if(standing)
@@ -136,7 +136,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_facial_s.color = "#" + H.dna.mutant_color
+ img_facial_s.color = "#" + H.dna.features["mcolor"]
else
img_facial_s.color = "#" + hair_color
else
@@ -164,7 +164,7 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_hair_s.color = "#" + H.dna.mutant_color
+ img_hair_s.color = "#" + H.dna.features["mcolor"]
else
img_hair_s.color = "#" + hair_color
else
@@ -240,33 +240,75 @@
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail"
+
if("waggingtail" 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"
+ if("spines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "spines"
+
+ if("waggingspines" in mutant_bodyparts)
+ if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "waggingspines"
+ else if ("tail" in mutant_bodyparts)
+ bodyparts_to_add -= "waggingspines"
+
if("snout" in mutant_bodyparts) //Take a closer look at that snout!
if(H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE))
bodyparts_to_add -= "snout"
+ if("frills" in mutant_bodyparts)
+ if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS))
+ bodyparts_to_add -= "frills"
+
+ if("horns" in mutant_bodyparts)
+ 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(!bodyparts_to_add)
return
- var/icon_state_string = "[id]_"
var/g = (H.gender == FEMALE) ? "f" : "m"
- var/image/I
- if(sexes)
- icon_state_string += "[g]_s"
- else
- icon_state_string += "_s"
+ var/image/I
for(var/layer in relevent_layers)
for(var/bodypart in bodyparts_to_add)
- I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]", "layer" =- layer)
+ 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("spines")
+ S = spines_list[H.dna.features["spines"]]
+ if("waggingspines")
+ S.= animated_spines_list[H.dna.features["spines"]]
+ if("snout")
+ S = snouts_list[H.dna.features["snout"]]
+ if("frills")
+ S = frills_list[H.dna.features["frills"]]
+ if("horns")
+ S = horns_list[H.dna.features["horns"]]
+ if("body_markings")
+ S = body_markings_list[H.dna.features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ icon_string = "[id]_m_[bodypart]_[S.icon_state]_[layer]"
+
+ I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
+
if(!(H.disabilities & HUSK))
- I.color = "#[H.dna.mutant_color]"
+ 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 dd01e5a0420..79f84797b28 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -30,7 +30,7 @@
default_color = "00FF00"
roundstart = 1
specflags = list(MUTCOLORS,EYECOLOR,LIPS)
- mutant_bodyparts = list("tail", "snout")
+ mutant_bodyparts = list("tail", "snout", "spines", "horns", "frills", "body_markings")
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 5415474439d..e28dcc3adab 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -14,8 +14,10 @@
hair_color = random_short_color()
facial_hair_color = hair_color
eye_color = random_eye_color()
- pref_species = new /datum/species/human()
+ if(!pref_species)
+ pref_species = new /datum/species/human()
backbag = 2
+ features = random_features()
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous.
@@ -45,24 +47,9 @@
preview_icon = new /icon('icons/mob/human.dmi', "[skin_tone]_[g]_s")
else
preview_icon = new /icon('icons/mob/human.dmi', "[pref_species.id]_[g]_s")
- preview_icon.Blend("#[mutant_color]", ICON_MULTIPLY)
+ preview_icon.Blend("#[features["mcolor"]]", ICON_MULTIPLY)
var/datum/sprite_accessory/S
- if(underwear)
- S = underwear_list[underwear]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(undershirt)
- S = undershirt_list[undershirt]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
- if(socks)
- S = socks_list[socks]
- if(S)
- preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
-
var/icon/eyes_s = new/icon()
if(EYECOLOR in pref_species.specflags)
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[pref_species.eyes]_s")
@@ -90,10 +77,47 @@
for(var/layer in relevent_layers)
for(var/bodypart in pref_species.mutant_bodyparts)
- var/icon/part = new/icon("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]")
- part.Blend("#[mutant_color]", ICON_MULTIPLY)
+ switch(bodypart)
+ if("tail")
+ S = tails_list[features["tail"]]
+ if("spines")
+ S = spines_list[features["spines"]]
+ if("snout")
+ S = snouts_list[features["snout"]]
+ if("frills")
+ S = frills_list[features["frills"]]
+ if("horns")
+ S = horns_list[features["horns"]]
+ if("body_markings")
+ S = body_markings_list[features["body_markings"]]
+
+ if(!S || S.icon_state == "none")
+ continue
+ var/icon_string
+ if(S.gender_specific)
+ icon_string = "[pref_species.id]_[g]_[bodypart]_[S.icon_state]_[layer]"
+ else
+ 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)
preview_icon.Blend(part, ICON_OVERLAY)
+ if(underwear)
+ S = underwear_list[underwear]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(undershirt)
+ S = undershirt_list[undershirt]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
+ if(socks)
+ S = socks_list[socks]
+ if(S)
+ preview_icon.Blend(new /icon(S.icon, "[S.icon_state]_s"), ICON_OVERLAY)
+
var/icon/clothes_s = null
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 8b42ef1bcb8..c28d4fd705c 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -41,6 +41,7 @@
var/icon_state //the icon_state of the accessory
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
//////////////////////
// Hair Definitions //
@@ -1046,3 +1047,232 @@
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
+
+//////////.//////////////////
+// MutantParts Definitions //
+/////////////////////////////
+
+/datum/sprite_accessory/body_markings
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/body_markings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/body_markings/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/body_markings/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/body_markings/dtigerhead
+ name = "Dark Tiger Body + Head"
+ icon_state = "dtigerhead"
+
+/datum/sprite_accessory/body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/body_markings/ltigerhead
+ name = "Light Tiger Body + Head"
+ icon_state = "ltigerhead"
+
+/datum/sprite_accessory/body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+ gender_specific = 1
+
+/datum/sprite_accessory/tails
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails_animated/light
+ name = "Light"
+ icon_state = "light"
+
+/datum/sprite_accessory/tails/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails_animated/dstripe
+ name = "Dark Stripe"
+ icon_state = "dstripe"
+
+/datum/sprite_accessory/tails/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails_animated/lstripe
+ name = "Light Stripe"
+ icon_state = "lstripe"
+
+/datum/sprite_accessory/tails/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails_animated/club
+ name = "Club"
+ icon_state = "club"
+
+/datum/sprite_accessory/tails/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/tails_animated/aqua
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/snouts
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
+/datum/sprite_accessory/snouts/round
+ name = "Round"
+ icon_state = "round"
+
+/datum/sprite_accessory/snouts/sharplight
+ name = "Sharp + Light"
+ icon_state = "sharplight"
+
+/datum/sprite_accessory/snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+
+/datum/sprite_accessory/horns
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/horns/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/horns/curled
+ name = "Curled"
+ icon_state = "curled"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/angler
+ name = "Angeler"
+ icon_state = "angler"
+
+/datum/sprite_accessory/frills
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/frills/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/frills/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/frills/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines_animated
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/spines/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines_animated/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines_animated/long
+ name = "Long"
+ icon_state = "long"
+
+/datum/sprite_accessory/spines/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines_animated/longmeme
+ name = "Long + Membrane"
+ icon_state = "longmeme"
+
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
+
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
diff --git a/html/changelogs/Incoming5643-Lizard-Hypercustomization.yml b/html/changelogs/Incoming5643-Lizard-Hypercustomization.yml
new file mode 100644
index 00000000000..2851e7a2230
--- /dev/null
+++ b/html/changelogs/Incoming5643-Lizard-Hypercustomization.yml
@@ -0,0 +1,5 @@
+author: Incoming5643
+delete-after: True
+
+changes:
+ - rscadd: "Lizards can now choose from a wide varity of physical appearances in character creation! Sprites made by WJohn. Hiss Responsibly."
\ No newline at end of file
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index 7b47bec0962..8f924ee6632 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 6221fbad9e7..94acba1cbc5 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ