Final Fantasy Wiki
Advertisement

What the hell is that?

Zidane Tribal

The Prison Cage is a boss from Final Fantasy IX. The party fights it twice in the Evil Forest, once with Garnet imprisoned in it, and once with Vivi.

Stats[]

#12

#14

Formations[]

Enemies Frequency AP
????
Can't escape.
Prison Cage (#014), Vivi 100% 3
????
Can't escape. Characters do not pose on victory.
Prison Cage (#012), Garnet 100% 3

Battle[]

FFIX Absorb

Absorb.

The Prison Cage will use Absorb to drain HP from the character it has imprisoned, both curing itself and hurting its prisoner. The player must keep the imprisoned character alive. During the second battle, Vivi will use Fire on Prison Cage at regular intervals.

During the first fight, both Zidane and Steiner will be in the party, giving the player the first opportunity to use Steiner's Sword Arts ability. Zidane will begin the first fight entering Trance.

AI script[]

First battle[]

Using global variable zidane
Using global variable steiner
Using global variable garnetendflag
Using global variable prisonendflag
Using global variable cagedgarnet
Using global variable prisoncage
Using global variable garnetdeadflag
Using global variable winflag

Function Main_Init
   InitObject( Prison_Cage )
   InitObject( Garnet)
   AttachObject( Garnet, Prison_Cage, Node_Cage )
   set SV_EnemyTeam[ATB] = SV_EnemyTeam[MAX_ATB]
   set zidane = ( SV_PlayerTeam[MODEL_TYPE] ==$ 0 )
   set zidane |= ( SV_PlayerTeam[MODEL_TYPE] ==$ 1 )
   set steiner = ( SV_PlayerTeam[MODEL_TYPE] ==$ 7 )
   set steiner |= ( SV_PlayerTeam[MODEL_TYPE] ==$ 8 )
   set SV_PlayerTeam[ATB] =$ 0


Function Main_Loop
   if ( endflag )
      return
   if ( #( SV_EnemyTeam & cagedgarnet ) == 0 )
      return
   if ( #( SV_EnemyTeam & prisoncage ) == 0 )
      return
   if ( cagedgarnet[HP] <= 10000 )
      set garnetdeadflag = TRUE
      set endflag = TRUE
   if ( prisoncage[HP] <= 10000 )
      set winflag = TRUE
      set endflag = TRUE
   Wait( 1 )
   loop


Function Prison_Cage_Loop
   if ( prisonendflag )
      return
   if ( !initflag )
      set initflag = TRUE
      set prisoncage = SV_FunctionEnemy
      RunBattleCode( Enable ATB )
      while ( GetBattleState != 4 )
         Wait( 1 )
   if ( dialogprogression == 0 )
      set SV_PlayerTeam[ATB] = 0
   elseif ( dialogprogression == 1 )
      if ( GetAttacker == zidane )
         set dialogprogression = 2
      set SV_PlayerTeam[ATB] =$ 0
      set SV_EnemyTeam[ATB] =$ 0
   elseif ( dialogprogression == 2 )
      if ( GetAttacker != zidane )
         set dialogprogression = 3
      set SV_PlayerTeam[ATB] =$ 0
      set SV_EnemyTeam[ATB] =$ 0
   elseif ( dialogprogression == 3 )
      set SV_PlayerTeam[ATB] =$ 0
      set SV_EnemyTeam[ATB] =$ 0
      if ( !cameraattackdone )
         if ( SV_FunctionEnemy[ATB] != SV_FunctionEnemy[MAX_ATB] )
            set SV_FunctionEnemy[ATB] = SV_FunctionEnemy[MAX_ATB] - 1
      BattleDialog( "Wh-What is that light!?" )
      set dialogwait1++
      if ( dialogwait1 > 45 )
         set dialogprogression = 7
   elseif ( dialogprogression == 7 )
      set SV_PlayerTeam[ATB] = 0
      set SV_EnemyTeam[ATB] = 0
      BattleDialog( "I don’t know. Somehow, it raises my power." )
      set dialogwait2++
      if ( dialogwait2 > 45 )
         set dialogprogression = 4
   elseif ( dialogprogression == 4 )
      set SV_PlayerTeam[ATB] = 0
      set SV_EnemyTeam[ATB] = 0
      BattleDialog( "Could it really be Trance...!?" )
      set dialogwait3++
      if ( dialogwait3 > 30 )
         set dialogprogression = 5
   elseif ( dialogprogression == 5 )
      set SV_PlayerTeam[ATB] = 0
      set SV_EnemyTeam[ATB] = 0
      BattleDialog( "I’ve heard of it before!" )
      set dialogwait4++
      if ( dialogwait4 > 30 )
         set dialogprogression = 6
   elseif ( dialogprogression == 6 )
      set SV_PlayerTeam[ATB] = 0
      set SV_EnemyTeam[ATB] = 0
      BattleDialog( "Trance is induced by a surge of emotion." )
      set dialogwait5++
      if ( dialogwait5 > 45 )
         set dialogprogression = 8
   elseif ( dialogprogression == 8 )
      set SV_PlayerTeam[ATB] = 0
      set SV_EnemyTeam[ATB] = 0
      BattleDialog( "Alright, let’s take him!" )
      set dialogprogression = 10
   elseif ( dialogprogression == 10 )
      set SV_PlayerTeam[ATB] =$ 0
      set SV_EnemyTeam[ATB] =$ 0
      set dialogwait6++
      if ( dialogwait6 > 30 )
         set dialogprogression = 9
   if ( ( !prisonendflag ) && winflag )
      set prisonendflag = 1
      while ( IsAttacking != 0 )
         Wait( 1 )
      if ( GetBattleState != 4 )
      RunBattleCode( Disable ATB )
      while ( GetBattleState != 1 )
         Wait( 1 )
      set SV_Target = SV_FunctionEnemy
      AttackSpecial( Use in event )
      while ( IsAttacking != 0 )
         Wait( 1 )
      AttackSpecial( Event of death )
      Wait( 30 )
      set SV_FunctionEnemy[SHADOW] = 0
      while ( IsAttacking != 0 )
         Wait( 1 )
      RunBattleCode( End Battle, Victory )
   if ( #( SV_EnemyTeam & cagedgarnet ) && ( cagedgarnet[HP] >= 10070 ) )
      set zidanehealwarning = 0
      set steinerhealwarning = 0
   Wait( 1 )
   loop


Function Prison_Cage_ATB
   if ( !dialogprogression )
      set dialogprogression = 1
      set SV_Target = zidane
      Attack( Transfer )
   if ( !cameraattackdone )
      set cameraattackdone = TRUE
      set SV_Target = zidane
      Attack( For camera use )
   if ( garnetendflag + prisonendflag )
      set SV_Target 0
      Attack( Right Stem )
   if ( attacktracker == 0 )
      set attacktracker = 1
      set SV_Target = cagedgarnet
      Attack( Absorb )
   elseif ( attacktracker == 1 )
      set attacktracker = 2
      set SV_Target = steiner
      Attack( Right Stem )
   else
      set attacktracker = 0
      set SV_Target = zidane
      Attack( Left Stem )


Function Prison_Cage_CounterEx
   if ( #( SV_EnemyTeam & cagedgarnet ) == 0 )
      return
   if ( SV_FunctionEnemy[HP] < 10050 )
      return
   if ( ( GetAttackCommandId == Attack ) && #( SV_EnemyTeam & cagedgarnet ) && ( cagedgarnet[HP] < 10025 ) )
      if ( GetAttacker == zidane )
         if ( #( NotMatching(SV_PlayerTeam[STATUS_CURRENT], PETRIFY | VENOM | DEATH | STOP) & steiner ) == 0 )
            return
         if ( zidanehealwarning == 0 )
            set zidanehealwarning++
            BattleDialog( "We must heal the princess!" )
         elseif ( zidanehealwarning == 1 )
            set zidanehealwarning++
            BattleDialog( "Hurry up and heal the princess!!!" )
         else
            BattleDialog( "Heal the princess at once!!!" )
      elseif ( GetAttacker == steiner )
         if ( #( NotMatching(SV_PlayerTeam[STATUS_CURRENT], PETRIFY | VENOM | DEATH | STOP) & zidane ) == 0 )
            return
         if ( steinerhealwarning == 0 )
            set steinerhealwarning++
            BattleDialog( "Yo, this is no time to be attacking!" )
         elseif ( steinerhealwarning == 1 )
            set steinerhealwarning++
            BattleDialog( "We have to heal Garnet first!" )
         else
            BattleDialog( "Garnet!" )


Second battle[]

Using global variable zidane
Using global variable steiner
Using global variable viviendflag
Using global variable prisonendflag
Using global variable prisoncage
Using global variable cagedvivi
Using global variable vivideadflag
Using global variable winflag

Function Main_Init
   InitObject( Prison_Cage )
   InitObject( Vivi )
   AttachObject( ViVi, Prison_Cage, Node_Cage )
   set zidane = ( SV_PlayerTeam[MODEL_TYPE] ==$ 0 )
   set zidane |= ( SV_PlayerTeam[MODEL_TYPE] ==$ 1 )
   set steiner = ( SV_PlayerTeam[MODEL_TYPE] ==$ 7 )
   set steiner |= ( SV_PlayerTeam[MODEL_TYPE] ==$ 8 )


Function Main_Loop
   if ( endflag )
      return
   if ( #( SV_EnemyTeam & cagedvivi ) == 0 )
      return
   if ( #( SV_EnemyTeam & prisoncage ) == 0 )
      return
   if ( cagedvivi[HP] <= 10000 )
      set endflag = TRUE
      set vivideadflag = TRUE
   elseif ( prisoncage[HP] <= 10000 )
      set endflag = TRUE
      set winflag = TRUE
   Wait( 1 )
   loop


Function Prison_Cage_Loop
   if ( !initflag )
      set initflag = TRUE
      set prisoncage = SV_FunctionEnemy
      set SV_FunctionEnemy[ATB] = 0
      set SV_FunctionEnemy[DEFEATED_ON] = 1
      RunBattleCode( Enable ATB )
      while ( GetBattleState != 4 )
         Wait( 1 )
   if ( !prisonendflag && winflag )
      set prisonendflag = TRUE
      while ( IsAttacking != 0 )
         Wait( 1 )
      RunBattleCode( Disable ATB )
      while ( GetBattleState != 1 )
         Wait( 1 )
      set SV_Target = SV_FunctionEnemy
      AttackSpecial( Death )
      while ( IsAttacking != 0 )
         Wait( 1 )
      RunBattleCode( End Battle, Victory )
   Wait( 1 )
   loop


Function Prison_Cage_ATB
   if ( attacktracker == 0 )
      set attacktracker = 1
      set SV_Target = cagedvivi
      Attack( Absorb )
   elseif ( attacktracker == 1 )
      set attacktracker = 2
      set SV_Target = steiner
      Attack( Right Stem )
   else
      set attacktracker = 0
      set SV_Target = zidane
      Attack( Left Stem )


Other appearances[]

Final Fantasy Record Keeper[]

FFRK Prison Cage FFIX
Baknamy FFTA2This section about an enemy in Final Fantasy Record Keeper is empty or needs to be expanded. You can help the Final Fantasy Wiki by expanding it.


Gallery[]

Related enemies[]

Advertisement