diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 8fdeaa0f9f..1fbee56db3 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -392,6 +392,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.dna.custom_species ? H.dna.custom_species : S.name]\n"
msg += "\tBase Species: [S.name]\n"
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index f15588a7f1..b97d009920 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 5124c5d62e..d2d0108cee 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 746d8ecabe..d6664d699b 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -719,19 +719,25 @@
/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
+ var/holycheck = ishumanbasic(C)
+ if(!(holycheck || islizard(C)) || reac_volume < 5) // implying xenohumans are holy //as with all things,
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")
+ 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)
+ 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 fb71bb483d..bdf1cf7c97 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -15,14 +15,6 @@
/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)
@@ -36,6 +28,31 @@
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
+ icon = 'sandcode/icons/mob/wings.dmi'
+
+/datum/sprite_accessory/wings_open/dragon
+ name = "Dragon"
+ icon_state = "dragon"
+ dimension_x = 96
+ center = TRUE
+ dimension_y = 32
+ icon = 'sandcode/icons/mob/wings.dmi'
+
// Decorative wings
/datum/sprite_accessory/deco_wings
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 837b4f73cf..84f3819e43 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -145,17 +145,17 @@
/mob/living/carbon/human/proc/OpenWings()
if(!dna || !dna.species)
return
- if(dna.species.mutant_bodyparts["wings"])
- dna.species.mutant_bodyparts["wingsopen"] = dna.species.mutant_bodyparts["wings"]
+ 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(dna.species.mutant_bodyparts["wingsopen"])
- dna.species.mutant_bodyparts["wings"] = dna.species.mutant_bodyparts["wingsopen"]
+ if("wingsopen" in dna.species.mutant_bodyparts)
dna.species.mutant_bodyparts -= "wingsopen"
+ dna.species.mutant_bodyparts |= "wings"
update_body()
if(isturf(loc))
var/turf/T = loc
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 154fc067ee..75ce9520c2 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1096,9 +1096,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 f2531f4369..664e8fc8b4 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -119,6 +119,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//the ids you can use for your species, if empty, it means default only and not changeable
var/list/allowed_limb_ids
+ //sandcode tg port, very special
+ var/flying_species = FALSE //is a flying species, just a check for some things
+ var/datum/action/innate/flight/fly //the actual flying ability given to flying species
+ var/wings_icon = "Angel" //the icon used for the wings
+
+
///////////
// PROCS //
///////////
@@ -364,6 +370,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(H.client && has_field_of_vision && CONFIG_GET(flag/use_field_of_vision))
H.LoadComponent(/datum/component/field_of_vision, H.field_of_vision_type)
+ //sandstorm code start -- tg port wings
+ if(flying_species && isnull(fly))
+ fly = new
+ fly.Grant(C)
+ //sandstorm code end -- tg port wings
+
C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod)
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
@@ -404,6 +416,19 @@ 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)
+ 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
+
SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src)
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
@@ -932,6 +957,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if((H.health < H.crit_threshold) && takes_crit_damage)
H.adjustBruteLoss(1)
+ //sandstorm code start -- tg port wings
+ if(flying_species)
+ HandleFlight(H)
+ //sandstorm code end -- tg port wings
+
/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
@@ -2126,12 +2156,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
////////////
-//Stun//
+// Stun //
////////////
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
+
+ if(flying_species && H.movement_type & FLYING)
+ ToggleFlight(H)
+ flyslip(H)
+
. = stunmod * H.physiology.stun_mod * amount
//////////////
@@ -2139,10 +2174,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//////////////
/datum/species/proc/space_move(mob/living/carbon/human/H)
- return 0
+ if(H.movement_type & FLYING)
+ return TRUE
+ return FALSE
/datum/species/proc/negates_gravity(mob/living/carbon/human/H)
- return 0
+ if(H.movement_type & FLYING)
+ return TRUE
+ return FALSE
////////////////
//Tail Wagging//
@@ -2176,3 +2215,103 @@ 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
+ if(isnull(fly))
+ fly = new
+ fly.Grant(H)
+ if(H.dna.features["wings"] != wings_icon)
+ mutant_bodyparts |= "wings"
+ 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))
+ 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/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
deleted file mode 100644
index 2cf054c7b9..0000000000
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ /dev/null
@@ -1,144 +0,0 @@
-/datum/species/angel
- name = "Angel"
- id = "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 = "human"
- skinned_type = /obj/item/stack/sheet/animalhide/human
- species_type = "human" //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.35
- 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()
\ No newline at end of file
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 9c01a15406..8ee91f30d6 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -30,6 +30,7 @@
tail_type = "tail_lizard"
wagging_type = "waggingtail_lizard"
species_type = "lizard"
+ wings_icon = "Dragon" //sandstorm code -- tg port wings
/datum/species/lizard/random_name(gender,unique,lastname)
if(unique)
diff --git a/sandcode/icons/mob/wings.dmi b/sandcode/icons/mob/wings.dmi
new file mode 100644
index 0000000000..587f9594a3
Binary files /dev/null and b/sandcode/icons/mob/wings.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 0c1f18f131..f21d62875e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2531,7 +2531,6 @@
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\species_types\abductors.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\bugmen.dm"
#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"