Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion code/game/objects/items/storage/backpack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,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"
Expand Down
1 change: 0 additions & 1 deletion code/modules/clothing/spacesuits/miscellaneous.dm
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,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)

//ERT Janitor
/obj/item/clothing/head/helmet/space/hardsuit/ert/jani
Expand Down
24 changes: 16 additions & 8 deletions code/modules/mining/lavaland/necropolis_chests.dm
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,7 @@
/obj/item/reagent_containers/glass/bottle/potion/flight/syndicate
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "potionflask"

/obj/item/reagent_containers/glass/bottle/potion/flight
name = "strange elixir"
desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'."
Expand All @@ -602,16 +602,24 @@

/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, "<span class='notice'><i>You feel nothing but a terrible aftertaste.</i></span>")
to_chat(C, "<span class='notice'><i>You feel nothing but a terrible aftertaste.</i></span>")
return ..()

to_chat(M, "<span class='userdanger'>A terrible pain travels down your back as wings burst out!</span>")
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, "<span class='userdanger'>A terrible pain travels down your back as wings burst out!</span>")
C.dna.species.GiveSpeciesFlight(C)
if(holycheck)
to_chat(C, "<span class='notice'>You feel blessed!</span>")
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
if(islizard(C))
to_chat(C, "span class='notice'>You feel blessed... by... something?</span>")
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
playsound(C.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1)
C.adjustBruteLoss(20)
C.emote("scream")
..()


Expand Down
25 changes: 20 additions & 5 deletions code/modules/mob/dead/new_player/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1713,26 +1713,41 @@
/datum/sprite_accessory/wings_open
icon = 'icons/mob/wings.dmi'

/datum/sprite_accessory/wings_open/angel
/datum/sprite_accessory/wings
icon = 'icons/mob/wings.dmi'

/datum/sprite_accessory/wings/angel
name = "Angel"
icon_state = "angel"
color_src = 0
dimension_x = 46
center = TRUE
dimension_y = 34
locked = TRUE

/datum/sprite_accessory/wings
icon = 'icons/mob/wings.dmi'

/datum/sprite_accessory/wings/angel
/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/frills
icon = 'icons/mob/mutant_bodyparts.dmi'

Expand Down
3 changes: 0 additions & 3 deletions code/modules/mob/living/carbon/human/human.dm
Original file line number Diff line number Diff line change
Expand Up @@ -912,9 +912,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

Expand Down
132 changes: 129 additions & 3 deletions code/modules/mob/living/carbon/human/species.dm
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/list/special_step_sounds //Sounds to override barefeet walkng
var/grab_sound //Special sound for grabbing
var/screamsound //yogs - audio of a species' scream
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

// species-only traits. Can be found in DNA.dm
var/list/species_traits = list()
Expand Down Expand Up @@ -296,6 +299,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
for(var/datum/disease/A in C.diseases)
A.cure(FALSE)

if(flying_species && isnull(fly))
fly = new
fly.Grant(C)

C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING))

SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
Expand All @@ -317,6 +324,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
C.dna.mutation_index[location] = new_species.inert_mutation
C.dna.mutation_index[new_species.inert_mutation] = create_sequence(new_species.inert_mutation)

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()

C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES)

SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src)
Expand Down Expand Up @@ -737,6 +755,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/takes_crit_damage = (!HAS_TRAIT(H, TRAIT_NOCRITDAMAGE))
if((H.health < H.crit_threshold) && takes_crit_damage)
H.adjustBruteLoss(1)
if(flying_species)
HandleFlight(H)

/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H)
return
Expand Down Expand Up @@ -1672,21 +1692,28 @@ GLOBAL_LIST_EMPTY(roundstart_races)


////////////
//Stun//
// Stun //
////////////

/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
if(flying_species && H.movement_type & FLYING)
ToggleFlight(H)
flyslip(H)
. = stunmod * H.physiology.stun_mod * amount

//////////////
//Space Move//
//////////////

/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//
Expand All @@ -1701,3 +1728,102 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/start_wagging_tail(mob/living/carbon/human/H)

/datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H)

///////////////
//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, "<span class='warning'>The atmosphere is too thin for you to fly!</span>")
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, "<span class='notice'>Your wings spazz out and launch you!</span>")

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, "<span class='notice'>You settle gently back onto the ground...</span>")
else
to_chat(H, "<span class='notice'>You beat your wings and begin to hover gently above the ground...</span>")
H.set_resting(FALSE, TRUE)
Loading