//
//    CHAPTER 22
//    Class Source Name [FontStringsArray.java]
//    Package name      [userClass.App]
//                                    1996.3
//                 Author [ Junzo hagimoto ]

package  userClass.App;

import java.applet.*;
import java.awt.*;

public  class      FontStringsArray{
    Applet       a;
    FontString   fs[];
    int          maxIdx=0;
    int          curIdx=0;
    int          counter=-1;
    Color        color;            // フオントの色
    Font         font;             // フオント
    int          h = 0;            // フォント高さ
    public FontStringsArray(Applet a,int maxText){
           this.a = a;
           fs   = new FontString[maxText];
           maxIdx = maxText;
           font  = new Font("TimesRoman",Font.BOLD,20);
           h     =( a.getFontMetrics(font) ).getLeading() ;      
           h    -=( a.getFontMetrics(font) ).getDescent() ;      
           h    +=( a.getFontMetrics(font) ).getAscent() ;
    }
    public  final void   add(String s){
           if( curIdx  != maxIdx ){
               fs[curIdx++] = new FontString(a,this,s);
           }
    }
    public  final FontString    nextString() {
        int    red,blue,green;
        int    x,y;
        int    wx=0;
        int    wy=0;
        Dimension d = a.size();
        red   = (int)(Math.random() * 256);
        blue  = (int)(Math.random() * 256);
        green = (int)(Math.random() * 256);
        color = new     Color( red, green, blue);
        if(counter >=0 ){
            wx    = fs[counter].x;
            wy    = fs[counter].y;
        }
        counter++;
        if(counter >= curIdx){
           counter=0;
        }
        do{
           x =  (int)( Math.random() * (d.width - fs[counter].w ) ) ;
           y = Math.max( h ,(int)( Math.random() * (d.height- h ) ));
        } while( Math.abs(wx-x) < 40  &&  Math.abs(wy-y) < 20 );
        fs[counter].x =  x;
        fs[counter].y =  y;
        return fs[counter];
   }

   public  final void  drawString(Graphics g){
         g.setFont( font );                                  
         g.setColor(color);
         fs[counter].drawString(g);
   }
   public  final void  drawChars(Graphics g, Mover m,int maxtimer){
         g.setFont( font );                                  
         g.setColor(color);
         fs[counter].drawChars( g, m, maxtimer );
   }
    public  final boolean  hit(Mover  mover){
         return fs[counter].hit( mover );
    }
}
//
//  パッケージの外からはアクセスできないクラス
//
class      FontString  {
    int     w;                       // 文字列の長さ
    String  s;                       // 表示文字列
    int     x=0;                     // x表示位置
    int     y=0;                     // y表示位置
    char    separated[];             // キャラクタ配列
    FontStringsArray owner;          
    
    FontString(Applet a,FontStringsArray fsa,String str){
           x=0;
           y=0;
           owner = fsa;
           s = str;
           w = (a.getFontMetrics(owner.font)).stringWidth(s) ;
           separated =  new char [ s.length() ];
           s.getChars(0,s.length(),separated,0);
    }
    void  drawString(Graphics g){
          g.drawString(s,x,y);
    }
    void  drawChars(Graphics g, Mover m,int maxTimer){
          for(int i=0;i < s.length();i++){
               int y_coord = (int) (Math.random()*10);
               int x_coord = (int) (Math.random()*10);
               g.drawChars( separated, i,1,
               x + 12*i + ((maxTimer - m.hitTimer)*2) * m.x_Plus, 
               y + y_coord + (maxTimer - m.hitTimer) *  m.y_Plus); 
          }
    }
    //                                      
    //  px,py         px2(px+w),py                   
    //     *---------*                              
    //     | bit     |                              
    //     *---------*                              
    //  px,py2(py+h)  px2(px+w),py2(py+h)
    //
    //      x,y - h                   x+w,y-h    
    //          *------------------------*       
    //          |  Fonts                 |       
    //      x,y *------------------------*
    //                                  x+w
     
    boolean  hit(Mover  mover){
         Image img = mover.getImage(0);
         int px  = mover.x;
         int py  = mover.y;
         int px2 = mover.getImageWidth(0) + px;
         int py2 = mover.getImageHeight(0)+ py;
         if( px2 < x || px > x+w || py > y  || py2 < y - owner.h )  return false;
         return true;
    }
}
              //