CSCommon: MQuestItem.h 소스 파일

MAIET

MQuestItem.h

00001 #ifndef _MQUEST_ITEM_H
00002 #define _MQUEST_ITEM_H
00003 
00004 #include "MUID.h"
00005 #include <map>
00006 using std::map;
00007 
00008 
00009 class MMatchObject;
00010 
00011 
00012 #define QUEST_ITEM_FILE_NAME    "zquestitem.xml"
00013 
00014 #define MAX_UNIQUE_ITEM_COUNT   3
00015 
00016 #define START_QUEST_ITEM_COUNT  2
00017 #define MIN_QUEST_ITEM_COUNT    1
00018 #define MAX_QUEST_ITEM_COUNT    101 // 하나의 종류에대해 유저가 가질수 있는 최대 아이템 수.
00019                                     // 카운트: 0은 한번도 획득한 적이 없으면서 현제 수량이 0.
00020                                     //       : 1은 적어도 한번은 획득한 적이 있으나 현제 수량이 0임.
00021                                     //       : 2은 아이템 카운트가 시작되는 시점. 2가 실질적으로는 0개를 나타냄.
00022 
00023 
00024 #define MQICTOK_ITEM        "ITEM"
00025 #define MQICTOK_ID          "id"
00026 #define MQICTOK_NAME        "name"
00027 #define MQICTOK_TYPE        "type"
00028 #define MQICTOK_DESC        "desc"
00029 #define MQICTOK_UNIQUE      "unique"
00030 #define MQICTOK_PRICE       "price"
00031 #define MQICTOK_SECRIFICE   "secrifice"
00032 #define MQICTOK_PARAM       "param"
00033 
00034 
00035 enum MQuestItemType
00036 {
00037     MMQIT_PAGE = 1,
00038     MMQIT_SKULL,
00039     MMQIT_FRESH,
00040     MMQIT_RING,
00041     MMQIT_NECKLACE,
00042     MMQIT_DOLL,
00043     MMQIT_BOOK,
00044     MMQIT_OBJECT,
00045     MMQIT_SWORD,
00046     MMQIT_GUN,
00047     MMQIT_LETTER,
00048     MMQIT_ITEMBOX,
00049     
00050 
00051     MMQIT_END,
00052 };
00053 
00054 struct MQuestMonster
00055 {
00056     char szData[ 32 ];
00057 };
00058 
00059 struct MQuestItemDesc
00060 {
00061     unsigned long int   m_nItemID;
00062     char                m_szQuestItemName[ 32 ];
00063     int                 m_nLevel;
00064     MQuestItemType      m_nType;
00065     int                 m_nPrice;
00066     bool                m_bUnique;
00067     bool                m_bSecrifice;
00068     char                m_szDesc[ 8192 ];
00069     int                 m_nLifeTime;
00070     int                 m_nParam;
00071 };
00072 
00073 class MQuestItemDescManager : public map< int, MQuestItemDesc* >
00074 {
00075 public :
00076     MQuestItemDescManager();
00077     ~MQuestItemDescManager();
00078 
00079     static MQuestItemDescManager& GetInst()
00080     {
00081         static MQuestItemDescManager QuestItemDescManager;
00082         return QuestItemDescManager;
00083     }
00084 
00085     bool ReadXml( const char* szFileName );
00086     bool ReadXml( MZFileSystem* pFileSystem, const char* szFileName );
00087     void ParseQuestItem( MXmlElement& element );
00088     void Clear();
00089     MQuestItemDesc* Find( const int nItemID );
00090 private :
00091 };
00092 
00093 #define GetQuestItemDescMgr() MQuestItemDescManager::GetInst()
00094 
00095 struct SimpleQuestItem
00096 {
00097     unsigned long int   m_nItemID;
00098     unsigned int        m_nCount;
00099 };
00100 
00101 // client와 server와의 공통된 부분.
00102 class MBaseQuestItem
00103 {
00104 public: 
00105     MBaseQuestItem() {}
00106     virtual ~MBaseQuestItem() {}
00107 };
00108 
00109 // server에 특화된 부분.
00110 // 퀘스트 아이템은 획득한 적이 있을 경우는 기본값 1을 Count에 설정을 함.
00111 //   그렇게이 카운트가 0이 아닌 1부터 시작을 하기에 실질적인 수량보다 1이 많음.
00112 //   현제 수량을 요구할시는 저장하고 있는 수량에 -1을 해서 반환을 해줘야 함.
00113 class MQuestItem : public MBaseQuestItem
00114 {
00115 public:
00116     MQuestItem() : MBaseQuestItem(),  m_nCount( 0 ), m_pDesc( 0 )
00117     {
00118     }
00119 
00120     virtual ~MQuestItem() 
00121     {
00122     }
00123 
00124     void Create( const unsigned long int nItemID, const int nCount )
00125     {
00126         m_nItemID       = nItemID;
00127         m_nCount        = nCount;
00128     }
00129 
00130     int Increase( const int nCount = 1 )
00131     {
00132         m_nCount += nCount;
00133         if( MAX_QUEST_ITEM_COUNT <= m_nCount )
00134         {
00135             int over = m_nCount - MAX_QUEST_ITEM_COUNT;
00136             m_nCount = MAX_QUEST_ITEM_COUNT;
00137 
00138             return over;
00139         }
00140 
00141         return 0;
00142     }
00143 
00144     int Decrease( const int nCount = 1 )
00145     {
00146         m_nCount -= nCount;
00147         if( MIN_QUEST_ITEM_COUNT > m_nCount )
00148         {
00149             int lower = m_nCount;
00150             m_nCount = MIN_QUEST_ITEM_COUNT;
00151 
00152             return lower;
00153         }
00154 
00155         return 0;
00156     }
00157     
00158     unsigned long int   GetItemID() { return m_nItemID; }
00159     MQuestItemDesc*     GetDesc()   { return m_pDesc; }
00160 
00161     // 퀘스트 아이템은 획득한 적이 있을 경우는 기본값 1을 Count에 설정을 함.
00162     //   그렇게이 카운트가 0이 아닌 1부터 시작을 하기에 실질적인 수량보다 1이 많음.
00163     //   현제 수량을 요구할시는 저장하고 있는 수량에 -1을 해서 반환을 해줘야 함.
00164     unsigned int        GetCount()  { return (m_nCount - MIN_QUEST_ITEM_COUNT); }
00165 
00166     void SetDesc( MQuestItemDesc* pDesc ) 
00167     {
00168         if( 0 == pDesc ) return;
00169         m_pDesc = pDesc;
00170     }
00171 
00172     void SetItemID( unsigned long int nItemID ) { m_nItemID = nItemID; }
00173     void SetCount( unsigned int nCount )        { m_nCount = nCount; }
00174 
00175 private :
00176     unsigned long int       m_nItemID;
00177     MQuestItemDesc*         m_pDesc;
00178 
00179     unsigned int            m_nCount;           // 같은 종류의 아이템은 새로 생성하지 않고 수를 늘림.
00180 };
00181 
00182 
00183 // 게임중에 퀘스트 아이템을 등록하고 있는 클래스.
00184 // 맵에 등록된 퀘스트 아이템은 적어도 한번은 획득한적이 있었던 아이템임.
00185 // 개수가 1일경우는 획득한 적이 있던 아이템이지만 현제 가지고 있는 수량이 0이라는 뜻.
00186 class MQuestItemMap : public map< unsigned long int, MQuestItem* >
00187 {
00188 public :
00189     MQuestItemMap() : m_bDoneDbAccess( false )
00190     {
00191     }
00192 
00193     ~MQuestItemMap()
00194     {
00195     }
00196 
00197 
00198     void SetDBAccess( const bool bState )   { m_bDoneDbAccess = bState; }
00199     bool IsDoneDbAccess()                   { return m_bDoneDbAccess; }
00200 
00201     virtual bool    CreateQuestItem( const unsigned long int nItemID, const int nCount );
00202     void            Clear();
00203     void            Remove( const unsigned long int nItemID );
00204     MQuestItem*     Get( const unsigned long int nItemID );
00205     
00206 
00207     static MUID UseUID()
00208     {
00209         m_csUIDGenerateLock.Lock();
00210             m_uidGenerate.Increase();   
00211         m_csUIDGenerateLock.Unlock();
00212         return m_uidGenerate;
00213     }
00214 
00215 private :
00216     static MUID             m_uidGenerate;
00217     static MCriticalSection m_csUIDGenerateLock;
00218     bool                    m_bDoneDbAccess;        // 디비에서 정보를 가져왔었는지 여부
00219 };
00220 
00221 // 유니크 아이템 획득시, 일정 시간 경과, 일정 횟수 이상 플레이.
00222 // 유니크 아이템 획득은 바로 DB를 업데이 시킴.
00223 class DBQuestCashingData
00224 {
00225 public :
00226     DBQuestCashingData() : m_dwLastUpdateTime( timeGetTime() ), m_nPlayCount( 0 ), m_bEnableUpdate( false ), m_nShopTradeCount( 0 ),
00227         m_pObject( 0 )
00228     {
00229     }
00230 
00231     ~DBQuestCashingData() 
00232     {
00233     }
00234 
00235     bool IsRequestUpdate()
00236     {
00237         if( (MAX_PLAY_COUNT < m_nPlayCount) || (MAX_ELAPSE_TIME < GetUpdaetElapse()) ||
00238             (MAX_SHOP_TRADE_COUNT < m_nShopTradeCount) || m_bEnableUpdate )
00239             return m_bEnableUpdate = true;
00240 
00241         return m_bEnableUpdate = false;
00242     }
00243 
00244     void IncreasePlayCount( const int nCount = 1 );
00245     void IncreaseShopTradeCount( const int nCount = 1 );
00246     bool CheckUniqueItem( MQuestItem* pQuestItem );
00247     void Reset();
00248     
00249     DWORD GetUpdaetElapse() { return timeGetTime() - m_dwLastUpdateTime; }
00250 
00251     void SetEnableUpdateState( const bool bState )  { m_bEnableUpdate = bState; }
00252     void SetCharObject( MMatchObject* pObject )     { m_pObject = pObject; }
00253     
00254     bool DoUpdateDBCharQuestItemInfo();
00255 
00256 private :
00257     enum LIMIT
00258     {
00259         MAX_PLAY_COUNT          = 1,        // 최대 DB업데이트 없이 할수있는 퀘스트 완료수.
00260         MAX_ELAPSE_TIME         = 6000,     // 최대 DB업데이트를 지연시킬수 있는 시간(/ms).
00261         MAX_SHOP_TRADE_COUNT    = 1,        // 최대 DB업데이트 없이 아이템 거래를 할수 있는수.
00262     };
00263 
00264 
00265     MMatchObject*   m_pObject;              // DB업데이트때 데이터를 가져오기 위해서 저장해 놓은 포인터.
00266     DWORD           m_dwLastUpdateTime;     // 업데이트가 적용되면 같이 갱신됨. 
00267     int             m_nPlayCount;           // 게임횟수는 게임에 들어가서 하는 모든 행동에 관계없이 완료를 해야 1번 적용됨. 
00268     int             m_nShopTradeCount;      // 상점에서의 퀘스트 아이템 거래 횟수.
00269     bool            m_bEnableUpdate;        // 현제 상태. 업데이트가 가능하면 true임.
00270 };
00271 
00272 
00273 #endif


MAIET entertainment