#pragma once

#include "GameSrvDefines.h"

class cPlayer;

struct ClientInfo
{
	union // Database Flag - Common
	{
		struct
		{
			// 0 off / 1 on
			bool check                 : 1; // 로그인 여부 확인.
			bool characterList         : 1; // 캐릭터 목록 검색.
			bool characterName         : 1; // 캐릭터 이름 검색.
			bool characterInsert       : 1; // 캐릭터 생성.
			bool characterDelete       : 1; // 캐릭터 삭제.
			bool characterSelect       : 1; // 캐릭터 선택.
			bool characterUpdate       : 1; // 캐릭터 갱신.
			bool characterEquip        : 1; // 캐릭터 착용 아이템 갱신.
			bool characterMoney        : 1; // 캐릭터 소지금액 갱신.
			bool characterActiveWeapon : 1; // 캐릭터 활성 무기정보 갱신.
			bool noteSelect            : 1; // 쪽지 목록 검색.
			bool noteInsert            : 1; // 쪽지 보내기.
			bool noteDelete            : 1; // 쪽지 지우기.
			bool friendSelect          : 1; // 친구 목록 검색.
			bool friendInsert          : 1; // 친구 추가.
			bool friendUpdate          : 1; // 친구 갱신.
			bool friendDelete          : 1; // 친구 삭제.
			bool spreadValue           : 1; // 스프레드 결과값 반환.
			bool tarotResult           : 1; // 타로카드 효과값 반환.
			bool comeinGame            : 1; // 게임서버 접속(채널이동).
			bool stallSellSearch       : 1; // 판매노점 검색.
			bool stallSellClear        : 1; // 판매노점 아이템 정리.
			bool shortcutUpdate        : 1; // 단축창 갱신.
			bool gameInOutComplete     : 1; // 게임 In/Out 완료.
			bool logout                : 1; // 로그아웃.
			bool skillInfluenceDelete  : 1; // ?
			bool gotoInstantDungeon    : 1; // 인던이동.
			bool returnToMap           : 1; // 채널맵귀환.
			bool memberSelect		   : 1; // 접속유저 검색
		} commonDb;
		long commonDatabase;
	};
	union // Database Flag - GameIn
	{
		struct
		{
			bool heroInfo             : 1; // 하위 목록이 다 전송된후 스텟 최종 계산된 hero 정보를 발송
			bool inventoryList        : 1; // 인벤토리     목록검색.
			bool inventoryCooltime    : 1; // 쿨타임       목록검색.
			bool skillSelect          : 1; // 보유스킬     목록검색.
			bool skillInfluenceSelect : 1; // 보유스킬효과 목록검색.
			bool shortcutSelect       : 1; // 퀵슬롯       목록검색.
			bool questList			  : 1; // 퀘스트	   목록검색.
			bool questEndList		  : 1; // 퀘스트 완료  목록검색.
			bool titleList			  : 1; // 보유호칭	   목록검색.
			bool noteList			  : 1; // 쪽지		   목록검색.
			bool makeSkillList        : 1; // 제조스킬     목록검색.
			bool fortuneData          : 1; // 운세정보     목록검색.
		} gameInDb;
		long gameInDatabase;
	};
	union // Database Flag - Inventory
	{
		struct
		{
			bool insert               : 1; // 생성.(운영자만 가능).
			bool remove               : 1; // 삭제.
			bool use                  : 1; // 사용.
			bool swap                 : 1; // 이동중 교환(예외적인 이동).
			bool move                 : 1; // 이동.
			bool except               : 1; // 이동중 이동(예외적인 이동).
			bool merge                : 1; // 이동중 병합(예외적인 이동).
			bool divide               : 1; // 나누기.
			bool move2                : 1; // 이동(인벤<>창고 전용).
			bool enhanced             : 1; // 강화.
			bool disjoint             : 1; // 분해.
			bool putCard              : 1; // 카드장착
			bool change               : 1; // 체인지(교환).
			bool sell                 : 1; // 판매.
			bool buy                  : 1; // 구매.
			bool get                  : 1; // 줍기.
			bool reward               : 1; // 보상.
			bool take				  : 1; // 회수.
			bool collect              : 1; // 컬렉션북.
			bool stallSellGet         : 1; // 구매(노점).
			bool itemMix              : 1; // 아이템조합.
		} inventoryDb;
		long inventoryDatabase;
	};
	union // Databse Flag - Skill
	{
		struct
		{
			// 0 off / 1 on
			bool skillDbUse          : 1;
			bool makeSkillDbUse      : 1;
		} skillDb;
		long skillDatabase;
	};
	union
	{
		struct  
		{
			// 0 off / 1on
			bool questInsert		  : 1; // 퀘스트 삽입(db기록중인지 체크)
			bool questDelete		  : 1; // 퀘스트 포기
			bool questComplete		  : 1; // 퀘스트 진행완료
			bool questReward		  : 1; // 퀘스트 보상
		} questDb;
		long questDatabase;
	};
	union
	{
		struct 
		{
			// 0 off / 1on
			bool guildCreate		  : 1; // 길드 생성
			bool guildAdd			  : 1; // 길드원 추가
			bool guildOut			  : 1; // 길드 탈퇴
			bool guildCut			  : 1; // 길드 추방
			bool guildDelete		  : 1; // 길드 해체
			bool guildGivePosition	  : 1; // 길드 직위부여
			bool guildMarkUpdate	  : 1; // 길드 마크 갱신
		} guildDb;
		long guildDatabase;
	};
	union // Request Flag
	{
		struct
		{
			// 0 off / 1 on
			bool channelList           : 1; // 채널목록.
			bool characterList         : 1; // 캐릭터목록.
			bool characterSelect       : 1; // 캐릭터선택.
			bool characterEquip        : 1; // 캐릭터장비 교채.
			bool characterOptionSend   : 1; // 캐릭터옵션 전송.
			bool gameIn                : 1; // 게임인.
			bool gameOut               : 1; // 게임아웃.
			bool inventorySend         : 1; // 인벤토리 전송.
			bool inventoryUpdate       : 1; // 인벤토리 변경.
			bool inventoryCooltimeSend : 1; // 인벤토리 쿨타임 전송.
			bool shortcutSend          : 1; // 당 축 창 전송.
			bool noteSend              : 1; // 쪽지목록 전송.
			bool questSend			   : 1; // 퀘스트 목록 전송
			bool titleSend			   : 1; // 호칭 목록 전송
			bool gotoInstantDungeon    : 1; // Instant Dungeon
			bool joinInstantDungeon    : 1; // Instant Dungeon
			bool returnToMap           : 1; // Return to Map
			bool joinMap               : 1; // Join Map
		} request;
		long requestData;
	};
	union // Complete Flag
	{
		struct
		{
			// 0 off / 1 on
			bool check                 : 1; // 로그인 확인.
			bool characterSelect       : 1; // 캐릭터 선택.
			bool gameIn                : 1; // 게임인.
			bool inventory             : 1; // 인벤토리.
			bool inventoryCooltime     : 1; // 인벤토리 쿨 타임.
			bool characterUpdate       : 1; // 캐릭터 업데이트.
			bool characterEquip        : 1; // 캐릭터 착용정보.
			bool characterActiveWeapon : 1; // 캐릭터 활성 무기정보.
			bool characterOption       : 1; // 캐릭터 옵션.
			bool stallSell             : 1; // 판매노점.
			bool stallBuy              : 1; // 구입노점.
			bool influenceRelease      : 1; // ?
			bool skillRelease          : 1; // ?
			bool skillInfluenceInsert  : 1; // ?
			bool skillCoolTime         : 1; // ?
			bool duelEnd               : 1; // 결투 종료 처리
			bool shortcut              : 1; // 단축창 등록정보. 
			bool noteSelect            : 1; // 쪽지목록 확인.
			bool friendSelect          : 1; // 친구목록 확인.
			bool quest				   : 1; // 퀘스트 확인
			bool pvpJoin               : 1; // pvp중
			bool title				   : 1; // 호칭 확인.
			bool fortuneData		   : 1; // 운세속성 확인.
			bool recipeCoolTime        : 1; // 조합 레시피 쿨타임
			bool gameInOutComplete     : 1; // 게임 In/Out 완료.
		} complete;
		long completeData;
	};

	struct
	{
		DWORD channelList;                 // 채  널목록 지연.
		DWORD characterList;               // 캐릭터목록 지연.
		DWORD firendSend;                  // 친  구목록 지연.
		DWORD questSave;                   // 퀘스트저장 지연.
		DWORD chatting;                    // 채팅       지연.
	} delay;

	// 사용자 정보.
	u_long    memberIdx;                   // 계  정 인덱스.
	u_long    loginIdx;                    // 로그인 인덱스.
	u_long    lastChannel;                 // 이전 채널.
	u_long    characterIdx;                // 캐릭터 인덱스.
	BYTE      slevel;                      // 보안등급.

	cPlayer*  hero;                        // Hero 포인터-cPlayer Class.
	ULONG_PTR playerInfo;                  // 캐릭터 Info  (주소).
	ULONG_PTR wearInfo;                    // 캐릭터 Wear  (주소).
	ULONG_PTR weaponInfo;                  // 캐릭터 Weapon(주소).
	ULONG_PTR exrInfo;                     // 캐릭터 Extra (주소).

	// 임시저장 정보.
	TB_SHORTCUT shortcut;                  // 단축키 데이터.
	long        optionData1;               // 옵  션 데이터.
};
