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

public class skeleton extends Applet implements Runnable{

   int td[][] = {{-1,-1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1},
                 {-1,-1,-1,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1,-1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1},
                 {-1,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1},
                 {-1,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1},
                 { 0, 0, 0, 0, 0,-1, 0,-1, 0,-1, 0, 0, 0, 0, 0},
                 {-1,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1},
                 {-1,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1},
                 {-1,-1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1},
                 {-1,-1,-1,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1},
                 {-1,-1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,-1,-1}};
   int ws[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int tpx[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int tpy[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int wdd[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
   String mk;
   int md[][] = {{ 1, 2, 3, 4, 5},{ 1, 7, 8, 9, 3},{10,11, 6, 9, 3},{10,12, 5, 4, 5},
                 { 9, 6,12, 7,12},{13, 1, 5, 4, 7},{16, 9,15, 2, 1},{11,17,10, 9,18},
                 {11,17, 4, 7, 1},{11, 3,14, 9,15},{ 7, 1, 4,14, 9},{ 7, 9,19,11,12},
                 { 5, 1,14, 9,15},{ 5, 9,17,12,17},{12,17, 9,15,12},{ 3, 1, 7, 6, 9},
                 { 3,11,15, 9,17},{ 3,12,15,12,15},{ 3, 4,14,12,15},{14,11,17, 4, 3},
                 { 4, 7, 4, 7,12},{ 4,14,11, 7, 9},{ 6, 9, 7, 4,14},{ 6,11,17,18,11}};
   int sn = 1,dd = 1,ss = 0,ck;
   int mx=-100,my=-100,px,py;
   Thread th = null;
   Image os;
   Graphics og;

   public void init(){
      os = createImage(580,280);
      og = os.getGraphics();
      setBackground(Color.white);

      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               if(e.getClickCount() == 2){
                  dd = dd*(-1);
               }
               if(((mx-340)*(mx-560)<0) && ((my-20)*(my-260)<0)){
                  sn = (e.getX()-340)/105*12+(e.getY()-20)/20;
                  switch(ws[sn]){
                     case 0 : ws[sn] = 1 ; ss = 1 ; break;
                     case 1 : ws[sn] = 0 ; ss = 0 ; break;
                     case 2 : ws[sn] = 1 ; ss = 1 ; break;
                  }
                  td_r();
               }
               if(((mx-20)*(mx-320)<0) && ((my-20)*(my-240)<0)){
                  if(dd == 1){
                     px = (e.getX()-20)/20-2;
                     py = (e.getY()-20)/20;
                  }else{
                     px = (e.getX()-20)/20;
                     py = (e.getY()-20)/20-2;
                  }
                  ck = 0;
                  for(int k1 = 0;k1 <5;k1 ++){
                     if(dd == 1){
                        if(td[py][px+k1] != 0){
                           if((td[py][px+k1] != md[sn][k1]) || (td[py][px+k1] == -1))ck = 1;
                        }
                     }else{
                        if(td[py+k1][px] != 0){
                           if((td[py+k1][px] != md[sn][k1]) || (td[py+k1][px] == -1))ck = 1;
                        }
                     }
                  }
                  if((ws[sn] == 0) || (ws[sn] == 2))ck = 1;
                  if(ck == 0){
                     tpx[sn] = px;
                     tpy[sn] = py;
                     wdd[sn] = dd;
                     ws[sn] = 2;
                     td_r();
                  }
               }
               repaint();
            }
         }
      );

      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               mx = e.getX()+10;
               my = e.getY()+10;
               repaint();
            }
         }
      );
   }

   public void paint(Graphics g){
      og.setColor(Color.white);
      og.fillRect(0,0,580,280);
      og.setColor(new Color(175,238,238));
      og.fillRect(10,10,320,260);
      og.setFont(new Font("",Font.PLAIN,18));
      for(int k1 = 0;k1 < 15;k1 ++){
         for(int k2 = 0;k2 < 11;k2 ++){
            if(td[k2][k1] >= 0){
               og.setColor(new Color(255,255,128));
               og.fill3DRect(20*k1+20,20*k2+20,20,20,true);
               og.setColor(new Color(190,190,190));
               og.drawRect(20*k1+20,20*k2+20,20,20);
            }
         }
      }

      for(int k3 = 0;k3 < 24;k3 ++){
         if(ws[k3] != 2){
            og.setColor(Color.white);
         }else{
            og.setColor(Color.lightGray);
         }
         og.fillRect(120*(k3/12)+340,20*k3+20-240*(k3/12),100,20);
         for(int k4 = 0;k4 < 5;k4 ++){
            og.setColor(new Color(0,0,90));
            s_ch(md[k3][k4]);
            og.drawString(mk,120*(k3/12)+20*k4+342,20*k3+37-240*(k3/12));
         }

         if(ws[k3] == 2){
            for(int k4 = 0;k4 < 5;k4 ++){
               og.setColor(new Color(0,0,90));
               s_ch(md[k3][k4]);
               if(wdd[k3] == 1){
                  og.drawString(mk,tpx[k3]*20+k4*20+21,tpy[k3]*20+36);
               }else{
                  og.drawString(mk,tpx[k3]*20+21,tpy[k3]*20+k4*20+36);
               }
            }
         }
      }

      if(((mx-20)*(mx-320)<0) && ((my-20)*(my-240)<0)){
         
         if(dd == 1){
            og.setColor(Color.blue);
            og.drawRect((mx-50)/20*20,(my-10)/20*20,100,20);
            og.drawRect((mx-50)/20*20+1,(my-10)/20*20+1,100,20);
            if(ss == 1){
               for(int k5 = 0;k5 < 5;k5 ++){
                  s_ch(md[sn][k5]);
                  og.setColor(new Color(0,0,128));
                  og.drawString(mk,(mx-50)/20*20+20*k5+2,(my-10)/20*20+17);
               }
            }
         }else{
            og.setColor(Color.blue);
            og.drawRect((mx-10)/20*20,(my-50)/20*20,20,100);
            og.drawRect((mx-10)/20*20+1,(my-50)/20*20+1,20,100);
            if(ss == 1){
               for(int k5 = 0;k5 < 5;k5 ++){
                  s_ch(md[sn][k5]);
                  og.setColor(new Color(0,0,128));
                  og.drawString(mk,(mx-10)/20*20+2,(my-50)/20*20+20*k5+17);
               }
            }
         }
      }
      if(ss == 1){
         og.setColor(Color.red);
         og.drawRect(120*(sn/12)+340,20*sn+20-240*(sn/12),100,20);
      }
      og.setColor(Color.white);
      og.fillOval(245,195,60,60);
      og.setColor(new Color(0,0,128));
      if(dd == 1){
         og.fill3DRect(250,220,50,10,true);
      }else{
         og.fill3DRect(270,200,10,50,true);
      }
      g.drawImage(os,0,0,this);
   }

   public void td_r(){
      for(int k1 = 0;k1 < 15;k1 ++){
         for(int k2 = 0;k2 < 11;k2 ++){
            if(td[k2][k1] != -1)td[k2][k1] = 0;
         }
      }
      for(int k3 = 0;k3 < 24;k3 ++){
         if(ws[k3] == 2){
            if(wdd[k3] == 1){
               for(int k5 = 0;k5 < 5;k5 ++)td[tpy[k3]][tpx[k3]+k5] = md[k3][k5];
            }else{
               for(int k5 = 0;k5 < 5;k5 ++)td[tpy[k3]+k5][tpx[k3]] = md[k3][k5];
            }
         }
      }
   }

   public void s_ch(int ch){
      switch(ch){
         case  0 : mk = "" ; break;
         case  1 : mk = "™" ; break;
         case  2 : mk = "š" ; break;
         case  3 : mk = "›" ; break;
         case  4 : mk = "œ" ; break;
         case  5 : mk = "" ; break;
         case  6 : mk = " " ; break;
         case  7 : mk = "¡" ; break;
         case  8 : mk = "¢" ; break;
         case  9 : mk = "£" ; break;
         case 10 : mk = "ž" ; break;
         case 11 : mk = "Ÿ" ; break;
         case 12 : mk = "¤" ; break;
         case 13 : mk = "¥" ; break;
         case 14 : mk = "¦" ; break;
         case 15 : mk = "‡" ; break;
         case 16 : mk = "ˆ" ; break;
         case 17 : mk = "–" ; break;
         case 18 : mk = "{" ; break;
         case 19 : mk = "¬" ; break;
      }
   }

   public void start(){
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while(th != null){
         try{
            Thread.sleep(100);
         }
         catch (InterruptedException e){
         }
      }
   }

   public void update( Graphics g ){
      paint( g ) ;
   }
}