KItem.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:24k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "MyAssert.H"
  3. #include "KTabFile.h"
  4. #include "KNpc.h"
  5. #include "KItem.h"
  6. #include "KItemSet.h"
  7. #ifndef _STANDALONE
  8. #include "../../../lib/S3DBInterface.h"
  9. #else
  10. #include "S3DBInterface.h"
  11. #endif
  12. #ifndef _SERVER
  13. #include "ImgRef.h"
  14. #include "KPlayer.h"
  15. #include "../../Represent/iRepresent/iRepresentshell.h"
  16. #include "KMagicDesc.h"
  17. #endif
  18. KItem Item[MAX_ITEM];
  19. int GetRandomNumber(int nMin, int nMax);
  20. KItem::KItem()
  21. {
  22. ::memset(&m_CommonAttrib,    0, sizeof(m_CommonAttrib));
  23. ::memset(m_aryBaseAttrib,    0, sizeof(m_aryBaseAttrib));
  24. ::memset(m_aryRequireAttrib, 0, sizeof(m_aryRequireAttrib));
  25. ::memset(m_aryMagicAttrib,   0, sizeof(m_aryMagicAttrib));
  26. ::memset(&m_GeneratorParam,  0, sizeof(m_GeneratorParam));
  27. m_nCurrentDur = -1;
  28. #ifndef _SERVER
  29. ::memset(&m_Image,   0, sizeof(KRUImage));
  30. #endif
  31. m_nIndex = 0;
  32. }
  33. KItem::~KItem()
  34. {
  35. }
  36. void* KItem::GetRequirement(IN int nReq)
  37. {
  38. int i = sizeof(m_aryRequireAttrib)/sizeof(m_aryRequireAttrib[0]);
  39. if (nReq >= i)
  40. return NULL;
  41. return &m_aryRequireAttrib[nReq];
  42. }
  43. /******************************************************************************
  44. 功能: 将item上的魔法应用到NPC身上
  45. 入口: pNPC: 指向NPC的指针,nMagicAcive:打开的隐藏属性数目
  46. 出口: 魔法被应用。
  47. 具体工作由KNpc的成员函数完成。
  48. KItem 对象本身没有成员变量被修改
  49. ******************************************************************************/
  50. void KItem::ApplyMagicAttribToNPC(IN KNpc* pNPC, IN int nMagicActive /* = 0 */) const
  51. {
  52. _ASSERT(this != NULL);
  53. _ASSERT(nMagicActive >= 0);
  54. int nCount = nMagicActive;
  55. int i;
  56. // 基础属性调整NPC
  57. for (i = 0; i < sizeof(m_aryBaseAttrib)/sizeof(m_aryBaseAttrib[0]); i++)
  58. {
  59. const KItemNormalAttrib* pAttrib;
  60. pAttrib = &(m_aryBaseAttrib[i]);
  61. if (INVALID_ATTRIB != pAttrib->nAttribType)
  62. {
  63. pNPC->ModifyAttrib(pNPC->m_Index, (void *)pAttrib);
  64. }
  65. }
  66. // 魔法属性调整NPC
  67. for (i = 0; i < sizeof(m_aryMagicAttrib)/sizeof(m_aryMagicAttrib[0]); i++)
  68. {
  69. const KItemNormalAttrib* pAttrib;
  70. pAttrib = &(m_aryMagicAttrib[i]);
  71. if (INVALID_ATTRIB != pAttrib->nAttribType)
  72. {
  73. if (i & 1) // 为奇数,是后缀(i从零开始)
  74. {
  75. if (nCount > 0)
  76. {
  77. pNPC->ModifyAttrib(pNPC->m_Index, (void *)pAttrib);
  78. nCount--;
  79. }
  80. }
  81. else
  82. {
  83. pNPC->ModifyAttrib(pNPC->m_Index, (void *)pAttrib);
  84. }
  85. }
  86. }
  87. }
  88. /******************************************************************************
  89. 功能: 将item上的魔法从NPC身上移除
  90. 入口: pNPC: 指向NPC的指针,nMagicAcive:打开的隐藏属性数目
  91. 出口: 魔法被应用。
  92. 具体工作由KNpc的成员函数完成。
  93. KItem 对象本身没有成员变量被修改
  94. ******************************************************************************/
  95. void KItem::RemoveMagicAttribFromNPC(IN KNpc* pNPC, IN int nMagicActive /* = 0 */) const
  96. {
  97. _ASSERT(this != NULL);
  98. _ASSERT(nMagicActive >= 0);
  99. int nCount = nMagicActive;
  100. int i;
  101. // 基础属性调整NPC
  102. for (i = 0; i < sizeof(m_aryBaseAttrib)/sizeof(m_aryBaseAttrib[0]); i++)
  103. {
  104. const KItemNormalAttrib* pAttrib;
  105. pAttrib = &(m_aryBaseAttrib[i]);
  106. if (INVALID_ATTRIB != pAttrib->nAttribType)
  107. {
  108. KItemNormalAttrib RemoveAttrib;
  109. RemoveAttrib.nAttribType = pAttrib->nAttribType;
  110. RemoveAttrib.nValue[0] = -pAttrib->nValue[0];
  111. RemoveAttrib.nValue[1] = -pAttrib->nValue[1];
  112. RemoveAttrib.nValue[2] = -pAttrib->nValue[2];
  113. pNPC->ModifyAttrib(pNPC->m_Index, (void *)&RemoveAttrib);
  114. }
  115. }
  116. for (i = 0; i < sizeof(m_aryMagicAttrib)/sizeof(m_aryMagicAttrib[0]); i++)
  117. {
  118. const KItemNormalAttrib* pAttrib;
  119. pAttrib = &(m_aryMagicAttrib[i]);
  120. if (INVALID_ATTRIB != pAttrib->nAttribType) // TODO: 为 -1 定义一个常量?
  121. {
  122. KItemNormalAttrib RemoveAttrib;
  123. if (i & 1) // 为奇数,是后缀(i从零开始)
  124. {
  125. if (nCount > 0)
  126. {
  127. RemoveAttrib.nAttribType = pAttrib->nAttribType;
  128. RemoveAttrib.nValue[0] = -pAttrib->nValue[0];
  129. RemoveAttrib.nValue[1] = -pAttrib->nValue[1];
  130. RemoveAttrib.nValue[2] = -pAttrib->nValue[2];
  131. pNPC->ModifyAttrib(pNPC->m_Index, (void *)&RemoveAttrib);
  132. nCount--;
  133. }
  134. }
  135. else
  136. {
  137. RemoveAttrib.nAttribType = pAttrib->nAttribType;
  138. RemoveAttrib.nValue[0] = -pAttrib->nValue[0];
  139. RemoveAttrib.nValue[1] = -pAttrib->nValue[1];
  140. RemoveAttrib.nValue[2] = -pAttrib->nValue[2];
  141. pNPC->ModifyAttrib(pNPC->m_Index, (void *)&RemoveAttrib);
  142. }
  143. }
  144. }
  145. }
  146. /******************************************************************************
  147. 功能: 将item上的第N项隐藏魔法属性应用到NPC身上
  148. 入口: pNPC: 指向NPC的指针
  149. 出口: 魔法被应用。
  150. 具体工作由KNpc的成员函数完成。
  151. KItem 对象本身没有成员变量被修改
  152. ******************************************************************************/
  153. void KItem::ApplyHiddenMagicAttribToNPC(IN KNpc* pNPC, IN int nMagicActive) const
  154. {
  155. _ASSERT(this != NULL);
  156. if (nMagicActive <= 0)
  157. return;
  158. const KItemNormalAttrib* pAttrib;
  159. pAttrib = &(m_aryMagicAttrib[(nMagicActive << 1) - 1]); // 后缀为隐藏属性所以乘2减一
  160. if (-1 != pAttrib->nAttribType)
  161. {
  162. pNPC->ModifyAttrib(pNPC->m_Index, (void *)pAttrib);
  163. }
  164. }
  165. /******************************************************************************
  166. 功能: 将item上的第N项隐藏魔法属性从NPC身上移除
  167. 入口: pNPC: 指向NPC的指针,nMagicActive:第n项魔法属性
  168. 出口: 魔法被移除。
  169. 具体工作由KNpc的成员函数完成。
  170. KItem 对象本身没有成员变量被修改
  171. ******************************************************************************/
  172. void KItem::RemoveHiddenMagicAttribFromNPC(IN KNpc* pNPC, IN int nMagicActive) const
  173. {
  174. _ASSERT(this != NULL);
  175. if (nMagicActive <= 0)
  176. return;
  177. const KItemNormalAttrib* pAttrib;
  178. pAttrib = &(m_aryMagicAttrib[(nMagicActive << 1) - 1]); // 后缀为隐藏属性所以乘2减一
  179. if (-1 != pAttrib->nAttribType)
  180. {
  181. KItemNormalAttrib RemoveAttrib;
  182. RemoveAttrib.nAttribType = pAttrib->nAttribType;
  183. RemoveAttrib.nValue[0] = -pAttrib->nValue[0];
  184. RemoveAttrib.nValue[1] = -pAttrib->nValue[1];
  185. RemoveAttrib.nValue[2] = -pAttrib->nValue[2];
  186. pNPC->ModifyAttrib(pNPC->m_Index, (void *)&RemoveAttrib);
  187. }
  188. }
  189. /******************************************************************************
  190. 功能: 根据配置文件中的数据,为item的各项赋初值
  191. 入口: pData: 给出来自配置文件的数据
  192. 出口: 成功时返回非零, 以下成员变量被值:
  193. m_CommonAttrib,m_aryBaseAttrib,m_aryRequireAttrib
  194. 失败时返回零
  195. 说明: CBR: Common,Base,Require
  196. ******************************************************************************/
  197. BOOL KItem::SetAttrib_CBR(IN const KBASICPROP_EQUIPMENT* pData)
  198. {
  199. _ASSERT(pData != NULL);
  200. BOOL bEC = FALSE;
  201. if (pData)
  202. {
  203. //SetAttrib_Common(pData);
  204. *this = *pData; // 运算符重载
  205. SetAttrib_Base(pData->m_aryPropBasic);
  206. SetAttrib_Req(pData->m_aryPropReq);
  207. bEC = TRUE;
  208. }
  209. return bEC;
  210. }
  211. BOOL KItem::SetAttrib_Base(const KEQCP_BASIC* pBasic)
  212. {
  213. for (int i = 0;
  214.  i < sizeof(m_aryBaseAttrib)/sizeof(m_aryBaseAttrib[0]); i++)
  215. {
  216. KItemNormalAttrib* pDst;
  217. const KEQCP_BASIC* pSrc;
  218. pDst = &(m_aryBaseAttrib[i]);
  219. pSrc = &(pBasic[i]);
  220. pDst->nAttribType = pSrc->nType;
  221. pDst->nValue[0] = ::GetRandomNumber(pSrc->sRange.nMin, pSrc->sRange.nMax);
  222. pDst->nValue[1] = 0; // RESERVED
  223. pDst->nValue[2] = 0; // RESERVED
  224. if (pDst->nAttribType == magic_durability_v)
  225. SetDurability(pDst->nValue[0]);
  226. }
  227. if (m_nCurrentDur == 0) // 说明没有耐久度属性
  228. m_nCurrentDur = -1;
  229. return TRUE;
  230. }
  231. BOOL KItem::SetAttrib_Req(const KEQCP_REQ* pReq)
  232. {
  233. for (int i = 0;
  234.  i < sizeof(m_aryRequireAttrib)/sizeof(m_aryRequireAttrib[0]); i++)
  235. {
  236. KItemNormalAttrib* pDst;
  237. pDst = &(m_aryRequireAttrib[i]);
  238. pDst->nAttribType = pReq[i].nType;
  239. pDst->nValue[0] = pReq[i].nPara;
  240. pDst->nValue[1] = 0; // RESERVED
  241. pDst->nValue[2] = 0; // RESERVED
  242. }
  243. return TRUE;
  244. }
  245. /******************************************************************************
  246. 功能: 根据传入的数据, 为item的魔法属性赋初值
  247. 入口: pMA: 给出数据
  248. 出口: 成功时返回非零, 以下成员变量被值:
  249. m_aryMagicAttrib
  250. 失败时返回零
  251. ******************************************************************************/
  252. BOOL KItem::SetAttrib_MA(IN const KItemNormalAttrib* pMA)
  253. {
  254. if (NULL == pMA)
  255. { _ASSERT(FALSE); return FALSE; }
  256. for (int i = 0; i < sizeof(m_aryMagicAttrib) / sizeof(m_aryMagicAttrib[0]); i++)
  257. {
  258. m_aryMagicAttrib[i] = pMA[i];
  259. // 永不磨损
  260. if (m_aryMagicAttrib[i].nAttribType == magic_indestructible_b)
  261. {
  262. SetDurability(-1);
  263. }
  264. }
  265. return TRUE;
  266. }
  267. /******************************************************************************
  268. 功能: 根据传入的数据, 为item的魔法属性赋初值
  269. 入口: pMA: 给出数据
  270. 出口: 成功时返回非零, 以下成员变量被值:
  271. m_aryMagicAttrib
  272. 失败时返回零
  273. ******************************************************************************/
  274. BOOL KItem::SetAttrib_MA(IN const KMACP* pMA)
  275. {
  276. if (NULL == pMA)
  277. { _ASSERT(FALSE); return FALSE; }
  278. for (int i = 0; i < sizeof(m_aryMagicAttrib) / sizeof(m_aryMagicAttrib[0]); i++)
  279. {
  280. const KMACP* pSrc;
  281. KItemNormalAttrib* pDst;
  282. pSrc = &(pMA[i]);
  283. pDst = &(m_aryRequireAttrib[i]);
  284. pDst->nAttribType = pSrc->nPropKind;
  285. pDst->nValue[0] =  ::GetRandomNumber(pSrc->aryRange[0].nMin, pSrc->aryRange[0].nMax);
  286. pDst->nValue[1] =  ::GetRandomNumber(pSrc->aryRange[1].nMin, pSrc->aryRange[1].nMax);
  287. pDst->nValue[2] =  ::GetRandomNumber(pSrc->aryRange[2].nMin, pSrc->aryRange[2].nMax);
  288. }
  289. return TRUE;
  290. }
  291. void KItem::operator = (const KBASICPROP_EQUIPMENT& sData)
  292. {
  293. KItemCommonAttrib* pCA = &m_CommonAttrib;
  294. pCA->nItemGenre  = sData.m_nItemGenre;
  295. pCA->nDetailType  = sData.m_nDetailType;
  296. pCA->nParticularType = sData.m_nParticularType;
  297. pCA->nObjIdx  = sData.m_nObjIdx;
  298. pCA->bStack  = sData.m_bStack;
  299. pCA->nWidth  = sData.m_nWidth;
  300. pCA->nHeight  = sData.m_nHeight;
  301. pCA->nPrice  = sData.m_nPrice;
  302. pCA->nLevel  = sData.m_nLevel;
  303. pCA->nSeries  = sData.m_nSeries;
  304. ::strcpy(pCA->szItemName,  sData.m_szName);
  305. #ifndef _SERVER
  306. ::strcpy(pCA->szImageName, sData.m_szImageName);
  307. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  308. m_Image.Color.Color_b.a = 255;
  309. m_Image.nFrame = 0;
  310. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  311. m_Image.nType = ISI_T_SPR;
  312. ::strcpy(m_Image.szImage, pCA->szImageName);
  313. m_Image.uImage = 0;
  314. #endif
  315. }
  316. void KItem::operator = (const KBASICPROP_MEDMATERIAL& sData)
  317. {
  318. // 赋值: 共同属性部分
  319. KItemCommonAttrib* pCA = &(m_CommonAttrib);
  320. pCA->nItemGenre  = sData.m_nItemGenre;
  321. pCA->nDetailType  = sData.m_nDetailType;
  322. pCA->nParticularType = sData.m_nParticularType;
  323. pCA->nObjIdx  = sData.m_nObjIdx;
  324. pCA->bStack  = sData.m_bStack;
  325. pCA->nWidth  = sData.m_nWidth;
  326. pCA->nHeight  = sData.m_nHeight;
  327. pCA->nPrice  = sData.m_nPrice;
  328. pCA->nLevel  = sData.m_nLevel;
  329. pCA->nSeries  = sData.m_nSeries;
  330. ::strcpy(pCA->szItemName,  sData.m_szName);
  331. #ifndef _SERVER
  332. ::strcpy(pCA->szImageName, sData.m_szImageName);
  333. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  334. #endif
  335. // 赋值: 基本属性部分
  336. KItemNormalAttrib* pBA = m_aryBaseAttrib;
  337. pBA[0].nAttribType = sData.m_nAttrib1_Type;
  338. pBA[0].nValue[0]   = sData.m_nAttrib1_Para;
  339. pBA[1].nAttribType = sData.m_nAttrib2_Type;
  340. pBA[1].nValue[0]   = sData.m_nAttrib2_Para;
  341. pBA[2].nAttribType = sData.m_nAttrib3_Type;
  342. pBA[2].nValue[0]   = sData.m_nAttrib3_Para;
  343. // 赋值: 需求属性部分: 无
  344. // 赋值: 魔法属性部分: 无
  345. #ifndef _SERVER
  346. m_Image.Color.Color_b.a = 255;
  347. m_Image.nFrame = 0;
  348. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  349. m_Image.nType = ISI_T_SPR;
  350. ::strcpy(m_Image.szImage, pCA->szImageName);
  351. m_Image.uImage = 0;
  352. #endif
  353. }
  354. void KItem::operator = (const KBASICPROP_MINE& sData)
  355. {
  356. // 赋值: 共同属性部分
  357. KItemCommonAttrib* pCA = &m_CommonAttrib;
  358. pCA->nItemGenre  = sData.m_nItemGenre;
  359. pCA->nDetailType  = sData.m_nDetailType;
  360. pCA->nParticularType = sData.m_nParticularType;
  361. pCA->nObjIdx  = sData.m_nObjIdx;
  362. pCA->bStack  = sData.m_bStack;
  363. pCA->nWidth  = sData.m_nWidth;
  364. pCA->nHeight  = sData.m_nHeight;
  365. pCA->nPrice  = sData.m_nPrice;
  366. pCA->nLevel  = sData.m_nLevel;
  367. ::strcpy(pCA->szItemName,  sData.m_szName);
  368. #ifndef _SERVER
  369. ::strcpy(pCA->szImageName, sData.m_szImageName);
  370. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  371. #endif
  372. // 赋值: 需求属性部分: 无
  373. // 赋值: 魔法属性部分: 无
  374. #ifndef _SERVER
  375. m_Image.Color.Color_b.a = 255;
  376. m_Image.nFrame = 0;
  377. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  378. m_Image.nType = ISI_T_SPR;
  379. ::strcpy(m_Image.szImage, pCA->szImageName);
  380. m_Image.uImage = 0;
  381. #endif
  382. }
  383. void KItem::operator = (const KBASICPROP_QUEST& sData)
  384. {
  385. // 赋值: 共同属性部分
  386. KItemCommonAttrib* pCA = &m_CommonAttrib;
  387. pCA->nItemGenre  = sData.m_nItemGenre;
  388. pCA->nDetailType  = sData.m_nDetailType;
  389. pCA->nParticularType = 0;
  390. pCA->nObjIdx  = sData.m_nObjIdx;
  391. pCA->bStack  = 0;
  392. pCA->nWidth  = sData.m_nWidth;
  393. pCA->nHeight  = sData.m_nHeight;
  394. pCA->nPrice  = 0;
  395. pCA->nLevel  = 1;
  396. pCA->nSeries  = -1;
  397. ::strcpy(pCA->szItemName,  sData.m_szName);
  398. #ifndef _SERVER
  399. ::strcpy(pCA->szImageName, sData.m_szImageName);
  400. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  401. #endif
  402. ZeroMemory(m_aryBaseAttrib, sizeof(m_aryBaseAttrib));
  403. // 赋值: 需求属性部分: 无
  404. ZeroMemory(m_aryRequireAttrib, sizeof(m_aryBaseAttrib));
  405. // 赋值: 魔法属性部分: 无
  406. ZeroMemory(m_aryMagicAttrib, sizeof(m_aryBaseAttrib));
  407. #ifndef _SERVER
  408. m_Image.Color.Color_b.a = 255;
  409. m_Image.nFrame = 0;
  410. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  411. m_Image.nType = ISI_T_SPR;
  412. ::strcpy(m_Image.szImage, pCA->szImageName);
  413. m_Image.uImage = 0;
  414. #endif
  415. }
  416. void KItem::operator = (const KBASICPROP_TOWNPORTAL& sData)
  417. {
  418. // 赋值: 共同属性部分
  419. KItemCommonAttrib* pCA = &m_CommonAttrib;
  420. pCA->nItemGenre  = sData.m_nItemGenre;
  421. pCA->nDetailType  = 0;
  422. pCA->nParticularType = 0;
  423. pCA->nObjIdx  = sData.m_nObjIdx;
  424. pCA->bStack  = 0;
  425. pCA->nWidth  = sData.m_nWidth;
  426. pCA->nHeight  = sData.m_nHeight;
  427. pCA->nPrice  = sData.m_nPrice;
  428. pCA->nLevel  = 1;
  429. pCA->nSeries  = -1;
  430. ::strcpy(pCA->szItemName,  sData.m_szName);
  431. #ifndef _SERVER
  432. ::strcpy(pCA->szImageName, sData.m_szImageName);
  433. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  434. #endif
  435. ZeroMemory(m_aryBaseAttrib, sizeof(m_aryBaseAttrib));
  436. // 赋值: 需求属性部分: 无
  437. ZeroMemory(m_aryRequireAttrib, sizeof(m_aryBaseAttrib));
  438. // 赋值: 魔法属性部分: 无
  439. ZeroMemory(m_aryMagicAttrib, sizeof(m_aryBaseAttrib));
  440. #ifndef _SERVER
  441. m_Image.Color.Color_b.a = 255;
  442. m_Image.nFrame = 0;
  443. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  444. m_Image.nType = ISI_T_SPR;
  445. ::strcpy(m_Image.szImage, pCA->szImageName);
  446. m_Image.uImage = 0;
  447. #endif
  448. }
  449. void KItem::operator = (const KBASICPROP_MEDICINE& sData)
  450. {
  451. // 赋值: 共同属性部分
  452. KItemCommonAttrib* pCA = &m_CommonAttrib;
  453. pCA->nItemGenre  = sData.m_nItemGenre;
  454. pCA->nDetailType  = sData.m_nDetailType;
  455. pCA->nParticularType = sData.m_nParticularType;
  456. pCA->nObjIdx  = sData.m_nObjIdx;
  457. pCA->bStack  = sData.m_bStack;
  458. pCA->nWidth  = sData.m_nWidth;
  459. pCA->nHeight  = sData.m_nHeight;
  460. pCA->nPrice  = sData.m_nPrice;
  461. pCA->nLevel  = sData.m_nLevel;
  462. pCA->nSeries  = sData.m_nSeries;
  463. ::strcpy(pCA->szItemName,  sData.m_szName);
  464. #ifndef _SERVER
  465. ::strcpy(pCA->szImageName, sData.m_szImageName);
  466. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  467. #endif
  468. // 赋值: 基本属性部分
  469. ZeroMemory(m_aryBaseAttrib, sizeof(m_aryBaseAttrib));
  470. KItemNormalAttrib* pBA = m_aryBaseAttrib;
  471. pBA[0].nAttribType = sData.m_aryAttrib[0].nAttrib;
  472. pBA[0].nValue[0]   = sData.m_aryAttrib[0].nValue;
  473. pBA[0].nValue[1]   = sData.m_aryAttrib[0].nTime;
  474. pBA[1].nAttribType = sData.m_aryAttrib[1].nAttrib;
  475. pBA[1].nValue[0]   = sData.m_aryAttrib[1].nValue;
  476. pBA[1].nValue[1]   = sData.m_aryAttrib[1].nTime;
  477. ZeroMemory(m_aryRequireAttrib, sizeof(m_aryRequireAttrib));
  478. ZeroMemory(m_aryMagicAttrib, sizeof(m_aryMagicAttrib));
  479. #ifndef _SERVER
  480. m_Image.Color.Color_b.a = 255;
  481. m_Image.nFrame = 0;
  482. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  483. m_Image.nType = ISI_T_SPR;
  484. ::strcpy(m_Image.szImage, pCA->szImageName);
  485. m_Image.uImage = 0;
  486. #endif
  487. }
  488. void KItem::operator = (const KBASICPROP_EQUIPMENT_UNIQUE& sData)
  489. {
  490. // 赋值: 共同属性部分
  491. KItemCommonAttrib* pCA = &m_CommonAttrib;
  492. pCA->nItemGenre  = sData.m_nItemGenre;
  493. pCA->nDetailType  = sData.m_nDetailType;
  494. pCA->nParticularType = sData.m_nParticularType;
  495. pCA->nObjIdx  = sData.m_nObjIdx;
  496. pCA->nPrice  = sData.m_nPrice;
  497. pCA->nLevel  = sData.m_nLevel;
  498. pCA->nSeries  = sData.m_nSeries;
  499. ::strcpy(pCA->szItemName,  sData.m_szName);
  500. #ifndef _SERVER
  501. ::strcpy(pCA->szImageName, sData.m_szImageName);
  502. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  503. m_Image.Color.Color_b.a = 255;
  504. m_Image.nFrame = 0;
  505. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  506. m_Image.nType = ISI_T_SPR;
  507. ::strcpy(m_Image.szImage, pCA->szImageName);
  508. m_Image.uImage = 0;
  509. #endif
  510. }
  511. //flying add this overloaded operator to generate a gold item.
  512. void KItem::operator = (const KBASICPROP_EQUIPMENT_GOLD& sData)
  513. {
  514. KItemCommonAttrib* pCA = &m_CommonAttrib;
  515. pCA->nItemGenre  = sData.m_nItemGenre;
  516. pCA->nDetailType  = sData.m_nDetailType;
  517. pCA->nParticularType = sData.m_nParticularType;
  518. pCA->nObjIdx  = sData.m_nObjIdx;
  519. pCA->nPrice  = sData.m_nPrice;
  520. pCA->nLevel  = sData.m_nLevel;
  521. pCA->nSeries  = sData.m_nSeries;
  522. pCA->nWidth  = sData.m_nWidth;
  523. pCA->nHeight  = sData.m_nHeight;
  524. ::strcpy(pCA->szItemName,  sData.m_szName);
  525. #ifndef _SERVER
  526. ::strcpy(pCA->szImageName, sData.m_szImageName);
  527. ::strcpy(pCA->szIntro,    sData.m_szIntro);
  528. m_Image.Color.Color_b.a = 255;
  529. m_Image.nFrame = 0;
  530. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  531. m_Image.nType = ISI_T_SPR;
  532. ::strcpy(m_Image.szImage, pCA->szImageName);
  533. m_Image.uImage = 0;
  534. #endif
  535. }
  536. BOOL KItem::Gen_Equipment_Unique(const KBASICPROP_EQUIPMENT* pEqu,
  537.  const KBASICPROP_EQUIPMENT_UNIQUE* pUni)
  538. {
  539. _ASSERT(this != NULL);
  540. _ASSERT(pEqu != NULL);
  541. _ASSERT(pUni != NULL);
  542. if (NULL == pEqu || NULL == pUni)
  543. { _ASSERT(FALSE); return FALSE; }
  544. // 赋值: 共同属性部分
  545. *this = *pUni; // 运算符重载
  546. KItemCommonAttrib* pCA = &m_CommonAttrib;
  547. pCA->bStack  = pEqu->m_bStack;
  548. pCA->nWidth  = pEqu->m_nWidth;
  549. pCA->nHeight = pEqu->m_nHeight;
  550. SetAttrib_Base(pEqu->m_aryPropBasic); // 赋值: 基本属性部分
  551. SetAttrib_Req(pUni->m_aryPropReq); // 赋值: 需求属性部分
  552. SetAttrib_MA(pUni->m_aryMagicAttribs); // 赋值: 魔法属性部分
  553. return TRUE;
  554. }
  555. void KItem::Remove()
  556. {
  557. m_nIndex = 0;
  558. }
  559. BOOL KItem::SetBaseAttrib(IN const KItemNormalAttrib* pAttrib)
  560. {
  561. if (!pAttrib)
  562. return FALSE;
  563. for (int i = 0; i < sizeof(m_aryBaseAttrib) / sizeof(m_aryBaseAttrib[0]); i++)
  564. {
  565. m_aryBaseAttrib[i] = pAttrib[i];
  566. }
  567. return TRUE;
  568. }
  569. BOOL KItem::SetRequireAttrib(IN const KItemNormalAttrib* pAttrib)
  570. {
  571. if (!pAttrib)
  572. return FALSE;
  573. for (int i = 0; i < sizeof(m_aryRequireAttrib) / sizeof(m_aryRequireAttrib[0]); i++)
  574. {
  575. m_aryRequireAttrib[i] = pAttrib[i];
  576. }
  577. return TRUE;
  578. }
  579. BOOL KItem::SetMagicAttrib(IN const KItemNormalAttrib* pAttrib)
  580. {
  581. return SetAttrib_MA(pAttrib);
  582. }
  583. //------------------------------------------------------------------
  584. // 磨损,返回值表示剩余耐久度
  585. //------------------------------------------------------------------
  586. int KItem::Abrade(IN const int nRandRange)
  587. {
  588. if (m_nCurrentDur == -1 || nRandRange == 0) // 永不磨损
  589. return -1;
  590. if (g_Random(nRandRange) == 0) // nRandRange分之一的概率
  591. {
  592. m_nCurrentDur--;
  593. if (m_nCurrentDur == 0)
  594. {
  595. return 0;
  596. }
  597. }
  598. return m_nCurrentDur;
  599. }
  600. #ifndef _SERVER
  601. void KItem::Paint(int nX, int nY)
  602. {
  603. m_Image.oPosition.nX = nX;
  604. m_Image.oPosition.nY = nY;
  605. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  606. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, TRUE);
  607. }
  608. void KItem::GetDesc(char* pszMsg, bool bShowPrice, int nPriceScale, int nActiveAttrib)
  609. {
  610. char szColor[item_number][32] = 
  611. {
  612. "",
  613. "<color=White>",
  614. "",
  615. "",
  616. "<color=Yellow>",
  617. };
  618. if (m_CommonAttrib.nItemGenre == item_equip)
  619. {
  620. if (m_CommonAttrib.nLevel > 10) // 黄金装备
  621. {
  622. strcpy(szColor[item_equip], "<color=Yellow>");
  623. }
  624. else if (m_aryMagicAttrib[0].nAttribType) // 魔法装备
  625. {
  626. strcpy(szColor[item_equip], "<color=Blue>");
  627. }
  628. else
  629. {
  630. strcpy(szColor[item_equip], "<color=White>");
  631. }
  632. }
  633. strcpy(pszMsg, szColor[m_CommonAttrib.nItemGenre]);
  634. strcat(pszMsg, m_CommonAttrib.szItemName);
  635. strcat(pszMsg, "n");
  636. if (bShowPrice && nPriceScale > 0)
  637. {
  638. char szPrice[32];
  639. sprintf(szPrice, "价格:%d", m_CommonAttrib.nPrice / nPriceScale);
  640. strcat(pszMsg, szPrice);
  641. strcat(pszMsg, "n");
  642. }
  643. if (m_CommonAttrib.nItemGenre == item_equip)
  644. {
  645. switch(m_CommonAttrib.nSeries)
  646. {
  647. case series_metal:
  648. strcat(pszMsg, "<color=White>五行属性:<color=Metal>金");
  649. break;
  650. case series_wood:
  651. strcat(pszMsg, "<color=White>五行属性:<color=Wood>木");
  652. break;
  653. case series_water:
  654. strcat(pszMsg, "<color=White>五行属性:<color=Water>水");
  655. break;
  656. case series_fire:
  657. strcat(pszMsg, "<color=White>五行属性:<color=Fire>火");
  658. break;
  659. case series_earth:
  660. strcat(pszMsg, "<color=White>五行属性:<color=Earth>土");
  661. break;
  662. }
  663. }
  664. strcat(pszMsg, "n");
  665. strcat(pszMsg, "<color=White>");
  666. strcat(pszMsg, m_CommonAttrib.szIntro);
  667. strcat(pszMsg, "n");
  668. for (int i = 0; i < 7; i++)
  669. {
  670. if (!m_aryBaseAttrib[i].nAttribType)
  671. {
  672. continue;
  673. }
  674. if (m_aryBaseAttrib[i].nAttribType == magic_durability_v)
  675. {
  676. char szDurInfo[32];
  677. if (m_nCurrentDur == -1)
  678. sprintf(szDurInfo, "<color=Yellow>永不磨损<color=White>");
  679. else
  680. sprintf(szDurInfo, "耐久度 %3d / %3d", GetDurability(), GetMaxDurability());
  681. strcat(pszMsg, szDurInfo);
  682. }
  683. else
  684. {
  685. char* pszInfo = (char *)g_MagicDesc.GetDesc(&m_aryBaseAttrib[i]);
  686. if (!pszInfo || !pszInfo[0])
  687. continue;
  688. strcat(pszMsg, pszInfo);
  689. }
  690. strcat(pszMsg, "n");
  691. }
  692. for (i = 0; i < 6; i++)
  693. {
  694. if (!m_aryRequireAttrib[i].nAttribType)
  695. {
  696. continue;
  697. }
  698. char* pszInfo = (char *)g_MagicDesc.GetDesc(&m_aryRequireAttrib[i]);
  699. if (!pszInfo || !pszInfo[0])
  700. continue;
  701. if (Player[CLIENT_PLAYER_INDEX].m_ItemList.EnoughAttrib(&m_aryRequireAttrib[i]))
  702. {
  703. strcat(pszMsg, "<color=White>");
  704. }
  705. else
  706. {
  707. strcat(pszMsg, "<color=Red>");
  708. }
  709. strcat(pszMsg, pszInfo);
  710. strcat(pszMsg, "n");
  711. }
  712. for (i = 0; i < 6; i++)
  713. {
  714. if (!m_aryMagicAttrib[i].nAttribType)
  715. {
  716. continue;
  717. }
  718. char* pszInfo = (char *)g_MagicDesc.GetDesc(&m_aryMagicAttrib[i]);
  719. if (!pszInfo || !pszInfo[0])
  720. continue;
  721. if ((i & 1) == 0)
  722. {
  723. strcat(pszMsg, "<color=HBlue>");
  724. }
  725. else
  726. {
  727. if ((i>>1) < nActiveAttrib)
  728. {
  729. strcat(pszMsg, "<color=HBlue>");
  730. }
  731. else
  732. {
  733. strcat(pszMsg, "<color=DBlue>");
  734. }
  735. }
  736. strcat(pszMsg, pszInfo);
  737. strcat(pszMsg, "n");
  738. }
  739. }
  740. #endif
  741. int KItem::GetMaxDurability()
  742. {
  743. for (int i = 0; i < 7; i++)
  744. {
  745. if (m_aryBaseAttrib[i].nAttribType == magic_durability_v)
  746. {
  747. return m_aryBaseAttrib[i].nValue[0];
  748. }
  749. }
  750. return -1;
  751. }
  752. int KItem::GetTotalMagicLevel()
  753. {
  754. int nRet = 0;
  755. for (int i = 0; i < 6; i++)
  756. {
  757. nRet += m_GeneratorParam.nGeneratorLevel[i];
  758. }
  759. return nRet;
  760. }
  761. int KItem::GetRepairPrice()
  762. {
  763. if (ItemSet.m_sRepairParam.nMagicScale == 0)
  764. return 0;
  765. if (GetGenre() != item_equip)
  766. return 0;
  767. if (m_nCurrentDur == -1)
  768. return 0;
  769. int nMaxDur = GetMaxDurability();
  770. int nSumMagic = GetTotalMagicLevel();
  771. if (nMaxDur <= 0)
  772. return 0;
  773. return m_CommonAttrib.nPrice * ItemSet.m_sRepairParam.nPriceScale / 100 * (nMaxDur - m_nCurrentDur) / nMaxDur * (ItemSet.m_sRepairParam.nMagicScale + nSumMagic) / ItemSet.m_sRepairParam.nMagicScale;
  774. }
  775. BOOL KItem::CanBeRepaired()
  776. {
  777. if (GetGenre() != item_equip)
  778. return FALSE;
  779. if (m_nCurrentDur == -1)
  780. return FALSE;
  781. int nMaxDur = GetMaxDurability();
  782. if (m_nCurrentDur == nMaxDur)
  783. return FALSE;
  784. return TRUE;
  785. }