From 35f5c9513caae1182f835af5322d58e2858fbf76 Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Fri, 24 Jul 2026 13:30:54 -0400 Subject: [PATCH] Update BattleState.lua --- src/battle/BattleState.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/battle/BattleState.lua b/src/battle/BattleState.lua index 951a49ed..3d1b84ad 100644 --- a/src/battle/BattleState.lua +++ b/src/battle/BattleState.lua @@ -2393,10 +2393,17 @@ function BattleState:performMove(user, target, moveInst, isCalled) -- PP: not for continuations, struggle, called moves, or (under -- gen1_faithful) wild/trainer enemies — pokered DecrementPP only ever -- mutates wBattleMonPP / party PP (engine/battle/decrement_pp.asm). + -- That rule doesn't apply in a link battle: "the enemy" there is a real + -- human peer independently tracking their own PP the normal way, not an + -- AI Gen 1 never bothered to decrement -- applying it made each side + -- silently skip decrementing the OTHER side's PP for the move it just + -- used, so both simulations' party state diverged by exactly 1 PP on + -- the very first move either side made, failing the lockstep hash + -- check turn 1 of literally every link battle. local isContinuation = releasing or (user.thrashTurns and user.thrashTurns > 0 and moveInst == user.thrashMove) or moveInst == user.rageMove - local enemyUnlimited = not user.isPlayer + local enemyUnlimited = not user.isPlayer and self.kind ~= "link" and self.ruleset and self.ruleset.enemyUnlimitedPP if not isContinuation and not moveInst.struggle and not isCalled and not enemyUnlimited then