//
//    CHAPTERˇˇ27
//    Applet Source Name [Piranihan.java]
//                                    1996.2
//                 Author [ Junzo hagimoto ]

import java.applet.*;
import java.awt.*;
import userClass.*;
import userClass.App.*;

public  class  Piranhan  extends AnimatorApplet {
    static  int  MAXTIMER  =  100;           
    Dimension d;
    int    maxText;
    int    maxPiranhan;
    int    speed;
    FontStringsArray stringarray;
    boolean     hitAction = false;
    Assistant   assist;
    public void initAnimator() {
        d = size();
                                                              
        String param = getParameter( "speed" );               
        speed = (param != null) ? Integer.parseInt(param) : 1;
        if(speed < 1 || speed > 10 ){                       
           speed = 1;                                         
        }                                                   
        speed = speed * 4;                                  
        param = getParameter( "maxText" );                   
        maxText = (param != null) ? Integer.parseInt(param) : 1;    
        stringarray = new FontStringsArray(this,maxText);
        int i=0;
        do{                                                         
            param = getParameter( "text"+ (i+1) );                  
            if(param != null ){                                     
            stringarray.add( new String(param) );                           
        }else{
                if( i==0 ){
                   stringarray.add(new String("Java") );                                    
                } 
             maxText = i+1;
            } 
        }while( param != null && ++i != maxText );                  
        param = getParameter( "maxPiranhan" );
        maxPiranhan = (param != null) ? Integer.parseInt(param) : 3 ;

        assist = new Assistant(this,maxPiranhan);

        stringarray.nextString(); 
    }


    public void paintAnimator(Graphics g) {
        Mover m;
        int   i=0;
                                         
        g.setColor(Color.blue);          
        g.fillRect(0, 0, d.width, d.height);
        g.setColor(Color.red);
        assist.loop(this,g);
    }

    public void offScreenPaint(Graphics g,Mover mover,int drawCounter){
                                                                          
        if( mover.hitTimer == 0 ){                                              
            mover.calcxy(d,speed);
            boolean  hit = stringarray.hit(mover);
            if( hit && hitAction == false &&  assist.canHit(mover) ){
                mover.hitTimer = MAXTIMER;
                hitAction      = true;
                mover.save_x   = mover.x;
                mover.save_y   = mover.y;
                assist.createAccessary(mover);
            }
            if(drawCounter==0 &&  hitAction == false ){
                stringarray.drawString(g);
            }
            mover.drawImage(g);     
        }else{                                                            
            stringarray.drawChars(g,mover,MAXTIMER);
            mover.drawImage(g); 
            mover.hitTimer-- ;                                                  
            if(mover.hitTimer==0){                                              
                  hitAction  = false;
                  mover.imgCount=0;                                            
                  stringarray.nextString();               
                  assist.nextStory(mover);
            }
        } 
    }                                                                 
}

class   Assistant {
    boolean     cloneSwitch  = true;
    MoverArray  piranhanarray;
    MoverArray  cuttlearray;
    MoverArray  octopusarray;
    MoverArray  softcoralarray;
    public Assistant(Applet pra,int maxPiranhan){
        piranhanarray = new MoverArray(pra,"../appimage/q",11,maxPiranhan);
        piranhanarray.createMover();
        cuttlearray   = new MoverArray(pra,"../appimage/i",6,maxPiranhan); 
        octopusarray  = new MoverArray(pra,"../appimage/o",6,maxPiranhan); 
        softcoralarray= new MoverArray(pra,"../appimage/sc",6,20); 
    }
    public void loop(Piranhan pra,Graphics g){
        int i=0;
        Mover m;
        for( i=0; (m = piranhanarray.nextMover() ) != null ; i++){
                pra.offScreenPaint(g,m,i);
        }
        for( i=0; (m = cuttlearray.nextMover() ) != null ;i++){
                pra.offScreenPaint(g,m,i);
        }
        for( i=0; (m = octopusarray.nextMover() ) != null;i++ ){
                pra.offScreenPaint(g,m,i);
        }
        for( i=0; (m = softcoralarray.nextMover() ) != null;i++ ){
                pra.offScreenPaint(g,m,i);
        }
   }
   public boolean  cloneMover( Mover mover){                         
         int sw     = (int) (Math.random()*9);
         boolean   r = false;
         switch(sw){
         case  0:
              Mover m = mover.copy(new MoverPonPon());                
              if(mover instanceof MoverPonPon ){                      
                 if(mover.x - mover.getImageWidth(0) - 10 < 0 ) {     
                         m.x = mover.x + mover.getImageHeight(0) + 10;
                 }else{                                               
                         m.x = mover.x - mover.getImageHeight(0) - 10;
                 }                                                    
              }                                                       
              r = piranhanarray.addMover(m);                          
              break;
         case   1:
              r = piranhanarray.addMover(mover.copy(new MoverHiPower()));
              break;
         case   2:
         case   3:
              r = piranhanarray.cloneMover(mover);                    
              break;
         case   4:
         case   5:
              r = cuttlearray.addMover(mover.copy(new MoverCuttle()));  
              break;
         case   6:
         case   7:
             r = octopusarray.addMover(mover.copy(new MoverOctopus()));  
              break;
         case   8:
             r = softcoralarray.addMover((MoverSoftCoral)mover.copy(new MoverSoftCoral()));  
              break;
         }
          System.out.println(sw);
	 
         return r;
    }                                                                 

    public boolean  deleteMover( Mover mover){                        
         if(mover instanceof MoverCuttle ){                           
              return cuttlearray.deleteMover(mover);                  
         }                                                       
         if(mover instanceof MoverOctopus ){                           
              return octopusarray.deleteMover(mover);                   
         }                                                            
         if(mover instanceof MoverSoftCoral ){                           
              return softcoralarray.deleteMover(mover);                   
         }                                                            
         return piranhanarray.deleteMover(mover);
   }                                                                 
   public boolean  canHit( Mover mover){ 
         if( (mover instanceof MoverSoftCoral)||(mover instanceof Bubbles) || 
                    (mover instanceof Ink    ) ){
             return false;
         }
         return true;
   }
   public void     createAccessary(Mover mover){
         if(mover instanceof MoverCuttle ){
                cuttlearray.addMover( mover.copy(new Ink()));  
         }else
	     if(mover instanceof MoverOctopus){                       
                octopusarray.addMover( mover.copy(new Ink()));  
         }else{
                piranhanarray.addMover( mover.copy(new Bubbles()));
	     }
    }
    public void nextStory(Mover mover){
         if(cloneSwitch){
            cloneSwitch =   cloneMover(mover);
            if(!cloneSwitch){      
                deleteMover(mover); 
            }
         }else{                     
            cloneSwitch = ! deleteMover(mover);
            if(cloneSwitch){
                cloneMover(mover);
            }
         }
    }
}