//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * 敵状態ヘッダ
 * @author Junpee
 */

#ifndef ENEMY_STATE_H_
#define ENEMY_STATE_H_

#include "Game/System/SystemReference.h"

class Stage;

//------------------------------------------------------------------------------
/**
 * 敵状態
 */
class EnemyState : public SystemReference{
friend class Enemy;
public:
	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 * @param enemy 敵
	 */
	EnemyState(Enemy* enemy);

	/**
	 * デストラクタ
	 */
	virtual ~EnemyState();

protected:
	//--------------------------------------------------------------------------
	/**
	 * 速度と位置の計算
	 * @param addVelocity 追加する速度
	 */
	virtual void calcVelocityAndPosition(Vector3 addVelocity = Vector3::zero);

	/**
	 * 地形コリジョン
	 */
	virtual void landCollide();

	/**
	 * 攻撃コリジョン
	 * @param bone ボーン
	 * @param offset コリジョンのオフセット
	 * @param size コリジョンのサイズ
	 * @param damage コリジョンのダメージ
	 */
	virtual void attackCollide(
		Bone* bone, const Vector3& offset, float size, int damage);

	/**
	 * 描画セットアップ
	 * @param animationTime アニメーション時間
	 */
	virtual void drawSetup(	float animationTime);

	//--------------------------------------------------------------------------
	/**
	 * 敵の取得
	 * @return 敵
	 */
	virtual Enemy* getEnemy(){ return enemy_; }

	/**
	 * 実行カウンタの取得
	 * @return 実行カウンタ
	 */
	virtual int getRunCounter() const{ return runCounter_; }

	/**
	 * プレイヤとの間隔
	 * @return プレイヤとの間隔
	 */
	virtual const Vector3& getPlayerDistance(){ return playerDistance_; }

	/**
	 * プレイヤ方向の取得
	 * @return プレイヤ方向
	 */
	virtual Vector3 getPlayerDirection(){
		Vector3 playerDirection = getPlayerDistance();
		playerDirection.y = 0.f;
		if(!playerDirection.isZero()){ playerDirection.normalize(); }
		return playerDirection;
	}

	//--------------------------------------------------------------------------
	// 実行
	//--------------------------------------------------------------------------
	/**
	 * 初期化
	 */
	virtual void initialize() = 0;

	/**
	 * 後始末
	 */
	virtual void finalize() = 0;

	/**
	 * 実行
	 */
	virtual void run() = 0;

	/**
	 * 実行の実装
	 */
	virtual void runImplement();

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードの取得
	 * @return シーンノード
	 */
	virtual SceneNode* getSceneNode();

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * モデルの取得
	 * @return モデル
	 */
	virtual CharacterModel* getModel();

	/**
	 * 攻撃ボーンの取得
	 * @return 攻撃ボーン
	 */
	virtual Bone* getAttackBone();

	/**
	 * 体ボーンの取得
	 * @return 体ボーン
	 */
	virtual Bone* getBodyBone();

	//--------------------------------------------------------------------------
	// アニメーション
	//--------------------------------------------------------------------------
	/**
	 * アニメーションの取得
	 * @return アニメーション
	 */
	virtual Animation* getAnimation();

	//--------------------------------------------------------------------------
	// コリジョン
	//--------------------------------------------------------------------------
	/**
	 * コリジョンノードの取得
	 * @return コリジョンノード
	 */
	virtual CollisionNode* getCollisionNode();

	/**
	 * 地形コリジョンの取得
	 * @return 地形コリジョン
	 */
	virtual StaticSphereCollision* getLandCollision();

	/**
	 * ダメージコリジョンの取得
	 * @return ダメージコリジョン
	 */
	virtual StaticSphereCollision* getDamageCollision();

	/**
	 * 攻撃コリジョンの取得
	 * @return 攻撃コリジョン
	 */
	virtual StaticSphereCollision* getAttackCollision();

	//--------------------------------------------------------------------------
	// 位置
	//--------------------------------------------------------------------------
	/**
	 * 位置の設定
	 * @param position 位置
	 */
	virtual void setPosition(const Vector3& position);

	/**
	 * 位置の取得
	 * @return 位置
	 */
	virtual const Vector3& getPosition() const;

	//--------------------------------------------------------------------------
	// 回転
	//--------------------------------------------------------------------------
	/**
	 * 向きの設定
	 * @param direction 向き
	 */
	virtual void setDirection(const Vector3& direction);

	/**
	 * 向きの取得
	 * @return 向き
	 */
	virtual const Vector3& getDirection() const;

	/**
	 * 回転の取得
	 * @return 回転
	 */
	virtual const Vector3& getRotation() const;

	//--------------------------------------------------------------------------
	// 速度
	//--------------------------------------------------------------------------
	/**
	 * 速度の設定
	 * @param velocity 速度
	 */
	virtual void setVelocity(const Vector3& velocity);

	/**
	 * 速度の取得
	 * @return 速度
	 */
	virtual const Vector3& getVelocity() const;

	//--------------------------------------------------------------------------
	// 空中フラグ
	//--------------------------------------------------------------------------
	/**
	 * 空中フラグの設定
	 * @param isAerial 空中ならtrue
	 */
	virtual void setAerial(bool isAerial);

	/**
	 * 空中フラグの取得
	 * @return 空中ならtrue
	 */
	virtual bool isAerial() const;

	//--------------------------------------------------------------------------
	// ライフ
	//--------------------------------------------------------------------------
	/**
	 * 命の設定
	 * @param life 命
	 */
	virtual void setLife(int life);

	/**
	 * 命の取得
	 * @return 命
	 */
	virtual int getLife() const;

	/**
	 * 体力の設定
	 * @param health 体力
	 */
	virtual void setHealth(int health);

	/**
	 * 体力の取得
	 * @return 体力
	 */
	virtual int getHealth() const;

	/**
	 * 死んでいるか
	 * @return 死んでいるならtrue
	 */
	virtual bool isDeath() const;

	/**
	 * 全滅しているか
	 * @return 全滅していればtrue
	 */
	virtual bool isAnnihilated() const;

	//--------------------------------------------------------------------------
	// ダメージ
	//--------------------------------------------------------------------------
	/**
	 * ダメージ方向の取得
	 * @return ダメージ方向
	 */
	virtual const Vector3& getDamageDirection() const;

	/**
	 * ダメージ値の取得
	 * @return ダメージ値
	 */
	virtual int getDamageValue() const;

	/**
	 * ダメージのクリア
	 */
	virtual void clearDamage();

	/**
	 * 無敵カウンタの取得
	 * @return 無敵カウンタ
	 */
	virtual int getMatchlessCounter() const;

	/**
	 * 無敵カウンタの設定
	 * @param matchlessCounter 無敵カウンタ
	 */
	virtual void setMatchlessCounter(int matchlessCounter);

	//--------------------------------------------------------------------------
	/**
	 * ランダムの取得
	 * @return ランダム
	 */
	virtual Random& getRandom();

private:
	//--------------------------------------------------------------------------
	// コピーコンストラクタの隠蔽
	EnemyState(const EnemyState& copy);

	// 代入コピーの隠蔽
	void operator =(const EnemyState& copy);

	//--------------------------------------------------------------------------
	// 敵
	Enemy* enemy_;
	// 実行カウンタ
	int runCounter_;
	// プレイヤとの間隔
	Vector3 playerDistance_;

};

//------------------------------------------------------------------------------
#endif // End of ENEMY_STATE_H_
//------------------------------------------------------------------------------

