
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.*;


public class UnitGraphicsEngineApp extends UnitGraphicsEngine {

	static int squareSizeX = 32;
	static int squareSizeY = 32;

	static Image imgBlueSoldier[] = new Image[4];
	static Image imgRedSoldier[] = new Image[4];

	static Image imgBlueCavalry[] = new Image[4];
	static Image imgRedCavalry[] = new Image[4];

	static Image imgBlueArcher[] = new Image[4];
	static Image imgRedArcher[] = new Image[4];

	static Image imgBlueKing[] = new Image[4];
	static Image imgRedKing[] = new Image[4];

	static Image imgBlueArrow[] = new Image[4];
	static Image imgRedArrow[] = new Image[4];

	static Image imgCity;
	static Image imgBlueCapital;
	static Image imgRedCapital;

	static Image imgRoad[] = new Image[11];

	public UnitGraphicsEngineApp(Applet viewer, MediaTracker mediaTracker) {
		this.mediaTracker = mediaTracker;
		MTID = 0;

		// 歩兵画像の読み込み。
		imgBlueSoldier[0] = viewer.getImage(viewer.getCodeBase(), "blue_soldier0.gif");
		mediaTracker.addImage(imgBlueSoldier[0], MTID);
		imgBlueSoldier[1] = viewer.getImage(viewer.getCodeBase(), "blue_soldier1.gif");
		mediaTracker.addImage(imgBlueSoldier[1], MTID);
		imgBlueSoldier[2] = viewer.getImage(viewer.getCodeBase(), "blue_soldier2.gif");
		mediaTracker.addImage(imgBlueSoldier[2], MTID);
		imgBlueSoldier[3] = viewer.getImage(viewer.getCodeBase(), "blue_soldier3.gif");
		mediaTracker.addImage(imgBlueSoldier[3], MTID);

		imgRedSoldier[0] = viewer.getImage(viewer.getCodeBase(), "red_soldier0.gif");
		mediaTracker.addImage(imgRedSoldier[0], MTID);
		imgRedSoldier[1] = viewer.getImage(viewer.getCodeBase(), "red_soldier1.gif");
		mediaTracker.addImage(imgRedSoldier[1], MTID);
		imgRedSoldier[2] = viewer.getImage(viewer.getCodeBase(), "red_soldier2.gif");
		mediaTracker.addImage(imgRedSoldier[2], MTID);
		imgRedSoldier[3] = viewer.getImage(viewer.getCodeBase(), "red_soldier3.gif");
		mediaTracker.addImage(imgRedSoldier[3], MTID);

		// 騎兵画像の読み込み。
		imgBlueCavalry[0] = viewer.getImage(viewer.getCodeBase(), "blue_cavalry0.gif");
		mediaTracker.addImage(imgBlueCavalry[0], MTID);
		imgBlueCavalry[1] = viewer.getImage(viewer.getCodeBase(), "blue_cavalry1.gif");
		mediaTracker.addImage(imgBlueCavalry[1], MTID);
		imgBlueCavalry[2] = viewer.getImage(viewer.getCodeBase(), "blue_cavalry2.gif");
		mediaTracker.addImage(imgBlueCavalry[2], MTID);
		imgBlueCavalry[3] = viewer.getImage(viewer.getCodeBase(), "blue_cavalry3.gif");
		mediaTracker.addImage(imgBlueCavalry[3], MTID);

		imgRedCavalry[0] = viewer.getImage(viewer.getCodeBase(), "red_cavalry0.gif");
		mediaTracker.addImage(imgRedCavalry[0], MTID);
		imgRedCavalry[1] = viewer.getImage(viewer.getCodeBase(), "red_cavalry1.gif");
		mediaTracker.addImage(imgRedCavalry[1], MTID);
		imgRedCavalry[2] = viewer.getImage(viewer.getCodeBase(), "red_cavalry2.gif");
		mediaTracker.addImage(imgRedCavalry[2], MTID);
		imgRedCavalry[3] = viewer.getImage(viewer.getCodeBase(), "red_cavalry3.gif");
		mediaTracker.addImage(imgRedCavalry[3], MTID);

		// 弓兵画像の読み込み。
		imgBlueArcher[0] = viewer.getImage(viewer.getCodeBase(), "blue_archer0.gif");
		mediaTracker.addImage(imgBlueArcher[0], MTID);
		imgBlueArcher[1] = viewer.getImage(viewer.getCodeBase(), "blue_archer1.gif");
		mediaTracker.addImage(imgBlueArcher[1], MTID);
		imgBlueArcher[2] = viewer.getImage(viewer.getCodeBase(), "blue_archer2.gif");
		mediaTracker.addImage(imgBlueArcher[2], MTID);
		imgBlueArcher[3] = viewer.getImage(viewer.getCodeBase(), "blue_archer3.gif");
		mediaTracker.addImage(imgBlueArcher[3], MTID);

		imgRedArcher[0] = viewer.getImage(viewer.getCodeBase(), "red_archer0.gif");
		mediaTracker.addImage(imgRedArcher[0], MTID);
		imgRedArcher[1] = viewer.getImage(viewer.getCodeBase(), "red_archer1.gif");
		mediaTracker.addImage(imgRedArcher[1], MTID);
		imgRedArcher[2] = viewer.getImage(viewer.getCodeBase(), "red_archer2.gif");
		mediaTracker.addImage(imgRedArcher[2], MTID);
		imgRedArcher[3] = viewer.getImage(viewer.getCodeBase(), "red_archer3.gif");
		mediaTracker.addImage(imgRedArcher[3], MTID);

		// 矢画像の読み込み。
		imgBlueArrow[0] = viewer.getImage(viewer.getCodeBase(), "blue_arrow0.gif");
		mediaTracker.addImage(imgBlueArrow[0], MTID);
		imgBlueArrow[1] = viewer.getImage(viewer.getCodeBase(), "blue_arrow1.gif");
		mediaTracker.addImage(imgBlueArrow[1], MTID);
		imgBlueArrow[2] = viewer.getImage(viewer.getCodeBase(), "blue_arrow2.gif");
		mediaTracker.addImage(imgBlueArrow[2], MTID);
		imgBlueArrow[3] = viewer.getImage(viewer.getCodeBase(), "blue_arrow3.gif");
		mediaTracker.addImage(imgBlueArrow[3], MTID);

		imgRedArrow[0] = viewer.getImage(viewer.getCodeBase(), "red_arrow0.gif");
		mediaTracker.addImage(imgRedArrow[0], MTID);
		imgRedArrow[1] = viewer.getImage(viewer.getCodeBase(), "red_arrow1.gif");
		mediaTracker.addImage(imgRedArrow[1], MTID);
		imgRedArrow[2] = viewer.getImage(viewer.getCodeBase(), "red_arrow2.gif");
		mediaTracker.addImage(imgRedArrow[2], MTID);
		imgRedArrow[3] = viewer.getImage(viewer.getCodeBase(), "red_arrow3.gif");
		mediaTracker.addImage(imgRedArrow[3], MTID);

		// 王様画像の読み込み。
		imgBlueKing[0] = viewer.getImage(viewer.getCodeBase(), "blue_king0.gif");
		mediaTracker.addImage(imgBlueKing[0], MTID);
		imgBlueKing[1] = viewer.getImage(viewer.getCodeBase(), "blue_king1.gif");
		mediaTracker.addImage(imgBlueKing[1], MTID);
		imgBlueKing[2] = viewer.getImage(viewer.getCodeBase(), "blue_king2.gif");
		mediaTracker.addImage(imgBlueKing[2], MTID);
		imgBlueKing[3] = viewer.getImage(viewer.getCodeBase(), "blue_king3.gif");
		mediaTracker.addImage(imgBlueKing[3], MTID);

		imgRedKing[0] = viewer.getImage(viewer.getCodeBase(), "red_king0.gif");
		mediaTracker.addImage(imgRedKing[0], MTID);
		imgRedKing[1] = viewer.getImage(viewer.getCodeBase(), "red_king1.gif");
		mediaTracker.addImage(imgRedKing[1], MTID);
		imgRedKing[2] = viewer.getImage(viewer.getCodeBase(), "red_king2.gif");
		mediaTracker.addImage(imgRedKing[2], MTID);
		imgRedKing[3] = viewer.getImage(viewer.getCodeBase(), "red_king3.gif");
		mediaTracker.addImage(imgRedKing[3], MTID);

		// 都市・首都画像の読み込み。
		imgCity = viewer.getImage(viewer.getCodeBase(), "city.gif");
		mediaTracker.addImage(imgCity, MTID);

		imgBlueCapital = viewer.getImage(viewer.getCodeBase(), "blue_capital.gif");
		mediaTracker.addImage(imgBlueCapital, MTID);
		imgRedCapital = viewer.getImage(viewer.getCodeBase(), "red_capital.gif");
		mediaTracker.addImage(imgRedCapital, MTID);

		// 道路画像の読み込み。
		for ( int i = 0; 11 > i; i++ ) {
			imgRoad[i] = viewer.getImage(viewer.getCodeBase(), "road" + i + ".gif");
			mediaTracker.addImage(imgRoad[i], MTID);
		}


		try
		{
			//イメージの強制ロードを要求
			mediaTracker.waitForID(MTID);
		}
		catch (InterruptedException e)
		{
			return;
		}

	}
	public void show(Graphics g, int squareSizeX, int squareSizeY, Unit unit, Component view) {
			g.setColor( Color.pink );
			g.fillRect( unit.getX() * squareSizeX, unit.getY() * squareSizeY, squareSizeX, squareSizeY );
	}

	public void show(Graphics g, int squareSizeX, int squareSizeY, Ground ground, Component view) {
		switch ( ground.getGroundKind() ) {
			case Ground.DEEP_WATER:
				g.setColor( Color.blue );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.SHALLOW_WATER:
				g.setColor( new Color(50, 150, 250) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.SWAMP:
				g.setColor( new Color(100, 150, 250) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.LOW_LAND:
				g.setColor( new Color(50, 255, 100) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.PLAIN_LAND:
				g.setColor( new Color(150, 250, 50) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.HIGH_LAND:
				g.setColor( Color.green );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.HILL_LAND:
				g.setColor( new Color(160, 120, 0) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.LOW_MOUNTAIN:
				g.setColor( new Color(150, 110, 50) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			case Ground.HIGH_MOUNTAIN:
				g.setColor( new Color(130, 110, 100) );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

			default:
				g.setColor( Color.gray );
				g.fillRect( ground.getX() * squareSizeX, ground.getY() * squareSizeY, squareSizeX, squareSizeY );
				break;

		}
	}

	public void show(Graphics g, int squareSizeX, int squareSizeY, Structure structure, Component view) {
			g.setColor( Color.white );
			g.fillRect( structure.getX() * squareSizeX, structure.getY() * squareSizeY, squareSizeX, squareSizeY );
	}

	/** 軍隊を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Army army, Component view) {
		if (1 == army.getNationality()) {
			g.drawImage( imgBlueSoldier[army.getDirection().getDirection()],
				army.getX() * squareSizeX,  army.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedSoldier[army.getDirection().getDirection()],
				army.getX() * squareSizeX,  army.getY() * squareSizeY, view);
		}
	}


	/** 道を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Road road, Component view) {

		g.drawImage( imgRoad[ road.getKind() ], road.getX() * squareSizeX,  road.getY() * squareSizeY, view);
	}

	/** 都市を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, NapCity city, Component view) {
		g.drawImage( imgCity, city.getX() * squareSizeX,  city.getY() * squareSizeY, view);
	}
	/** 首都を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, NapCapital capital, Component view) {
		if (1 == capital.getNationality()) {
			g.drawImage( imgBlueCapital, capital.getX() * squareSizeX,  capital.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedCapital, capital.getX() * squareSizeX,  capital.getY() * squareSizeY, view);
		}
	}

	/** 動的ユニットを描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Creature soldier, Component view) {
		if (1 == soldier.getNationality()) {
			g.drawImage( imgBlueSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
	}

	/** 兵士を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Soldier soldier, Component view) {
		if (1 == soldier.getNationality()) {
			g.drawImage( imgBlueSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
	}

	/** 歩兵を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Infantry soldier, Component view) {
		if (1 == soldier.getNationality()) {
			g.drawImage( imgBlueSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedSoldier[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
	}

	/** 弓兵を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Archer soldier, Component view) {
		if (1 == soldier.getNationality()) {
			g.drawImage( imgBlueArcher[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedArcher[soldier.getDirection().getDirection()],
				soldier.getX() * squareSizeX,  soldier.getY() * squareSizeY, view);
		}
	}
	/** 矢を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Arrow arrow, Component view) {
		if (1 == arrow.getNationality())
			g.drawImage( imgBlueArrow[arrow.getDirection().getDirection()],
				arrow.getX() * squareSizeX,  arrow.getY() * squareSizeY, view);
		else
			g.drawImage( imgRedArrow[arrow.getDirection().getDirection()],
				arrow.getX() * squareSizeX,  arrow.getY() * squareSizeY, view);
	}

	/** 騎兵を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Cavalry cavalry, Component view) {
		if (1 == cavalry.getNationality()) {
			g.drawImage( imgBlueCavalry[cavalry.getDirection().getDirection()],
				cavalry.getX() * squareSizeX,  cavalry.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedCavalry[cavalry.getDirection().getDirection()],
				cavalry.getX() * squareSizeX,  cavalry.getY() * squareSizeY, view);
		}
	}

	/** 指揮官を描画するルーチン。 */
	public void show(Graphics g, int squareSizeX, int squareSizeY, Commander commander, Component view) {
		if (1 == commander.getNationality()) {
			g.drawImage( imgBlueKing[commander.getDirection().getDirection()],
				commander.getX() * squareSizeX,  commander.getY() * squareSizeY, view);
		}
		else {
			g.drawImage( imgRedKing[commander.getDirection().getDirection()],
				commander.getX() * squareSizeX,  commander.getY() * squareSizeY, view);
		}
	}

}