Research Scarlet & Violet Battle Mechanics Research

So I just documented a couple of use cases for the Tera BP modifier for moves under 60 BP. These are:
  • Technician
  • Heatproof
  • Dry Skin
  • Toxic Boost
  • Flare Boost
  • Strong Jaw
  • Steely Spirit
  • Offensive Terrain (Grassy Terrain)
  • Defensive Terrain (Earthquake in Grassy Terrain)
  • Supreme Overlord
Unless I did something wrong with testing, all of these should be applied before the Tera BP modifier, except Heatproof. I tested it two times:

Test 1:
Lvl 36 95 SpAtk [raw stat] Skeledirge Tera Fire Torch Song vs Lvl 41 103 SpD [raw stat] Heatproof Bronzong

SD calc result:
Lvl 36 0 SpA Tera Fire Skeledirge Torch Song (60 BP) vs. Lvl 41 0 HP / 0 SpD Heatproof Bronzong: 64-76 (54.2 - 64.4%) -- guaranteed 2HKO
Possible damage amounts: (64, 64, 64, 64, 64, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 76)
NCP calc result:
[Lvl 36] 0 SpA Tera-Fire Skeledirge Torch Song vs. [Lvl 41] 0 HP / 0 SpD Heatproof Bronzong: 44-52 (37.2 - 44%) -- guaranteed 3HKO
(44, 44, 44, 44, 44, 44, 44, 44, 48, 48, 48, 48, 48, 48, 48, 52)

Actual damage dealt: 48
Highlight:
(I don't know how to prevent the embed sorry)

Test 2:
Lvl 36 95 SpAtk [raw stat] Skeledirge Tera Fire Torch Song vs Lvl 40 104 SpD [raw stat] Heatproof Bronzong

SD calc result:
Lvl 36 0 SpA Tera Fire Skeledirge Torch Song (60 BP) vs. Lvl 40 0 HP / 0 SpD Heatproof Bronzong: 64-76 (55.1 - 65.5%) -- guaranteed 2HKO
Possible damage amounts: (64, 64, 64, 64, 64, 68, 68, 68, 68, 68, 72, 72, 72, 72, 72, 76)
NCP calc result:
[Lvl 36] 0 SpA Tera-Fire Skeledirge Torch Song vs. [Lvl 40] 0 HP / 0 SpD Heatproof Bronzong: 44-52 (37.9 - 44.8%) -- guaranteed 3HKO
(44, 44, 44, 44, 44, 44, 44, 44, 48, 48, 48, 48, 48, 48, 48, 52)

Actual damage dealt: 48
Highlight:

Either Heatproof is specifically omitted, or Heatproof out of all these cases was the only BP modifier to change when it was applied in comparison to Gen 7/8 (NCP calc bases where the modifiers are applied off of DaWoblefet's Gen 7 Trainer Tower article on the damage formula, and the Tera BP modifier is applied directly before Heatproof). Both of these possibilities seem very unusual to me. I'd recommend further testing if someone wants to verify my findings and/or be more thorough than I was today. And if this has been documented already, my apologies for retreading already conducted research.
 
Last edited:

Anubis

HONK
is a Community Contributoris a Top Researcheris a Battle Simulator Admin Alumnusis a Community Leader Alumnusis a Smogon Discord Contributor Alumnus
Either Heatproof is specifically omitted, or Heatproof out of all these cases was the only BP modifier to change when it was applied in comparison to Gen 7/8 (NCP calc bases where the modifiers are applied off of DaWoblefet's Gen 7 Trainer Tower article on the damage formula, and the Tera BP modifier is applied directly before Heatproof).
I tested this a couple of weeks ago and mentioned it to DaWoblefet in private, but Heatproof is a 2048 attack modifier now.
(I did not think anyone would care or notice since it hasn't been noticed in this long.)
Thread 12 "JobThread1" hit Breakpoint 6, 0x000000129ef33408 in ?? ()
$1 = 40
$2 = "base power"
$3 = 4096
$4 = "base power mod"

Thread 12 "JobThread1" hit Breakpoint 1, 0x000000129ef34030 in ?? ()
$5 = 2048
$6 = "attack mod"
$7 = 68
$8 = "attack power before mod"

Thread 12 "JobThread1" hit Breakpoint 8, 0x000000129ef3434c in ?? ()
$9 = 34
$10 = "attack power"

Thread 12 "JobThread1" hit Breakpoint 2, 0x000000129ef34b0c in ?? ()
$11 = 4096
$12 = "defense mod"
$13 = 32
$14 = "defense power before mod"

Thread 12 "JobThread1" hit Breakpoint 11, 0x000000129ef34b20 in ?? ()
$15 = 32
$16 = "defense power"

Thread 12 "JobThread1" hit Breakpoint 9, 0x000000129ef34b30 in ?? ()
$17 = 53
$18 = "attacker level"

Thread 12 "JobThread1" hit Breakpoint 10, 0x000000129ef34b34 in ?? ()
$19 = 40
$20 = "move BP"

Thread 12 "JobThread1" hit Breakpoint 5, 0x000000129ef3516c in ?? ()
$21 = 2048
$22 = "weather mod"

Thread 12 "JobThread1" hit Breakpoint 12, 0x000000129ef351cc in ?? ()

Thread 12 "JobThread1" hit Breakpoint 4, 0x000000129ef35668 in ?? ()
$23 = 4096
$24 = "STAB/tera mod"
$25 = 10
$26 = "damage before STAB/tera mod"

Thread 12 "JobThread1" hit Breakpoint 3, 0x000000129ef3596c in ?? ()
$27 = 4096
$28 = "damage mod"
$29 = 5
$30 = "damage before mod"

Thread 12 "JobThread1" hit Breakpoint 7, 0x000000129ef35a7c in ?? ()
$31 = 5
$32 = "final damage"

EDIT: Current implementation seems to reflect this too, https://dex.pokemonshowdown.com/abilities/heatproof
 
Last edited:
This is correct:

Additionally, if Morpeko Tera's in it's Hangry Form, it will remain so if switched out then back in.
Do we know if this applies to other Pokemon who can change forms during battle that have different typing? For example, if Sky Forme Shaymin becomes Frozen, will it remain in Sky Forme while Terastallized, or will it revert back to Land Forme and lose its Flying type like usual? I think Shaymin and Meloetta are the only other ones that would need to be tested, since the only other species I can think of that can change into new forms mid-battle that have different typing (Castform and Zen Mode Darmanitan) aren't in the game.
 
Do we know if this applies to other Pokemon who can change forms during battle that have different typing? For example, if Sky Forme Shaymin becomes Frozen, will it remain in Sky Forme while Terastallized, or will it revert back to Land Forme and lose its Flying type like usual? I think Shaymin and Meloetta are the only other ones that would need to be tested, since the only other species I can think of that can change into new forms mid-battle that have different typing (Castform and Zen Mode Darmanitan) aren't in the game.
They are Tested.
Tested two forme change things since some people were requesting them, plus an unintentional bonus I found while laddering!

Shaymin-S and Meloetta's forme mechanics are NOT impacted by Terastallization!




Bonus: If a Toxic Chain Pokemon Knocks Off a Lum Berry and activates Toxic Chain at the same time, Lum Berry is eaten before its knocked off. I swear this is how Poison Touch worked as well, but figured I should post this just in case considering how many weird exceptions SV seems to love!

 
Do all of the item altering moves (e.g. Knock Off, Corrosive Gas, Thief etc.) work on the Ogerpon masks? Can Ogerpon change forms in battle? Can the masks be Tricked, Knocked Off, or stolen?
 
Do all of the item altering moves (e.g. Knock Off, Corrosive Gas, Thief etc.) work on the Ogerpon masks? Can Ogerpon change forms in battle? Can the masks be Tricked, Knocked Off, or stolen?
No. No form altering item can be removed from or given to a Pokemon whose form it can affect midbattle.
 
OK, writing this after I lost a game to it: Booster energy speed sometimes activates before sticky web does, meaning the pokemon ends up at normal speed? It's only happened to me twice, and I can't seem to replicate it on the ladder, but both times it was vs Proto speed tusk, and it's impossible for tusk to have its highest stat be speed at -1. I didn't save the replays of the games that had it, so I might just be remembering wrong. Has anybody else had this experience? If so, can you explain why or, lacking that, the exact circumstances to facilitate further testing?

Edit: someone in the OU forums provided this:
Nope, its got nothing to do with raw speed
its quite simple actually

if you send out a mon with booster energy at the start of a turn, the order will be webs -> booster energy, resulting in never getting a speed boost from booster
however, if you switch out a mon in the middle of a turn and send in the booster energy mon, the order will always be booster energy -> then webs, so you always boost your speed.

no, its not a bug, it works the same way on cart iirc
im surprised that very little people know about this interaction despite it happening so often
thank you so much
 
Last edited:
So I was curious about how easy it would be to game the early tera raids in a playthrough if you traded for a high level mon, brought it to the raids and therefore get really high level AI partners. Admittedly it's not very sporting, but it does seem to work. If I brought in a level 75 mon to a 1 star raid the AI partners would 1 shot the opponent.

My question is, should the high level mon even obey me in a raid? I only have 1 badge, so can control up to level 25, but I did 5 different raids with level 75+ mons and the obey rate has been 100% so far. Just curious if the check is even in place for tera raids.
 
So I was curious about how easy it would be to game the early tera raids in a playthrough if you traded for a high level mon, brought it to the raids and therefore get really high level AI partners. Admittedly it's not very sporting, but it does seem to work. If I brought in a level 75 mon to a 1 star raid the AI partners would 1 shot the opponent.

My question is, should the high level mon even obey me in a raid? I only have 1 badge, so can control up to level 25, but I did 5 different raids with level 75+ mons and the obey rate has been 100% so far. Just curious if the check is even in place for tera raids.
The obedience function has only ever applied in regular battles. Link Battles, Battle Facilities (usually require cheats to get to without all badges), Dynamax and Tera Raids, etc. don't check it.
 

Tea Guzzler

forever searching for a 10p freddo
is a Site Content Manageris a Social Media Contributoris a Forum Moderatoris a Community Contributoris a Tiering Contributoris a Top Contributoris a Smogon Media Contributor
interesting discovery in regards to ogerpon - if it has an ability that can't be removed via skill swap (such as protosynthesis or power construct), then after terastallizing, it keeps that ability until it switches out (after then, it becomes embody aspect as normal). when this happens, embody aspect doesn't activate. when testing with proto, it kept its boost until it switched out, after which it longer applied thanks to no longer having proto.
 

DaWoblefet

Demonstrably so
is a Battle Simulator Administratoris a Community Leaderis a Programmeris a Community Contributoris a Top Researcheris a Top Tiering Contributoris a Social Media Contributor Alumnus
PS Admin
Embody Aspect behaves like Libero / Protean in the sense of only being able to activate once while the Ogerpon is present on the field. This can be seen by switching in Neutralizing Gas to temporarily suppress the Ability, then immediately switching out. If a Pokemon with one of these Abilities loses its Ability and regains it later (e.g. Skill Swap away and Skill Swap back) the Ability will reactivate (e.g. Protean can change typing again). So unlike Abilities like Supersweet Syrup, Intrepid Sword, or Battle Bond, which can only activate once per battle, these Abilities can only activate once per "instance", so to speak.

Here's examples of Abilities I've explicitly tested that do not have this property (not comprehensive):

Air Lock
Comatose
Commander
Costar
Curious Medicine
Desolate Land
Download
Drizzle
Frisk
Grassy Surge
Hadron Engine
Hospitality
Intimidate
Mimicry
Mold Breaker
Pressure
Slow Start
Supreme Overlord
Sword of Ruin
Tablets of Ruin
Wind Rider (increasing Attack in Tailwind)

Somewhat unrelated; while testing this, I accidentally found a game crash with the interaction of Neutralizing Gas, Hospitality, and Terastallized Ogerpon. If a Neutralizing Gas user switches out for a Terastallized Ogerpon by an ally that has Hospitality, Hospitality will attempt to activate to heal the Neutralizing Gas user, but immediately crash the game (see additional details by Anubis).
 
Last edited:
Somewhat unrelated; while testing this, I accidentally found a game crash with the interaction of Neutralizing Gas, Hospitality, and Terastallized Ogerpon. If a Neutralizing Gas user switches out for a Terastallized Ogerpon by an ally that has Hospitality, Hospitality will attempt to activate to heal the Neutralizing Gas user, but immediately crash the game (see additional details by Anubis).
Is it only happening when a Terastallized Ogerpon is involved? Or does it happen any time a Neutralizing Gas user switches out with a Hospitality ally on the field?
 

Anubis

HONK
is a Community Contributoris a Top Researcheris a Battle Simulator Admin Alumnusis a Community Leader Alumnusis a Smogon Discord Contributor Alumnus
Is it only happening when a Terastallized Ogerpon is involved? Or does it happen any time a Neutralizing Gas user switches out with a Hospitality ally on the field?
It's specifically Terastallized Ogerpon. The lua function with the lines restricting it and the line that crashes are marked below.

Code:
L68_1 = _ENV
L69_1 = "main.battle.BattleTimelineCommand"
L68_1 = L68_1[L69_1]
L69_1 = "CFunc_Tml_GaugeDamage"
function L70_1(A0_2, A1_2, A2_2, A3_2)
  local L4_2, L5_2, L6_2, L7_2, L8_2, L9_2, L10_2, L11_2, L12_2, L13_2, L14_2, L15_2, L16_2, L17_2, L18_2, L19_2, L20_2, L21_2, L22_2, L23_2, L24_2
  L5_2 = A0_2
  L4_2 = A0_2.fB3CF1DEB
  L4_2 = L4_2(L5_2)
  L5_2 = C3B091777E3EC94A5
  L5_2 = L5_2.s_behaviorMap
  L5_2 = L5_2.h
  L5_2 = L5_2[L4_2]
  L6_2 = L42_1.tnull
  if L5_2 == L6_2 then
    L5_2 = nil
  end
  L6_2 = L52_1.__cast
  L7_2 = L5_2
  L8_2 = main.battle.BattleTimelineCommand
  L6_2 = L6_2(L7_2, L8_2)
  L7_2 = L6_2[2]
  L9_2 = L6_2
  L8_2 = L6_2.F6D2686DAA2F37029
  L10_2 = A1_2
  L11_2 = A2_2
  L8_2 = L8_2(L9_2, L10_2, L11_2)
  L9_2 = true
  L11_2 = L7_2
  L10_2 = L7_2.GetSetupData
  L10_2 = L10_2(L11_2)
  L10_2 = L10_2[1]
  if 1 == L10_2 and 1 == L8_2 then
    L10_2 = nil
    L11_2 = nil
    L12_2 = _hx_tab_array
    L13_2 = {}
    L13_2.length = 0
    L13_2[0] = 0
    L14_2 = 2
    L15_2 = 4
    L16_2 = 6
    L13_2[1] = L14_2
    L13_2[2] = L15_2
    L13_2[3] = L16_2
    L14_2 = 4
    L12_2 = L12_2(L13_2, L14_2)
    L13_2 = 0
    L14_2 = false
    while true do
      L15_2 = L12_2.length
      if not (L13_2 < L15_2) then
        break
      end
      L15_2 = L12_2[L13_2]
      L13_2 = L13_2 + 1
      L17_2 = L7_2
      L16_2 = L7_2.GetDirectorArray
      L18_2 = L15_2
      L16_2 = L16_2(L17_2, L18_2)
      if nil ~= L16_2 then
        L16_2 = 0
        L18_2 = L7_2
        L17_2 = L7_2.GetDirectorArray
        L19_2 = L15_2
        L17_2 = L17_2(L18_2, L19_2)
        while true do
          L18_2 = L17_2.length
          if not (L16_2 < L18_2) then
            break
          end
          L18_2 = L17_2[L16_2]
          L16_2 = L16_2 + 1
          if nil ~= L18_2 then
            L19_2 = L18_2[8]
            if "WazaEffect" == L19_2 then
              L20_2 = L18_2
              L19_2 = L18_2.GetTimelinePlayer
              L19_2 = L19_2(L20_2)
              L19_2 = L19_2[2]
              if L19_2 == A1_2 then
                L10_2 = L18_2
                break
              end
            end
          end
          if nil ~= L18_2 then
            L19_2 = L18_2[8]
            if "AddEffect" == L19_2 then
              L20_2 = L18_2
              L19_2 = L18_2.GetTimelinePlayer
              L19_2 = L19_2(L20_2)
              L19_2 = L19_2[2]
              if L19_2 == A1_2 then
                L11_2 = L18_2
                break
              end
            end
          end
        end
        if nil ~= L10_2 then
          L14_2 = true
        else
          if nil ~= L11_2 then
            L14_2 = true
          else
          end
        end
      end
      if L14_2 then
        L14_2 = false
        break
      end
    end
    if nil ~= L10_2 then
      L15_2 = L52_1.__cast
      L16_2 = L10_2
      L17_2 = C325BAB6901F24A22
      L15_2 = L15_2(L16_2, L17_2)
      if nil ~= L15_2 then
        L17_2 = L15_2
        L16_2 = L15_2.FA3D6B2CCC0BBACB3
        L16_2 = L16_2(L17_2)
        L18_2 = L15_2
        L17_2 = L15_2.GetRaidBossHp
        L17_2 = L17_2(L18_2)
        if L17_2 >= 0 then
          L18_2 = L7_2[12]
          L19_2 = L18_2
          L18_2 = L18_2.F73E6D0F3C004ACE7
          L20_2 = L16_2
          L21_2 = L17_2
          L18_2(L19_2, L20_2, L21_2)
        end
        L9_2 = false
      end
    elseif nil ~= L11_2 and nil ~= L11_2 then
      L9_2 = false
    end
  end
  if L9_2 then
    L10_2 = L7_2[12]
    L11_2 = L10_2
    L10_2 = L10_2.StartGaugeAnime
    L12_2 = L8_2
    L10_2(L11_2, L12_2)
  end
  L11_2 = L7_2
  L10_2 = L7_2.GetBattlePokeParam
  L12_2 = L8_2
  L10_2 = L10_2(L11_2, L12_2)
  L11_2 = nil
  L12_2 = cBF3FA539
  L12_2 = L12_2.fA3B248EE
  L13_2 = L10_2
  L14_2 = L11_2
  L12_2 = L12_2(L13_2, L14_2)
  if L12_2 then
    L13_2 = L10_2
    L12_2 = L10_2.f0BD5134F_getMonsNo
    L12_2 = L12_2(L13_2)
    if 1011 == L12_2 then -- check for Ogerpon's devID
      L13_2 = L10_2
      L12_2 = L10_2.fAA91CCF5_isTerastallized
      L12_2 = L12_2(L13_2)
      if true == L12_2 then -- only if Ogerpon is Terastallized
        L12_2 = L32_1.lpad
        L13_2 = L31_1.string
        L14_2 = ""
        L13_2 = L13_2(L14_2)
        L14_2 = L31_1.string
        L16_2 = L10_2
        L15_2 = L10_2.fB0912853
        L15_2, L16_2, L17_2, L18_2, L19_2, L20_2, L21_2, L22_2, L23_2, L24_2 = L15_2(L16_2)
        L14_2 = L14_2(L15_2, L16_2, L17_2, L18_2, L19_2, L20_2, L21_2, L22_2, L23_2, L24_2)
        L13_2 = L13_2 .. L14_2
        L14_2 = "0"
        L15_2 = 2
        L12_2 = L12_2(L13_2, L14_2, L15_2)
        L14_2 = L7_2
        L13_2 = L7_2.GetPokemon
        L15_2 = L8_2
        L13_2 = L13_2(L14_2, L15_2)
        if nil ~= L13_2 then
          L15_2 = L13_2
          L14_2 = L13_2.GetGemObj -- this is the line it is crashing in
          L14_2 = L14_2(L15_2)
          L15_2 = nil
          L16_2 = c016374C1
          L16_2 = L16_2.f8C7D4F4D
          L17_2 = L14_2
          L18_2 = L15_2
          L16_2 = L16_2(L17_2, L18_2)
          if L16_2 then
            L17_2 = L14_2
            L16_2 = L14_2.f5439788F
            L18_2 = L31_1.string
            L19_2 = "crown"
            L18_2 = L18_2(L19_2)
            L19_2 = L31_1.string
            L20_2 = L12_2
            L19_2 = L19_2(L20_2)
            L18_2 = L18_2 .. L19_2
            L16_2 = L16_2(L17_2, L18_2)
            L17_2 = nil
            L18_2 = c016374C1
            L18_2 = L18_2.f8C7D4F4D
            L19_2 = L16_2
            L20_2 = L17_2
            L18_2 = L18_2(L19_2, L20_2)
            if L18_2 then
              L18_2 = cE35B3EB3
              L18_2 = L18_2.fB41FD22F
              L19_2 = L16_2
              L18_2 = L18_2(L19_2)
              L19_2 = nil
              L20_2 = cE35B3EB3
              L20_2 = L20_2.f67745D00
              L21_2 = L18_2
              L22_2 = L19_2
              L20_2 = L20_2(L21_2, L22_2)
              if L20_2 then
                L20_2 = L7_2[12]
                L21_2 = L20_2
                L20_2 = L20_2.FEAF3BBD39A3DF8FA
                L20_2 = L20_2(L21_2)
                if nil ~= L20_2 then
                  L22_2 = L20_2
                  L21_2 = L20_2.GetGaugeParam
                  L23_2 = L8_2
                  L21_2 = L21_2(L22_2, L23_2)
                  L21_2 = L21_2.animeEndHp
                  L23_2 = L20_2
                  L22_2 = L20_2.GetGaugeParam
                  L24_2 = L8_2
                  L22_2 = L22_2(L23_2, L24_2)
                  L22_2 = L22_2.animeStartHp
                  if L21_2 < L22_2 then
                    L22_2 = L18_2
                    L21_2 = L18_2.fF56461AF
                    L21_2 = L21_2(L22_2)
                    L22_2 = L21_2
                    L21_2 = L21_2.fE5760654
                    L23_2 = "damage_int"
                    L24_2 = 2
                    L21_2(L22_2, L23_2, L24_2)
                    L22_2 = L18_2
                    L21_2 = L18_2.fF56461AF
                    L21_2 = L21_2(L22_2)
                    L22_2 = L21_2
                    L21_2 = L21_2.fFE05DDAD
                    L23_2 = "damage_trigger"
                    L24_2 = 1
                    L21_2(L22_2, L23_2, L24_2)
                  end
                end
              end
            end
          end
        end
      end
    end
  end
1699138629964.png


Function hashes can be matched to their strings here.

DaWoblefet was really lucky to find it since it's very specific and the order mattered.
 
Last edited:

Dunfan

formerly Dunsparce Fanboy
Regarding Effect Spore, if the attacker is immune to the status effect it would be inflicted with, are the probabilities recalculated for a different status effect?
And if not, are the other two status effect attempted, and if yes, in what order? (eg. first poison, then paralysis, then sleep)
 
Last edited:
Regarding Effect Spore, if the attacker is immune to the status effect it would be inflicted with, are the probabilities recalculated for a different status effect?
And if not, are the other two status effect attempted, and if yes, in what order? (eg. first poison, then paralysis, then sleep)
Given that, from Gen 5 on, Effect Spore has a slightly higher chance of inflicting Sleep and a slightly lower chance of inflicting Poison, I'm pretty sure it tries Sleep first and Poison last when trying to inflict them. Assuming nothing has changed codewise in SV it just has a lower chance of activating against Pokémon immune to one of the statuses.
 

Users Who Are Viewing This Thread (Users: 2, Guests: 2)

Top