Files
Sun1602/SolarQuest/QuestStruct.h
T
2022-10-26 12:25:11 +08:00

287 lines
7.3 KiB
C

#pragma once
#pragma pack(push,1)
// redesigned by __NA_001337_20090511_EXPANSION_QUEST_COMPL_NUM
// 버전값은 진행중과 완료 스트림 같이 쓴다.
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 진행중 퀘스트 스트림 버전 관리
//
// 9byte
struct QUESTPART_PROGR_V0
{
enum {
QUESTPART_PROGR_VERSION = 0,
MAX_QUEST_MONSTER_KILL_COUNT = 5,
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
MAX_QUEST_MISSION_CLEAR_COUNT = 2,
#endif //_NA_006607_20130402_ADD_QUESTTYPE
MAX_QUEST_PROGR_NUM = 50
};
// 4byte
DWORD m_QCode : 11; //< 2048 개
DWORD m_ExpireTime : 19; //< 524288 := 145.63시간 => 최대 86400=24시간만 해주면 됨
// (남은시간 : 초로 사용) GetQuestInfo()->GetExpiredTime() 이 0이 아니면 사용중 값
DWORD m_QState : 2; //< 0~3 => 0: 진행, 1: 완료, 2:실패
// 5byte
BYTE m_KCount[MAX_QUEST_MONSTER_KILL_COUNT];
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
BYTE mission_number[2];
#endif //_NA_006607_20130402_ADD_QUESTTYPE
};
// 11byte
struct QUESTPART_PROGR_V1
{
enum {
QUESTPART_PROGR_VERSION = 1,
MAX_QUEST_MONSTER_KILL_COUNT = 5,
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
MAX_QUEST_MISSION_CLEAR_COUNT = 2,
#endif //_NA_006607_20130402_ADD_QUESTTYPE
MAX_QUEST_PROGR_NUM = 50
};
void init() {
this->m_QCode = 0;
this->m_Reserved1 = 0;
this->m_ExpireTime = 0;
this->m_Reserved2 = 0;
this->m_QState = 0;
this->m_Reserved3 = 0;
ZeroMemory(this->m_KCount,MAX_QUEST_MONSTER_KILL_COUNT);
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
ZeroMemory(this->mission_number, MAX_QUEST_MISSION_CLEAR_COUNT);
#endif //_NA_006607_20130402_ADD_QUESTTYPE
}
QUESTPART_PROGR_V1& operator = (const QUESTPART_PROGR_V0& rhs) {
this->m_QCode = rhs.m_QCode;
this->m_Reserved1 = 0;
this->m_ExpireTime = rhs.m_ExpireTime;
this->m_Reserved2 = 0;
this->m_QState = rhs.m_QState;
this->m_Reserved3 = 0;
memcpy(this->m_KCount,rhs.m_KCount,QUESTPART_PROGR_V0::MAX_QUEST_MONSTER_KILL_COUNT);
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
memcpy(this->mission_number, rhs.mission_number, QUESTPART_PROGR_V0::MAX_QUEST_MISSION_CLEAR_COUNT);
#endif //_NA_006607_20130402_ADD_QUESTTYPE
return *this;
}
WORD m_QCode : 12; //< 4096 개
WORD m_Reserved1 : 4; //< 이후 여분의 값은 유동적으로 사용.
DWORD m_ExpireTime : 17; //< 132072 := 36.4시간 => 최대 86400=24시간만 해주면 됨
DWORD m_Reserved2 : 11;
DWORD m_QState : 2; //< 0~3 => 0: 진행, 1: 완료, 2:실패
DWORD m_Reserved3 : 2;
BYTE m_KCount[MAX_QUEST_MONSTER_KILL_COUNT];
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
BYTE mission_number[2];
#endif //_NA_006607_20130402_ADD_QUESTTYPE
};
// 11byte
// m_Reserved2 영역에 탐색퀘스트 진행 여부 추가
struct QUESTPART_PROGR_V2
{
enum {
QUESTPART_PROGR_VERSION = 2,
MAX_QUEST_MONSTER_KILL_COUNT = 5,
MAX_QUEST_PROGR_NUM = 50
};
void init() {
this->m_QCode = 0;
this->m_Reserved1 = 0;
this->m_ExpireTime = 0;
this->m_Reserved2 = 0;
this->m_SearchedArea1 = 0;
this->m_SearchedArea2 = 0;
this->m_SearchedArea3 = 0;
this->m_Reserved3 = 0;
this->m_QState = 0;
this->m_Reserved4 = 0;
ZeroMemory(this->m_KCount,MAX_QUEST_MONSTER_KILL_COUNT);
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
ZeroMemory(this->mission_number, 2);
#endif //_NA_006607_20130402_ADD_QUESTTYPE
}
QUESTPART_PROGR_V2& operator = (const QUESTPART_PROGR_V1& rhs) {
this->m_QCode = rhs.m_QCode;
this->m_Reserved1 = 0;
this->m_ExpireTime = rhs.m_ExpireTime;
this->m_Reserved2 = 0;
this->m_SearchedArea1 = 0;
this->m_SearchedArea2 = 0;
this->m_SearchedArea3 = 0;
this->m_Reserved3 = 0;
this->m_QState = rhs.m_QState;
this->m_Reserved4 = 0;
memcpy(this->m_KCount,rhs.m_KCount,QUESTPART_PROGR_V1::MAX_QUEST_MONSTER_KILL_COUNT);
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
memcpy(this->mission_number, rhs.mission_number, QUESTPART_PROGR_V1::MAX_QUEST_MISSION_CLEAR_COUNT);
#endif //_NA_006607_20130402_ADD_QUESTTYPE
return *this;
}
WORD m_QCode : 12; //< 4096 개
WORD m_Reserved1 : 4; //< 이후 여분의 값은 유동적으로 사용.
DWORD m_ExpireTime : 17; //< 132072 := 36.4시간 => 최대 86400=24시간만 해주면 됨
DWORD m_Reserved2 : 3;
DWORD m_SearchedArea1 : 1;
DWORD m_SearchedArea2 : 1;
DWORD m_SearchedArea3 : 1;
DWORD m_Reserved3 : 5;
DWORD m_QState : 2; //< 0~3 => 0: 진행, 1: 완료, 2:실패
DWORD m_Reserved4 : 2;
BYTE m_KCount[MAX_QUEST_MONSTER_KILL_COUNT];
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
BYTE mission_number[2];
#endif //_NA_006607_20130402_ADD_QUESTTYPE
};
struct QUESTPART_PROGR : public QUESTPART_PROGR_V2 {};
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 퀘스트 완료 스트림 버전 관리
//
struct QUESTPART_COMPL_V0
{
enum {
QUESTPART_COMPL_VERSION = 0,
MAX_QUEST_COMPL_NUM = 1500
};
BYTE m_Num; //< 완료한 횟수
};
// 0번 사용 불가 (1~3000)
// (define.h,DefineForLog.h,LogCommonDefine.h)
struct QUESTPART_COMPL_V1
{
enum {
QUESTPART_COPML_VERSION = 1,
MAX_QUEST_COMPL_NUM = 3001
};
BYTE m_Num; //< 완료한 횟수
};
// 내부 변화 없음
struct QUESTPART_COMPL_V2
{
enum {
QUESTPART_COPML_VERSION = 2,
MAX_QUEST_COMPL_NUM = MAX_COMPL_QUESTSTREAM_SIZE
};
BYTE m_Num; //< 완료한 횟수
};
#ifdef _NA_004157_20120409_QUEST_BANDWITH_INCREASING
struct QUESTPART_COMPL_V3
{
enum {
QUESTPART_COPML_VERSION = 3,
MAX_QUEST_COMPL_NUM = 3001
};
WORD m_Num; //< 완료한 횟수
};
struct QUESTPART_COMPL : public QUESTPART_COMPL_V3 {};
#else
struct QUESTPART_COMPL : public QUESTPART_COMPL_V2 {};
#endif //_NA_004157_20120409_QUEST_BANDWITH_INCREASING
////////////////////////////////////////////////////////////////////////////////////////////////////
struct QUESTPART_COMPL_EX : public QUESTPART_COMPL
{
WORD m_QCode;
};
struct QUEST_PROGR_TOTAL_INFO
{
BYTE m_Count;
QUESTPART_PROGR m_Info[QUESTPART_PROGR::MAX_QUEST_PROGR_NUM];
int GetSize() {
return (sizeof(QUEST_PROGR_TOTAL_INFO)-(QUESTPART_PROGR::MAX_QUEST_PROGR_NUM-m_Count)*sizeof(QUESTPART_PROGR));
}
};
// 값을 사용하는 배열의 최대 인덱스 만큼을 보낸다
struct QUEST_COMPL_TOTAL_INFO
{
WORD m_Count;
QUESTPART_COMPL_EX m_Info[QUESTPART_COMPL::MAX_QUEST_COMPL_NUM];
int GetSize()
{
return (sizeof(QUEST_COMPL_TOTAL_INFO)-(QUESTPART_COMPL::MAX_QUEST_COMPL_NUM-m_Count)*sizeof(QUESTPART_COMPL_EX));
}
};
struct QUEST_DAILY_INFO
{
WORD code_;
BYTE status_;
DWORD64 start_datetime_;
DWORD64 end_datetime_;
QUEST_DAILY_INFO()
: code_(0), status_(0), start_datetime_(0), end_datetime_(0)
{
}
};
// (WAVERIX) define제거했습니당
//#ifdef __NA_0_20070521_QUEST_CONDITION_RESULT_CHANGE
//#endif
#pragma pack(pop)
struct QUEST_MSG
{
};
struct QUEST_MONSTER_KILL_MSG : public QUEST_MSG
{
WORD m_MonsterCode;
//WORD m_MonsterNum; //< 기본적으로 1이겠지?
};
struct QUEST_MONSTER_KILL_GRADE_MSG : public QUEST_MSG
{
BYTE m_MonsterGrade;
WORD m_MonsterLevel;
};
struct QUEST_AREA_MSG : public QUEST_MSG
{
DWORD m_AreaID;
};
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
struct QUEST_MISSION_CLEAR_MSG : public QUEST_MSG
{
WORD mission_code;
};
#endif //_NA_006607_20130402_ADD_QUESTTYPE