Files
2022-10-26 12:25:11 +08:00

137 lines
3.8 KiB
C++

#pragma once
//=======================================================================================================================
/// CollectionParser class
/**
@author
Lee Su Tek
@since
2009. 2. 21
@remarks
@note
@history
*/
//=======================================================================================================================
#include <SolarHashTable.h>
#include <Singleton.h>
struct CollectionInfo
{
friend class CollectionParser;
enum { START = 0, LOOP, END, MAX_ANI }; // 플레이어 애니메이션코드
enum { COLLECTABLE = 0, COLLECTING, SUCCESS, MAX_EFFECT }; // 채집물 표시 이펙트코드
enum
{ // 채집 가능 조건
QUEST = 0,
AC,
MAPOBJID,
STAMP,
COUNT,
TRIGGER,
MAX_CONDITION
};
enum
{ // 각인 유.무
OBJ_COLLECT = 0,
OBJ_STAMP,
OBJ_STAMP_USE_GUILD_MASTER,
OBJ_BATTLE_GROUND_STRONGPOINT, //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
//_NA_008334_20150608_SONNENSCHEIN
OBJ_SONNENSCHEIN_STAMP,
// _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
OBJ_ONEDYSGUILDMISSION_STAMP,
};
enum { SCRIPT_TYPE_ITEM = 0, SCRIPT_TYPE_DROP, MAX_SCRIPT_TYPE }; // [아이템코드] 사용 방법
private:
CollectionInfo() {}
~CollectionInfo() {}
CollectionInfo(const CollectionInfo& rhs) { *this = rhs; }
/*
// (CHANGES) (f100604.3L) remove constructor
const CollectionInfo( const CollectionInfo& rhs )
: m_CollectionID(rhs.m_CollectionID)
, m_dwRespawnTime(rhs.m_dwRespawnTime)
, m_dwCollectingTime(rhs.m_dwCollectingTime)
, m_byScriptType(rhs.m_byScriptType)
, m_ItemCode(rhs.m_ItemCode)
, m_IGType(rhs.m_IGType)
{
memcpy( m_wzidAnimation, rhs.m_wzidAnimation, sizeof(m_wzidAnimation) );
memcpy( m_wzidEffect, rhs.m_wzidEffect, sizeof(m_wzidEffect) );
memcpy( m_Condition, rhs.m_Condition, sizeof(m_Condition) );
}
*/
public:
// 유일키
WzID m_CollectionID;
DWORD m_dwRespawnTime; // 리스폰 시간
DWORD m_dwCollectingTime; // 채집 시간
WzID m_wzidAnimation[MAX_ANI]; // 애니메이션코드
WzID m_wzidEffect[MAX_EFFECT]; // 이펙트코드
BYTE m_byScriptType; // 연결스크립트 (0:아이템고정, 1: 드랍방식)
SLOTCODE m_ItemCode; // 아이템코드
INT m_IGType; // 아이템등급
DWORD m_Condition[MAX_CONDITION]; // 채집 조건
};
typedef util::SolarHashTable<const CollectionInfo*> COLLECTION_INFO_HASH;
class CollectionParser : public util::Singleton<CollectionParser>, public IParser
{
public:
CollectionParser();
virtual ~CollectionParser();
VOID Init( char * pszPackFileName );
VOID Release(){ Unload(); };
VOID Reload();
VOID Unload();
BOOL LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload );
inline const CollectionInfo* const FindCollectionInfo( WzID CollectionID ) { return m_CollectionInfoHash.GetData(CollectionID); }
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
inline const COLLECTION_INFO_HASH& GetCollectionInfoHash() const { return m_CollectionInfoHash; }
template< class Operator >
void for_each( Operator& op );
private:
BOOL _Load( BOOL bReload );
BOOL _Validating( const CollectionInfo& Collection ) const ;
private:
char m_tszFileName[MAX_PATH];
COLLECTION_INFO_HASH m_CollectionInfoHash;
};
// (CHANGES) (f100320.1L) (WAVERIX) fix up the unsafe code that the for_each using std::for_each \
// change to explicit for each routine, because the COLLECTION_INFO_HASH is the SolarHashtable \
// which is not supported generic type traits
template< class Operator >
void CollectionParser::for_each(Operator& op) {
COLLECTION_INFO_HASH::iterator it = m_CollectionInfoHash.begin(),
end = m_CollectionInfoHash.end();
for ( ; it != end; ++it) {
const CollectionInfo* info = *it;
op(info);
}
}