diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 436b4c76c78..8468f237be7 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -22,6 +22,8 @@
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/wings, wings_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, wings_open_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 39c68439420..3cd1649b6db 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -64,9 +64,11 @@
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)
+ if(!wings_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_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)))
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "wings" = "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 5116c62e83e..52727a50626 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -25,6 +25,8 @@ 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/wings_list = list()
+var/global/list/wings_open_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 7ffb0c72eb0..4e10cc4a9bc 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -59,7 +59,7 @@ var/list/preferences_datums = list()
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_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "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", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
var/adminmusicvolume = 50
@@ -324,6 +324,15 @@ var/list/preferences_datums = list()
dat += ""
+ if("wings" in pref_species.mutant_bodyparts) //TODO: make specific body parts be toggleable via config or something.
+ dat += "
"
+
+ dat += "Wings"
+
+ dat += "[features["wings"]] "
+
+ dat += " | "
+
dat += ""
@@ -946,6 +955,12 @@ var/list/preferences_datums = list()
if(new_ears)
features["ears"] = new_ears
+ if("wings")
+ var/new_wings
+ new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in wings_list
+ if(new_wings)
+ features["wings"] = new_wings
+
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/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 600150027a8..be33b925595 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -129,6 +129,19 @@
if (!src.restrained())
message = "[src] flaps \his wings."
m_type = 2
+ if(((dna.features["wings"] != "None") && !("wings" in dna.species.mutant_bodyparts)))
+ OpenWings()
+ spawn(1)
+ CloseWings()
+
+ if ("wings")
+ if (!src.restrained())
+ if(dna && dna.species &&((dna.features["wings"] != "None") && ("wings" in dna.species.mutant_bodyparts)))
+ message = "[src] opens \his wings."
+ OpenWings()
+ else if(dna && dna.species &&((dna.features["wings"] != "None") && ("wingsopen" in dna.species.mutant_bodyparts)))
+ message = "[src] closes \his wings."
+ CloseWings()
if ("gasp","gasps")
if (miming)
@@ -383,4 +396,20 @@
if("waggingtail_human" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "waggingtail_human"
dna.species.mutant_bodyparts |= "tail_human"
+ update_body()
+
+/mob/living/carbon/human/proc/OpenWings()
+ if(!dna || !dna.species)
+ return
+ if("wings" in dna.species.mutant_bodyparts)
+ dna.species.mutant_bodyparts -= "wings"
+ dna.species.mutant_bodyparts |= "wingsopen"
+ update_body()
+
+/mob/living/carbon/human/proc/CloseWings()
+ if(!dna || !dna.species)
+ return
+ if("wings_open" in dna.species.mutant_bodyparts)
+ dna.species.mutant_bodyparts -= "wingsopen"
+ dna.species.mutant_bodyparts |= "wings"
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 638a318f7f0..2b3f1c1c4fb 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -366,6 +366,17 @@
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)))
bodyparts_to_add -= "ears"
+ if("wings" in mutant_bodyparts)
+ if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
+ bodyparts_to_add -= "wings"
+
+ if("wings_open" in mutant_bodyparts)
+ if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
+ bodyparts_to_add -= "wings_open"
+ else if ("wings" in mutant_bodyparts)
+ bodyparts_to_add -= "wings_open"
+
+
if(!bodyparts_to_add)
return
@@ -399,6 +410,10 @@
S = ears_list[H.dna.features["ears"]]
if("body_markings")
S = body_markings_list[H.dna.features["body_markings"]]
+ if("wings")
+ S = wings_list[H.dna.features["wings"]]
+ if("wingsopen")
+ S = wings_open_list[H.dna.features["wings"]]
if(!S || S.icon_state == "none")
continue
@@ -417,6 +432,7 @@
else
icon_string = "m_[bodypart]_[S.icon_state]_[layer]"
+ world.log << icon_string
I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
if(!(H.disabilities & HUSK))
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index df97e03d43b..ae3631a6c66 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -7,8 +7,8 @@
id = "human"
default_color = "FFFFFF"
specflags = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
- mutant_bodyparts = list("tail_human", "ears")
- default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None")
+ mutant_bodyparts = list("tail_human", "ears", "wings")
+ default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = 1
skinned_type = /obj/item/stack/sheet/animalhide/human
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 930d7a33a15..c5e022ca2a3 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1295,6 +1295,20 @@
hasinner = 1
color_src = HAIR
+/datum/sprite_accessory/wings/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/wings_open/angel
+ name = "Angel"
+ icon_state = "angel"
+ color_src = 0
+
+/datum/sprite_accessory/wings/angel
+ name = "Angel"
+ icon_state = "angel"
+ color_src = 0
+
/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 108699d328c..9e4d555ed72 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ