/** 弓兵 */

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, int direction, int Nationality) {
		super(x,y, direction, Nationality);
	}
	public archer(int x, int y, int direction, int Nationality, soldier target, boolean auto) {
		super(x,y, direction, Nationality, target, auto);
	}

	public void init() {
		HP = 100;
		offensivePower = 1;
		defensivePower = 1;

		presentSpeed = 0;
		maxSpeed = 2;
		acceleration = 1;

		range = 5;
	}

	public void show(Graphics g, int x, int y, Component view) {
		UGE.show(g, x,y, this, view);
	}

	/** 引数として与えられた兵士にたいし攻撃する */
	void attack(soldier enemy) {
		shot(enemy);
	}

	public void shot(soldier enemy) {
		enemy.attacked(this, this.getDestDirection(enemy) );	// 敵に矢を放つ。
	}

	/** 攻撃力を算出するルーチン。兵士のもつ「攻撃力」「現在速力」「体力」「方角」によって求める */
	public int getOffensivePower(int attackDirection) {

		int retOffensivePower = offensivePower + (HP>>2);

		if (direction == attackDirection)
			retOffensivePower += (3+(presentSpeed>>1));
		else if ( direction == ((attackDirection+1)&3) )
			retOffensivePower += (2+(presentSpeed>>1));
		else if ( direction == ((attackDirection-1)&3) )
			retOffensivePower += (1+(presentSpeed>>1));

		return retOffensivePower;
	}
	/** 防御力を算出するルーチン。兵士のもつ「防御力」「現在速力」「方角」によって求める */
	public int getDefensivePower(int attackedDirection) {

		int retDefensivePower = defensivePower + presentSpeed + (HP>>3);

		if (direction == attackedDirection) {
			retDefensivePower += presentSpeed;
		} else if ( direction == ((attackedDirection+1)&3) )
			retDefensivePower += (1+presentSpeed);
		else if ( direction == ((attackedDirection-1)&3) )
			retDefensivePower += (2+presentSpeed);
		else
			retDefensivePower += (3+presentSpeed);

		return retDefensivePower;
	}

	/** 自身の攻撃範囲に敵がいるかどうかを判断するルーチン */
	public soldier searchEnemy() {

		soldier enemy = null;
		int dest_x = x;
		int dest_y = y;

		int next_x1 = 0, next_y1 = 0, next_x2 = 0, next_y2 = 0,
		 next_x3 = 0, next_y3 = 0, next_x4 = 0, next_y4 = 0;

		switch (direction) {
			case 0 : next_x1 = 0;
				next_y1 = -1;
				next_x2 = -1;
				next_y2 = 1;
				next_x3 = 1;
				next_y3 = 0;
				next_x4 = 1;
				next_y4 = 1;
				break;

			case 1 : next_x1 = 1;
				next_y1 = 0;
				next_x2 = -1;
				next_y2 = -1;
				next_x3 = 0;
				next_y3 = 1;
				next_x4 = -1;
				next_y4 = 1;
				break;

			case 2 : next_x1 = 0;
				next_y1 = 1;
				next_x2 = 1;
				next_y2 = -1;
				next_x3 = -1;
				next_y3 = 0;
				next_x4 = -1;
				next_y4 = -1;
				break;

			case 3 : next_x1 = -1;
				next_y1 = 0;
				next_x2 = 1;
				next_y2 = 1;
				next_x3 = 0;
				next_y3 = -1;
				next_x4 = 1;
				next_y4 = -1;

		}

		int temp_x = x;
		int temp_y = y;
searchEnemy:	for (int tempRange = 1; tempRange <= range; tempRange++) {
			dest_x = temp_x;
			dest_y = temp_y;

			dest_x += next_x1;
			dest_y += next_y1;

			temp_x = dest_x;
			temp_y = dest_y;

			enemy = (soldier)gameBoard.getUnit(dest_x, dest_y);
			if (enemy != null && checkEnemy(enemy))
				break searchEnemy;

			for (int i = 0 ; i < tempRange; i++) {
				dest_x += next_x2;
				dest_y += next_y2;

				enemy = (soldier)gameBoard.getUnit(dest_x, dest_y);
				if (enemy != null && checkEnemy(enemy))
					break searchEnemy;

				int temp_x2 = dest_x;
				int temp_y2 = dest_y;

				dest_x += (next_x3 * (i+1) *2);
				dest_y += (next_y3 * (i+1) *2);

				enemy = (soldier)gameBoard.getUnit(dest_x, dest_y);
				if (enemy != null && checkEnemy(enemy))
					break searchEnemy;

				dest_x = temp_x2;
				dest_y = temp_y2;
			}

			for (int i = tempRange; i > 0; i--) {
				dest_x += next_x4;
				dest_y += next_y4;

				enemy = (soldier)gameBoard.getUnit(dest_x, dest_y);
				if (enemy != null && checkEnemy(enemy))
					break searchEnemy;

				int temp_x2 = dest_x;
				int temp_y2 = dest_y;

				dest_x = dest_x + (next_x3 * (i-1) *2);
				dest_y = dest_y + (next_y3 * (i-1) *2);

				enemy = (soldier)gameBoard.getUnit(dest_x, dest_y);
				if (enemy != null && checkEnemy(enemy))
					break searchEnemy;

				dest_x = temp_x2;
				dest_y = temp_y2;
			}


		}

		return enemy;
	}

}

