diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 6443f2eb6eac..6b00a9c1ca5a 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -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" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f70a80096614..123db1db7d25 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -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 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 7375d1f4a2b4..27525db477ff 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -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'." @@ -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, "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) + if(islizard(C)) + to_chat(C, "span class='notice'>You feel blessed... by... something?") + ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) + 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.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index db125e581762..033a5729d3ef 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -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' diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 236cab44c2dc..ea524e01cff8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e2bb1061fb30..03203cf75eb7 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -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() @@ -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) @@ -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) @@ -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 @@ -1672,10 +1692,13 @@ 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 ////////////// @@ -1683,10 +1706,14 @@ GLOBAL_LIST_EMPTY(roundstart_races) ////////////// /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// @@ -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, "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) \ No newline at end of file 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 8f4ff118e022..000000000000 --- 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) - mutant_bodyparts = list("wings") - default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel") - use_skintones = 1 - no_equip = list(SLOT_BACK) - limbs_id = "human" - skinned_type = /obj/item/stack/sheet/animalhide/human - changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN - - 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(!("wings" in H.dna.species.mutant_bodyparts)) - H.dna.species.mutant_bodyparts |= "wings" - 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("wings" in H.dna.species.mutant_bodyparts) - 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(H.stat || !(H.mobility_flags & MOBILITY_STAND)) - return 0 - 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 0 - var/turf/T = get_turf(H) - if(!T) - return 0 - - 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 0 - else - return 1 - -/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,FALSE) - H.update_mobility() - else - to_chat(H, "You beat your wings and begin to hover gently above the ground...") - A.ToggleFlight(H,TRUE) - H.set_resting(FALSE, FALSE) - -/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 4cb25439d02d..ac9d78a7cf13 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -24,6 +24,7 @@ inert_mutation = FIREBREATH deathsound = 'sound/voice/lizard/deathsound.ogg' screamsound = 'yogstation/sound/voice/lizardperson/lizard_scream.ogg' //yogs - lizard scream + wings_icon = "Dragon" /datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.grant_language(/datum/language/draconic) diff --git a/icons/mob/moth_wings.dmi b/icons/mob/moth_wings.dmi new file mode 100644 index 000000000000..b05f3a528408 Binary files /dev/null and b/icons/mob/moth_wings.dmi differ diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi index b2990a150946..cc170ec24435 100644 Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ diff --git a/yogstation.dme b/yogstation.dme index 3e31da7b9afe..3490a984038f 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2064,7 +2064,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\corporate.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" #include "code\modules\mob\living\carbon\human\species_types\eggpeople.dm"