#ifndef _RS_CONSTS_
#define _RS_CONSTS_

#include <vector>

namespace GEnum {
	namespace KeyMap{
        enum{
            UP,
            DOWN,
            LEFT,
            RIGHT,
           
            A,
            B,
            C,

            D,
			E,
			F,

			G,
			H,
			I,

			J,
			//K,
			//L,

			MAX_KEY
        };
    };


	/** スプライトインデックス
	  * data/ImageList.txtに記載
	  */
	namespace SpriteType{

		enum{
			COMMON,
			SHOT,
			EFFECT,

			EVIGEN_WEAPON,
			DURANDAL,
			// 5
			NAKED_PESERU,

			EVIGEN,
			TANYA,
			TRELLAMA,
			UNDELSEN,
			// 10
			DURANDANA,
			PESERU,
			GARDA,
			SAKURI,
			TANYA_YOUJO,
			// 15
			NOTOKO,
			ELLIN,

			FOBOKO_P,
			RAMDA,
			KAPPA,
			// 20
			DELTA,

			MAX_NUM
		};

	}

	namespace Common {
		enum {
			TILE,					//0
			FADE_OUT,
			NUMBERS,
			READYGO,
			GAMESET,
			STAGE_SELECT_TITLE,
			STAGE_SELECT_MAP_000,
			STAGE_SELECT_MAP_001,	//5
			STAGE_SELECT_MAP_003,	
			STAGE_SELECT_SELECT,
			PLAYER_SELECT_TITLE,	
			PLAYER_SELECT_SELECT,
			PLAYER_SELECT_SELECT_2,
			PLAYER_SELECT_SELECT_3,
			PLAYER_SELECT_SELECT_4,
			WATCH_FRAME,
			WATCH_SAND,
			STOCK_DEFAULT,
			STOCK_EVIGEN,
			PLAYER_SELECT_EVIGEN,
		};
	}

	namespace Motion {
		enum {
			STAND,
			WALK,
			DASH,
			FLYDOWN,
			FLYUP,
			CROUCH,
			ATTACK,
			ATTACK_2,
			ATTACK_GUN,
			DEAD,
			DEAD_FLYDOWN,
			DEAD_FLYUP,
			DAMAGE,
			DAMAGE_FLYDOWN,
			DAMAGE_FLYDOWN_REVERSE,
			DAMAGE_ELEC,
			DAMAGE_HOLD,						//! 掴み攻撃
			DAMAGE_HOLD_DOWN,
			BIND,
			BIND_DAMAGE,						//! 磔
			BIND_DAMAGE_ELEC,
			BROKEN,
			EATENING,
			EATEN,
			JATTACK,			//! ジャンプ攻撃

			TAUNT,
			MAX_NUM
		};
	}

	namespace Sequence {
		namespace EvigenWeapon {
			enum {
				MINIGUN_NORMAL,
				MISSILE_LAUNCHER,
				FRAME_THROWER,
				MAX_NUM
			};

		}

		namespace Effect {
			enum {
				HIT,
				CONSTRUCT,
				ABESHI,
			};
		}
		/** ショットのシーケンス番号
		  *
		  */
	/*	namespace Shot {
			enum {
				BULLET,		//! バレット(ミニガンの弾)
				SLASH,		//! 剣
				//FIRE,
			};
		}*/
	}
	
	namespace SceneType {
		enum {
			GAME,
			PLAYER_SELECT,
			STAGE_SELECT,
			LOBBY,
		};
	}

	//! ゲームシーンの使いまわし
	namespace GameSceneType {
		enum {
			G_TITLE,
			G_GAME,
			G_RESULT,
		};
	}

	/** ショットタイプ
	  * 絵は使いまわしたり混合して表示する事があるため、
	  * 同じにはしない。
	  */
	namespace ShotType {
		enum {
			BULLET,			//! 弾（マシンガン）
			SLASH,			//! ペセルのアレ
			FIRE_BALL,		//! アンデルセン、トリラーマのアレ
			SWORD_SLASH,	//! トリラーマのアレ
			BEAM,			//! オプティックブラスト
			ONLY_SLASH,		//! 剣の攻撃のみ(デュランダナ、ターニャ)
			ODORO,			//! 沼低級
			THUNDER_BOLT,	//! 光中級
			MISSILE,		//! ミサイル
			EXPLOSION,		//! 爆発
			PINE_APPLE_0,	//! パイナップル
			PINE_APPLE_1,	//! パイナップル（爆発前）
			RYUHA_1,		//! 悪ガル子のあれ1(横)
			RYUHA_2,		//! 悪ガル子のあれ2(上方向二本) 
			SAUCER,			//! かっぱのお皿
			FRAME_THROWER_FIRE,	//! 火炎放射器の炎
			MAX_NUM
		};
	}

	/** プレイヤー種別
	  */
	namespace PlayerType{
		enum{
			EVIGEN,
			TANYA,
			TRELLAMA,
			UNDELSEN,
			DURANDANA,
			PESERU,
			GARDA,
			SAKURI,
			TANYA_YOUJO,
			NOTOKO,
			ELLIN,

			// 召喚枠
			FOBOKO_P,

			//PLAYABLE_MAX,				// ここから先は色々あれ
			RAMDA,// = PLAYABLE_MAX,
			KAPPA,
			DELTA,
/*			SHADOW_EVIGEN,
			PHOBOKO_P,
			PHOBOKO_F,
			PHOBOKO_B,*/

			//None,
			/*Tanya,
			PTank,
			VTOLnya,
			Tanya2,*/

			MAX_NUM
		};
	};

	namespace AttackType {
		enum {
			SHOT = 0,		//! 何か出す
			HIT,			//! 体当たり：弾には当たる。互いに体当たりの場合互いに吹き飛ぶが、ダメージなし
		};
		static const char* Labels[20] = {
			"SHOT",
			"HIT"
		};
	}
	namespace PlayerSettingAttackType {
		enum {
			ATTACK,
			ATTACK_2,
			ATTACK_GUN,

			MAX_NUM,
		};
	}
	static const char* PLAYER_SETTING_LABEL[10] = {
		"ATTACK",
		"ATTACK_2",
		"ATTACK_GUN",
	};

	/** マップ種別
	  */
	namespace MapType {
		enum {
			MAP000,
			MAP001,
			TITLE,
			MAP003,		//TEST
			RESULT,
		};

	}

	namespace ShotSettingType {
		namespace IntegerData {
			enum {
				HIT,					//! 敵に当たるかどうか
				BOUNCE_TO_NO_HIT,		//! バウンドすると当たらなくなる
				ALIVE_AFTER_HIT,		//! 
				MAX_NUM
			};
		}
		static char* INTEGER_DATA_LABELS[256] = {
			"HIT",
			"BOUNCE_TO_NO_HIT",
			"ALIVE_AFTER_HIT",
		};
		namespace FloatData {
			enum {
				DAMAGE,					//! ダメージ量
				BLOW,					//! 吹っ飛び基本量
				MAX_NUM
			};
		}
		static char* FLOAT_DATA_LABELS[256] = {
			"DAMAGE",
			"BLOW",
		};
	}
	namespace PlayerSettingType {
		namespace IntegerData {
			enum {
			};
		}
		namespace FloatData {
			enum {
			};
		}
	}

	namespace WeaponSetType {
		namespace Evigen {			//			：近接(Z)、中距離(X)、長距離(C)
			enum {
				HEAVY_WEAPON,		//! 重火器	：火炎放射、ミニガン、ミサイル
				MARTIAL_ARTS,		//! 武術	：パンチ、パイナップル、？
			};
		}
	}
	/*namespace EnemyType {
		enum {
		};

	}*/
	/** 武器の種類
	  */
	/*namespace WeaponType {
		namespace Evigen {
			enum {
				HANDGUN,
				MINIGUN,
				ROCKET_LAUNCHER,
			};
		}
		namespace Tanya {
			enum {
				CROWBAR,
				BUILD,
				EVIL,
			};
		}
		namespace Undelsen {
			enum {
				FIRE_BALL,
				REPAIR,
				DARK_BALL,
			};
		}
		namespace Durandana {
			enum {
				DURANDAL,
				DRAGON_KILLER,
				KATANA,
			};
		}
		namespace Trellama {
			enum {
				DURANDAL,
				FIRE_STREAM,
				OPTIC_BLAST,
			};
		}
		namespace Peseru {
			enum {
				SLASH,
				SLIDING,
				NAKED,
			};
		}
	}*/

	/// ネット命令セット
	/// 括弧内は文字列数
	namespace NetCommand {
		enum {
			// LOGIN,ログインID(string)
			LOGIN,

			// LOGOUT
			LOGOUT,

			// クライアント→サーバ情報
			// CLIENT,TYPE(2),DAMAGE_RATE(3),CenterX(10),Y(10),DX(5),DY(5),STATE(3),FORCEID(1)
			CLIENT,

			// サーバからの情報
			// 各プレイヤーの情報
			// SERVER,PLAYERNUMBER(2),TYPE(2),NAME,DAMAGE_RATE(3),CenterX(10),Y(10),DX(5),DY(5),STATE(3),FORCEID(1)
			// NAMEはクライアント自身なら"-"が返ってくる
			PLAYER,

			// 登録情報
			// クライアントはこの情報を元に設定を行う
			// PLAYERNUMBER[]は他のプレイヤーの番号。
			// REGISTERD,STAGE(2),PLAYERNUMBER(2),PLAYERNUMBER[0],...,[PLAYER_MAX_NUM]
			_REGISTERED,

			// サーバから失敗通知,
			// FAILURE,失敗理由(2)
			FAILURE,

		};

	}
																
	namespace NetErrorType {
		enum {
			ERR_NONE,
			ERR_MAX_PLAYER,
			ERR_TIMEOUT,
		};
	}

	// テスト
	extern const float PESERU_SLASH_MOVE_X;						//! ペセルの攻撃時の前進速度
	extern const char* SHOT_SEQUENCE_ID_MAPPING_FILE_PATH;		//! タイプからシーケンスIDを取得する対応マッピングファイルパス
	extern const char* NEUTRAL_SEQUENCE_ID_MAPPING_FILE_PATH;	//! タイプからシーケンスIDを取得する対応マッピングファイルパス
	extern const float EVIGEN_MINIGUN_BULLET_SPEED;
	extern const float EVIGEN_MINIGUN_BULLET_ERROR_Y;
	extern const float EVIGEN_MISSILE_BACK_SPEED_X;
	extern const float SHOT_BLOW_SPEED;
	extern const float SLASH_BLOW_SPEED;
	extern const float MISSILE_BLOW_SPEED;
	extern const int DAMAGE_TEXT_MERGINE;
	extern const float TRELLAMA_FIRE_BALL_SPEED;				//! メイルストーム
	extern const float TRELLAMA_FIRE_BALL_ERROR_Y;				//! 上下エラー
	extern const float TRELLAMA_SWORD_SLASH_SPEED_X;			//! 剣劇
	extern const float EVIGEN_PINEAPPLE_THROW_SPEED_X;			//! パイナップル
	extern const float EVIGEN_PINEAPPLE_THROW_SPEED_Y;			//! 
	extern const float FIRE_BALL_ACCEL_X;						//! 火
	extern const float PESERU_SLIDING_BLOW_SPEED;
	extern const float PESERU_SLIDING_DAMAGE;
	extern const float PESERU_SLIDING_SPEED_X;
	extern const float PESERU_SLASH_Y;							//! 上にずらす量
	extern const float DURANDANA_GRAND_TIPER_BLOW_SPEED;
	extern const float DURANDANA_GRAND_TIPER_DAMAGE;
	extern const float DURANDANA_GRAND_TIPER_SPEED_X;
	extern const float DURANDANA_GRAND_TIPER_SPEED_Y;
	extern const float DURANDANA_ATTACK_2_BLOW_SPEED;			//! デュランダナAttack2（KATANA）
	extern const float DURANDANA_ATTACK_2_DAMAGE;
	extern const float DURANDANA_ATTACK_2_SPEED_X;				//! 刀の突撃速度

	extern const char* const SHOT_NAME_MAPPING_FILE_PATH;		//! 名前と数値のマッピング
	extern const char* const SHOT_SETTING_FILE_PATH;			//! ショットの設定ファイル
	extern const char* const PLAYER_SETTING_LIST_FILE_PATH;		//! プレイヤーの設定ファイル

	extern const float UNDELSEN_THUNDER_BOLT_SPEED_Y;
	extern const int UNDELSEN_THUNDER_BOLT_RANDOM_X;
	extern const float ODORO_ACCEL_Y;
	extern const float ODORO_DAMAGE;
	extern const float UNDELSEN_ODORO_SPEED_X;

	extern const float TWO_PLAYER_BOTH_BLOW_AWAY_SPEED;			//! 相打ち時の吹っ飛び速度
	extern const float EVIGEN_MISSILE_SPEED_X;

	extern const float GARDA_RYUHA_1_X;
	extern const float GARDA_RYUHA_2_Y;

	extern const int PLAYER_SELECT_COLUMN_PER_ROW;
	extern const int PLAYER_SELECT_LEFT;
	extern const int PLAYER_SELECT_TOP;
	extern const int PLAYER_SELECT_INTERVAL_X;
	extern const int PLAYER_SELECT_INTERVAL_Y;

	extern const int PLAYER_SELECT_NAME_LEFT;
	extern const int PLAYER_SELECT_NAME_TOP;
	extern const int PLAYER_SELECT_ANIMATION_INTERVAL;			//! アニメーションの変更間隔

	extern const int STAGE_SELECT_LEFT;
	extern const int STAGE_SELECT_TOP;
	extern const int STAGE_SELECT_INTERVAL_X;
	extern const int STAGE_SELECT_INTERVAL_Y;
	extern const int STAGE_SELECT_COLUMN_PER_ROW;

	extern const float MAX_ENEMY_PLAYER_HP;
	extern const float SAUCER_VELOCITY_X;
	extern const float SAUCER_VELOCITY_Y;

	///--------------- net
	static const int SIZE_OF_PACKET_DATA = 256;						//! 送受信データサイズ（固定）
	extern const char* NET_MYACCOUNT;								//! 名前がこれの場合、自分の情報として処理する
	static const int MAX_HANDLE_NAME_LENGTH = 16;					//! ハンドル名MAX

	/** プレイヤーの種類をランダムにする
	  * @param[in]	nExceptionPlayerIndex		除外するプレイヤーインデックス（-1なら全員ランダム）
	  * @param[in]	nExceptedPlayerType			除外された場所に入れるタイプ番号
	  */
	std::vector<int> randomPlayers( int nExceptionPlayerIndex, int nExceptedPlayerType );

	extern const int DEFAULT_STOCK_NUM;		//! デフォルトの開始ストック数
	extern const int RESPAWN_WAIT_FRAME_NUM;//! リスポーン完了までの時間
//	extern const int START_WAIT_FRAME_NUM;	//! ゲーム開始時のウエイト（アニメーション有り）
//	extern const int END_WAIT_FRAME_NUM;	//! ゲーム終了時（優勝確定時）のウエイト（アニメーションなし）
	static const int PLAYER_MAX_NUM = 4;
}

#endif
