diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 9538cf91fa..d25845d770 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -76,7 +76,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
-#define isangel(A) (is_species(A, /datum/species/angel))
#define ismush(A) (is_species(A, /datum/species/mush))
#define isshadow(A) (is_species(A, /datum/species/shadow))
#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz))
diff --git a/code/__DEFINES/species.dm b/code/__DEFINES/species.dm
index 74ca459fa1..8a8f4d96c3 100644
--- a/code/__DEFINES/species.dm
+++ b/code/__DEFINES/species.dm
@@ -3,7 +3,6 @@
#define SPECIES_ABDUCTOR "abductor"
#define SPECIES_ANDROID "android"
-#define SPECIES_ANGEL "angel"
#define SPECIES_MAMMAL "mammal"
#define SPECIES_MAMMAL_SYNTHETIC "mammal_synthetic"
#define SPECIES_ARACHNID "arachnid"
@@ -53,3 +52,13 @@
#define SPECIES_CATEGORY_SHADOW "shadow"
#define SPECIES_CATEGORY_SKELETON "skeleton"
#define SPECIES_CATEGORY_UNDEAD "undead"
+
+
+//Species Wing Type Defines ----------------------
+#define SPECIES_WINGS_ANGEL list("Angel")
+#define SPECIES_WINGS_DRAGON list("Dragon") //could also be considered demon wings or bat wings?
+#define SPECIES_WINGS_ROBOT list("Robotic")
+#define SPECIES_WINGS_INSECT list("Fly") //"hey when can we have something besides giant fly wings?" "when you sprite it!"
+#define SPECIES_WINGS_SKELETAL list("Skeleton")
+#define SPECIES_WINGS_MOTH list("Megamoth","Mothra")
+#define SPECIES_WINGS_JELLY list("Angel") //no actual slime wings present right now, but I'm making this in the event someone wants to sprite slime wings.
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 3ded0310dd..a01507e6bc 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -380,6 +380,8 @@ GENETICS SCANNER
mutant = TRUE
else if (S.mutantstomach != initial(S.mutantstomach))
mutant = TRUE
+ else if (S.flying_species != initial(S.flying_species))
+ mutant = TRUE
msg += "\tReported Species: [H.spec_trait_examine_font()][H.dna.custom_species ? H.dna.custom_species : S.name]\n"
msg += "\tBase Species: [H.spec_trait_examine_font()][S.name]\n"
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 8a3eedca4b..b75bd81af8 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -53,7 +53,6 @@
desc = "A satchel that opens into a localized pocket of Blue Space."
icon_state = "holdingsat"
item_state = "holdingsat"
- species_exception = list(/datum/species/angel)
/obj/item/storage/backpack/holding/duffel
name = "duffel bag of holding"
@@ -190,7 +189,6 @@
name = "satchel"
desc = "A trendy looking satchel."
icon_state = "satchel-norm"
- species_exception = list(/datum/species/angel) //satchels can be equipped since they are on the side, not back
/obj/item/storage/backpack/satchel/leather
name = "leather satchel"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index c944b2aa1f..f51593b590 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -234,7 +234,6 @@ Contains:
icon_state = "ert_medical"
item_state = "ert_medical"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/med
- species_exception = list(/datum/species/angel)
//Red alert ERT
@@ -296,7 +295,6 @@ Contains:
icon_state = "ert_medical-alert"
item_state = "ert_medical-alert"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/med
- species_exception = list(/datum/species/angel)
/obj/item/clothing/suit/space/eva
name = "EVA suit"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index b005822438..0f91437bd6 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -694,16 +694,19 @@
/datum/reagent/flightpotion/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(iscarbon(M) && M.stat != DEAD)
- if(!ishumanbasic(M) || reac_volume < 5) // implying xenohumans are holy
+ var/mob/living/carbon/C = M
+ if(reac_volume < 5)
if(method == INGEST && show_message)
- to_chat(M, "You feel nothing but a terrible aftertaste.")
+ to_chat(C, "You feel nothing but a terrible aftertaste.")
return ..()
-
- to_chat(M, "A terrible pain travels down your back as wings burst out!")
- M.set_species(/datum/species/angel)
- playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
- M.adjustBruteLoss(20)
- M.emote("scream")
+ var/has_wings = (C.dna.species.mutant_bodyparts["deco_wings"] && C.dna.features["deco_wings"] != "None" || C.dna.species.mutant_bodyparts["insect_wings"] && C.dna.features["insect_wings"] != "None")
+ to_chat(C, "A terrible pain travels down your back as [has_wings ? "your wings transform" : "wings burst out"]!")
+ C.dna.species.GiveSpeciesFlight(C)
+ to_chat(C, "You feel blessed!")
+ ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) //implying anyone is truly holy in a setting where people throw tantrums when things aren't violent
+ playsound(C.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1)
+ C.adjustBruteLoss(20)
+ C.emote("scream")
..()
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index 800682b8cf..830808924b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -1,4 +1,8 @@
-//Angel Wings
+//Functional Wings
+
+/datum/sprite_accessory/wings
+ icon = 'icons/mob/wings_functional.dmi'
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/wings/none
name = "None"
@@ -9,23 +13,12 @@
return (!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
/datum/sprite_accessory/wings_open
- icon = 'icons/mob/wings.dmi'
+ icon = 'icons/mob/wings_functional.dmi'
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/wings_open/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)) || H.dna.species.mutant_bodyparts["wings"])
-/datum/sprite_accessory/wings_open/angel
- name = "Angel"
- icon_state = "angel"
- color_src = 0
- dimension_x = 46
- center = TRUE
- dimension_y = 34
-
-/datum/sprite_accessory/wings
- icon = 'icons/mob/wings.dmi'
- relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/wings/angel
name = "Angel"
@@ -36,6 +29,114 @@
dimension_y = 34
locked = TRUE
+/datum/sprite_accessory/wings_open/angel
+ name = "Angel"
+ icon_state = "angel"
+ color_src = 0
+ dimension_x = 46
+ center = TRUE
+ dimension_y = 34
+
+/datum/sprite_accessory/wings/dragon
+ name = "Dragon"
+ icon_state = "dragon"
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/dragon
+ name = "Dragon"
+ icon_state = "dragon"
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
+/datum/sprite_accessory/wings/megamoth
+ name = "Megamoth"
+ icon_state = "megamoth"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/megamoth
+ name = "Megamoth"
+ icon_state = "megamoth"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
+/datum/sprite_accessory/wings/mothra
+ name = "Mothra"
+ icon_state = "mothra"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/mothra
+ name = "Mothra"
+ icon_state = "mothra"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
+/datum/sprite_accessory/wings/skeleton
+ name = "Skeleton"
+ icon_state = "skele"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/skeleton
+ name = "Skeleton"
+ icon_state = "skele"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
+/datum/sprite_accessory/wings/robotic
+ name = "Robotic"
+ icon_state = "robotic"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/robotic
+ name = "Robotic"
+ icon_state = "robotic"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
+/datum/sprite_accessory/wings/fly
+ name = "Fly"
+ icon_state = "fly"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ locked = TRUE
+
+/datum/sprite_accessory/wings_open/fly
+ name = "Fly"
+ icon_state = "fly"
+ color_src = FALSE
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+
// Decorative wings
/datum/sprite_accessory/deco_wings
@@ -43,6 +144,10 @@
color_src = WINGCOLOR
mutant_part_string = "insect_wings"
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ var/list/upgrade_to = list() //What the wings change to if the mob consumes a flight potion or gains true wings through other means. If it's an empty list, it will pick the species alternative instead.
+
+/datum/sprite_accessory/deco_wings/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
+ return (H.dna.features["wings"] != "None") //true wings will override decorative wings
/datum/sprite_accessory/deco_wings/none
name = "None"
@@ -57,162 +162,201 @@
center = TRUE
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
+ upgrade_to = SPECIES_WINGS_ANGEL //obviously
//nonmoth wings
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/deco_wings/bee
name = "Bee"
icon_state = "bee"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/deco_wings/bee2
name = "Small Bee"
icon_state = "beewings"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/deco_wings/dragon
name = "Dragon"
icon_state = "dragon"
+ upgrade_to = SPECIES_WINGS_DRAGON //lol
/datum/sprite_accessory/deco_wings/dragonfly
name = "Dragonfly"
icon_state = "dragonfly"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
+ upgrade_to = SPECIES_WINGS_INSECT //rip people's sparkly wings until someone sprites in some huge fairy wings or something
/datum/sprite_accessory/deco_wings/featheredwing
name = "Feathery"
icon_state = "feathery"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/deco_wings/featheredwingmedium
name = "Medium Feathered"
icon_state = "feathered3"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/deco_wings/featheredwinglarge
name = "Large Feathered"
icon_state = "feathered2"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/deco_wings/harpywings
name = "Harpy"
icon_state = "harpywings"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/deco_wings/roboticwing
name = "Robotic"
icon_state = "drago"
+ upgrade_to = SPECIES_WINGS_ROBOT
/datum/sprite_accessory/deco_wings/succubusblack
name = "Succubus Black"
icon_state = "succubusblack"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/deco_wings/succubuspurple
name = "Succubus Purple"
icon_state = "succubuspurple"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/deco_wings/succubusred
name = "Succubus Red"
icon_state = "succubusred"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/deco_wings/xenobackplate
name = "Xenomorph Backplate"
icon_state = "snagbackplate"
+ upgrade_to = list()
//moth wings
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/brown
name = "Brown"
icon_state = "brown"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/featherymoth
name = "Feathery Moth Wings"
icon_state = "featherymoth"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/gothic
name = "Gothic"
icon_state = "gothic"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/jungle
name = "Jungle"
icon_state = "jungle"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/lovers
name = "Lovers"
icon_state = "lovers"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/luna
name = "Luna"
icon_state = "luna"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/monarch
name = "Monarch"
icon_state = "monarch"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/plain
name = "Plain"
icon_state = "plain"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/plasmafire
name = "Plasma Fire"
icon_state = "plasmafire"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/poison
name = "Poison"
icon_state = "poison"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/punished
name = "Burnt Off"
icon_state = "punished"
+ upgrade_to = SPECIES_WINGS_MOTH //through TG code moth wings aren't meant to get upgraded if they're burnt off but...
/datum/sprite_accessory/deco_wings/ragged
name = "Ragged"
icon_state = "ragged"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/reddish
name = "Reddish"
icon_state = "redish"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/rosy
name = "Rosy"
icon_state = "rosy"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/royal
name = "Royal"
icon_state = "royal"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/snow
name = "Snow"
icon_state = "snow"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/deco_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
+ upgrade_to = SPECIES_WINGS_MOTH
//INSECT WINGS
@@ -220,67 +364,86 @@
icon = 'icons/mob/wings.dmi'
color_src = WINGCOLOR
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ var/list/upgrade_to = list()
+
+/datum/sprite_accessory/insect_wings/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
+ return (H.dna.features["wings"] != "None") //true wings will override decorative wings
//non insect wings
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/insect_wings/bee
name = "Bee"
icon_state = "bee"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/insect_wings/bee2
name = "Small Bee"
icon_state = "beewings"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/insect_wings/dragon
name = "Dragon"
icon_state = "dragon"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/insect_wings/dragonfly
name = "Dragonfly"
icon_state = "dragonfly"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
+ upgrade_to = SPECIES_WINGS_INSECT
/datum/sprite_accessory/insect_wings/featheredwing
name = "Feathery"
icon_state = "feathery"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/insect_wings/featheredwingmedium
name = "Medium Feathered"
icon_state = "feathered3"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/insect_wings/featheredwinglarge
name = "Large Feathered"
icon_state = "feathered2"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/insect_wings/harpywings
name = "Harpy"
icon_state = "harpywings"
+ upgrade_to = SPECIES_WINGS_ANGEL
/datum/sprite_accessory/insect_wings/roboticwing
name = "Robotic"
icon_state = "drago"
+ upgrade_to = SPECIES_WINGS_ROBOT
/datum/sprite_accessory/insect_wings/succubusblack
name = "Succubus Black"
icon_state = "succubusblack"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/insect_wings/succubuspurple
name = "Succubus Purple"
icon_state = "succubuspurple"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/insect_wings/succubusred
name = "Succubus Red"
icon_state = "succubusred"
+ upgrade_to = SPECIES_WINGS_DRAGON
/datum/sprite_accessory/insect_wings/xenobackplate
name = "Xenomorph Backplate"
icon_state = "snagbackplate"
+ upgrade_to = list()
//moth wings
@@ -288,98 +451,122 @@
name = "None"
icon_state = "none"
relevant_layers = null
+ upgrade_to = list()
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/brown
name = "Brown"
icon_state = "brown"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/featherymoth
name = "Feathery Moth Wings"
icon_state = "featherymoth"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/gothic
name = "Gothic"
icon_state = "gothic"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/jungle
name = "Jungle"
icon_state = "jungle"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/luna
name = "Luna"
icon_state = "luna"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/monarch
name = "Monarch"
icon_state = "monarch"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/plasmafire
name = "Plasma Fire"
icon_state = "plasmafire"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/poison
name = "Poison"
icon_state = "poison"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/punished
name = "Burnt Off"
icon_state = "punished"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/ragged
name = "Ragged"
icon_state = "ragged"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/reddish
name = "Reddish"
icon_state = "redish"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/rosy
name = "Rosy"
icon_state = "rosy"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/royal
name = "Royal"
icon_state = "royal"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/snow
name = "Snow"
icon_state = "snow"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
+ upgrade_to = SPECIES_WINGS_MOTH
/datum/sprite_accessory/insect_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
+ upgrade_to = SPECIES_WINGS_MOTH
//insect markings
/datum/sprite_accessory/insect_markings // Extra markings for insects ported from tg.
@@ -453,9 +640,11 @@
/datum/sprite_accessory/deco_wings/eyestalks
name = "gazer eyestalks"
icon_state = "eyestalks"
+ upgrade_to = list() //and suddenly flight potions become a lot more awkward when they gouge your tentacle eyes out.
//ckeys_allowed = list("liquidfirefly","seiga") //At request.
/datum/sprite_accessory/insect_wings/eyestalks
name = "gazer eyestalks"
icon_state = "eyestalks"
+ upgrade_to = list()
//ckeys_allowed = list("liquidfirefly","seiga") //At request.
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8669a1458a..9e5669e8a7 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1124,9 +1124,6 @@
/mob/living/carbon/human/species/android
race = /datum/species/android
-/mob/living/carbon/human/species/angel
- race = /datum/species/angel
-
/mob/living/carbon/human/species/corporate
race = /datum/species/corporate
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3976b1ebca..9a6cd477ad 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -138,6 +138,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/// A path to an outfit that is important for species life e.g. plasmaman outfit
var/datum/outfit/outfit_important_for_life
+ ///Is this species a flying species? Used as an easy check for some things
+ var/flying_species = FALSE
+ ///The actual flying ability given to flying species
+ var/datum/action/innate/flight/fly
+ ///Current wings icon
+ var/wings_icon = "Angel"
+ //Dictates which wing icons are allowed for a given species. If count is >1 a radial menu is used to choose between all icons in list
+ var/list/wings_icons = SPECIES_WINGS_ANGEL
+
///Species-only traits. Can be found in [code/__DEFINES/DNA.dm]
var/list/species_traits = list(HAS_FLESH,HAS_BONE) //by default they can scar and have bones/flesh unless set to something else
///Generic traits tied to having the species.
@@ -490,6 +499,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/datum/disease/A in C.diseases)
A.cure(FALSE)
+ if(flying_species && isnull(fly))
+ fly = new
+ fly.Grant(C)
+
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(NOGENITALS in H.dna.species.species_traits)
@@ -564,6 +577,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(F)
qdel(F)
+ if(flying_species)
+ fly.Remove(C)
+ QDEL_NULL(fly)
+ if(C.movement_type & FLYING)
+ C.setMovetype(C.movement_type & ~FLYING)
+ ToggleFlight(C,0)
+ if(C.dna && C.dna.species && (C.dna.features["wings"] == wings_icon))
+ if("wings" in C.dna.species.mutant_bodyparts)
+ C.dna.species.mutant_bodyparts -= "wings"
+ C.dna.features["wings"] = "None"
+ C.update_body()
if(ROBOTIC_LIMBS in species_traits)
for(var/obj/item/bodypart/B in C.bodyparts)
@@ -2356,10 +2380,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
////////////
-//Stun//
+// Stun //
////////////
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
+ if(flying_species && H.movement_type & FLYING)
+ ToggleFlight(H,0)
+ flyslip(H)
if(H)
stop_wagging_tail(H)
. = stunmod * H.physiology.stun_mod * amount
@@ -2406,3 +2433,127 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
mutant_bodyparts["spines"] = mutant_bodyparts["waggingspines"]
mutant_bodyparts -= "waggingspines"
H.update_body()
+
+///////////////
+//FLIGHT SHIT//
+///////////////
+
+/datum/species/proc/GiveSpeciesFlight(mob/living/carbon/human/H)
+ if(flying_species) //species that already have flying traits should not work with this proc
+ return
+ flying_species = TRUE
+ //CITADEL CHANGE: check if they already have wings, and "evolve" them based off of the wings they have. If they have none, use their species wings basis.
+ var/list/wingslist
+ //why the fuck do we have two different wing types anyways? they're literally almost both using the same wing shit too.
+ var/datum/sprite_accessory/deco_wings/D = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
+ var/datum/sprite_accessory/insect_wings/I = GLOB.insect_wings_list[H.dna.features["insect_wings"]]
+ if(mutant_bodyparts["deco_wings"] && D?.upgrade_to.len) //species check to see if they were allowed to have deco wings
+ wingslist = D.upgrade_to
+ else if(mutant_bodyparts["insect_wings"] && I?.upgrade_to.len) //species check to see if they were allowed to have insect wings
+ wingslist = I.upgrade_to
+ else
+ wingslist = wings_icons
+
+ if(wingslist.len > 1)
+ if(!H.client)
+ wings_icon = pick(wingslist)
+ else
+ var/list/wings = list()
+ for(var/W in wingslist)
+ var/datum/sprite_accessory/S = GLOB.wings_list[W] //Gets the datum for every wing this species has, then prompts user with a radial menu
+ var/image/img = image(icon = 'icons/mob/wings_functional.dmi', icon_state = "m_wingsopen_[S.icon_state]_BEHIND") //Process the HUD elements
+ img.transform *= 0.5
+ img.pixel_x = -32
+ if(wings[S.name])
+ stack_trace("Different wing types with repeated names. Please fix as this may cause issues.")
+ else
+ wings[S.name] = img
+ wings_icon = show_radial_menu(H, H, wings, tooltips = TRUE)
+ if(!wings_icon)
+ wings_icon = pick(wings_icons)
+ else
+ wings_icon = wingslist[1]
+ if(isnull(fly))
+ fly = new
+ fly.Grant(H)
+ if(H.dna.features["wings"] != wings_icon)
+ mutant_bodyparts["wings"] = wings_icon
+ H.dna.features["wings"] = wings_icon
+ H.update_body()
+
+/datum/species/proc/HandleFlight(mob/living/carbon/human/H)
+ if(H.movement_type & FLYING)
+ if(!CanFly(H))
+ ToggleFlight(H)
+ return FALSE
+ return TRUE
+ else
+ return FALSE
+
+/datum/species/proc/CanFly(mob/living/carbon/human/H)
+ if(H.stat || !(H.mobility_flags & MOBILITY_STAND))
+ return FALSE
+ if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
+ to_chat(H, "Your suit blocks your wings from extending!")
+ return FALSE
+ var/turf/T = get_turf(H)
+ if(!T)
+ return FALSE
+ var/datum/gas_mixture/environment = T.return_air()
+ if(environment && !(environment.return_pressure() > 30))
+ to_chat(H, "The atmosphere is too thin for you to fly!")
+ return FALSE
+ else
+ return TRUE
+
+/datum/species/proc/flyslip(mob/living/carbon/human/H)
+ var/obj/buckled_obj
+ if(H.buckled)
+ buckled_obj = H.buckled
+ to_chat(H, "Your wings spazz out and launch you!")
+ playsound(H.loc, 'sound/misc/slip.ogg', 50, TRUE, -3)
+ for(var/obj/item/I in H.held_items)
+ H.accident(I)
+ var/olddir = H.dir
+ H.stop_pulling()
+ if(buckled_obj)
+ buckled_obj.unbuckle_mob(H)
+ step(buckled_obj, olddir)
+ else
+ new /datum/forced_movement(H, get_ranged_target_turf(H, olddir, 4), 1, FALSE, CALLBACK(H, /mob/living/carbon/.proc/spin, 1, 1))
+ return TRUE
+
+//UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly
+/datum/species/proc/ToggleFlight(mob/living/carbon/human/H)
+ if(!(H.movement_type & FLYING) && CanFly(H))
+ stunmod *= 2
+ speedmod -= 0.35
+ H.setMovetype(H.movement_type | FLYING)
+ override_float = TRUE
+ H.pass_flags |= PASSTABLE
+ H.OpenWings()
+ H.update_mobility()
+ else
+ stunmod *= 0.5
+ speedmod += 0.35
+ H.setMovetype(H.movement_type & ~FLYING)
+ override_float = FALSE
+ H.pass_flags &= ~PASSTABLE
+ H.CloseWings()
+
+/datum/action/innate/flight
+ name = "Toggle Flight"
+ check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "flight"
+
+/datum/action/innate/flight/Activate()
+ var/mob/living/carbon/human/H = owner
+ var/datum/species/S = H.dna.species
+ if(S.CanFly(H))
+ S.ToggleFlight(H)
+ if(!(H.movement_type & FLYING))
+ to_chat(H, "You settle gently back onto the ground...")
+ else
+ to_chat(H, "You beat your wings and begin to hover gently above the ground...")
+ H.set_resting(FALSE, TRUE)
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 3c6a2a8e13..d9edfc240d 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -12,3 +12,4 @@
species_language_holder = /datum/language_holder/synthetic
limbs_id = SPECIES_SYNTH
species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
deleted file mode 100644
index 977e8aaab3..0000000000
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ /dev/null
@@ -1,145 +0,0 @@
-/datum/species/angel
- name = "Angel"
- id = SPECIES_ANGEL
- default_color = "FFFFFF"
- species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,HAS_FLESH,HAS_BONE)
- mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "Angel")
- use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
- no_equip = list(SLOT_BACK)
- blacklisted = 1
- limbs_id = SPECIES_HUMAN
- skinned_type = /obj/item/stack/sheet/animalhide/human
- species_category = SPECIES_CATEGORY_BASIC //they're a kind of human
-
- var/datum/action/innate/flight/fly
-
-/datum/species/angel/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- ..()
- if(H.dna && H.dna.species && (H.dna.features["wings"] != "Angel"))
- if(!H.dna.species.mutant_bodyparts["wings"])
- H.dna.species.mutant_bodyparts["wings"] = "Angel"
- H.dna.features["wings"] = "Angel"
- H.update_body()
- if(ishuman(H) && !fly)
- fly = new
- fly.Grant(H)
- ADD_TRAIT(H, TRAIT_HOLY, SPECIES_TRAIT)
-
-/datum/species/angel/on_species_loss(mob/living/carbon/human/H)
- if(fly)
- fly.Remove(H)
- if(H.movement_type & FLYING)
- H.setMovetype(H.movement_type & ~FLYING)
- ToggleFlight(H,0)
- if(H.dna && H.dna.species && (H.dna.features["wings"] == "Angel"))
- if(H.dna.species.mutant_bodyparts["wings"])
- H.dna.species.mutant_bodyparts -= "wings"
- H.dna.features["wings"] = "None"
- H.update_body()
- REMOVE_TRAIT(H, TRAIT_HOLY, SPECIES_TRAIT)
- ..()
-
-/datum/species/angel/spec_life(mob/living/carbon/human/H)
- HandleFlight(H)
-
-/datum/species/angel/proc/HandleFlight(mob/living/carbon/human/H)
- if(H.movement_type & FLYING)
- if(!CanFly(H))
- ToggleFlight(H,0)
- return 0
- return 1
- else
- return 0
-
-/datum/species/angel/proc/CanFly(mob/living/carbon/human/H)
- if(!CHECK_MOBILITY(H, MOBILITY_MOVE))
- return FALSE
- if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
- to_chat(H, "Your suit blocks your wings from extending!")
- return FALSE
- var/turf/T = get_turf(H)
- if(!T)
- return FALSE
-
- var/datum/gas_mixture/environment = T.return_air()
- if(environment && !(environment.return_pressure() > 30))
- to_chat(H, "The atmosphere is too thin for you to fly!")
- return FALSE
- return TRUE
-
-/datum/action/innate/flight
- name = "Toggle Flight"
- check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_STUN
- icon_icon = 'icons/mob/actions/actions_items.dmi'
- button_icon_state = "flight"
-
-/datum/action/innate/flight/Activate()
- var/mob/living/carbon/human/H = owner
- var/datum/species/angel/A = H.dna.species
- if(A.CanFly(H))
- if(H.movement_type & FLYING)
- to_chat(H, "You settle gently back onto the ground...")
- A.ToggleFlight(H,0)
- H.update_mobility()
- else
- to_chat(H, "You beat your wings and begin to hover gently above the ground...")
- H.set_resting(FALSE, TRUE)
- A.ToggleFlight(H,1)
- H.update_mobility()
-
-/datum/species/angel/proc/flyslip(mob/living/carbon/human/H)
- var/obj/buckled_obj
- if(H.buckled)
- buckled_obj = H.buckled
-
- to_chat(H, "Your wings spazz out and launch you!")
-
- playsound(H.loc, 'sound/misc/slip.ogg', 50, 1, -3)
-
- for(var/obj/item/I in H.held_items)
- H.accident(I)
-
- var/olddir = H.dir
-
- H.stop_pulling()
- if(buckled_obj)
- buckled_obj.unbuckle_mob(H)
- step(buckled_obj, olddir)
- else
- for(var/i=1, i<5, i++)
- spawn (i)
- step(H, olddir)
- H.spin(1,1)
- return 1
-
-
-/datum/species/angel/spec_stun(mob/living/carbon/human/H,amount)
- if(H.movement_type & FLYING)
- ToggleFlight(H,0)
- flyslip(H)
- . = ..()
-
-/datum/species/angel/negates_gravity(mob/living/carbon/human/H)
- if(H.movement_type & FLYING)
- return 1
-
-/datum/species/angel/space_move(mob/living/carbon/human/H)
- if(H.movement_type & FLYING)
- return 1
-
-/datum/species/angel/proc/ToggleFlight(mob/living/carbon/human/H,flight)
- if(flight && CanFly(H))
- stunmod = 2
- speedmod = -0.1
- H.setMovetype(H.movement_type | FLYING)
- override_float = TRUE
- H.pass_flags |= PASSTABLE
- H.OpenWings()
- else
- stunmod = 1
- speedmod = 0
- H.setMovetype(H.movement_type & ~FLYING)
- override_float = FALSE
- H.pass_flags &= ~PASSTABLE
- H.CloseWings()
- update_species_slowdown(H)
diff --git a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
index df129c6ff4..dba0035adc 100644
--- a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
+++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
@@ -48,4 +48,5 @@
miss_sound = 'sound/weapons/slashmiss.ogg'
allowed_limb_ids = list("mammal","aquatic","avian", "human")
- species_category = "robot"
+ species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
index 454625cf36..7495e2500e 100644
--- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
@@ -21,6 +21,7 @@
var/web_cooldown = 200
var/web_ready = TRUE
var/spinner_rate = 25
+ wings_icons = SPECIES_WINGS_MOTH //Arachnids' phylum is arthropods, which include butterflies. Might as well hit them with moth wings.
/datum/species/arachnid/random_name(gender,unique,lastname)
if(unique)
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index f87f425b5f..df4abf864a 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -19,6 +19,7 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_category = SPECIES_CATEGORY_INSECT
+ wings_icons = SPECIES_WINGS_INSECT
allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm
index e9baa786da..48b5032129 100644
--- a/code/modules/mob/living/carbon/human/species_types/corporate.dm
+++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm
@@ -19,3 +19,4 @@
sexes = 0
gib_types = /obj/effect/gibspawner/robot
species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 7cd582d050..facc3dfd8d 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -16,6 +16,7 @@
has_field_of_vision = FALSE //Too much of a trouble, their vision is already bound to their severed head.
species_category = SPECIES_CATEGORY_UNDEAD
var/pumpkin = FALSE
+ wings_icons = SPECIES_WINGS_SKELETAL //seems suitable for an undead.
var/obj/item/dullahan_relay/myhead
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 5a185cbeb8..86720289fe 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -13,6 +13,7 @@
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
species_category = SPECIES_CATEGORY_INSECT
+ wings_icons = SPECIES_WINGS_INSECT
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(istype(chem, /datum/reagent/toxin/pestkiller))
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index eb870f9624..a5de47258c 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -29,6 +29,7 @@
exotic_bloodtype = "HF"
exotic_blood_color = BLOOD_COLOR_OIL
species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
var/datum/action/innate/monitor_change/screen
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 04c69a4138..db2e574d72 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -29,6 +29,7 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_category = SPECIES_CATEGORY_JELLY
+ wings_icons = SPECIES_WINGS_JELLY
ass_image = 'icons/ass/assslime.png'
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 07fa78a88a..ef8fd35c45 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -29,6 +29,7 @@
tail_type = "tail_lizard"
wagging_type = "waggingtail_lizard"
species_category = SPECIES_CATEGORY_LIZARD
+ wings_icons = SPECIES_WINGS_DRAGON
ass_image = 'icons/ass/asslizard.png'
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 547d017c23..9c29856084 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -23,6 +23,7 @@
outfit_important_for_life = /datum/outfit/plasmaman
species_category = SPECIES_CATEGORY_SKELETON
+ wings_icons = SPECIES_WINGS_SKELETAL
ass_image = 'icons/ass/assplasma.png'
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 4c82a25b4b..bfef310cdf 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -16,6 +16,7 @@
mutanteyes = /obj/item/organ/eyes/night_vision
species_category = SPECIES_CATEGORY_SHADOW
+ wings_icons = SPECIES_WINGS_SKELETAL //not sure what's more spooky for these guys - skeleton or dragon?
/datum/species/shadow/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 8175f505fa..5a927397fb 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -16,6 +16,7 @@
burnmod = 1.25
species_category = SPECIES_CATEGORY_SKELETON //they have their own category that's disassociated from undead, paired with plasmapeople
+ wings_icons = SPECIES_WINGS_SKELETAL
/datum/species/skeleton/New()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) //skeletons are stronger during the spooky season!
diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
index b6a7e93c72..0d29add33a 100644
--- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
@@ -28,3 +28,4 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 91711b5c39..316b129ee8 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -18,6 +18,7 @@
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
species_language_holder = /datum/language_holder/synthetic
species_category = SPECIES_CATEGORY_ROBOT
+ wings_icons = SPECIES_WINGS_ROBOT
/datum/species/synth/military
name = "Military Synth"
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index e708835ed1..3e54a4e638 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -15,8 +15,10 @@
skinned_type = /obj/item/stack/sheet/animalhide/human
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
species_category = SPECIES_CATEGORY_UNDEAD
+ wings_icons = SPECIES_WINGS_DRAGON //closest to "bat" wings.
var/batform_enabled = TRUE
+
/datum/species/vampire/roundstart
id = SPECIES_VAMPIRE_WEAK
batform_enabled = FALSE
diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm
index d3249edd96..ffb8ac5a80 100644
--- a/code/modules/mob/living/carbon/human/species_types/xeno.dm
+++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm
@@ -17,3 +17,4 @@
disliked_food = JUNKFOOD
liked_food = GROSS | MEAT
species_category = SPECIES_CATEGORY_ALIEN
+ wings_icons = SPECIES_WINGS_DRAGON //most depictions of xenomorphs with wings are closest to this.
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 57a11481d7..0dc08eeedb 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -16,6 +16,7 @@
disliked_food = NONE
liked_food = GROSS | MEAT | RAW
species_category = SPECIES_CATEGORY_UNDEAD
+ wings_icons = SPECIES_WINGS_SKELETAL //eh.
/datum/species/zombie/notspaceproof
id = "notspaceproofzombie"
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 92de5c150c..49d9e4d4a8 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/mob/wings_functional.dmi b/icons/mob/wings_functional.dmi
new file mode 100644
index 0000000000..5d1a82a245
Binary files /dev/null and b/icons/mob/wings_functional.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 6b58f711bf..67b979f83e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2681,7 +2681,6 @@
#include "code\modules\mob\living\carbon\human\innate_abilities\limb_regeneration.dm"
#include "code\modules\mob\living\carbon\human\species_types\abductor.dm"
#include "code\modules\mob\living\carbon\human\species_types\android.dm"
-#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
#include "code\modules\mob\living\carbon\human\species_types\anthropomorph.dm"
#include "code\modules\mob\living\carbon\human\species_types\arachnid.dm"
#include "code\modules\mob\living\carbon\human\species_types\bugmen.dm"