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)