diff --git a/code/__DEFINES/combat/stamina_combat.dm b/code/__DEFINES/combat/stamina_combat.dm
index b35329d84d..0467b656c5 100644
--- a/code/__DEFINES/combat/stamina_combat.dm
+++ b/code/__DEFINES/combat/stamina_combat.dm
@@ -2,13 +2,13 @@
/// Stamina buffer amount
#define STAMINA_BUFFER_CAPACITY 35
/// Stamina buffer regen per decisecond
-#define STAMINA_BUFFER_REGEN_DS 0.1
+#define STAMINA_BUFFER_REGEN_PER_SECOND 1
/// Stamina buffer regen multiplier while in combat mode
-#define STAMINA_BUFFER_REGEN_COMBAT_MULT 3
-/// Linear scaling minimum for stamina buffer regen in percentage at stamcrit
-#define STAMINA_BUFFER_STAMCRIT_PENALTY_REGEN 0.75
-/// Linear scaling minimum for stamina buffer capacity in percentage at stamcrit
-#define STAMINA_BUFFER_STAMCRIT_PENALTY_CAPACITY 0.5
+#define STAMINA_BUFFER_REGEN_PER_SECOND_COMBAT 3
+/// percent of regen to take away at stamcrit
+#define STAMINA_BUFFER_STAMCRIT_REGEN_PENALTY_PERCENT 0.5
+/// percent of capacity to take away at stamcrit
+#define STAMINA_BUFFER_STAMCRIT_CAPACITY_PENALTY_PERCENT 0.5
// Standard amounts for stamina usage
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 85f5e4fd9b..b2fa88a343 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -251,7 +251,6 @@ GLOBAL_LIST_INIT(bitfields, list(
"COMBAT_FLAG_SPRINT_TOGGLED" = COMBAT_FLAG_SPRINT_TOGGLED,
"COMBAT_FLAG_SPRINT_ACTIVE" = COMBAT_FLAG_SPRINT_ACTIVE,
"COMBAT_FLAG_ATTEMPTING_CRAWL" = COMBAT_FLAG_ATTEMPTING_CRAWL,
- "COMBAT_FLAG_HARD_STAMCRIT" = COMBAT_FLAG_HARD_STAMCRIT,
"COMBAT_FLAG_SOFT_STAMCRIT" = COMBAT_FLAG_SOFT_STAMCRIT,
"COMBAT_FLAG_INTENTIONALLY_RESTING" = COMBAT_FLAG_INTENTIONALLY_RESTING,
"COMBAT_FLAG_RESISTING_REST" = COMBAT_FLAG_RESISTING_REST,
diff --git a/code/_onclick/hud/screen_objects/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm
index 5484014f8f..57152951db 100644
--- a/code/_onclick/hud/screen_objects/stamina.dm
+++ b/code/_onclick/hud/screen_objects/stamina.dm
@@ -38,24 +38,17 @@
if(!user)
return
if(user.stat == DEAD || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2))
- icon_state = "stambuffer7"
- else if(user.hal_screwyhud == 5)
icon_state = "stambuffer0"
+ else if(user.hal_screwyhud == 5)
+ icon_state = "stambuffer29"
else
- switch(user.bufferedstam / user.stambuffer)
- if(0.95 to INFINITY)
- icon_state = "stambuffer7"
- if(0.9 to 0.95)
- icon_state = "stambuffer6"
- if(0.8 to 0.9)
- icon_state = "stambuffer5"
- if(0.6 to 0.8)
- icon_state = "stambuffer4"
- if(0.4 to 0.6)
- icon_state = "stambuffer3"
- if(0.2 to 0.4)
- icon_state = "stambuffer2"
- if(0.05 to 0.2)
- icon_state = "stambuffer1"
- else
- icon_state = "stambuffer0"
+ icon_state = "stambuffer[FLOOR((stamina_buffer / stamina_buffer_max) * 29, 1)]"
+
+/obj/screen/staminabuffer/update_overlays()
+ var/level = FLOOR((stamina_buffer / stamina_buffer_max) * 29, 1)
+ if((user.stat == DEAD) || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2) || (level <= 5))
+ . = list("stamina_alert3")
+ else if(level <= 8)
+ . = list("stamina_alert2")
+ else if(level <= 12)
+ . = list("stamina_alert1")
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 8dbdc5ff20..f71fd4db58 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -171,7 +171,7 @@
"[user] has prodded you with [src]. Luckily it was off")
return disarming || (user.a_intent != INTENT_HARM)
-/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user, disarming = FALSE)
+/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/living/user, disarming = FALSE)
var/list/return_list = list()
if(L.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, return_list) & BLOCK_SUCCESS) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a2a3c3af8e..a4b7a9cd8a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -191,8 +191,8 @@
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob].")
return
-
- adjustStaminaLossBuffered(STAM_COST_THROW_MOB * ((throwable_mob.mob_size+1)**2))// throwing an entire person shall be very tiring
+ if(!UseStaminaBuffer(STAM_COST_THROW_MOB * ((throwable_mob.mob_size+1)**2), TRUE))
+ return
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
@@ -603,7 +603,7 @@
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
filters += CIT_FILTER_STAMINACRIT
update_mobility()
- if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_SOFTCRIT)
+ if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_CRIT)
to_chat(src, "You don't feel nearly as exhausted anymore.")
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
filters -= CIT_FILTER_STAMINACRIT
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b0c4e01359..a63b7a8f78 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -808,7 +808,7 @@
hud_used.healthdoll.icon_state = "healthdoll_DEAD"
hud_used.staminas?.update_icon_state()
- hud_used.staminabuffer?.update_icon_state()
+ hud_used.staminabuffer?.update_icon()
/mob/living/carbon/human/fully_heal(admin_revive = FALSE)
if(admin_revive)
diff --git a/code/modules/mob/living/silicon/stamina_buffer.dm b/code/modules/mob/living/silicon/stamina_buffer.dm
deleted file mode 100644
index 139597f9cb..0000000000
--- a/code/modules/mob/living/silicon/stamina_buffer.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/code/modules/mob/living/stamina_buffer.dm b/code/modules/mob/living/stamina_buffer.dm
index 7412c35dad..85c33080d5 100644
--- a/code/modules/mob/living/stamina_buffer.dm
+++ b/code/modules/mob/living/stamina_buffer.dm
@@ -20,7 +20,11 @@
*/
/mob/living/proc/UpdateStaminaBuffer(updating_hud = TRUE)
var/time = world.time - stamina_buffer_regen_last
- if(time <= 0)
+ var/missing_stamina_percent = getStaminaLoss() / STAMINA_CRIT
+ var/stamina_buffer_max = src.stamina_buffer_max * (1 - (missing_stamina_percent * STAMINA_BUFFER_STAMCRIT_CAPACITY_PERCENT_PENALTY))
+ if(stamina_buffer > stamina_buffer_max)
+ stamina_buffer = stamina_buffer_max
return
- stamina_buffer_regen_last = time
- var/penalized
+ var/combat_mode = !SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)
+ stamina_buffer += min((stamina_buffer_max - stamina_buffer), (1 - (missing_stamina_percent * STAMINA_BUFFER_STAMCRIT_REGEN_PERCENT_PENALTY)) * (time * 0.1 * ((combat_mode? stamina_buffer_regen_combat : stamina_buffer_regen) * stamina_buffer_regen_mod)))
+ hud_used?.staminabuffer?.update_icon()
diff --git a/modular_citadel/icons/ui/screen_gen.dmi b/modular_citadel/icons/ui/screen_gen.dmi
index 270f7c9ad9..510d312f1c 100644
Binary files a/modular_citadel/icons/ui/screen_gen.dmi and b/modular_citadel/icons/ui/screen_gen.dmi differ