import java.awt.image.*;
import java.awt.*;

//--------------------------------------------------
// キャラクラス
//--------------------------------------------------
class Chara{
	// 使用しているキャライメージ
	CharaImage img;

	// アクティブ(生存)フラグ
	boolean m_active;
	boolean IsActive(){return m_active;}
	void SetActive( boolean flag ){ this.m_active = flag; }

	// イベント開始方法
	// 話す・調べる = 0, 主人公と接触 = 1, 自動的に処理を開始 = 2
	int m_event_way;

	// 通行可能フラグ
	boolean m_can_move_flag;

	// でかキャラチップID
	int BigImageID;

	// イメージID
	int image_id;

	// 座標
	int px, py;

	// 固定小数の座標
	int px_one, py_one;

	// ダメージをくらったか 0=くらっていない 1=くらってダメージ処理 2=戻ってる処理 3=ふっとぶ
	int m_damage_flag;

	// 攻撃アクション 0=何もしない 1=前進 2=投げる 3=後退
	int m_attack_action;

	// 一時記憶用
	int m_temp_buffer;

	// 方向(0123:上右下左)
	int dir;

	// アニメパターン
	int anime;

	// アニメの方向
	int anime_dir;

	// イベントスクリプトファイル
	String m_scr_file;

	// 汎用タイマー
	int WaitTimer;

	// HP
	int m_hp;

	// 加速度
	Accel m_accel;

	// 歩行アニメ用タイマー
	int WalkAnimeTimer;

	// 移動中フラグ
	boolean WalkingFlag;

	// 移動した距離
	int m_move_length;

	// 歩く速度
	int m_move_speed;

	// 描画優先度（Y座標が同じ時）高いほうが後に描く
	byte priority;

	// コンストラクタ
	Chara(){
		anime = 1;	// 中央のもの
		anime_dir = 1;
		WalkAnimeTimer = 0;
		m_event_way = 0;
		image_id = 0;
		m_can_move_flag = false;
		WalkingFlag = false;
		m_move_speed = 4;
		m_move_length = 0;
		priority = 0;
		px = 0;
		py = 0;
		m_scr_file = new String("000");
		m_accel = new Accel();
		m_hp = 24;
		m_damage_flag = 0;
		m_attack_action = 0;
		this.m_active = false;
	}

	// イメージセット
	void SetImage( CharaImage img ){
		// イメージへの参照
		this.img = img;
	}

	// 座標セット
	void SetPoint( int x, int y ){
		this.px = x;
		this.py = y;
	}
	// マップ上の座標セット
	void SetPointIndex( int x, int y ){
		this.px = x << 4;
		this.py = y << 4;
	}

	// 方向セット
	void SetDir( int dir ){
		this.dir = dir;
	}
	int GetDir(){ return this.dir; }

	int GetMoveSpeed(){
		return m_move_speed;
	}

	// アニメパターン更新
	void RenewAnime(){
		WalkAnimeTimer++;
		// 8フレームに一回更新
		// ただし移動中は２倍

		if( ( WalkingFlag && ( WalkAnimeTimer > 4 ) ) || WalkAnimeTimer > 8 ){
			WalkAnimeTimer = 0;

			anime += anime_dir;
			if( anime >= CharaManage.ANIME_NUM ){
				anime_dir = -1;
				anime = 1;
			}else if( anime < 0 ){
				anime_dir = 1;
				anime = 1;
			}
		}
	}

	// イメージIDセット
	void SetImageID( int id ){
		this.image_id = id;
	}

	// でかイメージIDセット
	void SetBigImageID( int id ){
		this.BigImageID = id;
	}

	// イメージ取得
	Image GetImage(){
		return img.GetImage( dir, anime );
	}

	// イメージ取得
	ChipImage GetChipImage(){
		return img.GetChipImage( dir, anime );
	}

	// αカラー取得
	int GetAlphaColor(){
		return img.AlphaColor;
	}

	// イベントスクリプト取得
	String GetEvent(){
		return this.m_scr_file;
	}

	void SetEvent( String str ){
		this.m_scr_file = str;
	}

	// イベント開始方法
	void SetEventWay( int way ){
		this.m_event_way = way;
	}

	int GetEventWay(){
		return this.m_event_way;
	}

	// 通行フラグ
	void SetMoveFlag( boolean flag ){
		this.m_can_move_flag = flag;
	}
	boolean GetMoveFlag(){
		return this.m_can_move_flag;
	}

	// 向いてる方向に歩く
	// 一定距離歩けばtrueを返す
	boolean WalkAction(){
		if( dir == BasicManage.DIR_UP ){
			py -= m_move_speed;
		}
		else if( dir == BasicManage.DIR_RIGHT ){
			px += m_move_speed;
		}
		else if( dir == BasicManage.DIR_DOWN ){
			py += m_move_speed;
		}
		else if( dir == BasicManage.DIR_LEFT ){
			px -= m_move_speed;
		}

		// 一定の距離を歩けば停止
		m_move_length += m_move_speed;
		if( m_move_length >= MapManage.CHIP_SIZE ){
			WalkingFlag = false;
			m_move_length = 0;
			return true;
		}
		return false;
	}

	// 領域外対策
	void AreaOutCheck( boolean loop_flag, int width, int height ){
		// ループ
		if( loop_flag ){
			if( px >= width ){
				px = px - width;
			}
			if( py >= height ){
				py = py - height;
			}
			if( px < 0 ){
				px = px + width;
			}
			if( py < 0 ){
				py = py + height;
			}
		}
	}

}
