/** 弓兵 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class Archer extends Soldier implements Missile {

	int range;	//攻撃範囲

	public Archer(int x, int y, Board tacticsField, Direction direction, int nationality) {
		super(x,y, tacticsField, direction, nationality);
	}
	public Archer(int x, int y, Board tacticsField, Direction direction, int nationality, Unit target, boolean auto) {
		super(x,y, tacticsField, direction, nationality, target, auto);
	}

	public void init() {
		maxHP = 100;
		hp = 100;
		offensivePower = 1;
		defensivePower = 1;

		presentSpeed = 0;
		maxSpeed = 2;
		acceleration = 1;

		attackSpeed = 2;

		movementPower = 0;
		attackSpeedPower = 0;
		range = 5;
	}
	public void show(Graphics g, int x, int y, Component view) {
		uge.show(g, x,y, this, view);
	}

	public void shot(Soldier enemy) {

		Direction attackedDirection = new Direction( direction );
		attackedDirection.calculateDirectionStoD(x, y,  target.getX(), target.getY());

		// 敵を攻撃。
		enemy.attacked( getOffensivePower(attackedDirection), attackedDirection );

		// 画面に描画するための矢オブジェクトを作成。
		board.getFlyingUnitList().add( new Arrow(x,y, board, attackedDirection, nationality, enemy ) );
	}

	/** 攻撃力を算出するルーチン。兵士のもつ「攻撃力」「現在速力」「体力」「方角」によって求める */
	public int getOffensivePower(Direction attackedDirection) {

///		int retOffensivePower = offensivePower + board.getGround(x,y).getOffensivePower(attackedDirection) + (hp>>2);
		int retOffensivePower = 10;

/*		if (direction.getDirection() == attackDirection.getDirection())
			retOffensivePower += (3+presentSpeed);
		else if ( direction.getDirection() == ((attackDirection.getDirection()+1)&3) )
			retOffensivePower += (2+presentSpeed);
		else if ( direction == ((attackDirection-1)&3) )
			retOffensivePower += (1+presentSpeed);
*/
		return retOffensivePower;
	}

	/** 防御力を算出するルーチン。兵士のもつ「防御力」「現在速力」「方角」によって求める */
	public int getDefensivePower(Direction attackedDirection) {

///		int retDefensivePower = defensivePower + board.getGround(x,y).getDefensivePower(attackedDirection) + (hp>>3);
		int retDefensivePower = 5;

/*		switch () {
			case Direction.UP:
				retDefensivePower += presentSpeed;
				break;

			case Direction.LEFT:
				retDefensivePower += (presentSpeed + 1);
				break;

			case Direction.RIGHT:
				retDefensivePower += (presentSpeed + 2);
				break;

			case Direction.DOWN:
				retDefensivePower += (presentSpeed + 3);
				break;
		}
*/
		return retDefensivePower;
	}

	/** 自身の攻撃範囲に敵がいるかどうかを判断するルーチン */
	public Soldier searchEnemy() {

		Soldier enemy = null;
		Direction searchDirection = new Direction( direction );

		int destX = x;
		int destY = y;

searchEnemy:	for (int tempRange = 1; tempRange <= range; tempRange++) {

			destX += searchDirection.getNextX();
			destY += searchDirection.getNextY();

			int tempX = destX;
			int tempY = destY;

			enemy = (Soldier)board.getCreature( destX, destY );
			if ( checkEnemy(enemy) )
				break searchEnemy;

			for (int i = 0 ; i < tempRange; i++) {

				searchDirection.leftTurn();
				destX += searchDirection.getNextX();
				destY += searchDirection.getNextY();
				searchDirection.leftTurn();
				destX += searchDirection.getNextX();
				destY += searchDirection.getNextY();

				enemy = (Soldier)board.getCreature( destX, destY );
				if ( checkEnemy(enemy) )
					break searchEnemy;

				int tempX2 = destX;
				int tempY2 = destY;

				searchDirection.leftTurn();
				destX += ( searchDirection.getNextX() * (i+1) *2 );
				destY += ( searchDirection.getNextY() * (i+1) *2 );

				enemy = (Soldier)board.getCreature( destX, destY );
				if ( checkEnemy(enemy) )
					break searchEnemy;

				searchDirection.leftTurn();
				destX = tempX2;
				destY = tempY2;
			}

			for (int i = tempRange; i > 0; i--) {

				searchDirection.rightTurn();
				destX += searchDirection.getNextX();
				destY += searchDirection.getNextY();
				searchDirection.rightTurn();
				destX += searchDirection.getNextX();
				destY += searchDirection.getNextY();

				enemy = (Soldier)board.getCreature( destX, destY );
				if ( checkEnemy(enemy) )
					break searchEnemy;

				int tempX2 = destX;
				int tempY2 = destY;

				searchDirection.leftTurn();
				destX += ( searchDirection.getNextX() * (i+1) *2 );
				destY += ( searchDirection.getNextY() * (i+1) *2 );

				enemy = (Soldier)board.getCreature( destX, destY );
				if ( checkEnemy(enemy) )
					break searchEnemy;

				searchDirection.leftTurn();
				destX = tempX2;
				destY = tempY2;

			}

			destX = tempX;
			destY = tempY;

		}

		return enemy;
	}


}

