#ifndef	__ROLEDATA_H_
#define __ROLEDATA_H_
#include "RoleBaseInc.h"
#include "RoleAttr.h"

//只有Server 使用到的資料(各物件共用)
struct SelfRoleData
{
	Int32				LiveTime;							        //生存時間(-1 為不消失)
	Int32				OwnerDBID;				    		        //擁有者資料庫ID
	ManagementENUM		ManageLV;					        		//權限等級
	//---------------------------------------------------------------------------------
	//		劇情
	//---------------------------------------------------------------------------------
	Int32				PID;								        //由企劃設定的一個ID，用來劇情命令使用
	StaticString<_MAX_LUA_FUNTIONNAMESIZE_>	PlotClassName;          //劇情分類(用來搜尋角色劇情)
	StaticString<_MAX_LUA_FUNTIONNAMESIZE_>	AutoPlot;               //自動
    int                 NpcQuestID;                                 //任務ID
	//---------------------------------------------------------------------------------
	//		重生點
	//---------------------------------------------------------------------------------
    RolePosStruct       RevPos;
	int					RevZoneID;

	//好友名單
	FriendListStruct	FriendList;				

	//公會資料
//	GuildMemberStruct	Guild;

	SelfRoleData()	{ Init(); };
	void	Init();
};

//一般Client 端與Server端 與各個物件需要的資料
struct	BaseRoleData
{

	ObjectModeStruct	Mode;								//物件基本設定

	StaticString< _MAX_NAMERECORD_SIZE_ >   RoleName;	    //角色名稱
	int					ZoneID;								//目前區域編號
    RolePosStruct       Pos;
	int					RoomID;								//所在空間
	int					PlayTime;							//遊戲時間 (分鐘)

    LookStruct          Look;
    ItemFieldStruct		ItemInfo;							//顯像物品如果拿起來代表的資料
	//-------------------------------------------------------------------------------
	//		角色數值資料
	//-------------------------------------------------------------------------------
	Race_ENUM			Race;								//種族
	Voc_ENUM		    Voc;								//職業
    Voc_ENUM		    Voc_Sub;							//副職業
	Sex_ENUM			Sex;								//性別
    int                 Famous; 
    int					HP,MP,SP;							//目前血量與法力
	int					SP_Sub;								//副職的SP
	BaseAbilityStruct	AbilityList[ EM_Max_Vocation ];	    //各職業的個種基本數質	
	//-------------------------------------------------------------------------------
	//		物品裝備資料
	//-------------------------------------------------------------------------------
	//身體物品欄位
    ItemStruct          Body;
    ItemStruct          Bank;
	EQStruct			EQ;							        //裝備資料
    
    int                 TitleID;
    //頭銜資料
    StaticFlag<_MAX_TITLE_FLAG_COUNT_>		Title;
    StaticFlag<_MAX_FLAG_COUNT_>			KeyItem;

	QuestStruct			Quest;
    SkillValueStruct  	SkillValue;		                    //技能資料

    //---------------------------------------------------------------------------------
    StaticVector< BuffBaseStruct , _MAX_BUFF_COUNT_ > Buff; //法術Buff
	//---------------------------------------------------------------------------------
	int					DeadCountDown;					    //死亡復活倒數
    //---------------------------------------------------------------------------------
	int					PartyID;							//隊伍ID

	MagicColdownStruct	Coldown;
	StaticVector< RefineBuffStruct , _MAX_REFINE_BUFF_COUNT_ > RefineColdown; //合成Buff

	BaseRoleData( )	{ Init(); };
	void	Init();
};


struct	TempRoleData
{
    //---------------------------------------------------------------------------------------
    //交易暫存欄位(當物品要給予玩家時，先放置於暫存欄位中)
    StaticVector< ItemFieldStruct , _MAX_TEMP_COUNT_ > ItemTemp;


	RoleValueData			Attr;						//角色數值資料

	TradeStruct				Trade;

    SysManageInfoStruct     Sys;                        //系統管理相關資訊

	PathProcStruct			Move;						//移動資訊

	NPC_AI_Struct			AI; 						//AI處理

	NPCHateList				NPCHate;					//怪物被打到的資訊(給怪物AI使用)

	RoleUpdateEvent			UpdateInfo;					//更新資訊

	MagicProcInfo			Magic;						//施法資訊

    NPC_RandomMoveStruct    RandomMove;                 //亂數移動資訊

	SkillStruct				Skill;                      //技能法術資訊

	float					BoundRadius;				//基本模型大小
	float					ModelSize;					//模型縮放比例

    //---------------------------------------------------------------------------------------
    int                     AroundPlayer;               //周圍大約玩家數量
	//---------------------------------------------------------------------------------------

	//Server端劇情
	StaticString< _MAX_LUA_FUNTIONNAMESIZE_> RangePlot;	//範圍劇情
	StaticString< _MAX_LUA_FUNTIONNAMESIZE_> TouchPlot;	//處發劇情
	StaticString< _MAX_LUA_FUNTIONNAMESIZE_> DeadPlot;	//死亡劇情
	StaticString< _MAX_LUA_FUNTIONNAMESIZE_> SayPlot;	//範圍說話劇情
    StaticString< _MAX_LUA_FUNTIONNAMESIZE_> AttackPlot;//戰鬥劇情
    int                     TouchPlot_Range;
    int                     RangePlot_Range;
	//---------------------------------------------------------------------------------------
	//Client自動劇情
	StaticString< _MAX_LUA_FUNTIONNAMESIZE_> C_AutoPlot;//Client 端的自動劇情
	//---------------------------------------------------------------------------------------
//	int						Reserve[10];				//保留
	//---------------------------------------------------------------------------------------
    int                     CliActionID;                //Cli端動態ID 進入試野會送出
    //---------------------------------------------------------------------------------------
    int                     LoginTempID;                //記錄登入時檢查是否登入的的排程ID

    StaticString<_MAX_NAMERECORD_SIZE_>     CreateAccount;  //建立此物件的帳號

	//QuestTempDataStruct		QuestTempData;
	CastingData				CastData;

    RoleBackupInfo          BackInfo;                   //貝份資訊用來更新Client 或狀態處理

    ShopStateStruct         ShopInfo;                   //商店資訊

    PetStruct				Pet;

    //被動技能
    StaticVector< int , _MAX_PASSIVESKILL_COUNT_ > PassiveSkill;

	//拍賣物品貝份
	StaticVector< SellItemFieldStruct , _MAX_SELL_ITEM_SAVE_COUNT_ > SellItemBackup;
    
	TempRoleData( ) { Init(); };
	void	Init();
};

struct	RoleData
{
    struct
    {
	    GameObjectClassificationENUM        Type;
        Int32                               CharField;          //此帳號的第幾個角色資料
	    Int32				                DBID;				//資料庫ID
	    StaticString<_MAX_ACCOUNT_SIZE_>    Account_ID;	        //帳號名稱
	    StaticString<_MAX_CREATETIME_SIZE_> CreateTime;	        //此物件產生的日期
		UInt32								LogoutTime;			//登出的系統時間
    }Base;

	SelfRoleData	SelfData;								//LocalServer 專用
	BaseRoleData	BaseData;								//Client 與 Server 會用到
	TempRoleData	TempData;								//ClientServer 處理角色的暫存便數
	

	RoleData( );
	void	Init( );
};
//--------------------------------------------------------------------------------------------------------
// 選角色資料
//--------------------------------------------------------------------------------------------------------
struct SampleRoleData
{
//	ObjectClass_ENUM	Type;
	StaticString<_MAX_NAMERECORD_SIZE_> RoleName;
	StaticString<_MAX_ZONENAME_SIZE_>   ZoneName;	//地圖名稱
	int					OrgObjID;						//物件原始ID
	int					Level;
	//顯像資料
	Sex_ENUM			Sex;							//性別
	Race_ENUM			Race;							//種族
    Voc_ENUM            Voc;
/*
	//目前身上裝備
	int					Head;							//頭
	int					Face;							//臉
	int					Mouth;							//口
	int					Gloves;							//手套
	int					Shoes;							//鞋子
	int					Clothes;						//上衣
	int					Pants;							//褲子
	int					Back;							//背部
	int					LeftHand;						//左手
	int					RightHand;						//右手
    */
	void init()
    {
        memset(this,0,sizeof(SampleRoleData));
		Sex     = EM_Sex_Boy;
		Race    = EM_Race1 ;
        Voc     = EM_Vocation_Warrior;
	};
};
//--------------------------------------------------------------------------------------------------------
// npc 需要除存的資料
//--------------------------------------------------------------------------------------------------------
struct NPCData
{ 
	int                                     DBID;
	int					                    OrgObjID;		//物品樣板ID(顯像資料)
	StaticString<_MAX_CREATETIME_SIZE_>	    CreateTime;		//此物件產生的日期	
	ObjectModeStruct	                    Mode;			//物件基本設定
	StaticString<_MAX_NAMERECORD_SIZE_>     RoleName;	    //角色名稱
    int					                    ZoneID;			//目前區域編號
    RolePosStruct                           Pos;
    int                                     LiveTime;
    int                                     OwnerDBID;
    int                                     PID;            //企畫設定的ID用來搜尋執行劇情
	StaticString<_MAX_LUA_FUNTIONNAMESIZE_> PlotClassName;	//屬於哪一個劇情使用
	StaticString<_MAX_LUA_FUNTIONNAMESIZE_> AutoPlot;	    //自動   
	int										QuestID;
    StaticString<_MAX_NAMERECORD_SIZE_>     CreateAccount;	    //角色名稱
};
//--------------------------------------------------------------------------------------------------------
#endif