// ====================================================================
//            JAVA APPLET PROGRAM BASE SOURCE     BakuretuKen          
// ====================================================================

import java.applet.Applet;
import java.awt.*;
import java.net.*;
import java.awt.image.*;
import java.util.StringTokenizer;
import java.net.MalformedURLException;
import java.io.*;

// ===============================================================

public class MapPaint extends Applet {
	
	// グローバル変数
	
	// ダブルバッファリング用の宣言
	Graphics bg;
	Image backimage;
	
	// 背景イメージ
	Image haikei[];
	//その他
	Image player1, player2;
	// MAPデータ
	int map[][];
	// キャラの座標
	int cx, cy;
	int oldcx, oldcy;
	// キャラの画像状態
	boolean kuma;
	// ゴールしたかどうか？
	boolean isGoal;
	
	// -----------------------------------------------------------
	public void init() {  // 初期処理
		
		// ダブルバッファリング初期宣言
		backimage = createImage( 360, 360 );
		bg = backimage.getGraphics();
		
		// 背景配列の初期化
		haikei = new Image[6];
		
		haikei[0] = getImage(getDocumentBase(), "back00.gif");
		haikei[1] = getImage(getDocumentBase(), "back01.gif");
		haikei[2] = getImage(getDocumentBase(), "back02.gif");
		haikei[3] = getImage(getDocumentBase(), "back03.gif");
		haikei[4] = getImage(getDocumentBase(), "back04.gif");
		haikei[5] = getImage(getDocumentBase(), "back05.gif");
		player1   = getImage(getDocumentBase(), "kuma01.gif");
		player2   = getImage(getDocumentBase(), "kuma02.gif");
		
		// マップ配列の初期化
		map = new int[100][100];
		// ランダムで 300 x 300 のマップを作る
		for (int yy=0; yy<100; yy++){
			for (int xx=0; xx<100; xx++){
				map[xx][yy] = (int) (4 * Math.random());// ランダム
				if( xx<4 )   map[xx][yy] = 4;
				if( xx>95 ) map[xx][yy] = 4;
				if( yy<4 )   map[xx][yy] = 4;
				if( yy>95 ) map[xx][yy] = 4;
			}
		}
		// 家をマップ配列に置く
		int house_x = (int) (90 * Math.random());// ランダム
		int house_y = (int) (90 * Math.random());// ランダム
		map[house_x+5][house_y+5] = 5;
		// System.out.println( (house_x+5) +" "+(house_y+5)+"\n");
		
		// キャラ座標の初期値
		cx=50; cy=50;
		// キャラ状態の初期化
		kuma=true;
		// 初期状態でゴールしていない
		isGoal = false;
		
	} // init()
	
	// -----------------------------------------------------------
	public void paint(Graphics g) {  // 作画処理
		
		// System.out.println(">"+ cx +" "+cy+"\n");
		
		int no, mx, my;
		
		// 背景を作画
		for ( my=0; my<9; my++) {
			for ( mx=0; mx<9; mx++) {
				no = map[cx-4+mx][cy-4+my];
				bg.drawImage( haikei[no], mx*40, my*40, this);
			}
		}
		
		// キャラを中央に作画
		if ( kuma )
			bg.drawImage( player1, 4*40, 4*40, this);
		else
			bg.drawImage( player2, 4*40, 4*40, this);
		
		if ( isGoal ){
			bg.setFont(new Font("TimesRoman", Font.BOLD, 30 ));
			bg.setColor(Color.white);
			bg.drawString("家に着いた！", 100, 150);
		}
		
		// 裏画像を表に転送
		g.drawImage( backimage, 0, 0, null );
		
	} // paint()
	
	// -----------------------------------------------------------
	public void update(Graphics g) {  // 再作画処理
		paint( g );
	} // update()
	
	// -----------------------------------------------------------
	public boolean mouseDown(Event e, int x, int y) {  // マウスダウン
		
		if ( isGoal ) return true;
		
		int pos;
		
		// キャラ状態を変更
		kuma = !kuma;
		
		// 今のキャラ座標を保存する
		oldcx = cx; oldcy = cy;
		
		// 押された場所を調べる
		pos = checkDirection( x, y);
		
		// 押された場所にあわせて、キャラ座標を変更
		if (pos == 1) cy--;
		if (pos == 3) cy++;
		if (pos == 2) cx++;
		if (pos == 4) cx--;
		
		// もしも移動先が山や海だったら、キャラ座標を保存した座標に戻してやる
		if ( map[cx][cy]==3 || map[cx][cy]==4 ) {
			cx = oldcx;
			cy = oldcy;
		}
		// もしも移動先がゴールだったら、isGoal を ture に
		if ( map[cx][cy]==5 ) isGoal = true;
		
		// 再作画
		repaint();
		
		return true;
	} // mouseDown()
	
	// -----------------------------------------------------------
	public boolean mouseUp(Event e, int x, int y) {  // マウスアップ
		
		return true;
	} // mouseUp()
	
	// -----------------------------------------------------------
	public boolean mouseDrag(Event e, int x, int y) { //  マウス移動
		
		return true;
	} // mouseDrag()
	
	// -----------------------------------------------------------
	// 場所判定プログラム checkDirection()
	// 返り値(int)  上:1  右:2  下:3  左:4
	public int checkDirection(int mx, int my) {
		boolean c1=false;
		boolean c2=false;
		Dimension dim = this.size();
		my = dim.height-my;
		double dx = (double)dim.width;
		double dy = (double)dim.height;
		if(my>(int)((dy/dx)*mx)) c1=true;
		if(my>(int)(dy-(dy/dx)*mx)) c2=true;
		if (c1&&c2)   return 1;
		if (!c1&&c2)  return 2;
		if (!c1&&!c2) return 3;
		if (c1&&!c2)  return 4;
		return 0;
	} // checkDirection()
	
// ===============================================================
}  // End of Class

