/* -------------------------------------
 * Pac-Man
 * (c) April 1996 Daniel Abplanalp 
 *--------------------------------------
 */

import java.awt.* ;
import java.awt.image.* ;
import java.lang.* ;
import java.util.* ;
import java.net.* ;
import java.applet.*;

class Ausgabe
{ int StartLive=3;
  int Punkte=0,Live=StartLive,MaxPunkte=0;
  int AnzahlPunkte=0;
  int xbase=10,ybase=500,xbreite=500,ybreite=90;
  static final int SchriftGroesse=18;
  int allprint=3;
  boolean Lebenweg=false;


  public Ausgabe(int inLive,int inPunkte)
  { StartLive=inLive; MaxPunkte=inPunkte;
    Live=StartLive;
    Punkte=0;
    allprint=3;
  }
  public void init()
  { Live=StartLive; Punkte=0; allprint=3;
  }
  public void Levelinit(int inAnzahlPunkte)
  { AnzahlPunkte=inAnzahlPunkte;
  //System.out.println("Anzahl Punkte in Level:"+AnzahlPunkte+"(Live="+Live+")");

  //  AnzahlPunkte=5;
  }
  public void setxy(int xin,int yin)
  { xbase=xin; ybase=yin;
  }
  public void allprint(Graphics g,Image imagewesen,ImageObserver imo)
  { System.out.println("AllPrint");
    g.setColor(Color.black);
    g.fillRect(xbase,ybase,xbreite,ybreite);
    g.setColor(Color.yellow);
    g.setFont(new Font("TimesRoman", Font.PLAIN, SchriftGroesse));
    g.drawString("Punkte : ",xbase+xbreite/4,ybase+20+SchriftGroesse); //langsam
    g.drawString(""+Punkte,xbase+xbreite/4+70,ybase+20+SchriftGroesse);
    for (int i=1;i<Live;i++)
    { g.drawImage(imagewesen,xbase+30+i*40,ybase+40,imo);
    }
    Lebenweg=false;
  }

  public void allesprint(Graphics g,Image imagewesen,ImageObserver imo)
  { if (allprint!=3)
      return;
    allprint(g,imagewesen,imo);
    allprint=0;
  }

  public void Punkte(Graphics g)
  { if((allprint&1)==0)
      return;
    g.setColor(Color.black);
    g.fillRect(xbase+xbreite/4+70,ybase+20,100,22);
    g.setFont(new Font("TimesRoman", Font.PLAIN, SchriftGroesse));
    g.setColor(Color.yellow);
    g.drawString(""+Punkte,xbase+xbreite/4+70,ybase+20+SchriftGroesse);
    // schneller durch Zahlen-Bilder
    //System.out.println("Punkte :"+Punkte+"->"+xbase+","+ybase);
	allprint&=2;
   }
  public void Punkte(int plusPunkte)
  { allprint|=1;
    Punkte+=plusPunkte;
   // System.out.println("plusPunkte :"+Punkte);
  }
  public void hit()
  { Lebenweg=true;
    allprint|=2;
  }
  public void Leben()
  {allprint|=2;
  }
  public boolean Leben(Graphics g)
  { if ((allprint&2)==0)
      return true;
    allprint&=1;
    g.setColor(Color.black);
    Live--;
    //  Lebenweg=false;
    System.out.println("Live :"+Live);
    if (Live==0)
    { g.fillRect(xbase,ybase,xbreite,ybreite);
      g.setColor(Color.red);
      g.drawString("Game Over",xbase+xbreite/4+90,ybase+30);
      return false;
    }
    else 
      g.fillRect(xbase+30+Live*40,ybase+40,40,40);
    return true;
 }
 public boolean Gameover()
 { if (Live>0)
     return false;
   if (Punkte>MaxPunkte)
     MaxPunkte=Punkte;
   Live=StartLive;
   Lebenweg=false;
   return true;
 }
 public void eatPoint()
 { AnzahlPunkte--;
 }
 public boolean EndeLevel()
 { return (AnzahlPunkte==0 ? true : false);
 }

}

class Wesen
{ static final int right=2,left=1,up=3,down=0,stop=4,magicDauer=250;
  static final int vorwesenein=15; // Zuege bevor Wesen einem geben
  static final int genauigkeit=10;
  int Geschwindigkeit=2*genauigkeit; 
  int ZielRichtung=0,Richtung=stop,WesenArt=0,zielx=2,ziely=2,magic=0;
  int faktor=1;
  int x,y,X,Y,Xstart,Ystart;
  int wesenein=0,WesenPunkte=100;
  int WesenNr=0,MaxWesenNr[]={1,1,1,1,1};
  int wegx[]= new int[25],wegy[]= new int[25],altX,altY;
  int wowegx[]= new int[25],wowegy[]= new int[25];
  int maxbewegen[]= new int[8];
  int wobewegen=0,welchesimage[][]=new int[5][12];
  int wo=0,maxLaenge=5,altlaenge=100,feldgroessex=8,feldgroessey=8;
  double distanz=1000;
  boolean danger=false;
  static boolean gesucht=false;
  static final int wesennrimage[][][]={{{0,1,2,1},{3,4,5,6,7,6,5,4},{8,9,10,11,12,11,10,9},
                   {13,14,15,14},{0,1,2,1}},                                     {{16,17,18,17},{16,17,18,17},{16,17,18,17},{16,17,18,17},{16,17,18,17}}};
  public void start()
  { X=Xstart; x=X*feldgroessex*genauigkeit;
    Y=Ystart; y=Y*feldgroessey*genauigkeit;
    Richtung=ZielRichtung=stop;
    wo=0; wowegx[0]=-1; wowegx[1]=-1;
    magic=0;
    faktor=1;
    altX=-1; altY=-1;
  }
  public void getreadyimages(int nach,int von)
  { for (int wo=0;wo<maxbewegen[nach];wo++)
    { welchesimage[nach][wo]=wesennrimage[WesenArt][von][wo];
    }
   }
  public Wesen(){;};
  public Wesen(int wesenartin,int Xin,int Yin,int inGeschw,
			   int infeldgrx,int infeldgry,int inpkt,int inmaxbewegen[])
  { WesenArt=wesenartin;
    WesenPunkte=inpkt;
    feldgroessex=infeldgrx; feldgroessey=infeldgry;
    for (int i=0;i<5;i++)
    { if (inmaxbewegen[i]<0)
      { maxbewegen[i]=inmaxbewegen[-inmaxbewegen[i]-1]*2-2;       
        getreadyimages(i,-inmaxbewegen[i]-1);
      }  
      else
       { maxbewegen[i]=inmaxbewegen[i]*2-2;
         getreadyimages(i,i);
        }
     }
    Xstart=Xin;
    Ystart=Yin;
    Geschwindigkeit=inGeschw;
    wesenein=0;
    start();
  }
  public void setzen(int wesenartin,int Xin,int Yin,int inGeschw,
                     int infeldgrx,int infeldgry,int inpkt,int inmaxbewegen[])
  { feldgroessex=infeldgrx; feldgroessey=infeldgry;
    WesenArt=wesenartin;
    for (int i=0;i<5;i++)
    { if (inmaxbewegen[i]<0)
      { maxbewegen[i]=inmaxbewegen[-inmaxbewegen[i]-1]*2-2;       
        getreadyimages(i,-inmaxbewegen[i]-1);
      }  
      else
       { maxbewegen[i]=inmaxbewegen[i]*2-2;
         getreadyimages(i,i);
        }
     }
    Xstart=Xin;
    Ystart=Yin;
    Geschwindigkeit=inGeschw;
   WesenPunkte=inpkt;
	wesenein=0;
    start();
  }
  public void restart()
  { wesenein=0;
	start();
  } 

  public void zielrichtung(int wohin)
  { ZielRichtung=wohin;};


  public void sucheweg(int wox,int woy,int laenge,int bild[][],
					   int bildgroessex,int bildgroessey)
  { int h1,h2,i;
	
	if (wox<0 || wox>=bildgroessex || woy<0 || woy>=bildgroessey)
	  return;          // unnoetig
    wegx[laenge]=wox; wegy[laenge]=woy;
	for (i=0;i<laenge;i++)
	  if (wox==wegx[i] && woy==wegy[i]) return;
	if (laenge<maxLaenge)
	{ if (wox<bildgroessex-1 && bild[woy][wox+1]<=0)
		sucheweg(wox+1,woy,laenge+1,bild,bildgroessex,bildgroessey);
	  if (wox>0 && bild[woy][wox-1]<=0)
		sucheweg(wox-1,woy,laenge+1,bild,bildgroessex,bildgroessey);
	  if (woy<bildgroessey-1 && bild[woy+1][wox]<=0)
		sucheweg(wox,woy+1,laenge+1,bild,bildgroessex,bildgroessey);
	  if (woy>0 && bild[woy-1][wox]<=0)
		sucheweg(wox,woy-1,laenge+1,bild,bildgroessex,bildgroessey);
    }
	h1=Math.abs(zielx-wox);
	h2=Math.abs(ziely-woy);
        if(distanz>=h1 && distanz>=h2)
        if ((wox!=wegx[0] || woy!=wegy[0]) && ((distanz>h1 && distanz>h2) ||
	   	   laenge<altlaenge))
	{ distanz= h1<h2 ? h2 : h1;
	  for (i=0;i<=laenge;i++)
	  { wowegx[i]=wegx[i]; wowegy[i]=wegy[i];}
	  wowegx[laenge+1]=-1;
	  altlaenge=laenge;
        }     
}
  public void sucheweitweg(int wox,int woy,int laenge,int bild[][],
					   int bildgroessex,int bildgroessey)
  { int h1,h2,i;
    if (wox<0 || wox>=bildgroessex || woy<0 || woy>=bildgroessey)
	  return;          // unnoetig
    wegx[laenge]=wox; wegy[laenge]=woy;
	for (i=0;i<laenge;i++)
	  if (wox==wegx[i] && woy==wegy[i]) return;
	if (laenge<maxLaenge)
	{ if (wox<bildgroessex-1 && bild[woy][wox+1]<=0)
		sucheweitweg(wox+1,woy,laenge+1,bild,bildgroessex,bildgroessey);
	  if (wox>0 && bild[woy][wox-1]<=0)
		sucheweitweg(wox-1,woy,laenge+1,bild,bildgroessex,bildgroessey);
	  if (woy<bildgroessey-1 && bild[woy+1][wox]<=0)
		sucheweitweg(wox,woy+1,laenge+1,bild,bildgroessex,bildgroessey);
	  if (woy>0 && bild[woy-1][wox]<=0)
		sucheweitweg(wox,woy-1,laenge+1,bild,bildgroessex,bildgroessey);
    }
	h1=Math.abs(zielx-wox);
	h2=Math.abs(ziely-woy);
        if(distanz<=h1 && distanz<=h2)
        if ((wox!=wegx[0] || woy!=wegy[0]) && ((distanz<h1 && distanz<h2) ||
	   	   laenge<altlaenge))
	{ distanz= h1<h2 ? h1 : h2;
	  for (i=0;i<=laenge;i++)
	  { wowegx[i]=wegx[i]; wowegy[i]=wegy[i];}
	  wowegx[laenge+1]=-1;
	  altlaenge=laenge;
        }     
}
  public int womove(int bild[][],int bildgroessex,int bildgroessey,int inmagic)
  { wo++;
    if (danger &&
        inmagic<(Math.abs(zielx-X)*feldgroessex+Math.abs(ziely-Y)*feldgroessey)
        *genauigkeit/Geschwindigkeit && danger)
    { maxLaenge=19;
      altlaenge=100;
      distanz=1000;
      wowegx[0]=X; wowegy[0]=Y;
      altX=X;altY=Y;
      if (gesucht)
        return stop;
      sucheweg(X,Y,0,bild,bildgroessex,bildgroessey);
      danger=false; gesucht=true;
      wo=1;
    }
    else 
    if(!danger &&
       inmagic>(Math.abs(zielx-X)*feldgroessex+Math.abs(ziely-Y)*feldgroessey)
        *genauigkeit/Geschwindigkeit)
    { if (gesucht)
        return stop; 
      maxLaenge=19;
      altlaenge=100;
      distanz=-5;
      wowegx[0]=X; wowegy[0]=Y; // unnoetig
      altX=X; altY=Y;
      sucheweitweg(X,Y,0,bild,bildgroessex,bildgroessey);
      danger=true; gesucht=true;
// System.out.println("Weitsuchen : "+inmagic);
      wo=1;
    }
    else
    if (wowegx[wo]==-1)
    { if (gesucht)
        return stop;
      maxLaenge=19;
      altlaenge=100;
      wowegx[0]=X;  // unnoetig
      wowegy[0]=Y;  // unnoetig
     if (inmagic>0)
      { distanz=-5;
        sucheweitweg(X,Y,0,bild,bildgroessex,bildgroessey);
        danger=true; gesucht=true;
        wo=1;
      }
      else
      { if (altX==X && altY==Y)
        { distanz=-5;
          sucheweitweg(X,Y,0,bild,bildgroessex,bildgroessey);
          danger=false;
        }
        else
	{ distanz=1000;
          sucheweg(X,Y,0,bild,bildgroessex,bildgroessey);
          danger=false;
        }
        altX=X; altY=Y;
        wo=1;
      }
// System.out.println("X : "+X+",Y : "+Y+",womove : "+wo);
// System.out.println("zX : "+zielx+",zY : "+ziely);
    }
   if(wowegx[wo]==-1)
      return stop;
    if (wowegx[wo]>wowegx[wo-1])
      return right;
    if (wowegx[wo]<wowegx[wo-1])
      return left;
   if (wowegy[wo]>wowegy[wo-1])
     return down;
   if (wowegy[wo]<wowegy[wo-1])
     return up;
   return stop;
  }
int  direkt(int bild[][],Wesen Feind)
{ int i;
//System.out.println("X : "+X+"Y="+Y+"zielx="+zielx+"ziely="+ziely);
  if (ziely==Y)
    if(zielx<X)
    { for(i=X;X>=zielx && bild[ziely][i]<=0;i--)
      if (i==zielx)
        return(left);
      return(stop);
    }
    else
      if (zielx==X)
        return(Feind.Richtung);
      else
      { for(i=X;X<=zielx && bild[ziely][i]<=0;i++)
        if (i==zielx)
          return(right);
       return(stop);
      }
  if (zielx==X)
    if(ziely<Y)
    { for(i=Y;Y>=ziely && bild[i][zielx]<=0;i--)
      if (i==ziely)
        return(up);
      return(stop);
    }
    else
    { for(i=Y;Y<=ziely && bild[i][zielx]<=0;i++)
      if (i==ziely)
        return(down);
      return(stop);
    }
   return(stop);
 }    
  public void move(Wesen Feind,int bild[][],int bildgroessex,
                   int bildgroessey,Graphics g,Ausgabe aus)
  { if(wesenein>0)
    { wesenein--;
     // System.out.println("we="+wesenein);
      if(wesenein<vorwesenein)
      { if (wesenein==vorwesenein-1)
          start();
      }
      return;
    }  
  if (magic>0)
      magic--;
  if ((Math.abs(x-genauigkeit*feldgroessex*X)>=feldgroessex*genauigkeit || Math.abs(y-genauigkeit*feldgroessey*Y)>=feldgroessey*genauigkeit)
       || Richtung==stop)
    { X=(x/genauigkeit+feldgroessex/2)/feldgroessex; 
      Y=(y/genauigkeit+feldgroessey/2)/feldgroessey;
      x=X*genauigkeit*feldgroessex; y=Y*genauigkeit*feldgroessey;
      if (WesenArt!=0)
      { zielx=Feind.X; ziely=Feind.Y;
        if (Feind.magic<=0)
	{ Richtung=direkt(bild,Feind);
       if (Richtung!=stop)
         wowegx[wo+1]=-1;
        }
	if (Richtung==stop || Feind.magic>0)
	  Richtung=womove(bild,bildgroessex,bildgroessey,Feind.magic);
      }
      else
      { if (ZielRichtung!=Richtung)
	  Richtung=ZielRichtung;
	switch(Richtung)
	{ case right : if (X>=bildgroessex-1 || bild[Y][X+1]>0) Richtung=stop;
                       break;
	  case left  : if (X<=0 || bild[Y][X-1]>0) Richtung=stop;
                       break;
	  case down  : if (Y>=bildgroessey-1 || bild[Y+1][X]>0) Richtung=stop;
                       break;
          case up    : if (Y<=1 || bild[Y-1][X]>0) Richtung=stop;
                       break;
	 }
	 if (bild[Y][X]<0)
	 { if (bild[Y][X]==-1)
	   { g.setColor(Color.black);
	    g.fillRect(X*feldgroessex,Y*feldgroessey,feldgroessex,feldgroessey);
	     aus.Punkte(10);
             aus.eatPoint();
             bild[Y][X]=0;
 	   }
	   if (bild[Y][X]==-2)
	   { g.setColor(Color.black);
	    g.fillRect(X*feldgroessex,Y*feldgroessey,feldgroessex,feldgroessey);
	     aus.Punkte(100);
             magic=magicDauer;
             bild[Y][X]=0;
             faktor=1;
           }
         }
        }
      }
     switch(Richtung)
     { case right: x+=Feind.magic>0 ? Geschwindigkeit/2 : Geschwindigkeit;
                   break;
       case left:  x-=Feind.magic>0 ? Geschwindigkeit/2 : Geschwindigkeit;
                   break;
       case up:    y-=Feind.magic>0 ? Geschwindigkeit/2 : Geschwindigkeit;
                   break;
       case down:  y+=Feind.magic>0 ? Geschwindigkeit/2 : Geschwindigkeit;
                   break;
     }
 if (WesenArt!=0)
   if (Math.abs(Feind.x-x)<(feldgroessex*genauigkeit)/2 && 
       Math.abs(Feind.y-y)<(feldgroessey*genauigkeit)/2)
   { if(Feind.magic>0)
     { aus.Punkte(WesenPunkte*Feind.faktor);
       wesenein=vorwesenein+Feind.magic;
       Feind.faktor*=2;
     }
     else
       aus.hit();
   }
//  System.out.println("X : "+X+",Y : "+Y+",R : "+Richtung+",Z :"+ZielRichtung);
  
  }

  public void draw(Graphics g,Image imagewesen[],ImageObserver imo,Wesen Feind)
  { gesucht=false;
   if (wesenein<vorwesenein)
   { wobewegen= wobewegen>=maxbewegen[Richtung]-1 ? 0 : wobewegen+1;
// System.out.println("wobew "+WesenArt+" :"+Richtung+":"+wobewegen+"="+welchesimage[Richtung][wobewegen]);
    if(wesenein>0)
   g.drawImage(imagewesen[welchesimage[Richtung][wobewegen]]
                ,x/genauigkeit+1+wesenein/2,y/genauigkeit+2+wesenein/2,
                 26-wesenein,26-wesenein,imo);
    else
    if (Feind.magic>0)
      if (Feind.magic>25)
        g.drawImage(imagewesen[welchesimage[Richtung][wobewegen]]
                ,x/genauigkeit+1+3,y/genauigkeit+2+3,20,20,imo);
      else 
        g.drawImage(imagewesen[welchesimage[Richtung][wobewegen]]
                ,x/genauigkeit+1+2,y/genauigkeit+2+2,26-Feind.magic/5,26-Feind.magic/5,imo);
    else 
      g.drawImage(imagewesen[welchesimage[Richtung][wobewegen]]
                ,x/genauigkeit+1,y/genauigkeit+2,imo);
 
 
   } 
  }
 }


public class pac_man extends java.applet.Applet implements Runnable
{ Thread kicker=null;
  Image imageoffscreen;
  Graphics offscreen;
  ImageObserver imo = null;
  static final String URLImages="images/"; // Images Directory
  static final int bildgroessex=17,bildgroessey=17,feldgroessex=30,
				   feldgroessey=30;
  static final int maxLevel=4;
  static final String bilddaten[][]={{
"00000000000000000",
"0..*....D....*..0",
"0.000.00.00.000.0",
"0.000.00.00.000.0",
"0...............0",// 5
"0.0.0.0.0.0.0.0.0",
"0.0.0.0.*.0.0.0.0",
"0.0.0.00000.0.0.0",
"0.0.w.......w.0.0",
"0.0.0 00000.0.0.0",//10
"0.0.0.0.w.0.0.0.0",
"0.0.*.0.0.0.*.0.0",
"0.00000.0.00000.0",
"0.......0.......0",
"0.0000000.00000.0",//15
"0*.............*0",
"00000000000000000"},//17
{
"00000000000000000",
"0.......D.......0",
"0.000.00000.000.0",
"0.000.00000.000.0",
"0.0..*.....*..0.0",// 5
"0.0.000.0.000.0.0",
"0.0.000.0.000.0.0",
"0.......w.......0",
"0.000.00000.000.0",
"0.0...........0.0",//10
"0.0.000000000.0.0",
"0.0.0..w0w..0.0.0",
"0.0.0.0.0.0.0.0.0",
"0.0.*.0.0.0.*.0.0",
"0.00000.0.00000.0",//15
"0...............0",
"00000000000000000"},
{
"00000000000000000",
"0.....0.D.0.....0",
"0.000.0*0*0.000.0",
"0.0.0.......0.0.0",
"0.0.000.0.000.0.0",// 5
"0.0...0.*.0...0.0",
"0.0.0.00000.0.0.0",
"0...0...0...0...0",
"0.0.w.0.0.0.w.0.0",
"0...0 ..0...0...0",//10
"0.0.0.00000.0.0.0",
"0.0.*.0.0.0.*.0.0",
"0.00000.0.00000.0",
"0.......0.......0",
"0.00.00.w.00.00.0",//15
"0*......0......*0",
"00000000000000000"},//17
{
"00000000000000000",
"0.......0.......0",
"0.00000.0.00000.0",
"0.0.w.0.0.0.w.0.0",
"0.0.0.0.0.0.0.0.0",// 5
"0...............0",
"0.000.00.00.000.0",
"0.000.00*00.000.0",
"0......*D*......0",
"0.000.00*00.000.0",//10
"0.000.00.00.000.0",
"0...............0",
"0.0000.000.0000.0",
"0.......w.......0",
"0.0000000000000.0",//15
"0......*0*......0",
"00000000000000000"}};//17
  int bild[][]= new int[bildgroessex][bildgroessey];
  static final String hintergrund="rain";
  static final int maxwesen=3,maxverschiedenewesen=2;
  static final int anzwesenrichtung[][]={{3,5,5,3,-1},{3,-1,-1,-1,-1}};
  static final int bewgen[]=new int[maxwesen];
  static final String wesenname[]={"pac","wesen"};
  Wesen wesen[]=new Wesen[maxwesen+1];
  int weseninlevel=0,AnzahlPunkte=0,inLevel=1;
  static final int right=2,left=1,up=3,down=0,stop=4;
  MediaTracker tracker=null;   // Wird beim Bilder laden gebraucht
  final static String imageLabel="image";
  boolean loaded=false,action=false,painted=false,Pause=false;
  Ausgabe ausgabe=new Ausgabe(3,0);
  static final int maxwesenbilder=40;
  Image imagewesen[]= new Image[maxwesenbilder],imageback,imagemagicpoint;
     
  int X=60,Y=60,X0=60,Y0=60,Xakt,Yakt;

 public void init()
 { tracker = new MediaTracker(this);
   
   try { imageoffscreen = createImage(bildgroessex*feldgroessex, bildgroessey*feldgroessey);
	     offscreen = imageoffscreen.getGraphics();
       } catch (Exception e)
         { // double-buffering not available
	       offscreen = null;    // exit(1);
         }
   resize(bildgroessex*feldgroessex,bildgroessey*feldgroessey+90);
   ausgabe.setxy(0,bildgroessey*feldgroessey);

 }


 public void levelpaint(Graphics g,int inLevel,String bilddaten[])
 { // g.setBackground(Color.white);
   weseninlevel=1;
   AnzahlPunkte=0;
   //g.clipRect(0, 0, size().width - 1, size().height - 1);
   g.setColor(Color.black);
   g.fillRect(0, 0, size().width - 1, size().height - 1);
   g.setColor(Color.yellow);
   for (int y=0;y<bildgroessey;y++)     
    for (int x=0;x<bildgroessex && x<bilddaten[y].length();x++)
	{ bild[y][x]=0;
	  if (bilddaten[y].charAt(x)=='0' || bilddaten[y].charAt(x)=='O')
      { g.setColor(Color.yellow);
        g.fillRect(x*feldgroessex,y*feldgroessey,
        feldgroessex,feldgroessey);
         bild[y][x]=1;
        }
      else if(bilddaten[y].charAt(x)=='D')
     { wesen[0].setzen(0,x,y,40,feldgroessex,feldgroessey,0,anzwesenrichtung[0]);
     }
	 else if(bilddaten[y].charAt(x)=='W' || bilddaten[y].charAt(x)=='w')
	{  //   System.out.println("WesenNR : "+weseninlevel);
  wesen[weseninlevel].setzen(1,x,y,50,feldgroessex,feldgroessey,500,anzwesenrichtung[1]);
      if (weseninlevel<maxwesen) weseninlevel++;
    }
   if (bilddaten[y].charAt(x)=='.' || bilddaten[y].charAt(x)=='w')
	   { bild[y][x]=-1;
		 g.setColor(Color.orange);
		 g.fillOval(x*feldgroessex+feldgroessex/2-2,y*feldgroessey+feldgroessey/2-2,4,4);
         AnzahlPunkte++;
	   }
	   else if (bilddaten[y].charAt(x)=='*')
	   { bild[y][x]=-2;
		 g.setColor(Color.white);
		 g.drawImage(imagemagicpoint,x*feldgroessex,y*feldgroessey,imo);
	   }
	 }
   weseninlevel++;
   g.setColor(Color.blue);
   g.drawString("Level : "+inLevel,bildgroessex*feldgroessex/2-25,feldgroessey/2);
   ausgabe.Levelinit(AnzahlPunkte);
 }

 public void update(Graphics g)
 {  if (loaded)
   { g.drawImage(imageoffscreen, 0, 0, imo);
     // Wesen aus
       wesen[0].draw(g,imagewesen,imo,wesen[1]);
      for (int i=1;i<weseninlevel;i++)
       wesen[i].draw(g,imagewesen,imo,wesen[0]);
     ausgabe.allesprint(g,imagewesen[0],imo);
     ausgabe.Punkte(g);
     ausgabe.Leben(g);
   }
   else
   { g.setColor(Color.black);
     g.fillRect(0,0,size().width, size().height);
     g.setColor(Color.white);
     g.drawString("Please Wait",240,260);
   }
   painted=true;
 }

 public void paint(Graphics g)
 { update(g);
   if (loaded)
   ausgabe.allprint(g,imagewesen[0],imo);
 }

public boolean mouseUp(java.awt.Event evt, int x, int y)
{ int dx=Math.abs(wesen[0].x/wesen[0].genauigkeit-x);
  int dy=Math.abs(wesen[0].y/wesen[0].genauigkeit-y);
  if (dx<feldgroessex/2 && dy<feldgroessey/2)
	wesen[0].zielrichtung(stop);
  else
    if (dx>dy)
    { if (x>wesen[0].x/wesen[0].genauigkeit)
	    wesen[0].zielrichtung(right);
	  else
	    wesen[0].zielrichtung(left);
    }
    else
    { if (y>wesen[0].y/wesen[0].genauigkeit)
	    wesen[0].zielrichtung(down);
	  else
		wesen[0].zielrichtung(up);
	}
  action=true;
  return  true;
}


public boolean keyDown(java.awt.Event evt, int key)
{  if ((char)key=='6'||(char)key=='v'||(char)key=='r')
	 wesen[0].zielrichtung(right);
   else if ((char)key=='4'||(char)key=='c'||(char)key=='l')
	 wesen[0].zielrichtung(left);
   else if ((char)key=='8'||(char)key=='h'||(char)key=='u')
	 wesen[0].zielrichtung(up);
   else if ((char)key=='2'||(char)key=='b'||(char)key=='d')
	 wesen[0].zielrichtung(down);
   else if ((char)key=='5'||(char)key==' '||(char)key=='s')
	 wesen[0].zielrichtung(stop);
   else if ((char)key=='p')
	 Pause=true;
  action=true;
  return  true;
}

public void start()
{ if(kicker == null)     // Falls kein thread vorhanden
  { kicker=new Thread(this);        // dann bilde einen
    // kicker.setPriority(kicker.MIN_PRIORITY);
    kicker.start();                 // und starte ihn
  }
  repaint();
 }
public void stop()
{ if (kicker != null && kicker.isAlive())
    kicker.stop();
  kicker=null;
}

 public void destroy() // unnoetig 
{ if (kicker != null && kicker.isAlive())
  { kicker.stop();
	kicker.destroy();
  }
  kicker=null;
}
public void warten()
{ action=false;
  while (!action)
  { try {  Thread.sleep(200);
        } catch (InterruptedException e){}
  }
  action=false;
}
public void speichern()
{ String host="",URL = "http://haegar.unibe.ch/mabplana/CGI/pacspeichern.cgi?pacrangliste&";
;
   repaint();
  try { host=InetAddress.getLocalHost().toString();
      } catch (UnknownHostException e) {};
  try {  (new URL(""+URL+"1,0,"+ausgabe.Punkte+"-"+host)).openConnection().connect();    
      } catch (Exception e){};
  warten();
}
public void Lebenweg()
{ if (ausgabe.Gameover())
  { // Neue Spiel
    System.out.println("Neues Spiel");
    speichern();
    inLevel=1;
    ausgabe.init();
    levelpaint(offscreen,inLevel,bilddaten[inLevel-1]);
    repaint();
  }
  else
  { for(int i=0;i<weseninlevel;i++)
      wesen[i].restart(); 
    System.out.println("Leben weg : "+weseninlevel);
    repaint();
  }
  warten();
  ausgabe.Lebenweg=false;
}
public void NewLevel()
{ // Neues Level
  inLevel++;
  if (inLevel>maxLevel)
  { ausgabe.Punkte(6000);
    inLevel=1;
  }
  ausgabe.Punkte(inLevel*1000);
  levelpaint(offscreen,inLevel,bilddaten[inLevel-1]);
  repaint();  
}

public void run()
{ if (!loaded)
  {  // Sprites laden
  repaint();
  System.out.println("Sprites ein");
  int anzahl=0;
  for (int wesennr=0;wesennr<maxverschiedenewesen;wesennr++)
	for(int richtung=0;richtung<4;richtung++) //4 -> 5
      for(int nr=0;anzahl< maxwesenbilder && nr<anzwesenrichtung[wesennr][richtung];nr++)
  {   //System.out.println("load : "+wesenname[wesennr]+richtung+nr+".gif->"
      // +anzahl);
  imagewesen[anzahl]=getImage(getCodeBase(), URLImages+wesenname[wesennr]+richtung+nr+".gif");
    tracker.addImage(imagewesen[anzahl++],wesennr*100+richtung*20+nr);
  }
  imagemagicpoint=getImage(getCodeBase(), URLImages+"Meaning.gif");
  tracker.addImage(imagemagicpoint, -1);
  // imageback=getImage(getCodeBase(), URLImages+hintergrund+".gif");
  // imagepoint==getImage(getCodeBase(), URLImagespoint.gif");
  for (int wesennr=0;wesennr<maxverschiedenewesen;wesennr++)
    for(int richtung=0;richtung<4;richtung++) // 4 -> 5
      for(int nr=0;nr<anzwesenrichtung[wesennr][richtung];nr++)
	{ try{ tracker.waitForID(wesennr*100+richtung*20+nr);}
	  catch(InterruptedException e){}
	}
  try{ tracker.waitForID(-1);}
  catch(InterruptedException e){}
  loaded=true;
}
  for (int i=0;i<maxwesen+1;i++)
    wesen[i]= new Wesen();
  inLevel=1;
  ausgabe.init();
  levelpaint(offscreen,inLevel,bilddaten[inLevel-1]);
  System.out.println("19.4.96");
  repaint();
  warten(); 
  painted=true; if(Pause) {warten(); Pause=false;}
  while (kicker != null) // Solange Thread besteht
  { wesen[0].move(wesen[1],bild,bildgroessex,bildgroessey,
                  offscreen,ausgabe);
    for (int i=1;i<weseninlevel;i++)
      wesen[i].move(wesen[0],bild,bildgroessex,bildgroessey,
                    offscreen,ausgabe);
    if(Pause) {warten(); Pause=false;}
    while (!painted)
    { try { Thread.sleep(10);
          } catch (InterruptedException e){};
    }
    if(ausgabe.Lebenweg)
      Lebenweg();
    else if(ausgabe.EndeLevel())
       NewLevel();
	 else
	 { painted=false;
           repaint();
         } 
    try {  // Warte (in ms)
    Thread.sleep(50);
         } catch (InterruptedException e){}
    }
  }
}
