From 31791df2bda45648f355cfdbc86c32b8f769a184 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Mon, 21 Sep 2020 20:38:43 -0700
Subject: [PATCH] fixes
---
code/__DEFINES/combat.dm | 4 ++-
code/__DEFINES/traits.dm | 4 +++
.../configuration/entries/stamina_combat.dm | 14 +++++++----
code/modules/mob/living/carbon/life.dm | 2 +-
.../modules/mob/living/living_active_block.dm | 6 +++++
.../mob/living/living_blocking_parrying.dm | 6 ++++-
code/modules/mob/living/living_defines.dm | 2 ++
code/modules/mob/living/stamina_buffer.dm | 25 +++++++++++--------
8 files changed, 44 insertions(+), 19 deletions(-)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 0439a5d7e5..80170dccfa 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -73,8 +73,10 @@
#define CHECK_STAMCRIT(mob) (mob.combat_flags & COMBAT_FLAG_HARD_STAMCRIT)
//stamina stuff
-///crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
+/// crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
#define STAMINA_CRIT 140
+/// Threshold under for which you are unable to draw from stamina health to replace stamina buffer
+#define STAMINA_NO_OVERDRAW_THRESHOLD 100
#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 674cc16980..f489833b8a 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -206,6 +206,10 @@
#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
#define TRAIT_FAST_PUMP "fast_pump"
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good...
+/// Prevents stamina buffer regeneration
+#define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen"
+/// Prevents stamina regeneration
+#define TRAIT_NO_STAMINA_REGENERATION "block_stamina_regen"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
diff --git a/code/controllers/configuration/entries/stamina_combat.dm b/code/controllers/configuration/entries/stamina_combat.dm
index 5b179f7477..2cc99bdbe5 100644
--- a/code/controllers/configuration/entries/stamina_combat.dm
+++ b/code/controllers/configuration/entries/stamina_combat.dm
@@ -4,19 +4,19 @@
/// Maximum stamina buffer
/datum/config_entry/number/stamina_combat/buffer_max
- config_entry_value = 75
+ config_entry_value = 40
/// Seconds until percent_regeneration_out_of_combat kicks in
/datum/config_entry/number/stamina_combat/out_of_combat_timer
- config_entry_value = 8
+ config_entry_value = 10
/// Base regeneration per second
/datum/config_entry/number/stamina_combat/base_regeneration
- config_entry_value = 1
+ config_entry_value = 5
/// Combat mode regeneration per second
/datum/config_entry/number/stamina_combat/combat_regeneration
- config_entry_value = 5
+ config_entry_value = 12.5
/// After out_of_combat_timer elapses, additionally regenerate this percent of total stamina per second. Unaffected by combat mode.
/datum/config_entry/number/stamina_combat/percent_regeneration_out_of_combat
@@ -24,8 +24,12 @@
/// Seconds after an action for which your regeneration is penalized
/datum/config_entry/number/stamina_combat/post_action_penalty_delay
- config_entry_value = 2
+ config_entry_value = 5
/// Factor to multiply by for penalizing post-action-stamina-regen
/datum/config_entry/number/stamina_combat/post_action_penalty_factor
config_entry_value = 0.25
+
+/// Factor to multiply by for stamina usage past buffer into health
+/datum/config_entry/number/stamina_combat/overdraw_penalty_factor
+ config_entry_value = 1.5
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 36a17ab82a..30785a0103 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -503,7 +503,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
/mob/living/carbon/handle_status_effects()
..()
var/combat_mode = SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)
- if(getStaminaLoss())
+ if(getStaminaLoss() && !HAS_TRAIT(src, TRAIT_NO_STAMINA_REGENERATION))
adjustStaminaLoss((!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? STAM_RECOVERY_STAM_CRIT : STAM_RECOVERY_RESTING) : STAM_RECOVERY_NORMAL) * (combat_mode? 0.25 : 1))
if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1)
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index 46b7c52075..1d8815d007 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -8,6 +8,8 @@
active_block_item = null
REMOVE_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT)
REMOVE_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_BLOCK_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_NO_STAMINA_BUFFER_REGENERATION, ACTIVE_BLOCK_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_NO_STAMINA_REGENERATION, ACTIVE_BLOCK_TRAIT)
remove_movespeed_modifier(/datum/movespeed_modifier/active_block)
var/datum/block_parry_data/data = I.get_block_parry_data()
DelayNextAction(data.block_end_click_cd_add)
@@ -27,6 +29,10 @@
ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) //probably should be something else at some point
if(data.block_lock_sprinting)
ADD_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_BLOCK_TRAIT)
+ if(data.block_no_stamina_regeneration)
+ ADD_TRAIT(src, TRAIT_NO_STAMINA_REGENERATION, ACTIVE_BLOCK_TRAIT)
+ if(data.block_no_stambuffer_regeneration)
+ ADD_TRAIT(src, TRAIT_NO_STAMINA_BUFFER_REGENERATION, ACTIVE_BLOCK_TRAIT)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/active_block, multiplicative_slowdown = data.block_slowdown)
active_block_effect_start()
return TRUE
diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm
index 3bc7943c67..08ef674b33 100644
--- a/code/modules/mob/living/living_blocking_parrying.dm
+++ b/code/modules/mob/living/living_blocking_parrying.dm
@@ -74,8 +74,12 @@ GLOBAL_LIST_EMPTY(block_parry_data)
/// Ratio of stamina incurred by chest (so after [block_stamina_limb_ratio] runs) that is buffered.
var/block_stamina_buffer_ratio = 1
- /// Stamina dealt directly via adjustStaminaLossBuffered() per SECOND of block.
+ /// Stamina dealt directly via UseStaminaBuffer() per SECOND of block.
var/block_stamina_cost_per_second = 1.5
+ /// Prevent stamina buffer regeneration while block?
+ var/block_no_stambuffer_regeneration = TRUE
+ /// Prevent stamina regeneration while block?
+ var/block_no_stamina_regeneration = FALSE
/// Bitfield for attack types that we can block while down. This will work in any direction.
var/block_resting_attack_types_anydir = ATTACK_TYPE_MELEE | ATTACK_TYPE_UNARMED | ATTACK_TYPE_TACKLE
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 126672312a..5621fab9c1 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -165,3 +165,5 @@
var/stamina_buffer_regen_mod = 1
/// Last time stamina buffer regen was done
var/stamina_buffer_regen_last = 0
+ /// Last time we used stamina buffer
+ var/stamina_buffer_last_use = 0
diff --git a/code/modules/mob/living/stamina_buffer.dm b/code/modules/mob/living/stamina_buffer.dm
index 0670f97204..c59498041f 100644
--- a/code/modules/mob/living/stamina_buffer.dm
+++ b/code/modules/mob/living/stamina_buffer.dm
@@ -4,15 +4,20 @@
*
* Returns TRUE or FALSE based on if we have it.
*/
-/mob/living/proc/UseStaminaBuffer(amount, warn = FALSE)
+/mob/living/proc/UseStaminaBuffer(amount, warn = FALSE, considered_action = TRUE)
if(!(combat_flags & COMBAT_FLAG_STAMINA_BUFFER))
return TRUE
if(stamina_buffer < amount)
- if(warn)
- to_chat(src, "You do not have enough action stamina to do that!")
- return
- return FALSE
- stamina_buffer -= amount
+ var/stamina_health = getStaminaLoss()
+ if(stamina_health < STAMINA_NO_OVERDRAW_THRESHOLD)
+ if(warn)
+ to_chat(src, "You do not have enough action stamina to do that!")
+ return FALSE
+ adjustStaminaLoss(amount * CONFIG_GET(number/stamina_combat/overdraw_penalty_factor))
+ else
+ stamina_buffer -= amount
+ if(considered_action)
+ stamina_buffer_last_use = world.time
UpdateStaminaBuffer()
return TRUE
@@ -20,15 +25,13 @@
* Updates our stamina buffer amount.
*/
/mob/living/proc/UpdateStaminaBuffer(updating_hud = TRUE)
- if(!(combat_flags & COMBAT_FLAG_STAMINA_BUFFER))
- return
var/time = world.time - stamina_buffer_regen_last
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max)
stamina_buffer_regen_last = world.time
- if(stamina_buffer >= buffer_max)
+ if((stamina_buffer >= buffer_max) || !(combat_flags & COMBAT_FLAG_STAMINA_BUFFER))
stamina_buffer = buffer_max
return
- else if(!time)
+ else if(!time || HAS_TRAIT(src, TRAIT_NO_STAMINA_BUFFER_REGENERATION))
return
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/out_of_combat_timer, out_of_combat_timer)
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/base_regeneration, base_regeneration)
@@ -37,7 +40,7 @@
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/post_action_penalty_delay, post_action_penalty_delay)
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/post_action_penalty_factor, post_action_penalty_factor)
var/base_regen = (SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))? base_regeneration : combat_regeneration
- var/time_since_last_action = world.time - last_action
+ var/time_since_last_action = world.time - stamina_buffer_last_use
var/action_penalty = (((time_since_last_action) < (post_action_penalty_delay * 10)) && post_action_penalty_factor) || 1
var/out_of_combat_bonus = (time_since_last_action < (out_of_combat_timer * 10))? 0 : ((buffer_max * percent_regeneration_out_of_combat * 0.01))
var/regen = ((base_regen * action_penalty) + out_of_combat_bonus) * time * 0.1 * stamina_buffer_regen_mod