diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 0609b9dabe..f893ab3dfe 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) || is_species(A, /datum/species/mammal/synthetic)) diff --git a/code/__DEFINES/species.dm b/code/__DEFINES/species.dm index b1bcca8f64..60aeb57513 100644 --- a/code/__DEFINES/species.dm +++ b/code/__DEFINES/species.dm @@ -52,3 +52,14 @@ #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. +#define SPECIES_WINGS_ALL list("Angel","Dragon","Robotic","Fly","Skeleton","Megamoth","Mothra") //keep this updated diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 052f1437f1..0d46912a5a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -327,7 +327,7 @@ ADD_TRAIT(user, TRAIT_NODEATH, "memento_mori") ADD_TRAIT(user, TRAIT_NOHARDCRIT, "memento_mori") ADD_TRAIT(user, TRAIT_NOCRITDAMAGE, "memento_mori") - icon_state = "[initial(icon_state)]_active" //modular_sand edit + icon_state = "memento_mori_active" active_owner = user /obj/item/clothing/neck/necklace/memento_mori/proc/mori() @@ -695,24 +695,22 @@ /datum/reagent/flightpotion/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) var/mob/living/carbon/C = M - var/holycheck = ishumanbasic(C) - if(!(holycheck || islizard(C)) || reac_volume < 5) // implying xenohumans are holy //as with all things, + if(reac_volume < 5) if(method == INGEST && show_message) to_chat(C, "You feel nothing but a terrible aftertaste.") return ..() - - to_chat(C, "A terrible pain travels down your back as wings burst out!") - C.dna.species.GiveSpeciesFlight(C) - if(holycheck) - to_chat(C, "You feel blessed!") - ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) + 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") + var/has_functional_wings = (C.dna.species.mutant_bodyparts["wings"] != null) + to_chat(C, "A terrible pain travels down your back as [has_wings || has_functional_wings ? "your wings transform" : "wings burst out"]!") + C.dna.species.GiveSpeciesFlight(C, has_functional_wings ? TRUE : FALSE) //give them the full list of wing choices if this is their second flight potion + 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") ..() - /obj/item/jacobs_ladder name = "jacob's ladder" desc = "A celestial ladder that violates the laws of physics." 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 3893a0e54a..154ec4f53b 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,16 +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 - icon = 'icons/mob/wings.dmi' - relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) - /datum/sprite_accessory/wings/angel name = "Angel" icon_state = "angel" @@ -43,7 +43,6 @@ center = TRUE dimension_y = 32 locked = TRUE - icon = 'modular_sand/icons/mob/wings.dmi' /datum/sprite_accessory/wings_open/dragon name = "Dragon" @@ -51,7 +50,91 @@ dimension_x = 96 center = TRUE dimension_y = 32 - icon = 'modular_sand/icons/mob/wings.dmi' + +/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 @@ -60,6 +143,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" @@ -74,162 +161,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 @@ -237,67 +363,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 +/datum/sprite_accessory/insect_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 @@ -305,98 +450,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. @@ -470,9 +639,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/species.dm b/code/modules/mob/living/carbon/human/species.dm index a40fe4f9b2..692a7b9787 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -146,6 +146,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. @@ -506,6 +515,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) @@ -586,27 +599,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(F) qdel(F) - //sandstorm code start -- tg port wings if(flying_species) - fly.Remove(C) - QDEL_NULL(fly) if(C.movement_type & FLYING) ToggleFlight(C) + fly.Remove(C) + QDEL_NULL(fly) 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() - //sandstorm code end -- tg port wings if(ROBOTIC_LIMBS in species_traits) for(var/obj/item/bodypart/B in C.bodyparts) B.change_bodypart_status(initial(B.status), FALSE, TRUE) - if((TRAIT_ROBOTIC_ORGANISM in inherent_traits) && C.hud_used) - C.hud_used.coolant_display.clear() - - SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) // shamelessly inspired by antag_datum.remove_blacklisted_quirks() /datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C) @@ -1228,6 +1235,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return move_trail */ /datum/species/proc/spec_life(mob/living/carbon/human/H) + if(flying_species) //turns off flight automatically if they can't. + HandleFlight(H) if(HAS_TRAIT(H, TRAIT_NOBREATH)) H.setOxyLoss(0) H.losebreath = 0 @@ -2540,10 +2549,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) @@ -2600,20 +2612,53 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) 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 +/datum/species/proc/GiveSpeciesFlight(mob/living/carbon/human/H, all_wings = FALSE) + if(flying_species) //grant them the choice of all wings if they don't have them + all_wings = TRUE 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 + if(all_wings) //give them the full list of wing choices to pick from, typically if they drink a second flight potion + wingslist = SPECIES_WINGS_ALL + else + //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" + mutant_bodyparts["wings"] = wings_icon H.dna.features["wings"] = wings_icon H.update_body() @@ -2630,12 +2675,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) 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!") + 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!") @@ -2647,16 +2691,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) 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) @@ -2667,7 +2706,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //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)) + if(!(H.movement_type & FLYING) && CanFly(H)) stunmod *= 2 speedmod -= 0.35 H.setMovetype(H.movement_type | FLYING) @@ -2682,7 +2721,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) override_float = FALSE H.pass_flags &= ~PASSTABLE H.CloseWings() - update_species_slowdown(H) /datum/action/innate/flight name = "Toggle Flight" 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 c1ae4e34b5..e3fad9516b 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/anthropomorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm index b79c281b3b..c9af50de9d 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -57,4 +57,5 @@ exotic_bloodtype = "S" exotic_blood_color = BLOOD_COLOR_OIL 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 2d58861fa0..761274f255 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -20,6 +20,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 22c4e37aae..aa7ff820fc 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 7bb8db3e81..8bc39e43da 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 f7de3bcf0e..dae4baa4f4 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -35,6 +35,7 @@ exotic_bloodtype = "S" exotic_blood_color = BLOOD_COLOR_OIL species_category = SPECIES_CATEGORY_ROBOT + wings_icons = SPECIES_WINGS_ROBOT var/datum/action/innate/monitor_change/screen languagewhitelist = list("Encoded Audio Language") //Skyrat change - species language whitelist 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 37f3b92748..16a2bb67a5 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -30,6 +30,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) @@ -70,6 +71,7 @@ to_chat(H, "You feel drained!") if(H.blood_volume < (BLOOD_VOLUME_BAD*H.blood_ratio)) Cannibalize_Body(H) + ..() /datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H) var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs() 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 d0e27c0a7c..bd697ab7c8 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -30,7 +30,7 @@ tail_type = "tail_lizard" wagging_type = "waggingtail_lizard" species_category = SPECIES_CATEGORY_LIZARD - wings_icon = "Dragon" + 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 5d0b62e79d..00b3c57625 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -24,6 +24,7 @@ languagewhitelist = list("Calcic") //Skyrat change - species language whitelist 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 c56f875a59..f538a5d5d7 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -17,6 +17,7 @@ languagewhitelist = list("Shadowtongue") //Skyrat change - species language whitelist 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 1b20fa1f8e..d8162bbd7d 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 c091f75d8a..ec1fd86780 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -36,3 +36,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 e9f8b26239..04e48716df 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 f1eb454142..8ecb905e19 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/html/changelogs/AutoChangeLog-pr-15414.yml b/html/changelogs/AutoChangeLog-pr-15414.yml new file mode 100644 index 0000000000..b483e8437c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15414.yml @@ -0,0 +1,5 @@ +author: "BlueWildrose and tralezab, Wjohnston, Mey Ha Zah, ArcaneDefense, Jack7D1, Papaporo, Sheits & Mqiib from TG and Yog" +delete-after: True +changes: + - rscadd: "TG wing port - All species can now use flight potions and grow wings. Your wing sprite will be based off of what wings you have on your character, or otherwise what species you are if you have no wings." + - bugfix: "Jellypeople did not call the species parent proc on spec_life. Fixed." 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