The Tonberry is an enemy from Final Fantasy IX found in Ipsen's Castle. They are always seen in trios. They can't be encountered when Zidane heads back to rescue Amarant.
Stats[]
Battle[]
Tonberry retains its signature moves from previous games in the series. It slowly approaches the player party, and upon reaching them, unleashes either Knife attacks against a party member for 9,999 HP damage, or Everyone's Grudge, which deals damage based on the number of defeated Tonberries. After using Knife, it teleports out of the battle.
Strategy[]
The best way to defeat the Tonberry is to use attacks that deal fixed damage, such as Quina's Frog Drop or Zidane's Thievery, because they take little damage from physical attacks.
AI script[]
Using general variable General_TonberryCounter
Using global variable hplimitdeath
Using global variable dummyindex
Using global variable allescapestep
Using global variable linelist
Using global variable rowlist
Using global variable counteringbitflags
Using global variable obstacle1stepahead
Using global variable obstacle2stepahead
Using global variable tonberryaheadindex
Using global variable obstacleleft
Using global variable obstacleright
Function Tonberry_Loop
if ( !battlestate )
set SV_FunctionEnemy[PLAY_ANIM] = 3
if ( SV_FunctionEnemy == 16 )
set tonberryindex = 0
elseif ( SV_FunctionEnemy == 32 )
set tonberryindex = 1
elseif ( SV_FunctionEnemy == 64 )
set tonberryindex = 2
else
set tonberryindex = 3
if ( !tonberryindex )
set dummyindex = GetRandom & 3
set linelist = 0x3210
set rowlist = 0x3333
if ( !General_TonberryCounter )
set General_TonberryCounter = 1
if ( tonberryindex == dummyindex )
set SV_FunctionEnemy[MODEL_OFF] = 65535L
set SV_FunctionEnemy[SHADOW] = 0
set linelist |= 0xF << ( tonberryindex * 4 )
set rowlist |= 0xF << ( tonberryindex * 4 )
set hplimitdeath = 65535L - SV_FunctionEnemy[HP]
if ( hplimitdeath < 10000 )
set hplimitdeath = 10000
if ( #SV_PlayerTeam == 4 )
while ( GetBattleState != 1 )
Wait( 1 )
RunBattleCode( Enable ATB )
else
set SV_FunctionEnemy[PRESENCE_OFF] = 1
return
else
if ( #SV_PlayerTeam != 4 )
if ( dummyindex == 0 )
set allescapestep = 1
if ( tonberryindex == 0 )
set SV_Target = SV_FunctionEnemy
AttackSpecial( Disappear2 )
while ( IsAttacking == 0 )
Wait( 1 )
while ( IsAttacking != 0 )
Wait( 1 )
set allescapestep = 1
if ( dummyindex == 1 )
set allescapestep = 2
return
if ( tonberryindex == 1 )
while ( allescapestep != 1 )
Wait( 1 )
set SV_Target = SV_FunctionEnemy
AttackSpecial( Disappear2 )
while ( IsAttacking == 0 )
Wait( 1 )
while ( IsAttacking != 0 )
Wait( 1 )
set allescapestep = 2
if ( dummyindex == 2 )
set allescapestep = 3
return
if ( tonberryindex == 2 )
while ( allescapestep != 2 )
Wait( 1 )
set SV_Target = SV_FunctionEnemy
AttackSpecial( Disappear2 )
while ( IsAttacking == 0 )
Wait( 1 )
while ( IsAttacking != 0 )
Wait( 1 )
set allescapestep = 3
if ( dummyindex == 3 )
RunBattleCode( End Battle, Escape )
return
while ( allescapestep != 3 )
Wait( 1 )
set SV_Target = SV_FunctionEnemy
AttackSpecial( Disappear2 )
while ( IsAttacking == 0 )
Wait( 1 )
while ( IsAttacking != 0 )
Wait( 1 )
RunBattleCode( End Battle, Escape )
return
set SV_FunctionEnemy[MAX_HP] = 65535L
set SV_FunctionEnemy[HP] = 65535L
set battlestate++
elseif ( battlestate == 1 )
if ( tonberryindex == dummyindex )
while ( IsAttacking != 0 )
Wait( 1 )
set SV_FunctionEnemy[PRESENCE_OFF] = 1
return
while ( GetBattleState != 4 )
Wait( 1 )
set battlestate++
set SV_FunctionEnemy[ATB] = SV_FunctionEnemy[MAX_ATB]
Wait( 1 )
loop
Function Tonberry_ATB
if ( knifeflag )
set SV_Target = SV_FunctionEnemy
Attack( Disappear )
set currentline = ( linelist >> ( tonberryindex * 4 ) ) & 0xF
set currentrow = ( rowlist >> ( tonberryindex * 4 ) ) & 0xF
if ( currentrow == 10 )
set knifeflag = TRUE
set SV_Target = 1 << currentline
Attack( Knife )
set obstacle1stepahead = FALSE
set obstacle2stepahead = FALSE
set tonberryaheadindex = 0
set obstacleleft = FALSE
set obstacleright = FALSE
set index = 0
while ( index < 4 )
set line = ( linelist >> ( index * 4 ) ) & 0xF
set row = ( rowlist >> ( index * 4 ) ) & 0xF
if ( ( index != tonberryindex ) && ( line != 0xF ) )
if ( currentline == line )
if ( currentrow + 1 == row )
set obstacle1stepahead = TRUE
elseif ( currentrow + 2 == row )
set obstacle2stepahead = TRUE
elseif ( currentrow - 1 == row )
set tonberryaheadindex = index
elseif ( currentrow - 2 == row )
set tonberryaheadindex = index
elseif ( currentline + 1 == line )
if ( currentrow == row )
set obstacleright = TRUE
elseif ( currentline - 1 == line )
if ( currentrow == row )
set obstacleleft = TRUE
set index++
if ( currentrow == 9 )
set obstacle2stepahead = TRUE
elseif ( currentrow == 10 )
set obstacle1stepahead = TRUE
if ( !obstacle1stepahead )
set SV_Target = SV_FunctionEnemy
Attack( March )
else
set SV_Target = SV_PlayerTeam
Attack( Everyone’s Grudge )
Function Tonberry_Counter
if ( ( GetAttackCommandId == Skill ) && ( GetAttackId == What's That?! ) )
return
if ( SV_FunctionEnemy[HP] < hplimitdeath )
set linelist |= 0xF << ( tonberryindex * 4 )
set rowlist |= 0xF << ( tonberryindex * 4 )
if ( General_TonberryCounter < 254 )
set General_TonberryCounter += 2
set SV_FunctionEnemy[HP] = 0
return
set currentline = ( linelist >> ( tonberryindex * 4 ) ) & 0xF
set currentrow = ( rowlist >> ( tonberryindex * 4 ) ) & 0xF
if ( currentrow == 10 )
if ( !knifeflag )
set knifeflag = TRUE
set SV_Target = 1 << currentline
Attack( Knife )
return
SetupObstacleVariables( obstacle1stepahead, obstacle2stepahead, tonberryaheadindex, obstacleleft, obstacleright )
set attackerline = 255
set tmpcharacter = GetAttacker
if ( #tmpcharacter )
set attackerline = tmpcharacter[COLUMN]
set SV_Target = SV_FunctionEnemy
set counteringbitflags |= 1 << ( tonberryindex * 4 )
if ( attackerline == currentline )
if ( obstacle1stepahead )
Attack( Bump forward )
elseif ( obstacle2stepahead )
set rowlist += 1 << ( tonberryindex * 4 )
Attack( March )
set rowlist += 2 << ( tonberryindex * 4 )
Attack( Marching2 )
elseif ( attackerline < currentline )
if ( obstacleleft )
Attack( Bump right )
set linelist -= 1 << ( tonberryindex * 4 )
Attack( Move left )
else
if ( obstacleright )
Attack( Bump left )
set linelist += 1 << ( tonberryindex * 4 )
Attack( Move right )
Function Tonberry_CounterEx
if ( SV_FunctionEnemy[HP] < hplimitdeath )
set SV_FunctionEnemy[HP] = hplimitdeath
if ( GetAttacker == SV_FunctionEnemy )
if ( GetAttackId == Disappear )
set tonberrycount = 0
set index = 0
while ( index < 4 )
set line = ( linelist >> ( index * 4 ) ) & 0xF
if ( line != 0xF )
set tonberrycount++
set index++
set linelist |= 0xF << ( tonberryindex * 4 )
set rowlist |= 0xF << ( tonberryindex * 4 )
while ( IsAttacking != 0 )
Wait( 1 )
if ( tonberrycount <= 1 )
RunBattleCode( Disable ATB )
while ( GetBattleState != 1 )
Wait( 1 )
if ( GetExpGain )
RunBattleCode( End Battle, Victory )
else
RunBattleCode( End Battle, Escape )
set SV_FunctionEnemy[PRESENCE_OFF] = 1
if ( ( counteringbitflags >> ( tonberryindex * 4 ) ) & 1 )
set counteringbitfilter = 0xF << ( tonberryindex * 4 )
set counteringbitflags &= ~counteringbitfilter
elseif ( GetAttackId == March )
set rowlist += 1 << ( tonberryindex * 4 )
elseif ( GetAttackId == Marching2 )
set rowlist += 2 << ( tonberryindex * 4 )
set currentline = ( linelist >> ( tonberryindex * 4 ) ) & 0xF
set currentrow = ( rowlist >> ( tonberryindex * 4 ) ) & 0xF
SetupObstacleVariables( obstacle1stepahead, obstacle2stepahead, tonberryaheadindex, obstacleleft, obstacleright )
if ( tonberryaheadindex )
if ( !( ( counteringbitflags >> ( tonberryaheadindex * 4 ) ) & 1 ) )
set tmpcharacter = 1 << ( 4 + tonberryaheadindex )
if ( #( NotMatching(SV_EnemyTeam[STATUS_CURRENT], PETRIFY | VENOM | DEATH | STOP) & tmpcharacter ) )
set tmpcharacter[PREVENT_ATTACK] = 1
if ( obstacle1stepahead )
if ( ( 10 <= currentrow ) && ( GetAttackId != March ) && ( GetAttackId != Marching2 ) )
return
set SV_FunctionEnemy[PREVENT_ATTACK] = 1
Tetra Master[]
Tetra Master |
---|
#046 Location: Treno (Card Stadium "Card Freak Cil" and "Straight Shooter Shak") Black Mage Village (Black Mage No. 33 [Choco Hut], Black mage no.192 [endgame]) |