import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
import com.nttdocomo.util.*;
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.microedition.io.*;


public class Ugoku extends IApplication{
    UgokuCanvas canvas;

    public void start(){
	
	canvas = new UgokuCanvas();
	Display.setCurrent(canvas);
	canvas.morimori();
	canvas.timer.start();
	

    }

}


class UgokuCanvas extends Canvas{
    int width,height;
    private Image hoge01,hoge02,hoge03,hoge04,hoge05;
    private Image image;
    private final int DATA_END = 0; //inputデータが無いと -1or0が戻り値

    //タイマー用だよ
    ShortTimer timer;
    int nCounter;

    int hogeCounter = 1;

    Random rnd = new Random();

    //画像に表示される場所
    int PositionX=30;
    int PositionY=30;

    int[] PosX = {0,0,0,30,30,30,60,60,60};
    int[] PosY = {0,30,60,0,30,60,0,30,60};

    UgokuCanvas(){
     InputStream in;
	try {
	in=Connector.openInputStream("scratchpad:///0;pos=0");

      if (in.read() <= DATA_END){
        in.close();
        downdat("hoge01.gif",0);
        downdat("hoge02.gif",3100);
        downdat("hoge03.gif",6600);
        downdat("hoge04.gif",7200);
        downdat("hoge05.gif",7800);


      }else{
        in.close();
      }
    }
    catch (IOException e) {}
    loaddat();

	
	width = Display.getWidth();
	height = Display.getHeight();
	
	nCounter = 20;
	timer = ShortTimer.getShortTimer(this, 0, 1000, true);
    }


//scratchpadからデータ読み込み
  private void loaddat(){
    MediaImage mi1,mi2,mi3,mi4,mi5;
    int size;
    try{
     
      mi1=MediaManager.getImage("scratchpad:///0;pos=0");
      mi2=MediaManager.getImage("scratchpad:///0;pos=3100");
      mi3=MediaManager.getImage("scratchpad:///0;pos=6600");
      mi4=MediaManager.getImage("scratchpad:///0;pos=7200");
      mi5=MediaManager.getImage("scratchpad:///0;pos=7800");

      mi1.use();
      mi2.use();
      mi3.use();
      mi4.use();
      mi5.use();

      hoge01 = mi1.getImage();
      hoge02 = mi2.getImage();
      hoge03 = mi3.getImage();
      hoge04 = mi4.getImage();
      hoge05 = mi5.getImage();
    }catch (ConnectionException e){
    }catch (IOException ie){}
  
    repaint();
  }  

//Webサーバーからダウンロードscratchpadに書き込み  
  private void downdat(String str,int size){
    HttpConnection conn;
    String url;
    InputStream in;
    OutputStream out;
    byte dat[];
    int len;
    url="http://web.sfc.keio.ac.jp/~t00274yw/kadai/wireless/images/" + str;
    //    url=IApplication.getCurrentApp().getSourceURL() + str;
    
    try {
      conn=(HttpConnection)(Connector.open(url,Connector.READ));
      conn.setRequestMethod(HttpConnection.GET);
      conn.connect();
      in=conn.openInputStream();
      out=Connector.openOutputStream("scratchpad:///0;pos=" + size);
      
      dat=new byte[256];
      while (true){
        len=in.read(dat);
        
        if (len <= DATA_END) break;
        out.write(dat,0,len);
      } 
      in.close();
      out.close();
    }catch (IOException e){}
  }

    public void morimori(){
	switch(Math.abs((rnd.nextInt()%5))){
	case 0:
	    image = hoge01;
	    break;
	case 1:
	    image = hoge02;
	    break;
	case 2:
	    image = hoge03;
	    break;
	case 3:
	    image = hoge04;
	    break;
	case 4:
	    image = hoge05;
	    break;
	default:
	    image = hoge01;
	}
    }

    
    public void paint (Graphics g){

	
	
	g.lock();
	g.clearRect(0,0,width,height);

	g.drawImage(image,0,0);
	g.setColor(g.getColorOfName(g.BLUE));
	g.fillRect(PosX[0],PosY[0],30,30);
	g.setColor(g.getColorOfName(g.NAVY));
	g.fillRect(PosX[1],PosY[1],30,30);
	g.setColor(g.getColorOfName(g.AQUA));
	g.fillRect(PosX[2],PosY[2],30,30);

	g.setColor(g.getColorOfName(g.FUCHSIA));
	g.fillRect(PosX[3],PosY[3],30,30);
	g.setColor(g.getColorOfName(g.RED));
	g.fillRect(PosX[4],PosY[4],30,30);
	g.setColor(g.getColorOfName(g.PURPLE));
	g.fillRect(PosX[5],PosY[5],30,30);

	g.setColor(g.getColorOfName(g.LIME));
	g.fillRect(PosX[6],PosY[6],30,30);
	g.setColor(g.getColorOfName(g.TEAL));
	g.fillRect(PosX[7],PosY[7],30,30);
	g.setColor(g.getColorOfName(g.YELLOW));
	g.fillRect(PosX[8],PosY[8],30,30);
	
	g.setColor(g.getColorOfName(g.BLACK));
	g.drawString("残り時間" + nCounter + "秒だよ", 0, 100);
	
	g.unlock(true);
	
    }

    public void initHoge(){
	PosX[0] = 0;
	PosX[1] = 0;
	PosX[2] = 0;
	PosX[3] = 30;
	PosX[4] = 30;
	PosX[5] = 30;
	PosX[6] = 60;
	PosX[7] = 60;
	PosX[8] = 60;

	PosY[0] = 0;
	PosY[1] = 30;
	PosY[2] = 60;
	PosY[3] = 0;
	PosY[4] = 30;
	PosY[5] = 60;
	PosY[6] = 0;
	PosY[7] = 30;
	PosY[8] = 60;

	nCounter = 20;
	morimori();       
	repaint();

    }

    //イベント処理
    public void processEvent(int type, int param){
	switch(type){
	case Display.TIMER_EXPIRED_EVENT:
	    nCounter--;
	    repaint();

	    if(nCounter == 10){
		hogeCounter = hogeCounter + 3;
	    }

	    if(nCounter == 0){
		initHoge();
	    }
	    break;
	}
    
    
	if(type == Display.KEY_PRESSED_EVENT){
	    switch(param){
		
	    case Display.KEY_1:
		PosY[0] = PosY[0] - hogeCounter;
		repaint();
		break;
		
	    case Display.KEY_2:
		PosX[3] = PosX[3] - hogeCounter;
		repaint();
		break;

	    case Display.KEY_3:
		PosX[6] = PosX[6] + hogeCounter;
		repaint();
		break;

	    case Display.KEY_4:
		PosY[1] = PosY[1] + hogeCounter;
		repaint();
		break;

	    case Display.KEY_5:
		PosY[4] = PosY[4] - hogeCounter;
		repaint();
		break;
		
	    case Display.KEY_6:
		PosX[7] = PosX[7] - hogeCounter;
		repaint();
		break;

	    case Display.KEY_7:
		PosX[2] = PosX[2] + hogeCounter;
		repaint();
		break;

	    case Display.KEY_8:
		PosY[5] = PosY[5] + hogeCounter;
		repaint();
		break;

	    case Display.KEY_9:
		PosY[8] = PosY[8] + hogeCounter;
		repaint();
		break;

	    }
	}
    }
}


