diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index d34b210b997..b15d0f2ba0d 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -145,6 +145,14 @@ var/const/enterloopsanity = 100
M.lastarea = get_area(M.loc)
if(M.lastarea.has_gravity == 0)
inertial_drift(M)
+ if(ishuman(M)) //VORESTATION Edit Start. This overwrites the above is_space without touching it all that much.
+ var/mob/living/carbon/human/H = M
+ if(H.wings_flying == 1)
+ inertial_drift(H)
+ M.make_floating(1)
+ else if(!is_space())
+ M.inertia_dir = 0
+ M.make_floating(0) //VOREStation Edit End.
else if(!is_space())
M.inertia_dir = 0
M.make_floating(0)
diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm
index 221777f56ad..4f05f7e0a81 100644
--- a/code/modules/mob/animations.dm
+++ b/code/modules/mob/animations.dm
@@ -86,7 +86,11 @@ note dizziness decrements automatically in the mob's Life() proc.
if(anchored||buckled)
make_floating(0)
return
-
+ if(ishuman(src)) //VOREStation Edit Start. Floating code.
+ var/mob/living/carbon/human/H = src
+ if(H.wings_flying == 1)
+ make_floating(1)
+ return //VOREStation Edit End
var/turf/turf = get_turf(src)
if(!istype(turf,/turf/space))
var/area/A = turf.loc
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index ffac791a1fd..592ee6a761e 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -40,6 +40,7 @@
//Handle species-specific deaths.
species.handle_death(src)
animate_tail_stop()
+ stop_flying() //VOREStation Edit.
//Handle snowflake ling stuff.
if(mind && mind.changeling)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d4b6e589128..fed5ea739b3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1207,7 +1207,10 @@
verbs |= /mob/living/carbon/human/proc/succubus_drain_finialize
verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
if(species.hard_vore_enabled == 1) //Hardvore verb.
- verbs |= /mob/living/carbon/human/proc/shred_limb //VOREStation Edit End
+ verbs |= /mob/living/carbon/human/proc/shred_limb
+ if(species.can_fly == 1)
+ verbs |= /mob/living/carbon/human/proc/wings_toggle //Flying wings!
+ //VOREStation Edit End
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
if(client && client.screen)
@@ -1447,6 +1450,8 @@
/mob/living/carbon/human/Check_Shoegrip()
if(shoes && (shoes.item_flags & NOSLIP) && istype(shoes, /obj/item/clothing/shoes/magboots)) //magboots + dense_object = no floating
return 1
+ if(wings_flying == 1) //VOREStation Edit. Checks to see if they have wings and are flying.
+ return 1 //VOREStation Edit.
return 0
//Puts the item into our active hand if possible. returns 1 on success.
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index d27aeb02d74..71fd0d7a617 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -5,6 +5,7 @@
var/can_drain_prey = 0 //Determines if the person can use the succubus drain or not.
var/hard_vore_enabled = 0 //Determines if the person has the hardvore verb or not.
var/metabolism = 0.0015
+ var/can_fly = 0 //Determines if the species can fly if they have wings.
/datum/species/custom
name = "Custom Species"
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index e1209352b1f..650c592fbc4 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -720,3 +720,21 @@
T.apply_damage(25, BRUTE, D)
C.visible_message("[C] severely damages [D] of [T]!") //Keep it vague. Let the /me's do the talking.
log_and_message_admins("shreded [D] of [T].", C)
+
+/mob/living/carbon/human/proc/wings_toggle()
+ set name = "Toggle Flight"
+ set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained. Can be toggled at any time."
+ set category = "Abilities"
+
+ var/mob/living/carbon/human/C = src
+ if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
+ to_chat(src, "You cannot fly without wings!!")
+ return
+ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
+ to_chat(src, "You cannot fly in this state!")
+ return
+
+
+ C.wings_flying = !C.wings_flying
+ update_floating()
+ to_chat(C, "You have [C.wings_flying?"started":"stopped"] flying.")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index e44ec37ad1c..33777448d5d 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -14,6 +14,7 @@
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
+ can_fly = 1 //They have wings by default.
num_alternate_languages = 2
secondary_langs = list("Sol Common")
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 0848d8701e9..bda09e92603 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -119,6 +119,7 @@
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = LANGUAGE_BIRDSONG
color_mult = 1
+ can_fly = 1
min_age = 18
max_age = 80
@@ -357,6 +358,7 @@ datum/species/harpy
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = null
color_mult = 1
+ can_fly = 1
min_age = 18
max_age = 80
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
index 6b6b4092bfb..5d12aeb8deb 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
@@ -119,3 +119,9 @@
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 50%"
cost = 1
var_changes = list("flash_mod" = 0.5)
+
+/datum/trait/winged_flight
+ name = "Winged Flight"
+ desc = "Allows you to fly by using your wings."
+ cost = 1 //Minor in game value.
+ var_changes = list("can_fly" = 1)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons_vr.dm b/code/modules/mob/living/carbon/human/update_icons_vr.dm
index b440cf0f004..056e600b80a 100644
--- a/code/modules/mob/living/carbon/human/update_icons_vr.dm
+++ b/code/modules/mob/living/carbon/human/update_icons_vr.dm
@@ -63,3 +63,9 @@
if(update_icons)
update_icons()
return
+
+/mob/living/carbon/human/proc/stop_flying(var/update_icons=1)
+ wings_flying = 0
+
+ if(update_icons)
+ update_icons()
\ No newline at end of file
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index ba05eec77e3..b68d3593e92 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -23,12 +23,12 @@
if(!istype(start))
to_chat(src, "You are unable to move from here.")
return 0
-
+
var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
if(!destination)
to_chat(src, "There is nothing of interest in this direction.")
return 0
-
+
if(!start.CanZPass(src, direction))
to_chat(src, "\The [start] is in the way.")
return 0
@@ -49,6 +49,23 @@
else
to_chat(src, "You gave up on pulling yourself up.")
return 0
+ else if(ishuman(src)) //VOREStation Edit Start. Are they human (H above.), have a wing style, and do they have the trait?
+ var/mob/living/carbon/human/H = src //VOREStation Edit. Used for below
+ if(H.wings_flying == 1)
+ if(H.stat || H.paralysis || H.stunned || H.weakened || H.lying || H.restrained() || H.buckled)
+ to_chat(src, "You can't fly in your current state.")
+ return 0
+ var/fly_time = max(7 SECONDS + (H.movement_delay() * 10), 1) //So it's not too useful for combat.
+ to_chat(src, "You begin to fly upwards...")
+ destination.audible_message("You hear the flapping of wings.")
+ if(do_after(H, fly_time))
+ to_chat(src, "You fly upwards.")
+ else
+ to_chat(src, "You stopped flying upwards.")
+ return 0
+ else
+ to_chat(src, "Gravity stops you from moving upward.")
+ return 0 //VOREStation Edit End.
else
to_chat(src, "Gravity stops you from moving upward.")
return 0
@@ -140,6 +157,15 @@
if(throwing)
return
+ if(ishuman(src)) //VOREStation Edit Start. Code to see if they have wings.
+ var/mob/living/carbon/human/H = src
+ if(H.wings_flying == 1) //Some other checks are done in the wings_toggle proc
+ if(H.stat || H.paralysis || H.stunned || H.weakened || H.lying || H.restrained() || H.buckled)
+ //Just here to see if the person is KO'd, stunned, etc. If so, it'll move onto can_call.
+ else
+ return
+ if(H.grabbed_by.len) //If you're grabbed (presumably by someone flying) let's not have you fall.
+ return //VOREStation Edit End.
if(can_fall())
// We spawn here to let the current move operation complete before we start falling. fall() is normally called from
@@ -147,7 +173,7 @@
// or normal movement so other move behavior can continue.
var/mob/M = src
var/is_client_moving = (ismob(M) && M.client && M.client.moving)
- spawn(0)
+ spawn(0)
if(is_client_moving) M.client.moving = 1
handle_fall(below)
if(is_client_moving) M.client.moving = 0
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 1a1ba7ff3fa..5c8b3585d82 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -19,6 +19,7 @@
var/noisy = 0 // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
+ var/wings_flying = 0 // Determines if the person with wings is currently flying(floating) or not.
//
// Hook for generic creation of stuff on new creatures