From 1c9550e061a6f681d5df16ccb95a6b857201c991 Mon Sep 17 00:00:00 2001 From: "C.L" Date: Wed, 24 Aug 2022 21:10:12 -0400 Subject: [PATCH] Changes "Water Breather" to "Aquatic" - Changes Water Breather to Aquatic with a slew of new features. - Gives Akula and Skrell Aquatic by default. Lets Xenochimera choose Aquatic as a neutral trait. AQUATIC: - Gives the person the water_breather variable - Allows the person to move in water better. (No slowdown in shallow, 1/2 slowdown in deep) - Gives two new commands that can be used. Command #1: "Dive under water / Resurface" - Allows the user to dive under water, making them harder to see (still somewhat visible and able to be clicked, however) and enabling usage of the next command. - Gives them a speed boost (1.5) when fully submerged, meaning they can move in shallow water faster than normal and deep water at 2.5 slowdown instead of 4 slowdown w/ the water_speed variable alone. - Makes them 1.5x weaker to shocks while using this (due to being fully submerged). This, combined with being weaker to shocks when coated with water makes them much weaker to shocks. - Makes them 25% weaker with melee weapons when underwater. Swinging a tool in water is difficult! - Makes them have a -50 accuracy penalty when firing guns under water. (I did want to make it so you could not fire guns at all, but that framework did not exist.) - Makes them have a 30 evasion buff. This means they have a slightly better chance of evading shots, but if they get hit with a taser they're going down in a single shot. - Upon stepping out of the water, all the above perks/debuffs immediately cease. - Command can also be used to resurface, which also stops the above. Command #2: "Devour From Water" - After the user is fully submerged, allows the user to select a target that is also in the water (only in the water/on water turf such as a beach shoreline) - The target is alerted something is circling around them. - After 5 seconds, the target is eaten by whatever selected belly the predator has selected. --- code/modules/mob/_modifiers/modifiers_vr.dm | 33 +++++++ .../station/station_special_abilities_vr.dm | 90 ++++++++++++++++++- .../human/species/station/station_vr.dm | 8 +- .../species/station/traits_vr/positive.dm | 13 ++- .../species/station/xenochimera_trait_vr.dm | 8 +- vorestation.dme | 1 + 6 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 code/modules/mob/_modifiers/modifiers_vr.dm diff --git a/code/modules/mob/_modifiers/modifiers_vr.dm b/code/modules/mob/_modifiers/modifiers_vr.dm new file mode 100644 index 00000000000..a56bc5d2e0a --- /dev/null +++ b/code/modules/mob/_modifiers/modifiers_vr.dm @@ -0,0 +1,33 @@ +/datum/modifier/underwater_stealth + name = "underwater stealth" + desc = "You are currently underwater, rendering it more difficult to see you and enabling you to move quicker, thanks to your aquatic nature." + + on_created_text = "You sink under the water." + on_expired_text = "You come out from the water." + + stacks = MODIFIER_STACK_FORBID + + slowdown = -1.5 //A bit faster when actually submerged fully in water, as you're not waddling through it. + siemens_coefficient = 1.5 //You are, however, underwater. Getting shocked will hurt. + + outgoing_melee_damage_percent = 0.75 //You are swinging a sword under water...Good luck. + accuracy = -50 //You're underwater. Good luck shooting a gun. (Makes shots as if you were 3.33 tiles further.) + evasion = 30 //You're underwater and a bit harder to hit. + +/datum/modifier/underwater_stealth/on_applied() + holder.alpha = 50 + return + +/datum/modifier/underwater_stealth/on_expire() + holder.alpha = 255 + return + +/datum/modifier/underwater_stealth/tick() + if(holder.stat == DEAD) + expire(silent = TRUE) //If you're dead you float to the top. + if(istype(holder.loc, /turf/simulated/floor/water)) + var/turf/simulated/floor/water/water_floor = holder.loc + if(water_floor.depth < 1) //You're not in deep enough water anymore. + expire(silent = FALSE) + else + expire(silent = FALSE) \ No newline at end of file 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 a4333760a8d..ac55ff5f461 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 @@ -1064,4 +1064,92 @@ C.icon_scale_y = 0.25 * C.w_class C.update_transform() //egg_contents -= src - C.contents -= src \ No newline at end of file + C.contents -= src + +/mob/living/carbon/human/proc/water_stealth() + set name = "Dive under water / Resurface" + set desc = "Dive under water, allowing for you to be stealthy and move faster." + set category = "Abilities" + + if(last_special > world.time) + return + last_special = world.time + 50 //No spamming! + + if(has_modifier_of_type(/datum/modifier/underwater_stealth)) + to_chat(src, "You resurface!") + remove_modifiers_of_type(/datum/modifier/underwater_stealth) + return + + if(!isturf(loc)) //We have no turf. + to_chat(src, "There is no water for you to dive into!") + return + + if(istype(src.loc, /turf/simulated/floor/water)) + var/turf/simulated/floor/water/water_floor = src.loc + if(water_floor.depth >= 1) //Is it deep enough? + add_modifier(/datum/modifier/underwater_stealth) //No duration. It'll remove itself when they exit the water! + to_chat(src, "You dive into the water!") + visible_message("[src] dives into the water!") + else + to_chat(src, "The water here is not deep enough to dive into!") + return + + else + to_chat(src, "There is no water for you to dive into!") + return + +/mob/living/carbon/human/proc/underwater_devour() + set name = "Devour From Water" + set desc = "Grab something in the water with you and devour them with your selected stomach." + set category = "Abilities" + + if(last_special > world.time) + return + last_special = world.time + 50 //No spamming! + + if(stat == DEAD || paralysis || weakened || stunned) + to_chat(src, "You cannot do that while in your current state.") + return + + if(!(src.vore_selected)) + to_chat(src, "No selected belly found.") + return + + + if(!has_modifier_of_type(/datum/modifier/underwater_stealth)) + to_chat(src, "You must be underwater to do this!!") + return + + var/list/targets = list() //Shameless copy and paste. If it ain't broke don't fix it! + + for(var/turf/T in range(1, src)) + if(istype(T, /turf/simulated/floor/water)) + for(var/mob/living/L in T) + if(L == src) //no eating yourself. 1984. + continue + if(L.devourable) + targets += L + + if(!(targets.len)) + to_chat(src, "No eligible targets found.") + return + + var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets) + + if(!target) + return + + to_chat(target, "Something begins to circle around you in the water!") //Dun dun... + var/starting_loc = target.loc + + if(do_after(src, 50)) + if(target.loc != starting_loc) + to_chat(target, "You got away from whatever that was...") + to_chat(src, "They got away.") + return + if(target.buckled) //how are you buckled in the water?! + target.buckled.unbuckle_mob() + target.visible_message("\The [target] suddenly disappears, being dragged into the water!",\ + "You are dragged below the water and feel yourself slipping directly into \the [src]'s [vore_selected]!") + to_chat(src, "You successfully drag \the [target] into the water, slipping them into your [vore_selected].") + target.forceMove(src.vore_selected) \ No newline at end of file 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 fcb985c435a..4b923d35668 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 @@ -81,7 +81,7 @@ name_language = LANGUAGE_SKRELLIAN color_mult = 1 assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) min_age = 18 max_age = 80 @@ -105,6 +105,7 @@ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR water_breather = TRUE + water_movement = -4 //Negates shallow. Halves deep. flesh_color = "#AFA59E" base_color = "#777777" @@ -284,13 +285,16 @@ deform = 'icons/mob/human_races/r_def_skrell_vr.dmi' color_mult = 1 min_age = 18 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) reagent_tag = null allergens = null assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) genders = list(MALE, FEMALE, PLURAL, NEUTER) wikilink="https://wiki.vore-station.net/Skrell" + water_breather = TRUE + water_movement = -4 //Negates shallow. Halves deep. + /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 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 b2b5449bf51..32280209047 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 @@ -164,11 +164,16 @@ H.verbs |= /mob/living/carbon/human/proc/weave_item H.verbs |= /mob/living/carbon/human/proc/set_silk_color -/datum/trait/positive/water_breather - name = "Water Breather" - desc = "You can breathe under water." +/datum/trait/positive/aquatic + name = "Aquatic" + desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water." cost = 1 - var_changes = list("water_breather" = 1) + var_changes = list("water_breather" = 1, "water_movement" = -4) //Negate shallow water. Half the speed in deep water. + +/datum/trait/positive/aquatic/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.verbs |= /mob/living/carbon/human/proc/water_stealth + H.verbs |= /mob/living/carbon/human/proc/underwater_devour /datum/trait/positive/cocoon_tf name = "Cocoon Spinner" diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm index 152851d8c21..e91f6573ea2 100644 --- a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm @@ -53,15 +53,15 @@ category = 0 custom_only = FALSE -/datum/trait/positive/water_breather/xenochimera +/datum/trait/positive/aquatic/xenochimera sort = TRAIT_SORT_SPECIES allowed_species = list(SPECIES_XENOCHIMERA) - name = "Xenochimera: Water Breather" - desc = "You can breathe under water." + name = "Xenochimera: Aquatic" + desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water." cost = 0 category = 0 custom_only = FALSE - + /* // Commented out in lieu of finding a better solution. /datum/trait/neutral/coldadapt/xenochimera sort = TRAIT_SORT_SPECIES diff --git a/vorestation.dme b/vorestation.dme index fb7b6979ca3..c92c8d856dc 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2697,6 +2697,7 @@ #include "code\modules\mob\_modifiers\medical.dm" #include "code\modules\mob\_modifiers\modifiers.dm" #include "code\modules\mob\_modifiers\modifiers_misc.dm" +#include "code\modules\mob\_modifiers\modifiers_vr.dm" #include "code\modules\mob\_modifiers\traits.dm" #include "code\modules\mob\_modifiers\traits_phobias.dm" #include "code\modules\mob\_modifiers\unholy.dm"