Thorn is a boss in Final Fantasy IX. He is fought in Alexandria Castle along with Zorn. Additionally, Thorn appears as a dummied enemy in a cinematic fight in Mount Gulug.

Stats[edit | edit source]

Battle[edit | edit source]

The battle will end when one of them is defeated. The two will take turns charging up the other to cast a powerful spell on the party, but if the "charged" twin is attacked, the charge is canceled out and the spell will not be cast.

Strategy[edit | edit source]

As there is time limit for the fight, it is best to target Thorn instead of Zorn, since he has less HP.

AI script[edit | edit source]

Using global variable zorn
Using global variable thorn
Using global variable zornpoweron
Using global variable thornpoweron
Using global variable endflag

Function Thorn_Loop
   if ( !initflag )
      set thorn = SV_FunctionEnemy
      set hplimitdeath = 65535L - SV_FunctionEnemy[HP]
      set SV_FunctionEnemy[MAX_HP] = 65535L
      set SV_FunctionEnemy[HP] = 65535L
      set hp = 65535L
      set initflag = TRUE
   else
      if ( endflag )
         while ( GetBattleState != 1 )
            Wait( 1 )
         Wait( 20 )
      set SV_Target = SV_FunctionEnemy
         if ( SV_FunctionEnemy[STAND_ANIMATION] )
            AttackSpecial( Withdraw1 )
         else
            AttackSpecial( Withdraw0 )
         set SV_FunctionEnemy[DEFEATED_ON] = 1
         while ( IsAttacking != 0 )
            Wait( 1 )
         RunBattleCode( End Battle, Escape )
      if ( SV_FunctionEnemy[HP] < hplimitdeath )
         set endflag = TRUE
         while ( IsAttacking != 0 )
            Wait( 1 )
         RunBattleCode( Disable ATB )
         while ( GetBattleState != 1 )
            Wait( 1 )
      set SV_Target = SV_FunctionEnemy
         if ( SV_FunctionEnemy[STAND_ANIMATION] )
            AttackSpecial( Withdraw1 )
         else
            AttackSpecial( Withdraw0 )
         set SV_FunctionEnemy[DEFEATED_ON] = 1
         while ( IsAttacking != 0 )
            Wait( 1 )
      if ( thornpoweron )
         if ( GetAttacker == SV_FunctionEnemy )
            set thornpoweron = FALSE
      if ( waitingpowerzorn )
         if ( GetAttacker == SV_FunctionEnemy )
            set waitingpowerzorn = FALSE
         if ( zorn[STAND_ANIMATION] == 0 )
            set SV_FunctionEnemy[PREVENT_ATTACK] = 1
            set waitingpowerzorn = FALSE
      if ( SV_FunctionEnemy[STAND_ANIMATION] == 0 )
         set SV_FunctionEnemy[ATB] = SV_FunctionEnemy[MAX_ATB]
   Wait( 1 )
   loop

Function Thorn_ATB
   set jumpstate = [ zorn[STAND_ANIMATION] ; thorn[STAND_ANIMATION] ]
   if ( jumpstate == [ 0 ; 0 ] || jumpstate == [ 1 ; 0 ] )
      set SV_Target = SV_FunctionEnemy
      Attack( Continue0-1 )
   elseif ( jumpstate == [ 0 ; 1 ] )
      set SV_Target = RandomInTeam(SV_PlayerTeam)
      if ( thornpoweron )
         Attack( Light Flare )
      else
         Attack( No action )
   elseif ( jumpstate == [ 1 ; 1 ] )
      if ( thornpoweron )
      set SV_Target = RandomInTeam(SV_PlayerTeam)
         Attack( Light Flare )
      else
         if ( !zornpoweron )
            set SV_Target = zorn
            Attack( Power Zorn )
            set waitingpowerzorn = TRUE
         else
            set SV_Target = RandomInTeam(SV_PlayerTeam)
            Attack( No action )
   set SV_Target = RandomInTeam(SV_PlayerTeam)
   Attack( No action )


Function Thorn_Counter
   if ( ( GetAttackCommandId == Skill ) && ( GetAttackId == What's That?! ) )
      return
   if ( SV_FunctionEnemy[HP] < hp )
      set hp = SV_FunctionEnemy[HP]
      if ( GetAttackCommandId == Eidolon || GetAttackId == Six Dragons )
         return
   else
      set hp = SV_FunctionEnemy[HP]
      return
   set jumpstate = [ zorn[STAND_ANIMATION] ; thorn[STAND_ANIMATION] ]
   if ( jumpstate == [ 0 ; 0 ] )
      set SV_Target = SV_FunctionEnemy
      Attack( Continue0-1 )
   elseif ( jumpstate == [ 1 ; 0 ] )
      if ( !zornpoweron )
         set SV_Target = zorn
         Attack( Power Zorn )
         set waitingpowerzorn = TRUE
   elseif ( jumpstate == [ 0 ; 1 ] )
      if ( thornpoweron )
         set thornpoweron = FALSE
         BattleDialog( "The flare power has been neutralized." )
      set SV_FunctionEnemy[STAND_ANIMATION] = 0
      set SV_FunctionEnemy[PREVENT_ATTACK] = 1
   elseif ( jumpstate == [ 1 ; 1 ] )
      set SV_FunctionEnemy[STAND_ANIMATION] = 0
      set SV_FunctionEnemy[PREVENT_ATTACK] = 1
      if ( ( !zornpoweron ) && ( !thornpoweron ) )
         set SV_Target = zorn
         Attack( Power Zorn )
         set waitingpowerzorn = TRUE
      if ( thornpoweron )
         set thornpoweron = FALSE
         BattleDialog( "The flare power has been neutralized." )


Function Thorn_CounterEx
   if ( GetAttacker == SV_FunctionEnemy )
      if ( GetAttackId == Continue0-1 )
         set SV_FunctionEnemy[PREVENT_ATTACK] = 1
      return
   if ( GetAttacker == zorn )
      if ( GetAttackId == Power Thorn )
         set zorn[PREVENT_ATTACK] = 1
         set thorn[PREVENT_ATTACK] = 1
         set SV_FunctionEnemy[ATB] = 0
         set thornpoweron = TRUE
      return
   if ( SV_FunctionEnemy[HP] < hp )
      set hp = SV_FunctionEnemy[HP]
      if ( GetAttackCommandId == Eidolon || GetAttackId == Six Dragons )
         return
   else
      set hp = SV_FunctionEnemy[HP]
      return
   if ( thornpoweron )
      set thornpoweron = FALSE
      BattleDialog( "The flare power has been neutralized." )
   set SV_FunctionEnemy[STAND_ANIMATION] = 0
   set SV_FunctionEnemy[PREVENT_ATTACK] = 1


Gallery[edit | edit source]

Related enemies[edit | edit source]

Community content is available under CC-BY-SA unless otherwise noted.