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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Core (c) 2002 by Kingsoft
  3. //
  4. // File: KBasPropTbl.CPP
  5. // Date: 2002.08.14
  6. // Code: DongBo
  7. // Desc:    cpp file. 本文件实现的类用于从tab file中读出道具的初始属性,
  8. // 并生成对应的属性表
  9. //---------------------------------------------------------------------------
  10. #include "KCore.h"
  11. #include "KTabFile.h"
  12. #include "MyAssert.H"
  13. #include "KBasPropTbl.h"
  14. #define TABFILE_PATH "\settings\item"
  15. #define TABFILE_MINE "minebase.txt"
  16. #define TABFILE_TASK "questkey.txt"
  17. #define TABFILE_MEDICINE "potion.txt"
  18. #define TABFILE_MEDMATERIAL "medmaterialbase.txt"
  19. #define TABFILE_MELEEWEAPON "meleeweapon.txt"
  20. #define TABFILE_RANGEWEAPON "rangeweapon.txt"
  21. #define TABFILE_ARMOR "armor.txt"
  22. #define TABFILE_HELM "helm.txt"
  23. #define TABFILE_BOOT "boot.txt"
  24. #define TABFILE_BELT "belt.txt"
  25. #define TABFILE_AMULET "amulet.txt"
  26. #define TABFILE_RING "ring.txt"
  27. #define TABFILE_CUFF "cuff.txt"
  28. #define TABFILE_PENDANT "pendant.txt"
  29. #define TABFILE_HORSE "horse.txt"
  30. #define TABFILE_TOWNPORTAL "TownPortal.txt"
  31. #define TABFILE_EQUIPMENT_UNIQUE "unique.txt"
  32. #define TABFILE_MAGICATTRIB "magicattrib.txt"
  33. #define TABFILE_GOLDITEM "GoldItem.txt"
  34. // 以下定义的结构用于辅助从tabfile中读出属性的初始值
  35. typedef struct tagPROPINFO
  36. {
  37. int m_nType; // 属性的类型. 详见 PI_VARTYPE_...系列定义
  38. union
  39. {
  40. char* m_pszBuf; // 指向字符串缓冲区的指针
  41. int* m_pnData; // 指向int变量的指针
  42. }m_pData;
  43. int m_nBufSize; // 缓冲区的长度
  44. } PROPINFO;
  45. #define PI_VARTYPE_CHAR 0
  46. #define PI_VARTYPE_INT 1
  47. char* TABFILE_EQUIPMENT[] = 
  48. {
  49. TABFILE_MELEEWEAPON, //"MeleeWeapon.txt",
  50. TABFILE_RANGEWEAPON, //"RangeWeapon.txt",
  51. TABFILE_ARMOR, //"Armor.txt",
  52. TABFILE_HELM, //"Helm.txt",
  53. TABFILE_BOOT, //"Boot.txt",
  54. TABFILE_BELT, //"Belt.txt",
  55. TABFILE_AMULET, //"Amulet.txt",
  56. TABFILE_RING, //"Ring.txt",
  57. TABFILE_CUFF, //"Cuff.txt",
  58. TABFILE_PENDANT, //"Pendant.txt",
  59. TABFILE_HORSE, //"Horse.txt",
  60. };
  61. //int GetRandomNumber(int nMin, int nMax);
  62. //=============================================================================
  63. /******************************************************************************
  64. 功能: 从tab file中读入特定的数据记录
  65. 入口: pTF: 工具类指针, 用此工具类读取tab file
  66. nRow: 读第nRow项记录
  67. pPI[i].m_nType: 给出欲读的记录中第i个域的类型, 可能是整型或字符串
  68. pPI[i].m_pData: 将数据读到此缓冲区中
  69. cbFields: 每项记录包含这么多的域
  70. 出口: 成功时返回非零, m_pBuf 指向分配的内存
  71. 失败时返回零
  72. ******************************************************************************/
  73. BOOL LoadRecord(IN KTabFile* pTF, IN int nRow,
  74. IN OUT const PROPINFO* pPI, IN int cbFields)
  75. {
  76. BOOL bEC = TRUE;
  77. nRow += 2; // 加1: 跳过tabfile的第一行. 该行给出的是各列的名称
  78. // 再加1: KTabFile::GetInteger()函数要求nRow从1开始算起
  79. // 逐个读入各项属性
  80. for (int n = 0; n < cbFields; n++)
  81. {
  82. if (PI_VARTYPE_INT == (pPI+n)->m_nType)
  83. { // 读入 int 型数据
  84. if (FALSE == pTF->GetInteger(nRow, n+1, -1, (pPI+n)->m_pData.m_pnData))
  85. { _ASSERT(FALSE); bEC = FALSE; break; }
  86. }
  87. else
  88. { // 读入字符串型数据
  89. _ASSERT(PI_VARTYPE_CHAR == (pPI+n)->m_nType);
  90. if (FALSE == pTF->GetString(nRow, n+1, "", (pPI+n)->m_pData.m_pszBuf,
  91. (pPI+n)->m_nBufSize))
  92. { _ASSERT(FALSE); bEC = FALSE; break; }
  93. }
  94. }
  95. return bEC;
  96. }
  97. //=============================================================================
  98. KLibOfBPT::KLibOfBPT()
  99. {
  100. }
  101. KLibOfBPT::~KLibOfBPT()
  102. {
  103. }
  104. /******************************************************************************
  105. 功能: 总控,从tab file中读入道具,魔法等原始数据
  106. 出口: 相关数据存在m_BPTWeapon,m_BPTWeaponDirty等成员变量中
  107. ******************************************************************************/
  108. BOOL KLibOfBPT::Init()
  109. {
  110. // 初始化
  111. KBasicPropertyTable* paryBPT[] = {
  112. &m_BPTMeleeWeapon,
  113. &m_BPTRangeWeapon,
  114. &m_BPTArmor,
  115. &m_BPTHelm,
  116. &m_BPTBoot,
  117. &m_BPTBelt,
  118. &m_BPTAmulet,
  119. &m_BPTRing,
  120. &m_BPTCuff,
  121. &m_BPTPendant,
  122. &m_BPTHorse,
  123. &m_BPTMedicine,
  124. &m_BPTQuest,
  125. &m_BPTTownPortal,
  126. &m_BPTMagicAttrib,
  127. };
  128. // 将tab file逐个读入
  129. const int cbNumOfTables = sizeof(paryBPT)/sizeof(paryBPT[0]);
  130. for (int i = 0; i < cbNumOfTables; i++)
  131. {
  132. if (i < 11) // 装备特殊处理
  133. {
  134. KBPT_Equipment* pTemp = (KBPT_Equipment *)paryBPT[i];
  135. pTemp->Init(i);
  136. }
  137. if (FALSE == paryBPT[i]->Load())
  138. { _ASSERT(FALSE); return FALSE; }
  139. }
  140. // 构造魔法属性表
  141. InitMALib();
  142.     
  143.     // 构造魔法属性索引表
  144.     // add by Freeway Chen in 2003.5.30
  145.     InitMAIT();
  146. return TRUE;
  147. }
  148. /******************************************************************************
  149. 功能: 建立一个四维的数组,利用(前后缀、物品类型、五行、级别)
  150.             确定一个魔法属性的索引值列表
  151. 入口: m_BPTMagicAttrib: 内含从tab file读入的全部魔法属性
  152. 出口: 四维数组 m_CMAIT 分别填充相应的索引值列表
  153. ******************************************************************************/
  154. // Add by Freeway Chen in 2003.5.30
  155. BOOL KLibOfBPT::InitMAIT()
  156. {
  157.     int nResult = false;
  158.     int i = 0;
  159.     int nPrefixPostfix = 0;
  160.     int nType = 0;
  161.     int nSeries = 0;
  162.     int nSeriesMin = 0;
  163.     int nSeriesMax = 0;
  164.     int nLevel  = 0;
  165.     int nLevelMin = 0;
  166.     int nLevelMax = 0;
  167.     int nTotalCount = 0;
  168.     for (i = 0; i < m_BPTMagicAttrib.NumOfEntries(); i++)
  169.     {
  170.         KMAGICATTRIB_TABFILE *pItem = (KMAGICATTRIB_TABFILE *)m_BPTMagicAttrib.GetRecord(i);
  171.         if (!pItem)
  172.         {
  173.             _ASSERT(pItem);
  174.             continue;
  175.         }
  176.         pItem->m_nUseFlag = false;
  177.         nPrefixPostfix = pItem->m_nPos;
  178.         _ASSERT((nPrefixPostfix >= 0) && (nPrefixPostfix < MATF_PREFIXPOSFIX));
  179.         for (nType = 0; nType < MATF_CBDR; nType++)
  180.         {
  181.             if ((pItem->m_DropRate[nType]) == 0)
  182.                 continue; // 如果没有概率出现这个类型就跳到下一个
  183.             
  184.             nSeriesMin = nSeriesMax = pItem->m_nClass;
  185.             if ((pItem->m_nClass) == -1)
  186.             {
  187.                 nSeriesMin = 0;
  188.                 nSeriesMax = MATF_SERIES - 1;
  189.             }
  190.             else
  191.             {
  192.                 _ASSERT(((pItem->m_nClass) >= 0) && ((pItem->m_nClass) < MATF_SERIES));
  193.             }
  194.             for (nSeries = nSeriesMin; nSeries <= nSeriesMax; nSeries++)
  195.             {
  196.                 nLevelMin = pItem->m_nLevel;
  197.                 nLevelMax = MATF_LEVEL;
  198.                 for (nLevel = nLevelMin; nLevel <= nLevelMax; nLevel++)
  199.                 {  
  200.                     m_CMAIT[nPrefixPostfix][nType][nSeries][nLevel - 1].Insert(i);
  201.                     nTotalCount++;
  202.                 }
  203.             }
  204.         }
  205.     }
  206.     //#ifdef _DEBUG
  207.     #if 0
  208.     //g_DebugLog("[魔法属性]%s五防抗性上限增加%d", pNpc->Name, pMagic->nValue[0]);
  209.     printf("[魔法属性]m_CMAIT[前缀后缀][类型][五行][级别]n");
  210.     for (nPrefixPostfix = 0; nPrefixPostfix < MATF_PREFIXPOSFIX; nPrefixPostfix++)
  211.     {
  212.         for (nType = 0; nType < MATF_CBDR; nType++)
  213.         {
  214.             for (nSeries = 0; nSeries < MATF_SERIES; nSeries++)
  215.             {
  216.                 for (nLevel = 1; nLevel < (MATF_LEVEL + 1); nLevel++)
  217.                 {
  218.                     KBPT_ClassMAIT *pMAITItem = &m_CMAIT[nPrefixPostfix][nType][nSeries][nLevel - 1];
  219.                     char szOutputString[8192];
  220.                     char szStringContent[4096];
  221.                     szStringContent[0] = '';
  222.                     for (i = 0; i < pMAITItem->GetCount(); i++)
  223.                     {
  224.                         KMAGICATTRIB_TABFILE *pItem = (KMAGICATTRIB_TABFILE *)m_BPTMagicAttrib.GetRecord(pMAITItem->Get(i));
  225.                         char szTemp[1024];
  226.                         sprintf(szTemp, " %3d(%-8s) ", pMAITItem->Get(i) + 2, pItem->m_szName);
  227.                         strcat(szStringContent, szTemp);
  228.                     }
  229.                     sprintf(szOutputString, 
  230.                         "[魔法属性]m_CMAIT[%d][%d][%d][%d]: Count = %3d, %s  n",
  231.                         nPrefixPostfix,
  232.                         nType,
  233.                         nSeries,
  234.                         nLevel - 1,
  235.                         pMAITItem->GetCount(),
  236.                         szStringContent
  237.                     );
  238.                     printf("%s", szOutputString);
  239.                     //g_DebugLog("%s", szOutputString);
  240.                     //OutputDebugString(szOutputString);
  241.                 }
  242.             }
  243.         }
  244.     }
  245.     ExitProcess(0); // for redirect to File save
  246.     #endif // _DEBUG
  247.     nResult = true;
  248. //Exit0:
  249.     return nResult;
  250. }
  251. /******************************************************************************
  252. 功能: 根据原始的魔法属性表,统计出每种装备各有哪些可能的魔法属性
  253. 入口: m_BPTMagicAttrib: 内含从tab file读入的全部魔法属性
  254. 出口: 原始的魔法属性表被分类, 分类后的数据存入m_CMAT数组中
  255. m_CMAT[i]中给出了适用于第i种装备的全部魔法属性
  256. ******************************************************************************/
  257. BOOL KLibOfBPT::InitMALib()
  258. {
  259. BOOL bEC = FALSE;
  260. // 确定每种装备各有多少种可能的魔法属性
  261.     int naryMACount[2][MATF_CBDR]; // 第i种装备共有naryMACount[0][i]种可能的前缀
  262. //   和naryMACount[1][i]种可能的后缀
  263. m_BPTMagicAttrib.GetMACount((int*)naryMACount);
  264. // 根据取回的数值,为各装备的魔法属性索引表分配内容
  265. for (int i = 0; i < MATF_CBDR - 1; i++) // -1 because of horse
  266. {
  267. _ASSERT(naryMACount[0][i] > 0); // 不可能没有一个魔法前缀适用于该装备
  268. _ASSERT(naryMACount[1][i] > 0); // 不可能没有一个魔法后缀适用于该装备
  269. if (FALSE == m_CMAT[0][i].GetMemory(naryMACount[0][i]))
  270. return bEC;
  271. if (FALSE == m_CMAT[1][i].GetMemory(naryMACount[1][i]))
  272. return bEC;
  273. }
  274. // 遍历魔法属性表,建立起各装备的魔法属性索引表
  275. const int nNumOfMA = m_BPTMagicAttrib.NumOfEntries(); // 魔法属性的总数
  276. _ASSERT(nNumOfMA > 0);
  277. int m, n; // 第m项魔法属性适用于第n种装备
  278. for (m = 0; m < nNumOfMA; m++) // 遍历所有魔法属性
  279. {
  280. const KMAGICATTRIB_TABFILE* pRec;
  281. pRec = m_BPTMagicAttrib.GetRecord(m);
  282. for (n = 0; n < MATF_CBDR; n++) // 共有MATF_CBDR种装备带魔法
  283. { // 确认魔法属性适用于哪些装备
  284. if (0 != pRec->m_DropRate[n])
  285. { // 运行至此, 说明第m项魔法属性适用于第n种装备
  286. int nPos;
  287. nPos = (0 == pRec->m_nPos) ? 1 : 0;
  288. m_CMAT[nPos][n].Set(m);
  289. }
  290. }
  291. }
  292. bEC = TRUE;
  293. return bEC;
  294. }
  295. // flying add here
  296. const KBASICPROP_EQUIPMENT_GOLD* KLibOfBPT::GetGoldItemRecord(IN int nIndex) const
  297. {
  298. return (KBASICPROP_EQUIPMENT_GOLD*)m_GoldItem.GetRecord(nIndex);
  299. }
  300. const int KLibOfBPT::GetGoldItemNumber() const
  301. {
  302. return m_GoldItem.GetRecordCount();
  303. }
  304. /******************************************************************************
  305. 功能: 获取指定的CMAT
  306. ******************************************************************************/
  307. const KBPT_ClassifiedMAT* KLibOfBPT::GetCMAT(int nPos, int i) const
  308. {
  309. _ASSERT(this != NULL);
  310. if (nPos != 0 && nPos != 1)
  311. { _ASSERT(FALSE); return NULL; }
  312. if (i < 0 || i >= MATF_CBDR)
  313. { _ASSERT(FALSE); return NULL; }
  314. return &(m_CMAT[nPos][i]);
  315. }
  316. /******************************************************************************
  317. 功能: 获取指定的CMAIT
  318. ******************************************************************************/
  319. // Add by Freeway Chen in 2003.5.30
  320. const KBPT_ClassMAIT*       KLibOfBPT::GetCMIT(IN int nPrefixPostfix, IN int nType, IN int nSeries, int nLevel) const
  321. {
  322.     _ASSERT((nPrefixPostfix >= 0) && (nPrefixPostfix < MATF_PREFIXPOSFIX));
  323.     if (!((nPrefixPostfix >= 0) && (nPrefixPostfix < MATF_PREFIXPOSFIX)))
  324.         return NULL;
  325.     _ASSERT((nType >= 0) && (nType < MATF_CBDR));
  326.     if (!((nType >= 0) && (nType < MATF_CBDR)))
  327.         return NULL;
  328.     _ASSERT((nSeries >= 0) && (nSeries < MATF_SERIES));
  329.     if (!((nSeries >= 0) && (nSeries < MATF_SERIES)))
  330.         return NULL;
  331.     _ASSERT(((nLevel - 1) >= 0) && ((nLevel - 1) < MATF_LEVEL));    // nLevel is from 1..MATF_LEVEL
  332.     if (!(((nLevel - 1) >= 0) && ((nLevel - 1) < MATF_LEVEL)))
  333.         return NULL;
  334.     return &m_CMAIT[nPrefixPostfix][nType][nSeries][nLevel - 1];
  335. }
  336. const KMAGICATTRIB_TABFILE* KLibOfBPT::GetMARecord(IN int i) const
  337. {
  338. return m_BPTMagicAttrib.GetRecord(i);
  339. }
  340. const int KLibOfBPT::GetMARecordNumber() const
  341. {
  342. return m_BPTMagicAttrib.NumOfEntries();
  343. }
  344. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetMeleeWeaponRecord(IN int i) const
  345. {
  346. return m_BPTMeleeWeapon.GetRecord(i);
  347. }
  348. const int KLibOfBPT::GetMeleeWeaponRecordNumber() const
  349. {
  350. return m_BPTMeleeWeapon.NumOfEntries();
  351. }
  352. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetRangeWeaponRecord(IN int i) const
  353. {
  354. return m_BPTRangeWeapon.GetRecord(i);
  355. }
  356. const int KLibOfBPT::GetRangeWeaponRecordNumber() const
  357. {
  358. return m_BPTRangeWeapon.NumOfEntries();
  359. }
  360. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetArmorRecord(IN int i) const
  361. {
  362. return m_BPTArmor.GetRecord(i);
  363. }
  364. const int KLibOfBPT::GetArmorRecordNumber() const
  365. {
  366. return m_BPTArmor.NumOfEntries();
  367. }
  368. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetHelmRecord(IN int i) const
  369. {
  370. return m_BPTHelm.GetRecord(i);
  371. }
  372. const int KLibOfBPT::GetHelmRecordNumber() const
  373. {
  374. return m_BPTHelm.NumOfEntries();
  375. }
  376. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetBootRecord(IN int i) const
  377. {
  378. return m_BPTBoot.GetRecord(i);
  379. }
  380. const int KLibOfBPT::GetBootRecordNumber() const
  381. {
  382. return m_BPTBoot.NumOfEntries();
  383. }
  384. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetBeltRecord(IN int i) const
  385. {
  386. return m_BPTBelt.GetRecord(i);
  387. }
  388. const int KLibOfBPT::GetBeltRecordNumber() const
  389. {
  390. return m_BPTBelt.NumOfEntries();
  391. }
  392. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetAmuletRecord(IN int i) const
  393. {
  394. return m_BPTAmulet.GetRecord(i);
  395. }
  396. const int KLibOfBPT::GetAmuletRecordNumber() const
  397. {
  398. return m_BPTAmulet.NumOfEntries();
  399. }
  400. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetRingRecord(IN int i) const
  401. {
  402. return m_BPTRing.GetRecord(i);
  403. }
  404. const int KLibOfBPT::GetRingRecordNumber() const
  405. {
  406. return m_BPTRing.NumOfEntries();
  407. }
  408. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetCuffRecord(IN int i) const
  409. {
  410. return m_BPTCuff.GetRecord(i);
  411. }
  412. const int KLibOfBPT::GetCuffRecordNumber() const
  413. {
  414. return m_BPTCuff.NumOfEntries();
  415. }
  416. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetPendantRecord(IN int i) const
  417. {
  418. return m_BPTPendant.GetRecord(i);
  419. }
  420. const int KLibOfBPT::GetPendantRecordNumber() const
  421. {
  422. return m_BPTPendant.NumOfEntries();
  423. }
  424. const KBASICPROP_EQUIPMENT* KLibOfBPT::GetHorseRecord(IN int i) const
  425. {
  426. return m_BPTHorse.GetRecord(i);
  427. }
  428. const int KLibOfBPT::GetHorseRecordNumber() const
  429. {
  430. return m_BPTHorse.NumOfEntries();
  431. }
  432. const KBASICPROP_MEDICINE* KLibOfBPT::GetMedicineRecord(IN int i) const
  433. {
  434. return m_BPTMedicine.GetRecord(i);
  435. }
  436. const int KLibOfBPT::GetMedicineRecordNumber() const
  437. {
  438. return m_BPTMedicine.NumOfEntries();
  439. }
  440. const KBASICPROP_QUEST* KLibOfBPT::GetQuestRecord(IN int i) const
  441. {
  442. return m_BPTQuest.GetRecord(i);
  443. }
  444. const int KLibOfBPT::GetQuestRecordNumber() const
  445. {
  446. return m_BPTQuest.NumOfEntries();
  447. }
  448. const KBASICPROP_TOWNPORTAL* KLibOfBPT::GetTownPortalRecord(IN int i) const
  449. {
  450. return m_BPTTownPortal.GetRecord(i);
  451. }
  452. const int KLibOfBPT::GetTownPortalRecordNumber() const
  453. {
  454. return m_BPTTownPortal.NumOfEntries();
  455. }
  456. /*
  457. const KBASICPROP_EQUIPMENT* KLibOfBPT::FindEquipment(IN int a, IN int b, IN int c) const
  458. {
  459. return m_BPTEquipment.FindRecord(a, b, c);
  460. }
  461. */
  462. const KBASICPROP_EQUIPMENT_UNIQUE* KLibOfBPT::FindEquipmentUnique(IN int a, IN int b, IN int c) const
  463. {
  464. return 0;// TODO:m_BPTEquipment_Unique.FindRecord(a, b, c);
  465. }
  466. /******************************************************************************
  467. 功能: 获取指定的药材的属性记录
  468. 入口: i: 指定药材
  469. 出口: 成功时返回指向该记录的指针
  470. 失败时返回NULL
  471. ******************************************************************************/
  472. const KBASICPROP_MEDMATERIAL* KLibOfBPT::GetMedMaterial(int i) const
  473. {
  474. return 0;// TODO:m_BPTMedMaterial.GetRecord(i);
  475. }
  476. /******************************************************************************
  477. 功能: 获取指定的药品的属性记录
  478. 入口: nType: 药品的类型
  479. nLevel: 药品的级别
  480. 出口: 成功时返回指向该记录的指针
  481. 失败时返回NULL
  482. ******************************************************************************/
  483. const KBASICPROP_MEDICINE* KLibOfBPT::FindMedicine(IN int nType, IN int nLevel) const
  484. {
  485. return 0;//TODO: m_BPTMedicine.FindRecord(nType, nLevel);
  486. }
  487. /******************************************************************************
  488. 功能: 获取指定的矿石的属性记录
  489. 入口: i: 指定矿石
  490. 出口: 成功时返回指向该记录的指针
  491. 失败时返回NULL
  492. ******************************************************************************/
  493. const KBASICPROP_MINE* KLibOfBPT::GetMine(IN int i) const
  494. {
  495. return 0;// TODO:m_BPTMine.GetRecord(i);
  496. }
  497. //=============================================================================
  498. KBasicPropertyTable::KBasicPropertyTable()
  499. {
  500. m_pBuf = NULL;
  501. m_nNumOfEntries = 0;
  502. m_nSizeOfEntry = 0;
  503. m_szTabFile[0] = 0;
  504. }
  505. KBasicPropertyTable::~KBasicPropertyTable()
  506. {
  507. ReleaseMemory();
  508. }
  509. /******************************************************************************
  510. 功能: 记录tab file中共有多少项数据记录
  511. ******************************************************************************/
  512. void KBasicPropertyTable::SetCount(int cbCount)
  513. {
  514. _ASSERT(cbCount>0);
  515. _ASSERT(0==m_nNumOfEntries); // this function is supposed to be called only once
  516. m_nNumOfEntries = cbCount;
  517. }
  518. /******************************************************************************
  519. 功能: 分配内存,用于保存从tab file中读入的数据
  520. 入口: m_nNumOfEntries: 共有这么多项数据记录
  521. m_nSizeOfEntry: 每项数据记录的大小(字节)
  522. 出口: 成功时返回非零, m_pBuf 指向分配的内存
  523. 失败时返回零
  524. ******************************************************************************/
  525. BOOL KBasicPropertyTable::GetMemory()
  526. {
  527. _ASSERT(NULL == m_pBuf);
  528. _ASSERT(m_nNumOfEntries > 0 && m_nSizeOfEntry > 0);
  529. BOOL bEC = FALSE;
  530. const int nMemSize = m_nSizeOfEntry * m_nNumOfEntries;
  531. void* pBuf = new BYTE[nMemSize];
  532. _ASSERT(pBuf != NULL);
  533. if (pBuf != NULL)
  534. {
  535. m_pBuf = pBuf;
  536. bEC = TRUE;
  537. }
  538. return bEC;
  539. }
  540. /******************************************************************************
  541. 功能: 释放内存
  542. ******************************************************************************/
  543. void KBasicPropertyTable::ReleaseMemory()
  544. {
  545. if (m_pBuf)
  546. {
  547. delete []m_pBuf;
  548. m_pBuf = NULL;
  549. m_nNumOfEntries = 0;
  550. }
  551. }
  552. /******************************************************************************
  553. 功能: 读入tab file中的全部数据
  554. 入口: m_szTabFile: 文件名
  555. 出口: 成功时返回非零, 全部数据读入m_pBuf所指缓冲区中.
  556. m_nNumOfEntries 给出共读入多少项数据
  557. 失败时返回零
  558. ******************************************************************************/
  559. BOOL KBasicPropertyTable::Load()
  560. {
  561. BOOL bEC = FALSE;
  562. KTabFile theLoader;
  563. // 加载tab file
  564. g_SetRootPath(NULL);
  565. ::g_SetFilePath(TABFILE_PATH);
  566. if (FALSE == theLoader.Load(m_szTabFile))
  567. { _ASSERT(FALSE); return bEC; }
  568. // 确定file内给出了多少项记录
  569. const int cbItems = theLoader.GetHeight() - 1; // 第一行给出各列名称,
  570. if (cbItems <= 0) // 实际数据从第2行开始给出.
  571. { _ASSERT(FALSE); return bEC; }
  572. SetCount(cbItems);
  573. // 分配内存,构建属性表
  574. if (FALSE == GetMemory())
  575. { _ASSERT(FALSE); return bEC; }
  576. // 将属性记录逐条读入
  577. int i;
  578. for (i = 0; i < cbItems; i++)
  579. {
  580. if (FALSE == LoadRecord(i, &theLoader))
  581. { _ASSERT(FALSE); return bEC; }
  582. }
  583. bEC = TRUE;
  584. return bEC;
  585. }
  586. //============================================================================
  587. KBPT_Mine::KBPT_Mine()
  588. {
  589. m_nSizeOfEntry = sizeof(KBASICPROP_MINE);
  590. ::strcpy(m_szTabFile, TABFILE_MINE);
  591. }
  592. KBPT_Mine::~KBPT_Mine()
  593. {
  594. }
  595. BOOL KBPT_Mine::LoadRecord(int i, KTabFile* pTF)
  596. {
  597. _ASSERT(pTF != NULL);
  598. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  599. // 初始化
  600. KBASICPROP_MINE* pBuf = (KBASICPROP_MINE*)m_pBuf;
  601. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  602. const PROPINFO aryPI[] =
  603. {
  604. /*ver1****************************************************************
  605. { PI_VARTYPE_CHAR, pBuf->m_szSerialNum, sizeof(pBuf->m_szSerialNum)},
  606. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nStyle), 0},
  607. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  608. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nClass), 0},
  609. { PI_VARTYPE_CHAR, pBuf->m_szImage1, sizeof(pBuf->m_szImage1)},
  610. { PI_VARTYPE_CHAR, pBuf->m_szImage2, sizeof(pBuf->m_szImage2)},
  611. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bRepeatable), 0},
  612. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort), 0},
  613. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  614. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  615. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nValue), 0},
  616. *********************************************************************/
  617. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  618. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  619. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  620. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  621. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  622. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  623. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  624. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  625. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  626. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  627. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  628. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  629. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  630. };
  631. // 逐个读入各项属性
  632. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  633. }
  634. /******************************************************************************
  635. 功能: 获取指定的矿石的属性
  636. 入口: i: 要求获取第i项矿石的属性. 若为-1表示随机取一个
  637. 出口: 成功时返回指向该矿石属性的指针(一个KBASICPROP_MINE结构)
  638. 失败时返回NULL
  639. ******************************************************************************/
  640. const KBASICPROP_MINE* KBPT_Mine::GetRecord(int i) const
  641. {
  642. _ASSERT(this != NULL);
  643. if (-1 == i)
  644. i = ::GetRandomNumber(0, m_nNumOfEntries-1);
  645. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  646. return (i >= 0 && i < m_nNumOfEntries) ?
  647. (((KBASICPROP_MINE*)m_pBuf) + i) : NULL;
  648. }
  649. //============================================================================
  650. KBPT_TownPortal::KBPT_TownPortal()
  651. {
  652. m_nSizeOfEntry = sizeof(KBASICPROP_TOWNPORTAL);
  653. ::strcpy(m_szTabFile, TABFILE_TOWNPORTAL);
  654. }
  655. KBPT_TownPortal::~KBPT_TownPortal()
  656. {
  657. }
  658. BOOL KBPT_TownPortal::LoadRecord(int i, KTabFile* pTF)
  659. {
  660. _ASSERT(pTF != NULL);
  661. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  662. KBASICPROP_TOWNPORTAL* pBuf = (KBASICPROP_TOWNPORTAL*)m_pBuf;
  663. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  664. const PROPINFO aryPI[] =
  665. {
  666. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  667. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  668. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  669. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  670. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  671. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  672. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  673. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  674. };
  675. // 逐个读入各项属性
  676. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  677. }
  678. const KBASICPROP_TOWNPORTAL* KBPT_TownPortal::GetRecord(IN int i) const
  679. {
  680. _ASSERT(this != NULL);
  681. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  682. return (i >= 0 && i < m_nNumOfEntries) ?
  683. (((KBASICPROP_TOWNPORTAL*)m_pBuf) + i) : NULL;
  684. }
  685. //============================================================================
  686. KBPT_Quest::KBPT_Quest()
  687. {
  688. m_nSizeOfEntry = sizeof(KBASICPROP_QUEST);
  689. ::strcpy(m_szTabFile, TABFILE_TASK);
  690. }
  691. KBPT_Quest::~KBPT_Quest()
  692. {
  693. }
  694. BOOL KBPT_Quest::LoadRecord(int i, KTabFile* pTF)
  695. {
  696. _ASSERT(pTF != NULL);
  697. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  698. KBASICPROP_QUEST* pBuf = (KBASICPROP_QUEST*)m_pBuf;
  699. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  700. const PROPINFO aryPI[] =
  701. {
  702. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  703. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  704. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  705. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  706. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  707. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  708. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  709. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  710. };
  711. // 逐个读入各项属性
  712. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  713. }
  714. const KBASICPROP_QUEST* KBPT_Quest::GetRecord(IN int i) const
  715. {
  716. _ASSERT(this != NULL);
  717. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  718. return (i >= 0 && i < m_nNumOfEntries) ?
  719. (((KBASICPROP_QUEST*)m_pBuf) + i) : NULL;
  720. }
  721. const KBASICPROP_QUEST* KBPT_Quest::FindRecord(IN int nDetailType) const
  722. {
  723. const KBASICPROP_QUEST* pData = NULL;
  724. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType排序的,
  725. // 则可进行算法优化
  726. for (int i = 0; i < m_nNumOfEntries; i++)
  727. {
  728. const KBASICPROP_QUEST* pQst;
  729. pQst = GetRecord(i);
  730. _ASSERT(NULL != pQst);
  731. if (nDetailType == pQst->m_nDetailType)
  732. {
  733. // 根据策划的设计, 属性1类型 == 具体类别. 进行验证
  734. // _ASSERT(nType == pMed->m_nAttrib1_Type);
  735. pData = pQst;
  736. break;
  737. }
  738. }
  739. return pData;
  740. }
  741. //============================================================================
  742. KBPT_Medicine::KBPT_Medicine()
  743. {
  744. m_nSizeOfEntry = sizeof(KBASICPROP_MEDICINE);
  745. ::strcpy(m_szTabFile, TABFILE_MEDICINE);
  746. }
  747. KBPT_Medicine::~KBPT_Medicine()
  748. {
  749. }
  750. BOOL KBPT_Medicine::LoadRecord(int i, KTabFile* pTF)
  751. {
  752. _ASSERT(pTF != NULL);
  753. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  754. // 初始化
  755. KBASICPROP_MEDICINE* pBuf = (KBASICPROP_MEDICINE*)m_pBuf;
  756. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  757. const PROPINFO aryPI[] =
  758. {
  759. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  760. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  761. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  762. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  763. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  764. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  765. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  766. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  767. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  768. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  769. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  770. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  771. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  772. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nAttrib), 0},
  773. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nValue), 0},
  774. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nTime), 0},
  775. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nAttrib), 0},
  776. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nValue), 0},
  777. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nTime), 0},
  778. };
  779. // 逐个读入各项属性
  780. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  781. }
  782. /******************************************************************************
  783. 功能: 获取指定的药品的属性
  784. 入口: i: 要求获取第i项药品的属性
  785. 出口: 成功时返回指向该药材属性的指针(一个KBASICPROP_MEDICINE结构)
  786. 失败时返回NULL
  787. ******************************************************************************/
  788. const KBASICPROP_MEDICINE* KBPT_Medicine::GetRecord(int i) const
  789. {
  790. _ASSERT(this != NULL);
  791. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  792. return (i >= 0 && i < m_nNumOfEntries) ?
  793. (((KBASICPROP_MEDICINE*)m_pBuf) + i) : NULL;
  794. }
  795. const KBASICPROP_MEDICINE* KBPT_Medicine::FindRecord(IN int nType,
  796.  IN int nLevel) const
  797. {
  798. const KBASICPROP_MEDICINE* pData = NULL;
  799. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  800. // 则可进行算法优化
  801. for (int i = 0; i < m_nNumOfEntries; i++)
  802. {
  803. const KBASICPROP_MEDICINE* pMed;
  804. pMed = GetRecord(i);
  805. _ASSERT(NULL != pMed);
  806. if (nType == pMed->m_nDetailType && nLevel == pMed->m_nLevel)
  807. {
  808. // 根据策划的设计, 属性1类型 == 具体类别. 进行验证
  809. // _ASSERT(nType == pMed->m_nAttrib1_Type);
  810. pData = pMed;
  811. break;
  812. }
  813. }
  814. return pData;
  815. }
  816. //============================================================================
  817. KBPT_MedMaterial::KBPT_MedMaterial()
  818. {
  819. m_nSizeOfEntry = sizeof(KBASICPROP_MEDMATERIAL);
  820. ::strcpy(m_szTabFile, TABFILE_MEDMATERIAL);
  821. }
  822. KBPT_MedMaterial::~KBPT_MedMaterial()
  823. {
  824. }
  825. BOOL KBPT_MedMaterial::LoadRecord(int i, KTabFile* pTF)
  826. {
  827. _ASSERT(pTF != NULL);
  828. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  829. // 初始化
  830. KBASICPROP_MEDMATERIAL* pBuf = (KBASICPROP_MEDMATERIAL*)m_pBuf;
  831. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  832. const PROPINFO aryPI[] =
  833. {
  834. /*ver1****************************************************************
  835. { PI_VARTYPE_CHAR, pBuf->m_szSerialNum, sizeof(pBuf->m_szSerialNum)},
  836. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nStyle), 0},
  837. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  838. { PI_VARTYPE_CHAR, pBuf->m_szImage1, sizeof(pBuf->m_szImage1)},
  839. { PI_VARTYPE_CHAR, pBuf->m_szImage2, sizeof(pBuf->m_szImage2)},
  840. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bRepeatable), 0},
  841. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort1), 0},
  842. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort2), 0},
  843. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  844. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  845. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nValue), 0},
  846. *********************************************************************/
  847. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  848. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  849. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  850. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  851. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  852. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  853. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  854. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  855. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  856. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  857. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  858. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  859. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  860. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib1_Type), 0},
  861. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib1_Para), 0},
  862. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib2_Type), 0},
  863. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib2_Para), 0},
  864. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib3_Type), 0},
  865. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib3_Para), 0},
  866. };
  867. // 逐个读入各项属性
  868. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  869. }
  870. /******************************************************************************
  871. 功能: 获取指定的药材的属性
  872. 入口: i: 要求获取第i项药材的属性. 若为-1表示随机取一个
  873. 出口: 成功时返回指向该药材属性的指针(一个KBASICPROP_MEDMATERIAL结构)
  874. 失败时返回NULL
  875. ******************************************************************************/
  876. const KBASICPROP_MEDMATERIAL* KBPT_MedMaterial::GetRecord(int i) const
  877. {
  878. _ASSERT(this != NULL);
  879. if (-1 == i)
  880. i = ::GetRandomNumber(0, m_nNumOfEntries-1);
  881. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  882. return (i >= 0 && i < m_nNumOfEntries) ?
  883. (((KBASICPROP_MEDMATERIAL*)m_pBuf) + i) : NULL;
  884. }
  885. KBPT_Equipment::KBPT_Equipment()
  886. {
  887. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT);
  888. }
  889. KBPT_Equipment::~KBPT_Equipment()
  890. {
  891. }
  892. void KBPT_Equipment::Init(IN int i)
  893. {
  894. ::strcpy(m_szTabFile, TABFILE_EQUIPMENT[i]);
  895. }
  896. BOOL KBPT_Equipment::LoadRecord(int i, KTabFile* pTF)
  897. {
  898. _ASSERT(pTF != NULL);
  899. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  900. // 初始化
  901. KBASICPROP_EQUIPMENT* pBuf = (KBASICPROP_EQUIPMENT*)m_pBuf;
  902. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  903. const PROPINFO aryPI[] =
  904. {
  905. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  906. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  907. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  908. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  909. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  910. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  911. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  912. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  913. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  914. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  915. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  916. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  917. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  918. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].nType), 0},
  919. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].sRange.nMin), 0},
  920. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].sRange.nMax), 0},
  921. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].nType), 0},
  922. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].sRange.nMin), 0},
  923. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].sRange.nMax), 0},
  924. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].nType), 0},
  925. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].sRange.nMin), 0},
  926. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].sRange.nMax), 0},
  927. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].nType), 0},
  928. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].sRange.nMin), 0},
  929. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].sRange.nMax), 0},
  930. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].nType), 0},
  931. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].sRange.nMin), 0},
  932. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].sRange.nMax), 0},
  933. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].nType), 0},
  934. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].sRange.nMin), 0},
  935. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].sRange.nMax), 0},
  936. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].nType), 0},
  937. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].sRange.nMin), 0},
  938. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].sRange.nMax), 0},
  939. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  940. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  941. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  942. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  943. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  944. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  945. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  946. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  947. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  948. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  949. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  950. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  951. };
  952. // 逐个读入各项属性
  953. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  954. }
  955. /******************************************************************************
  956. 功能: 获取指定的装备的属性
  957. 入口: i: 要求获取第i项装备的属性
  958. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  959. 失败时返回NULL
  960. ******************************************************************************/
  961. const KBASICPROP_EQUIPMENT* KBPT_Equipment::GetRecord(int i) const
  962. {
  963. _ASSERT(this != NULL);
  964. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  965. return (i >= 0 && i < m_nNumOfEntries) ?
  966. (((KBASICPROP_EQUIPMENT*)m_pBuf) + i) : NULL;
  967. }
  968. /******************************************************************************
  969. 功能: 获取指定的装备属性记录
  970. 入口: nDetailType: 具体类别
  971. nParticularType: 详细类别
  972. nLevel: 等级
  973. 出口: 成功时返回指向该记录的指针
  974. 失败时返回NULL
  975. ******************************************************************************/
  976. const KBASICPROP_EQUIPMENT* KBPT_Equipment::FindRecord( IN int nDetailType,
  977. IN int nParticularType,
  978. IN int nLevel) const
  979. {
  980. _ASSERT(this != NULL);
  981. const KBASICPROP_EQUIPMENT* pData = NULL;
  982. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  983. // 则可进行算法优化
  984. for (int i = 0; i < m_nNumOfEntries; i++)
  985. {
  986. const KBASICPROP_EQUIPMENT* pEqu;
  987. pEqu = GetRecord(i);
  988. _ASSERT(NULL != pEqu);
  989. if (nDetailType == pEqu->m_nDetailType &&
  990. nParticularType == pEqu->m_nParticularType &&
  991. nLevel == pEqu->m_nLevel)
  992. {
  993. pData = pEqu;
  994. break;
  995. }
  996. }
  997. return pData;
  998. }
  999. //============================================================================
  1000. // 黄金装备的实现
  1001. // flying
  1002. KBPT_Equipment_Gold::KBPT_Equipment_Gold()
  1003. {
  1004. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT_GOLD);
  1005. // Copy the gold item information file's name into the buffer
  1006. ::strcpy(m_szTabFile, TABFILE_GOLDITEM);
  1007. }
  1008. KBPT_Equipment_Gold::~KBPT_Equipment_Gold()
  1009. {
  1010. return;
  1011. }
  1012. BOOL KBPT_Equipment_Gold::LoadRecord(int i, KTabFile* pTF)
  1013. {
  1014. _ASSERT(pTF != NULL);
  1015. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1016. // 初始化
  1017. KBASICPROP_EQUIPMENT_GOLD* pBuf = (KBASICPROP_EQUIPMENT_GOLD*)m_pBuf;
  1018. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1019. const PROPINFO aryPI[] =
  1020. {
  1021. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1022. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  1023. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  1024. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  1025. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nRarity), 0},
  1026. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  1027. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  1028. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  1029. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  1030. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1031. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  1032. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  1033. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1034. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  1035. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  1036. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  1037. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  1038. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  1039. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  1040. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  1041. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  1042. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  1043. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  1044. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  1045. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  1046. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].nPropKind), 0},
  1047. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMin), 0},
  1048. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMax), 0},
  1049. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMin), 0},
  1050. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMax), 0},
  1051. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMin), 0},
  1052. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMax), 0},
  1053. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].nPropKind), 0},
  1054. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMin), 0},
  1055. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMax), 0},
  1056. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMin), 0},
  1057. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMax), 0},
  1058. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMin), 0},
  1059. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMax), 0},
  1060. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].nPropKind), 0},
  1061. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMin), 0},
  1062. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMax), 0},
  1063. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMin), 0},
  1064. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMax), 0},
  1065. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMin), 0},
  1066. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMax), 0},
  1067. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].nPropKind), 0},
  1068. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMin), 0},
  1069. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMax), 0},
  1070. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMin), 0},
  1071. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMax), 0},
  1072. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMin), 0},
  1073. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMax), 0},
  1074. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].nPropKind), 0},
  1075. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMin), 0},
  1076. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMax), 0},
  1077. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMin), 0},
  1078. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMax), 0},
  1079. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMin), 0},
  1080. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMax), 0},
  1081. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].nPropKind), 0},
  1082. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMin), 0},
  1083. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMax), 0},
  1084. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMin), 0},
  1085. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMax), 0},
  1086. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMin), 0},
  1087. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMax), 0},
  1088. };
  1089. // 逐个读入各项属性
  1090. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  1091. }
  1092. /******************************************************************************
  1093. 功能: 获取指定的装备的属性
  1094. 入口: i: 要求获取第i项装备的属性
  1095. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  1096. 失败时返回NULL
  1097. ******************************************************************************/
  1098. const KBASICPROP_EQUIPMENT_GOLD* KBPT_Equipment_Gold::GetRecord(int i) const
  1099. {
  1100. _ASSERT(this != NULL);
  1101. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1102. return (i >= 0 && i < m_nNumOfEntries) ?
  1103. (((KBASICPROP_EQUIPMENT_GOLD*)m_pBuf) + i) : NULL;
  1104. }
  1105. /******************************************************************************
  1106. 功能: 获取指定的唯一装备属性记录
  1107. 入口: nDetailType: 具体类别
  1108. nParticularType: 详细类别
  1109. nLevel: 等级
  1110. 出口: 成功时返回指向该记录的指针
  1111. 失败时返回NULL
  1112. ******************************************************************************/
  1113. const KBASICPROP_EQUIPMENT_GOLD*
  1114. KBPT_Equipment_Gold::FindRecord(IN int nDetailType,
  1115.   IN int nParticularType,
  1116.   IN int nLevel) const
  1117. {
  1118. _ASSERT(this != NULL);
  1119. const KBASICPROP_EQUIPMENT_GOLD* pData = NULL;
  1120. for (int i = 0; i < m_nNumOfEntries; i++)
  1121. {
  1122. const KBASICPROP_EQUIPMENT_GOLD* pEqu;
  1123. pEqu = GetRecord(i);
  1124. _ASSERT(NULL != pEqu);
  1125. if (NULL == pEqu)
  1126. continue;
  1127. if (nDetailType == pEqu->m_nDetailType &&
  1128. nParticularType == pEqu->m_nParticularType &&
  1129. nLevel == pEqu->m_nLevel)
  1130. {
  1131. pData = pEqu;
  1132. break;
  1133. }
  1134. }
  1135. return pData;
  1136. }
  1137. //============================================================================
  1138. KBPT_Equipment_Unique::KBPT_Equipment_Unique()
  1139. {
  1140. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT_UNIQUE);
  1141. ::strcpy(m_szTabFile, TABFILE_EQUIPMENT_UNIQUE);
  1142. }
  1143. KBPT_Equipment_Unique::~KBPT_Equipment_Unique()
  1144. {
  1145. }
  1146. BOOL KBPT_Equipment_Unique::LoadRecord(int i, KTabFile* pTF)
  1147. {
  1148. _ASSERT(pTF != NULL);
  1149. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1150. // 初始化
  1151. KBASICPROP_EQUIPMENT_UNIQUE* pBuf = (KBASICPROP_EQUIPMENT_UNIQUE*)m_pBuf;
  1152. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1153. const PROPINFO aryPI[] =
  1154. {
  1155. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1156. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  1157. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  1158. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  1159. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1160. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  1161. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  1162. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1163. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  1164. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  1165. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nRarity), 0},
  1166. // TODO: 以上各项的顺序可能还会调整.
  1167. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  1168. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  1169. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  1170. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  1171. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  1172. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  1173. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  1174. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  1175. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  1176. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  1177. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  1178. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  1179. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].nPropKind), 0},
  1180. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMin), 0},
  1181. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMax), 0},
  1182. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMin), 0},
  1183. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMax), 0},
  1184. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMin), 0},
  1185. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMax), 0},
  1186. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].nPropKind), 0},
  1187. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMin), 0},
  1188. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMax), 0},
  1189. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMin), 0},
  1190. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMax), 0},
  1191. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMin), 0},
  1192. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMax), 0},
  1193. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].nPropKind), 0},
  1194. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMin), 0},
  1195. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMax), 0},
  1196. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMin), 0},
  1197. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMax), 0},
  1198. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMin), 0},
  1199. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMax), 0},
  1200. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].nPropKind), 0},
  1201. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMin), 0},
  1202. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMax), 0},
  1203. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMin), 0},
  1204. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMax), 0},
  1205. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMin), 0},
  1206. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMax), 0},
  1207. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].nPropKind), 0},
  1208. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMin), 0},
  1209. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMax), 0},
  1210. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMin), 0},
  1211. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMax), 0},
  1212. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMin), 0},
  1213. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMax), 0},
  1214. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].nPropKind), 0},
  1215. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMin), 0},
  1216. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMax), 0},
  1217. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMin), 0},
  1218. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMax), 0},
  1219. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMin), 0},
  1220. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMax), 0},
  1221. };
  1222. // 逐个读入各项属性
  1223. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  1224. }
  1225. /******************************************************************************
  1226. 功能: 获取指定的装备的属性
  1227. 入口: i: 要求获取第i项装备的属性
  1228. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  1229. 失败时返回NULL
  1230. ******************************************************************************/
  1231. const KBASICPROP_EQUIPMENT_UNIQUE* KBPT_Equipment_Unique::GetRecord(int i) const
  1232. {
  1233. _ASSERT(this != NULL);
  1234. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1235. return (i >= 0 && i < m_nNumOfEntries) ?
  1236. (((KBASICPROP_EQUIPMENT_UNIQUE*)m_pBuf) + i) : NULL;
  1237. }
  1238. /******************************************************************************
  1239. 功能: 获取指定的唯一装备属性记录
  1240. 入口: nDetailType: 具体类别
  1241. nParticularType: 详细类别
  1242. nLevel: 等级
  1243. 出口: 成功时返回指向该记录的指针
  1244. 失败时返回NULL
  1245. ******************************************************************************/
  1246. const KBASICPROP_EQUIPMENT_UNIQUE*
  1247. KBPT_Equipment_Unique::FindRecord(IN int nDetailType,
  1248.   IN int nParticularType,
  1249.   IN int nLevel) const
  1250. {
  1251. _ASSERT(this != NULL);
  1252. const KBASICPROP_EQUIPMENT_UNIQUE* pData = NULL;
  1253. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  1254. // 则可进行算法优化
  1255. for (int i = 0; i < m_nNumOfEntries; i++)
  1256. {
  1257. const KBASICPROP_EQUIPMENT_UNIQUE* pEqu;
  1258. pEqu = GetRecord(i);
  1259. _ASSERT(NULL != pEqu);
  1260. if (NULL == pEqu)
  1261. continue;
  1262. if (nDetailType == pEqu->m_nDetailType &&
  1263. nParticularType == pEqu->m_nParticularType &&
  1264. nLevel == pEqu->m_nLevel)
  1265. {
  1266. pData = pEqu;
  1267. break;
  1268. }
  1269. }
  1270. return pData;
  1271. }
  1272. //============================================================================
  1273. KBPT_MagicAttrib_TF::KBPT_MagicAttrib_TF()
  1274. {
  1275. m_nSizeOfEntry = sizeof(KMAGICATTRIB_TABFILE);
  1276. ::strcpy(m_szTabFile, TABFILE_MAGICATTRIB);
  1277. ::memset(&m_naryMACount, 0, sizeof(m_naryMACount));
  1278. }
  1279. KBPT_MagicAttrib_TF::~KBPT_MagicAttrib_TF()
  1280. {
  1281. }
  1282. BOOL KBPT_MagicAttrib_TF::LoadRecord(int i, KTabFile* pTF)
  1283. {
  1284. _ASSERT(pTF != NULL);
  1285. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1286. // 初始化
  1287. KMAGICATTRIB_TABFILE* pBuf = (KMAGICATTRIB_TABFILE*)m_pBuf;
  1288. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1289. const PROPINFO aryPI[] =
  1290. {
  1291. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1292. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPos), 0},
  1293. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nClass), 0},
  1294. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1295. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.nPropKind), 0},
  1296. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[0].nMin), 0},
  1297. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[0].nMax), 0},
  1298. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[1].nMin), 0},
  1299. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[1].nMax), 0},
  1300. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[2].nMin), 0},
  1301. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[2].nMax), 0},
  1302. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1303. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[0]), 0},
  1304. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[1]), 0},
  1305. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[2]), 0},
  1306. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[3]), 0},
  1307. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[4]), 0},
  1308. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[5]), 0},
  1309. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[6]), 0},
  1310. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[7]), 0},
  1311. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[8]), 0},
  1312. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[9]), 0},
  1313. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[10]), 0}
  1314. };
  1315. // 逐个读入各项属性
  1316. if (FALSE == ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0])))
  1317. return FALSE;
  1318.     pBuf->m_nUseFlag = false;       // 初始化为没有使用
  1319. // 数据统计:每种装备可适用的魔法数目
  1320. for (int n = 0; n < MATF_CBDR; n++)
  1321. {
  1322. if (0 != pBuf->m_DropRate[n])
  1323. {
  1324. int nPos;
  1325. nPos = (0 == pBuf->m_nPos) ? 1 : 0;
  1326. m_naryMACount[nPos][n]++;
  1327. }
  1328. }
  1329. return TRUE;
  1330. }
  1331. /******************************************************************************
  1332. 功能: 获取指定的魔法属性
  1333. 入口: i: 要求获取第i项魔法属性
  1334. 出口: 成功时返回指向该魔法属性的指针(一个KMAGICATTRIB_TABFILE结构)
  1335. 失败时返回NULL
  1336. ******************************************************************************/
  1337. const KMAGICATTRIB_TABFILE* KBPT_MagicAttrib_TF::GetRecord(int i) const
  1338. {
  1339. _ASSERT(this != NULL);
  1340. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1341. return (i >= 0 && i < m_nNumOfEntries) ?
  1342. (((KMAGICATTRIB_TABFILE*)m_pBuf) + i) : NULL;
  1343. }
  1344. void KBPT_MagicAttrib_TF::GetMACount(int* pnCount) const
  1345. {
  1346. _ASSERT(this != NULL);
  1347. _ASSERT(pnCount != NULL);
  1348. ::memcpy(pnCount, m_naryMACount, sizeof(m_naryMACount));
  1349. }
  1350. //============================================================================
  1351. // Magic Item Index Table Class
  1352. KBPT_ClassMAIT::KBPT_ClassMAIT()
  1353. {
  1354. m_pnTable = NULL;
  1355. m_nSize = 0;
  1356. m_nNumOfValidData = 0;
  1357. }
  1358. KBPT_ClassMAIT::~KBPT_ClassMAIT()
  1359. {
  1360.     m_nSize = 0;
  1361. m_nNumOfValidData = 0;
  1362. if (m_pnTable)
  1363.     {
  1364.         delete []m_pnTable;
  1365.         m_pnTable = NULL;
  1366.     }
  1367. }
  1368. /******************************************************************************
  1369. 功能: 将索引表清空,并不释放内存
  1370. 入口:
  1371. 出口: 成功返回非零,失败返回零
  1372. 说明:
  1373. ******************************************************************************/
  1374. BOOL KBPT_ClassMAIT::Clear()
  1375. {
  1376.     m_nNumOfValidData = 0; 
  1377.     
  1378.     return true;   
  1379. }
  1380. /******************************************************************************
  1381. 功能: 从索引表中取值
  1382. 入口: i: 从索引表中该位置取值
  1383. 出口: 返回所取的值
  1384. 说明: 若返回值为nItemIndex, 则调用KLibOfBPT::m_BPTMagicAttrib.GetRecord(nItemIndex)
  1385.             可获得对应的魔法属性
  1386. ******************************************************************************/
  1387. int KBPT_ClassMAIT::Get(int i) const
  1388. {
  1389. _ASSERT(this != NULL);
  1390. _ASSERT(i >= 0 && i < m_nNumOfValidData);
  1391.     _ASSERT(m_pnTable);
  1392. return m_pnTable[i];
  1393. }
  1394. /******************************************************************************
  1395. 功能: 给索引表插入一个新的值
  1396. 入口: nItemIndex: 欲赋之值
  1397. 出口: 成功时返回非零, m_pnTable[m_nNumOfValidData]为所赋之值
  1398. m_nNumOfValidData指向下一空位
  1399. 失败时返回零
  1400. ******************************************************************************/
  1401. BOOL KBPT_ClassMAIT::Insert(int nItemIndex)
  1402. {
  1403.     int nResult = false;
  1404. _ASSERT(this != NULL);
  1405. _ASSERT(nItemIndex >= 0); // nData 为数组下标
  1406.     if (!m_pnTable)
  1407.     {
  1408.         m_pnTable = new int [4];
  1409.         if (!m_pnTable)
  1410.             goto Exit0;
  1411.         m_nNumOfValidData = 0;
  1412.         m_nSize = 4;
  1413.     }
  1414.     if (m_nNumOfValidData >= m_nSize)
  1415.     {
  1416.         int *pnaryTemp = new int [m_nSize + 8];
  1417.         if (!pnaryTemp)
  1418.             goto Exit0;
  1419.         memcpy(pnaryTemp, m_pnTable, m_nNumOfValidData * sizeof(int));
  1420.         m_nSize += 8;
  1421.         delete []m_pnTable;
  1422.         m_pnTable = pnaryTemp;
  1423.         pnaryTemp = NULL;
  1424.     }
  1425. m_pnTable[m_nNumOfValidData++] = nItemIndex;
  1426.     nResult = true;
  1427. Exit0:
  1428.     return nResult;
  1429. }
  1430. //============================================================================
  1431. KBPT_ClassifiedMAT::KBPT_ClassifiedMAT()
  1432. {
  1433. m_pnTable = NULL;
  1434. m_nSize = 0;
  1435. m_nNumOfValidData = 0;
  1436. }
  1437. KBPT_ClassifiedMAT::~KBPT_ClassifiedMAT()
  1438. {
  1439. ReleaseMemory();
  1440. }
  1441. /******************************************************************************
  1442. 功能: 为索引表分配内存
  1443. 入口: nCount: 索引表大小(数据项的数目)
  1444. 出口: m_pnTable 指向分配的内存
  1445. m_nSize = nCount
  1446. ******************************************************************************/
  1447. BOOL KBPT_ClassifiedMAT::GetMemory(int nCount)
  1448. {
  1449. _ASSERT(this != NULL);
  1450. _ASSERT(nCount > 0);
  1451. _ASSERT(NULL == m_pnTable);
  1452. _ASSERT(0 == m_nSize);
  1453. BOOL bEC = FALSE;
  1454. int* pnBuf = new int[nCount];
  1455. if (pnBuf)
  1456. {
  1457. m_pnTable = pnBuf;
  1458. m_nSize = nCount;
  1459. bEC = TRUE;
  1460. }
  1461. return bEC;
  1462. }
  1463. /******************************************************************************
  1464. 功能: 释放索引表所用的内存
  1465. ******************************************************************************/
  1466. void KBPT_ClassifiedMAT::ReleaseMemory()
  1467. {
  1468. if (m_pnTable)
  1469. {
  1470. delete []m_pnTable;
  1471. m_pnTable = NULL;
  1472. m_nSize = 0;
  1473. }
  1474. }
  1475. /******************************************************************************
  1476. 功能: 给索引表赋值
  1477. 入口: nData: 欲赋之值
  1478. 出口: 成功时返回非零, m_pnTable[m_nNumOfValidData]为所赋之值
  1479. m_nNumOfValidData指向下一空位
  1480. 失败时返回零
  1481. ******************************************************************************/
  1482. BOOL KBPT_ClassifiedMAT::Set(int nData)
  1483. {
  1484. _ASSERT(this != NULL);
  1485. _ASSERT(nData >= 0); // nData 为数组下标
  1486. _ASSERT(m_nNumOfValidData >= 0 && m_nNumOfValidData < m_nSize);
  1487. m_pnTable[m_nNumOfValidData++] = nData;
  1488. return TRUE;
  1489. }
  1490. /******************************************************************************
  1491. 功能: 从索引表中取值
  1492. 入口: nIndex: 从索引表中该位置取值
  1493. 出口: 返回所取的值
  1494. 说明: 若返回值为i, 则调用KLibOfBPT::m_BPTMagicAttrib.GetRecord(i)可获得
  1495. 对应的魔法属性
  1496. ******************************************************************************/
  1497. int KBPT_ClassifiedMAT::Get(int nIndex) const
  1498. {
  1499. _ASSERT(this != NULL);
  1500. _ASSERT(nIndex >= 0 && nIndex < m_nSize);
  1501. return (nIndex >= 0 && nIndex < m_nSize) ? m_pnTable[nIndex] : 0;
  1502. }
  1503. #ifndef min
  1504. #define min(a,b)            (((a) < (b)) ? (a) : (b))
  1505. #endif
  1506. /******************************************************************************
  1507. 功能: 将数据导出到给定的缓冲区中
  1508. 入口: pnaryBuf: 级冲区指针
  1509. *pnCount: 缓冲区可容纳多少个int型数据
  1510. 出口: 成功时返回非零, 数据被导出到缓冲区中, *pnCount 给出数据个数
  1511. 失败时返回零
  1512. ******************************************************************************/
  1513. BOOL KBPT_ClassifiedMAT::GetAll(int* pnaryBuf, int* pnCount) const
  1514. {
  1515. _ASSERT(this != NULL);
  1516. _ASSERT(pnaryBuf != NULL);
  1517. _ASSERT(pnCount != NULL);
  1518. BOOL bEC = FALSE;
  1519. if (pnaryBuf && pnCount && *pnCount > 0)
  1520. {
  1521. int nLength = min(*pnCount, m_nSize);
  1522. ::memcpy(pnaryBuf, m_pnTable, nLength*sizeof(int));
  1523. *pnCount = nLength;
  1524. bEC = TRUE;
  1525. }
  1526. return bEC;
  1527. }