From ae83a6df0242bdece63b67df183cff21cf2fba38 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 19 Jul 2020 19:51:17 -0700
Subject: [PATCH] fix
---
code/_onclick/hud/alert.dm | 12 ++++-----
code/modules/mob/clickdelay.dm | 26 ++++++++++++++++---
code/modules/mob/living/carbon/carbon.dm | 10 +++----
code/modules/mob/living/carbon/human/human.dm | 2 +-
.../mob/living/carbon/monkey/combat.dm | 2 +-
code/modules/mob/living/living.dm | 13 +++++-----
6 files changed, 38 insertions(+), 27 deletions(-)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 66c75bfb58..9182360c5d 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -272,7 +272,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.last_resist = world.time
+ L.MarkResistTime()
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt.
@@ -600,17 +600,15 @@ so as to remain in compliance with the most up-to-date laws."
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.last_resist = world.time
- if(CHECK_MOBILITY(L, MOBILITY_MOVE) && (L.last_special <= world.time))
- return L.resist_restraints()
+ L.MarkResistTime()
+ return L.resist_restraints()
/obj/screen/alert/restrained/buckled/Click()
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
- L.last_resist = world.time
- if(L.last_special <= world.time)
- return L.resist_buckle()
+ L.MarkResistTime()
+ return L.resist_buckle()
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
diff --git a/code/modules/mob/clickdelay.dm b/code/modules/mob/clickdelay.dm
index 7c2c639b5a..6f181eaf64 100644
--- a/code/modules/mob/clickdelay.dm
+++ b/code/modules/mob/clickdelay.dm
@@ -8,21 +8,28 @@
/mob
// CLICKDELAY AND RELATED
+ // Generic clickdelay - Hybrid time-since-last-attack and time-to-next-attack system.
+ // next_action is a hard cooldown, as Click()s will not pass unless it is passed.
+ // last_action is not a hard cooldown and different items can check for different delays.
/// Generic clickdelay variable. Marks down the last world.time we did something that should cause or impact generic clickdelay. This should be directly set or set using [DelayNextAction()]. This should only be checked using [CheckActionCooldown()].
var/last_action = 0
/// Generic clickdelay variable. Next world.time we should be able to do something that respects generic clickdelay. This should be set using [DelayNextAction()] This should only be checked using [CheckActionCooldown()].
var/next_action = 0
/// Simple modification variable multiplied to next action modifier on adjust and on checking time since last action using [CheckActionCooldown()].
/// This should only be manually modified using multipliers.
- var/action_cooldown_mod = 0.5
- /// Simple modification variable added to amounton adjust and on checking time since last action using [CheckActionCooldown()].
+ var/action_cooldown_mod = 1
+ /// Simple modification variable added to amount on adjust and on checking time since last action using [CheckActionCooldown()].
/// This should only be manually modified via addition.
var/action_cooldown_adjust = 0
- /// Special clickdelay variable for resisting. Last time we did a special action like resisting. This should be directly set. This should only be checked using [CheckResistCooldown()].
+ // Resisting - While resisting will give generic clickdelay, it is also on its own resist delay system. However, resisting does not check generic movedelay.
+ // Resist cooldown should only be set at the start of a resist chain - whether this is clicking an alert button, pressing or hotkeying the resist button, or moving to resist out of a locker.
+ /// Special clickdelay variable for resisting. Last time we did a special action like resisting. This should only be set using [MarkResistTime()]. This should only be checked using [CheckResistCooldown()].
var/last_resist = 0
/// How long we should wait before allowing another resist. This should only be manually modified using multipliers.
var/resist_cooldown = CLICK_CD_RESIST
+ /// Minimum world time for another resist.
+ var/next_resist = 0
/**
* Applies a delay to next_action before we can do our next action.
@@ -62,7 +69,18 @@
* Checks if we can resist again.
*/
/mob/proc/CheckResistCooldown()
- return (world.time >= (last_resist + resist_cooldown))
+ return (world.time >= next_resist)
+
+/**
+ * Mark the last resist as now.
+ *
+ * @params
+ * * extra_cooldown - Extra cooldown to apply to next_resist. Defaults to this mob's resist_cooldown.
+ * * override - Defaults to FALSE - if TRUE, extra_cooldown will replace the old next_resist even if the old is longer.
+ */
+/mob/proc/MarkResistTime(extra_cooldown = resist_cooldown, override = FALSE)
+ last_resist = world.time
+ next_resist = override? (world.time + extra_cooldown) : max(next_resist, world.time + extra_cooldown)
/atom
// Standard clickdelay variables
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index eebbd72815..eed93ec78b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -292,13 +292,11 @@
return
if(restrained())
// too soon.
- if(last_special > world.time)
- return
var/buckle_cd = 600
if(handcuffed)
var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED)
buckle_cd = O.breakouttime
- last_resist = world.time
+ MarkResistTime()
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
if(do_after(src, buckle_cd, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
@@ -312,14 +310,12 @@
buckled.user_unbuckle_mob(src,src)
/mob/living/carbon/resist_fire()
- if(last_special > world.time)
- return
fire_stacks -= 5
DefaultCombatKnockdown(60, TRUE, TRUE)
spin(32,2)
visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \
"You stop, drop, and roll!")
- last_special = world.time + 30
+ MarkResistCooldown(30)
sleep(30)
if(fire_stacks <= 0)
visible_message("[src] has successfully extinguished [p_them()]self!", \
@@ -336,7 +332,7 @@
I = legcuffed
type = 2
if(I)
- last_resist = world.time
+ MarkResistTime()
cuff_resist(I)
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a7fbeaabcd..9464670884 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -733,7 +733,7 @@
/mob/living/carbon/human/resist_restraints()
if(wear_suit && wear_suit.breakouttime)
- last_resist = world.time
+ MarkResistTime()
cuff_resist(wear_suit)
else
..()
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index d55521b6a8..03e9c90b1c 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -90,7 +90,7 @@
else if(legcuffed)
I = legcuffed
if(I)
- last_resist = world.time
+ MarkResistTime()
cuff_resist(I)
/mob/living/carbon/monkey/proc/should_target(var/mob/living/L)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 695ee4fa5f..6cd0bd7d4f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -687,10 +687,10 @@
return
if(do_resist())
- last_resist = world.time
+ MarkResistTime()
changeNext_move(CLICK_CD_RESIST)
-/// The actual proc for resisting. Return TRUE to give clickdelay.
+/// The actual proc for resisting. Return TRUE to give CLICK_CD_RESIST clickdelay.
/mob/living/proc/do_resist()
set waitfor = FALSE // some of these sleep.
SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src)
@@ -703,7 +703,7 @@
return old_gs? TRUE : FALSE
// unbuckling yourself. stops the chain if you try it.
- if(buckled && last_special <= world.time)
+ if(buckled)
log_combat(src, buckled, "resisted buckle")
return resist_buckle()
@@ -735,10 +735,9 @@
changeNext_move(CLICK_CD_MELEE)
return FALSE
- if(last_special <= world.time)
- resist_restraints() //trying to remove cuffs.
- // DO NOT GIVE CLICKDELAY - last_special handles this.
- return FALSE
+ resist_restraints() //trying to remove cuffs.
+ // DO NOT GIVE CLICKDELAY - last_special handles this.
+ return FALSE
/// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly.
/mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE)