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