From 66ceb69b6632cd5c3dda6dabb79f0a00d6081854 Mon Sep 17 00:00:00 2001 From: Matt Dallmeyer Date: Mon, 7 Jul 2025 20:44:27 -0700 Subject: [PATCH 1/2] [jak2/3] Fix same-attack-invulnerable-timeout clock drift bug --- goal_src/jak2/engine/target/target-util.gc | 3 ++- goal_src/jak3/engine/target/target-util.gc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/goal_src/jak2/engine/target/target-util.gc b/goal_src/jak2/engine/target/target-util.gc index f3fc5a141b6..70bd7773686 100644 --- a/goal_src/jak2/engine/target/target-util.gc +++ b/goal_src/jak2/engine/target/target-util.gc @@ -1574,7 +1574,8 @@ (logior! (-> this mask) (attack-mask attacker)) ) (when (not (logtest? (-> this mask) (attack-mask attack-time))) - (set! (-> this attack-time) (-> *display* base-clock frame-counter)) + ;; og:preserve-this fix clock drift bug which can lead to ridiculously long invuln timeouts + (set! (-> this attack-time) (current-time)) ;; (-> *display* base-clock frame-counter)) (logior! (-> this mask) (attack-mask attack-time)) ) (if (not (logtest? (attack-mask damage) (-> this mask))) diff --git a/goal_src/jak3/engine/target/target-util.gc b/goal_src/jak3/engine/target/target-util.gc index ce61a7558bd..8dba59b0756 100644 --- a/goal_src/jak3/engine/target/target-util.gc +++ b/goal_src/jak3/engine/target/target-util.gc @@ -1763,7 +1763,8 @@ (logior! (-> this mask) (attack-mask attacker)) ) (when (not (logtest? (-> this mask) (attack-mask attack-time))) - (set! (-> this attack-time) (-> *display* base-clock frame-counter)) + ;; og:preserve-this fix clock drift bug which can lead to ridiculously long invuln timeouts + (set! (-> this attack-time) (current-time)) ;; (-> *display* base-clock frame-counter)) (logior! (-> this mask) (attack-mask attack-time)) ) (if (not (logtest? (attack-mask damage) (-> this mask))) From be30d5aa2b04bc4a588b462ccae76d128695dfe0 Mon Sep 17 00:00:00 2001 From: Matt Dallmeyer Date: Mon, 8 Dec 2025 17:48:44 -0800 Subject: [PATCH 2/2] check time-elapsed using base-clock, instead of setting attack-time with process's clock --- goal_src/jak2/engine/target/target-util.gc | 7 +++---- goal_src/jak3/engine/target/target-util.gc | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/goal_src/jak2/engine/target/target-util.gc b/goal_src/jak2/engine/target/target-util.gc index 70bd7773686..6fbfe143624 100644 --- a/goal_src/jak2/engine/target/target-util.gc +++ b/goal_src/jak2/engine/target/target-util.gc @@ -1456,8 +1456,8 @@ (dotimes (a2-2 8) (let ((v1-9 (-> self attack-info-old a2-2))) (when (= (-> arg0 id) (-> v1-9 id)) - (if (not (time-elapsed? (-> v1-9 attack-time) (the-as time-frame (-> *TARGET-bank* same-attack-invulnerable-timeout))) - ) + ;; og:preserve-this fix clock drift bug which can lead to longer invuln timeouts (use base-clock instead of target-clock) + (if (not (>= (- (-> *display* base-clock frame-counter) (-> v1-9 attack-time)) (the-as time-frame (-> *TARGET-bank* same-attack-invulnerable-timeout)))) (return #f) ) (cond @@ -1574,8 +1574,7 @@ (logior! (-> this mask) (attack-mask attacker)) ) (when (not (logtest? (-> this mask) (attack-mask attack-time))) - ;; og:preserve-this fix clock drift bug which can lead to ridiculously long invuln timeouts - (set! (-> this attack-time) (current-time)) ;; (-> *display* base-clock frame-counter)) + (set! (-> this attack-time) (-> *display* base-clock frame-counter)) (logior! (-> this mask) (attack-mask attack-time)) ) (if (not (logtest? (attack-mask damage) (-> this mask))) diff --git a/goal_src/jak3/engine/target/target-util.gc b/goal_src/jak3/engine/target/target-util.gc index 8dba59b0756..b0eadc9051c 100644 --- a/goal_src/jak3/engine/target/target-util.gc +++ b/goal_src/jak3/engine/target/target-util.gc @@ -1669,7 +1669,8 @@ (dotimes (a2-2 8) (let ((v1-9 (-> self attack-info-old a2-2))) (when (= (-> arg0 id) (-> v1-9 id)) - (if (not (time-elapsed? (-> v1-9 attack-time) (-> *TARGET-bank* same-attack-invulnerable-timeout))) + ;; og:preserve-this fix clock drift bug which can lead to longer invuln timeouts (use base-clock instead of target-clock) + (if (not (>= (- (-> *display* base-clock frame-counter) (-> v1-9 attack-time)) (-> *TARGET-bank* same-attack-invulnerable-timeout))) (return #f) ) (cond @@ -1763,8 +1764,7 @@ (logior! (-> this mask) (attack-mask attacker)) ) (when (not (logtest? (-> this mask) (attack-mask attack-time))) - ;; og:preserve-this fix clock drift bug which can lead to ridiculously long invuln timeouts - (set! (-> this attack-time) (current-time)) ;; (-> *display* base-clock frame-counter)) + (set! (-> this attack-time) (-> *display* base-clock frame-counter)) (logior! (-> this mask) (attack-mask attack-time)) ) (if (not (logtest? (attack-mask damage) (-> this mask)))