(first PR post so apologies if it reads a bit shit)
TL;DR Current Endless Battle Clause isn't comprehensive enough, and endless battles can occur in spite of it. Also an additional discussion on whether cases that technically aren't infinite but are also not "gameplay" should be included in the clause.
EBC is a bit outdated. Yes it stops your standard Funbro and Heal Pulse setups, but it's not really designed to handle more complex cases that nonetheless cause endless battles.
Here are the current mechanics (summarized from https://dex.pokemonshowdown.com/articles/battlerules):
The clause simply blanks these cases due to not fitting all of the criteria. Mostly, this is one of the Pokemon never becoming Stale.
Just going based off of the examples above, there are a few things to note:
https://replay.pokemonshowdown.com/gen9nationaldex-2143415570-3h7nvj0p7g1ax43ov6unembor1kuz2vpw (Harvest + Sitrus Exeggutor simply exists on the Gyarados side's team, causing an EBC tie even though Exeggutor never switches in)
https://replay.pokemonshowdown.com/gen9nationaldex-2143417952-15rqxi1wvgbb5a0frzs7un08y3j52fzpw (Exeggutor now has AV; the Slowbro side loses, as there is no single Pokemon on the Gyarados side that can restore Berries by itself)
Also note that, in the above 2 battles, the situation can clearly end due to there being a +6 Double-Edge Gyarados, but EBC steps in before it runs out of every other move and has to start attacking.
Fixing this is a difficult issue due to how many scenarios need to be accounted for, and it'd either involve updating the mechanics around Staling (almost definitely involving a Struggling Pokemon becoming Stale + something like tracking net HP loss over xyz turns rather than being made Stale by an opponent) or just rebuilding the entire clause to check for exact sequences. In my opinion, adjusting the Staling criteria is probably easier to maintain long-term and quicker to fix in the case of new EBC causes, but it's also more likely to give false positives.
Problem 2: Technically isn't infinite, but should it still go
This is probably more of a debate topic. It involves cases where, while the game isn't technically infinite, multiple hundreds of turns of non-gameplay are required to reach a resolution. This can contain cases similar to the above (where one player forces the other to play an endless game) or when it's in both players' interest to play the infinite.
The main question here is whether each situation (both players' interest is to play forever, "Endless" battle setups taking hundreds of turns to end but still having either a defined end or a chance for one) should be claused or not. An additional question, at least for the first type, would be on the amount of pressure put on the players to resolve it by a tie rather than having the clause (or admin / turn 1000) do it for them.
TL;DR Current Endless Battle Clause isn't comprehensive enough, and endless battles can occur in spite of it. Also an additional discussion on whether cases that technically aren't infinite but are also not "gameplay" should be included in the clause.
EBC is a bit outdated. Yes it stops your standard Funbro and Heal Pulse setups, but it's not really designed to handle more complex cases that nonetheless cause endless battles.
Here are the current mechanics (summarized from https://dex.pokemonshowdown.com/articles/battlerules):
- A Pokemon becomes Stale if it's hit by Entrainment, Skill Swap, Heal Pulse, Floral Healing, or has its HP/PP restored by a Berry it didn't start the battle with (this includes Recycled / Harvested berries). Note that being hit by one of these ability-changing moves after you've already used one doesn't make you Stale.
- If all Pokemon on the field are Stale, at least one can't switch, at least one was made Stale by the opponent, and it's past turn 100, the clause activates and either draws a Tie or makes the person who has a Pokemon with the means to endlessly regenerate Berries lose.
The clause simply blanks these cases due to not fitting all of the criteria. Mostly, this is one of the Pokemon never becoming Stale.
Case 1: Leppa + Recycle/Protect/Recover vs Poison Heal
This can occur if a Poison Heal user heals off Struggle recoil in 2 turns (the easiest way to get this amount is ensuring that the Poison Heal user's HP is perfectly divisible by 16). By Protecting every second turn, the Poison Heal user will perpetually remain at the HP they started with. This works as the Poison Heal user never becomes Stale (it already has the ability it needs for the setup to work, so it never needs to get hit by Skill Swap or Entrainment). https://replay.pokemonshowdown.com/gen9purehackmons-2124854496-b42o0duil2ny8p29eh2zgbkx7kw65a7pw
Case 2: Leppa + Recycle/Recover/Attack vs ___ Absorb + Leftovers
This works similarly to the above in that the target already has the desired ability for the setup, so the target never becomes Stale and the clause never trips. The attack vs ___ Absorb (Water, Volt, Earth Eater) always keeps it at the same HP level, and Leftovers is required to heal off the damage from turns spent using Recycle or Recover. https://replay.pokemonshowdown.com/gen9ou-2130969460-cs56ppkz242zj03hyww7yw9wcaka3b4pw
Case 3: Double Leppa + Recycle
Perhaps the simplest of all cases, as neither player's Staleness is inflicted by the opponent. This setup can be extended to something like Comatose + Leppa + Sleep Talk/Revival Blessing/Recover/Recycle, which still doesn't fit the Staling criteria but allows for easy access to infinite revives (Sleep Talk is usable without the sleep restriction thanks to Comatose, and Revival Blessing gets called with Sleep Talk's PP). https://replay.pokemonshowdown.com/gen9balancedhackmons-2143394126-5i4e4qtcslug2ayajlbo17pwlyvckdopw
Case 4: Gens 2/3 Struggle + Leftovers
Struggle's mechanics in these gens are different to the rest; it deals 1/4 of the damage as recoil rather than 1/4 of the user's max HP. This means that two Pokemon that outheal Struggle via Leftovers (and don't have to put up with potential Sand chip) will Struggle forever if they're the last Pokemon on either side. It's essentially the same principle as Leftovers Wobbuffet but with more strict requirements. https://replay.pokemonshowdown.com/gen3ubers-2143401664-hbkyb0ao8dx0lxmcy05u5xc0i60svcspw
This can occur if a Poison Heal user heals off Struggle recoil in 2 turns (the easiest way to get this amount is ensuring that the Poison Heal user's HP is perfectly divisible by 16). By Protecting every second turn, the Poison Heal user will perpetually remain at the HP they started with. This works as the Poison Heal user never becomes Stale (it already has the ability it needs for the setup to work, so it never needs to get hit by Skill Swap or Entrainment). https://replay.pokemonshowdown.com/gen9purehackmons-2124854496-b42o0duil2ny8p29eh2zgbkx7kw65a7pw
Case 2: Leppa + Recycle/Recover/Attack vs ___ Absorb + Leftovers
This works similarly to the above in that the target already has the desired ability for the setup, so the target never becomes Stale and the clause never trips. The attack vs ___ Absorb (Water, Volt, Earth Eater) always keeps it at the same HP level, and Leftovers is required to heal off the damage from turns spent using Recycle or Recover. https://replay.pokemonshowdown.com/gen9ou-2130969460-cs56ppkz242zj03hyww7yw9wcaka3b4pw
Case 3: Double Leppa + Recycle
Perhaps the simplest of all cases, as neither player's Staleness is inflicted by the opponent. This setup can be extended to something like Comatose + Leppa + Sleep Talk/Revival Blessing/Recover/Recycle, which still doesn't fit the Staling criteria but allows for easy access to infinite revives (Sleep Talk is usable without the sleep restriction thanks to Comatose, and Revival Blessing gets called with Sleep Talk's PP). https://replay.pokemonshowdown.com/gen9balancedhackmons-2143394126-5i4e4qtcslug2ayajlbo17pwlyvckdopw
Case 4: Gens 2/3 Struggle + Leftovers
Struggle's mechanics in these gens are different to the rest; it deals 1/4 of the damage as recoil rather than 1/4 of the user's max HP. This means that two Pokemon that outheal Struggle via Leftovers (and don't have to put up with potential Sand chip) will Struggle forever if they're the last Pokemon on either side. It's essentially the same principle as Leftovers Wobbuffet but with more strict requirements. https://replay.pokemonshowdown.com/gen3ubers-2143401664-hbkyb0ao8dx0lxmcy05u5xc0i60svcspw
- Leppa + Restoration is required on at least one Pokemon in all cases (spare Gen 2/3 Struggle).
- The requirement of a Pokemon being made Stale by an opponent is never satisfied.
https://replay.pokemonshowdown.com/gen9nationaldex-2143415570-3h7nvj0p7g1ax43ov6unembor1kuz2vpw (Harvest + Sitrus Exeggutor simply exists on the Gyarados side's team, causing an EBC tie even though Exeggutor never switches in)
https://replay.pokemonshowdown.com/gen9nationaldex-2143417952-15rqxi1wvgbb5a0frzs7un08y3j52fzpw (Exeggutor now has AV; the Slowbro side loses, as there is no single Pokemon on the Gyarados side that can restore Berries by itself)
Also note that, in the above 2 battles, the situation can clearly end due to there being a +6 Double-Edge Gyarados, but EBC steps in before it runs out of every other move and has to start attacking.
Fixing this is a difficult issue due to how many scenarios need to be accounted for, and it'd either involve updating the mechanics around Staling (almost definitely involving a Struggling Pokemon becoming Stale + something like tracking net HP loss over xyz turns rather than being made Stale by an opponent) or just rebuilding the entire clause to check for exact sequences. In my opinion, adjusting the Staling criteria is probably easier to maintain long-term and quicker to fix in the case of new EBC causes, but it's also more likely to give false positives.
Problem 2: Technically isn't infinite, but should it still go
This is probably more of a debate topic. It involves cases where, while the game isn't technically infinite, multiple hundreds of turns of non-gameplay are required to reach a resolution. This can contain cases similar to the above (where one player forces the other to play an endless game) or when it's in both players' interest to play the infinite.
Case 1: Regenerator Loops
This is probably the single post important one here. If neither player has a good way of making progress against the other (such as a stall mirror for example), then the best option for both sides to not lose can be to switch endlessly between the Regenerator users to shut off any progress. It's technically possible for a player to lose from this interaction, but this involves just throwing the game. I'd be hesitant to say that this needs clausing, as generally only players that understand the loop would find themselves in one (and thus have the foresight to offer tie), it'd require a specific code exception that'll probably find a way to be abused, and it'd also need to account for Regen + MG/Boots and every combination of the three, but it's one I've seen limited discussion on before, so I thought i'd bring it up.
(IMPORTANT: this isn't just "can these two bastards stop using their regen pokemon", it's specifically cases like this where the only viable option is switching between regen mons)
Case 2: Poison Heal setup with incorrect HP
If the Poison Heal user has a slightly dodgy amount of HP (doesn't heal off Struggle over 2 turns), then the setup can technically end when the Poison Heal user gets to ~25% HP and KOes itself from recoil. I didn't test every number, but the lowest I got was 2 HP every 2 turns; this would take a 31 IV / 0 EV Arceus ~286 turns to KO itself from full HP + no PP.
Case 3: Anything with Leppa + Harvest
Simply put, Harvest is a 50% chance, so it's entirely possible for any Harvest-related EBC setup to fail by just not recovering any Berries. It borders on phenomenally unlikely (a 1/1024 chance to offset a single Berry's worth of PP), but is still at least worth considering.
Case 4: Gen 2/3 Trapping vs Leftovers
Very niche option that again has to do with Gen 2/3 Struggle, this time the 100% accuracy rather than the --% of later gens (meaning it can miss after accuracy/evasion modifiers) in addition to the recoil. By repeatedly swapping between Arena Trap / Shadow Tag users that have Leftovers, a Struggle user (that itself holds Leftovers) can be forever trapped in if it misses enough and deals little enough such that Leftovers on the trapper team can heal it off. It's technically possible that the Pokemon being trapped simply hits every time and lands every crit, but it is definitely unrealistic. I'm assuming this can happen in Gen 2 (given the Pokemon being trapped is the last alive), but I haven't confirmed. https://replay.pokemonshowdown.com/gen3ou-2141693301?p2
This is probably the single post important one here. If neither player has a good way of making progress against the other (such as a stall mirror for example), then the best option for both sides to not lose can be to switch endlessly between the Regenerator users to shut off any progress. It's technically possible for a player to lose from this interaction, but this involves just throwing the game. I'd be hesitant to say that this needs clausing, as generally only players that understand the loop would find themselves in one (and thus have the foresight to offer tie), it'd require a specific code exception that'll probably find a way to be abused, and it'd also need to account for Regen + MG/Boots and every combination of the three, but it's one I've seen limited discussion on before, so I thought i'd bring it up.
(IMPORTANT: this isn't just "can these two bastards stop using their regen pokemon", it's specifically cases like this where the only viable option is switching between regen mons)
Case 2: Poison Heal setup with incorrect HP
If the Poison Heal user has a slightly dodgy amount of HP (doesn't heal off Struggle over 2 turns), then the setup can technically end when the Poison Heal user gets to ~25% HP and KOes itself from recoil. I didn't test every number, but the lowest I got was 2 HP every 2 turns; this would take a 31 IV / 0 EV Arceus ~286 turns to KO itself from full HP + no PP.
Case 3: Anything with Leppa + Harvest
Simply put, Harvest is a 50% chance, so it's entirely possible for any Harvest-related EBC setup to fail by just not recovering any Berries. It borders on phenomenally unlikely (a 1/1024 chance to offset a single Berry's worth of PP), but is still at least worth considering.
Case 4: Gen 2/3 Trapping vs Leftovers
Very niche option that again has to do with Gen 2/3 Struggle, this time the 100% accuracy rather than the --% of later gens (meaning it can miss after accuracy/evasion modifiers) in addition to the recoil. By repeatedly swapping between Arena Trap / Shadow Tag users that have Leftovers, a Struggle user (that itself holds Leftovers) can be forever trapped in if it misses enough and deals little enough such that Leftovers on the trapper team can heal it off. It's technically possible that the Pokemon being trapped simply hits every time and lands every crit, but it is definitely unrealistic. I'm assuming this can happen in Gen 2 (given the Pokemon being trapped is the last alive), but I haven't confirmed. https://replay.pokemonshowdown.com/gen3ou-2141693301?p2