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. char szFileName[FILE_NAME_LENGTH];
  567. g_UnitePathAndName(TABFILE_PATH, m_szTabFile, szFileName);
  568. if (FALSE == theLoader.Load(szFileName))
  569. { _ASSERT(FALSE); return bEC; }
  570. // 确定file内给出了多少项记录
  571. const int cbItems = theLoader.GetHeight() - 1; // 第一行给出各列名称,
  572. if (cbItems <= 0) // 实际数据从第2行开始给出.
  573. { _ASSERT(FALSE); return bEC; }
  574. SetCount(cbItems);
  575. // 分配内存,构建属性表
  576. if (FALSE == GetMemory())
  577. { _ASSERT(FALSE); return bEC; }
  578. // 将属性记录逐条读入
  579. int i;
  580. for (i = 0; i < cbItems; i++)
  581. {
  582. if (FALSE == LoadRecord(i, &theLoader))
  583. { _ASSERT(FALSE); return bEC; }
  584. }
  585. bEC = TRUE;
  586. return bEC;
  587. }
  588. //============================================================================
  589. KBPT_Mine::KBPT_Mine()
  590. {
  591. m_nSizeOfEntry = sizeof(KBASICPROP_MINE);
  592. ::strcpy(m_szTabFile, TABFILE_MINE);
  593. }
  594. KBPT_Mine::~KBPT_Mine()
  595. {
  596. }
  597. BOOL KBPT_Mine::LoadRecord(int i, KTabFile* pTF)
  598. {
  599. _ASSERT(pTF != NULL);
  600. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  601. // 初始化
  602. KBASICPROP_MINE* pBuf = (KBASICPROP_MINE*)m_pBuf;
  603. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  604. const PROPINFO aryPI[] =
  605. {
  606. /*ver1****************************************************************
  607. { PI_VARTYPE_CHAR, pBuf->m_szSerialNum, sizeof(pBuf->m_szSerialNum)},
  608. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nStyle), 0},
  609. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  610. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nClass), 0},
  611. { PI_VARTYPE_CHAR, pBuf->m_szImage1, sizeof(pBuf->m_szImage1)},
  612. { PI_VARTYPE_CHAR, pBuf->m_szImage2, sizeof(pBuf->m_szImage2)},
  613. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bRepeatable), 0},
  614. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort), 0},
  615. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  616. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  617. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nValue), 0},
  618. *********************************************************************/
  619. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  620. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  621. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  622. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  623. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  624. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  625. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  626. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  627. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  628. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  629. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  630. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  631. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  632. };
  633. // 逐个读入各项属性
  634. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  635. }
  636. /******************************************************************************
  637. 功能: 获取指定的矿石的属性
  638. 入口: i: 要求获取第i项矿石的属性. 若为-1表示随机取一个
  639. 出口: 成功时返回指向该矿石属性的指针(一个KBASICPROP_MINE结构)
  640. 失败时返回NULL
  641. ******************************************************************************/
  642. const KBASICPROP_MINE* KBPT_Mine::GetRecord(int i) const
  643. {
  644. _ASSERT(this != NULL);
  645. if (-1 == i)
  646. i = ::GetRandomNumber(0, m_nNumOfEntries-1);
  647. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  648. return (i >= 0 && i < m_nNumOfEntries) ?
  649. (((KBASICPROP_MINE*)m_pBuf) + i) : NULL;
  650. }
  651. //============================================================================
  652. KBPT_TownPortal::KBPT_TownPortal()
  653. {
  654. m_nSizeOfEntry = sizeof(KBASICPROP_TOWNPORTAL);
  655. ::strcpy(m_szTabFile, TABFILE_TOWNPORTAL);
  656. }
  657. KBPT_TownPortal::~KBPT_TownPortal()
  658. {
  659. }
  660. BOOL KBPT_TownPortal::LoadRecord(int i, KTabFile* pTF)
  661. {
  662. _ASSERT(pTF != NULL);
  663. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  664. KBASICPROP_TOWNPORTAL* pBuf = (KBASICPROP_TOWNPORTAL*)m_pBuf;
  665. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  666. const PROPINFO aryPI[] =
  667. {
  668. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  669. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  670. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  671. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  672. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  673. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  674. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  675. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  676. };
  677. // 逐个读入各项属性
  678. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  679. }
  680. const KBASICPROP_TOWNPORTAL* KBPT_TownPortal::GetRecord(IN int i) const
  681. {
  682. _ASSERT(this != NULL);
  683. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  684. return (i >= 0 && i < m_nNumOfEntries) ?
  685. (((KBASICPROP_TOWNPORTAL*)m_pBuf) + i) : NULL;
  686. }
  687. //============================================================================
  688. KBPT_Quest::KBPT_Quest()
  689. {
  690. m_nSizeOfEntry = sizeof(KBASICPROP_QUEST);
  691. ::strcpy(m_szTabFile, TABFILE_TASK);
  692. }
  693. KBPT_Quest::~KBPT_Quest()
  694. {
  695. }
  696. BOOL KBPT_Quest::LoadRecord(int i, KTabFile* pTF)
  697. {
  698. _ASSERT(pTF != NULL);
  699. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  700. KBASICPROP_QUEST* pBuf = (KBASICPROP_QUEST*)m_pBuf;
  701. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  702. const PROPINFO aryPI[] =
  703. {
  704. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  705. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  706. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  707. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  708. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  709. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  710. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  711. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  712. };
  713. // 逐个读入各项属性
  714. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  715. }
  716. const KBASICPROP_QUEST* KBPT_Quest::GetRecord(IN int i) const
  717. {
  718. _ASSERT(this != NULL);
  719. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  720. return (i >= 0 && i < m_nNumOfEntries) ?
  721. (((KBASICPROP_QUEST*)m_pBuf) + i) : NULL;
  722. }
  723. const KBASICPROP_QUEST* KBPT_Quest::FindRecord(IN int nDetailType) const
  724. {
  725. const KBASICPROP_QUEST* pData = NULL;
  726. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType排序的,
  727. // 则可进行算法优化
  728. for (int i = 0; i < m_nNumOfEntries; i++)
  729. {
  730. const KBASICPROP_QUEST* pQst;
  731. pQst = GetRecord(i);
  732. _ASSERT(NULL != pQst);
  733. if (nDetailType == pQst->m_nDetailType)
  734. {
  735. // 根据策划的设计, 属性1类型 == 具体类别. 进行验证
  736. // _ASSERT(nType == pMed->m_nAttrib1_Type);
  737. pData = pQst;
  738. break;
  739. }
  740. }
  741. return pData;
  742. }
  743. //============================================================================
  744. KBPT_Medicine::KBPT_Medicine()
  745. {
  746. m_nSizeOfEntry = sizeof(KBASICPROP_MEDICINE);
  747. ::strcpy(m_szTabFile, TABFILE_MEDICINE);
  748. }
  749. KBPT_Medicine::~KBPT_Medicine()
  750. {
  751. }
  752. BOOL KBPT_Medicine::LoadRecord(int i, KTabFile* pTF)
  753. {
  754. _ASSERT(pTF != NULL);
  755. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  756. // 初始化
  757. KBASICPROP_MEDICINE* pBuf = (KBASICPROP_MEDICINE*)m_pBuf;
  758. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  759. const PROPINFO aryPI[] =
  760. {
  761. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  762. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  763. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  764. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  765. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  766. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  767. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  768. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  769. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  770. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  771. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  772. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  773. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  774. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nAttrib), 0},
  775. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nValue), 0},
  776. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[0].nTime), 0},
  777. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nAttrib), 0},
  778. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nValue), 0},
  779. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryAttrib[1].nTime), 0},
  780. };
  781. // 逐个读入各项属性
  782. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  783. }
  784. /******************************************************************************
  785. 功能: 获取指定的药品的属性
  786. 入口: i: 要求获取第i项药品的属性
  787. 出口: 成功时返回指向该药材属性的指针(一个KBASICPROP_MEDICINE结构)
  788. 失败时返回NULL
  789. ******************************************************************************/
  790. const KBASICPROP_MEDICINE* KBPT_Medicine::GetRecord(int i) const
  791. {
  792. _ASSERT(this != NULL);
  793. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  794. return (i >= 0 && i < m_nNumOfEntries) ?
  795. (((KBASICPROP_MEDICINE*)m_pBuf) + i) : NULL;
  796. }
  797. const KBASICPROP_MEDICINE* KBPT_Medicine::FindRecord(IN int nType,
  798.  IN int nLevel) const
  799. {
  800. const KBASICPROP_MEDICINE* pData = NULL;
  801. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  802. // 则可进行算法优化
  803. for (int i = 0; i < m_nNumOfEntries; i++)
  804. {
  805. const KBASICPROP_MEDICINE* pMed;
  806. pMed = GetRecord(i);
  807. _ASSERT(NULL != pMed);
  808. if (nType == pMed->m_nDetailType && nLevel == pMed->m_nLevel)
  809. {
  810. // 根据策划的设计, 属性1类型 == 具体类别. 进行验证
  811. // _ASSERT(nType == pMed->m_nAttrib1_Type);
  812. pData = pMed;
  813. break;
  814. }
  815. }
  816. return pData;
  817. }
  818. //============================================================================
  819. KBPT_MedMaterial::KBPT_MedMaterial()
  820. {
  821. m_nSizeOfEntry = sizeof(KBASICPROP_MEDMATERIAL);
  822. ::strcpy(m_szTabFile, TABFILE_MEDMATERIAL);
  823. }
  824. KBPT_MedMaterial::~KBPT_MedMaterial()
  825. {
  826. }
  827. BOOL KBPT_MedMaterial::LoadRecord(int i, KTabFile* pTF)
  828. {
  829. _ASSERT(pTF != NULL);
  830. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  831. // 初始化
  832. KBASICPROP_MEDMATERIAL* pBuf = (KBASICPROP_MEDMATERIAL*)m_pBuf;
  833. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  834. const PROPINFO aryPI[] =
  835. {
  836. /*ver1****************************************************************
  837. { PI_VARTYPE_CHAR, pBuf->m_szSerialNum, sizeof(pBuf->m_szSerialNum)},
  838. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nStyle), 0},
  839. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  840. { PI_VARTYPE_CHAR, pBuf->m_szImage1, sizeof(pBuf->m_szImage1)},
  841. { PI_VARTYPE_CHAR, pBuf->m_szImage2, sizeof(pBuf->m_szImage2)},
  842. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bRepeatable), 0},
  843. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort1), 0},
  844. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSort2), 0},
  845. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  846. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  847. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nValue), 0},
  848. *********************************************************************/
  849. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  850. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  851. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  852. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  853. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  854. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  855. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  856. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  857. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  858. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  859. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  860. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  861. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  862. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib1_Type), 0},
  863. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib1_Para), 0},
  864. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib2_Type), 0},
  865. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib2_Para), 0},
  866. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib3_Type), 0},
  867. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nAttrib3_Para), 0},
  868. };
  869. // 逐个读入各项属性
  870. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  871. }
  872. /******************************************************************************
  873. 功能: 获取指定的药材的属性
  874. 入口: i: 要求获取第i项药材的属性. 若为-1表示随机取一个
  875. 出口: 成功时返回指向该药材属性的指针(一个KBASICPROP_MEDMATERIAL结构)
  876. 失败时返回NULL
  877. ******************************************************************************/
  878. const KBASICPROP_MEDMATERIAL* KBPT_MedMaterial::GetRecord(int i) const
  879. {
  880. _ASSERT(this != NULL);
  881. if (-1 == i)
  882. i = ::GetRandomNumber(0, m_nNumOfEntries-1);
  883. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  884. return (i >= 0 && i < m_nNumOfEntries) ?
  885. (((KBASICPROP_MEDMATERIAL*)m_pBuf) + i) : NULL;
  886. }
  887. KBPT_Equipment::KBPT_Equipment()
  888. {
  889. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT);
  890. }
  891. KBPT_Equipment::~KBPT_Equipment()
  892. {
  893. }
  894. void KBPT_Equipment::Init(IN int i)
  895. {
  896. ::strcpy(m_szTabFile, TABFILE_EQUIPMENT[i]);
  897. }
  898. BOOL KBPT_Equipment::LoadRecord(int i, KTabFile* pTF)
  899. {
  900. _ASSERT(pTF != NULL);
  901. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  902. // 初始化
  903. KBASICPROP_EQUIPMENT* pBuf = (KBASICPROP_EQUIPMENT*)m_pBuf;
  904. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  905. const PROPINFO aryPI[] =
  906. {
  907. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  908. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  909. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  910. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  911. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  912. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  913. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  914. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  915. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  916. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  917. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  918. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  919. { PI_VARTYPE_INT,  (char*)&(pBuf->m_bStack), 0},
  920. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].nType), 0},
  921. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].sRange.nMin), 0},
  922. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[0].sRange.nMax), 0},
  923. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].nType), 0},
  924. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].sRange.nMin), 0},
  925. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[1].sRange.nMax), 0},
  926. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].nType), 0},
  927. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].sRange.nMin), 0},
  928. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[2].sRange.nMax), 0},
  929. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].nType), 0},
  930. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].sRange.nMin), 0},
  931. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[3].sRange.nMax), 0},
  932. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].nType), 0},
  933. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].sRange.nMin), 0},
  934. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[4].sRange.nMax), 0},
  935. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].nType), 0},
  936. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].sRange.nMin), 0},
  937. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[5].sRange.nMax), 0},
  938. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].nType), 0},
  939. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].sRange.nMin), 0},
  940. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropBasic[6].sRange.nMax), 0},
  941. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  942. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  943. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  944. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  945. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  946. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  947. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  948. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  949. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  950. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  951. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  952. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  953. };
  954. // 逐个读入各项属性
  955. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  956. }
  957. /******************************************************************************
  958. 功能: 获取指定的装备的属性
  959. 入口: i: 要求获取第i项装备的属性
  960. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  961. 失败时返回NULL
  962. ******************************************************************************/
  963. const KBASICPROP_EQUIPMENT* KBPT_Equipment::GetRecord(int i) const
  964. {
  965. _ASSERT(this != NULL);
  966. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  967. return (i >= 0 && i < m_nNumOfEntries) ?
  968. (((KBASICPROP_EQUIPMENT*)m_pBuf) + i) : NULL;
  969. }
  970. /******************************************************************************
  971. 功能: 获取指定的装备属性记录
  972. 入口: nDetailType: 具体类别
  973. nParticularType: 详细类别
  974. nLevel: 等级
  975. 出口: 成功时返回指向该记录的指针
  976. 失败时返回NULL
  977. ******************************************************************************/
  978. const KBASICPROP_EQUIPMENT* KBPT_Equipment::FindRecord( IN int nDetailType,
  979. IN int nParticularType,
  980. IN int nLevel) const
  981. {
  982. _ASSERT(this != NULL);
  983. const KBASICPROP_EQUIPMENT* pData = NULL;
  984. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  985. // 则可进行算法优化
  986. for (int i = 0; i < m_nNumOfEntries; i++)
  987. {
  988. const KBASICPROP_EQUIPMENT* pEqu;
  989. pEqu = GetRecord(i);
  990. _ASSERT(NULL != pEqu);
  991. if (nDetailType == pEqu->m_nDetailType &&
  992. nParticularType == pEqu->m_nParticularType &&
  993. nLevel == pEqu->m_nLevel)
  994. {
  995. pData = pEqu;
  996. break;
  997. }
  998. }
  999. return pData;
  1000. }
  1001. //============================================================================
  1002. // 黄金装备的实现
  1003. // flying
  1004. KBPT_Equipment_Gold::KBPT_Equipment_Gold()
  1005. {
  1006. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT_GOLD);
  1007. // Copy the gold item information file's name into the buffer
  1008. ::strcpy(m_szTabFile, TABFILE_GOLDITEM);
  1009. }
  1010. KBPT_Equipment_Gold::~KBPT_Equipment_Gold()
  1011. {
  1012. return;
  1013. }
  1014. BOOL KBPT_Equipment_Gold::LoadRecord(int i, KTabFile* pTF)
  1015. {
  1016. _ASSERT(pTF != NULL);
  1017. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1018. // 初始化
  1019. KBASICPROP_EQUIPMENT_GOLD* pBuf = (KBASICPROP_EQUIPMENT_GOLD*)m_pBuf;
  1020. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1021. const PROPINFO aryPI[] =
  1022. {
  1023. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1024. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  1025. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  1026. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  1027. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nRarity), 0},
  1028. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  1029. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  1030. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nWidth), 0},
  1031. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nHeight), 0},
  1032. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1033. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  1034. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  1035. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1036. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  1037. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  1038. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  1039. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  1040. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  1041. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  1042. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  1043. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  1044. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  1045. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  1046. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  1047. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  1048. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].nPropKind), 0},
  1049. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMin), 0},
  1050. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMax), 0},
  1051. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMin), 0},
  1052. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMax), 0},
  1053. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMin), 0},
  1054. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMax), 0},
  1055. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].nPropKind), 0},
  1056. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMin), 0},
  1057. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMax), 0},
  1058. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMin), 0},
  1059. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMax), 0},
  1060. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMin), 0},
  1061. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMax), 0},
  1062. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].nPropKind), 0},
  1063. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMin), 0},
  1064. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMax), 0},
  1065. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMin), 0},
  1066. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMax), 0},
  1067. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMin), 0},
  1068. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMax), 0},
  1069. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].nPropKind), 0},
  1070. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMin), 0},
  1071. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMax), 0},
  1072. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMin), 0},
  1073. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMax), 0},
  1074. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMin), 0},
  1075. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMax), 0},
  1076. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].nPropKind), 0},
  1077. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMin), 0},
  1078. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMax), 0},
  1079. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMin), 0},
  1080. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMax), 0},
  1081. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMin), 0},
  1082. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMax), 0},
  1083. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].nPropKind), 0},
  1084. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMin), 0},
  1085. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMax), 0},
  1086. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMin), 0},
  1087. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMax), 0},
  1088. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMin), 0},
  1089. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMax), 0},
  1090. };
  1091. // 逐个读入各项属性
  1092. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  1093. }
  1094. /******************************************************************************
  1095. 功能: 获取指定的装备的属性
  1096. 入口: i: 要求获取第i项装备的属性
  1097. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  1098. 失败时返回NULL
  1099. ******************************************************************************/
  1100. const KBASICPROP_EQUIPMENT_GOLD* KBPT_Equipment_Gold::GetRecord(int i) const
  1101. {
  1102. _ASSERT(this != NULL);
  1103. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1104. return (i >= 0 && i < m_nNumOfEntries) ?
  1105. (((KBASICPROP_EQUIPMENT_GOLD*)m_pBuf) + i) : NULL;
  1106. }
  1107. /******************************************************************************
  1108. 功能: 获取指定的唯一装备属性记录
  1109. 入口: nDetailType: 具体类别
  1110. nParticularType: 详细类别
  1111. nLevel: 等级
  1112. 出口: 成功时返回指向该记录的指针
  1113. 失败时返回NULL
  1114. ******************************************************************************/
  1115. const KBASICPROP_EQUIPMENT_GOLD*
  1116. KBPT_Equipment_Gold::FindRecord(IN int nDetailType,
  1117.   IN int nParticularType,
  1118.   IN int nLevel) const
  1119. {
  1120. _ASSERT(this != NULL);
  1121. const KBASICPROP_EQUIPMENT_GOLD* pData = NULL;
  1122. for (int i = 0; i < m_nNumOfEntries; i++)
  1123. {
  1124. const KBASICPROP_EQUIPMENT_GOLD* pEqu;
  1125. pEqu = GetRecord(i);
  1126. _ASSERT(NULL != pEqu);
  1127. if (NULL == pEqu)
  1128. continue;
  1129. if (nDetailType == pEqu->m_nDetailType &&
  1130. nParticularType == pEqu->m_nParticularType &&
  1131. nLevel == pEqu->m_nLevel)
  1132. {
  1133. pData = pEqu;
  1134. break;
  1135. }
  1136. }
  1137. return pData;
  1138. }
  1139. //============================================================================
  1140. KBPT_Equipment_Unique::KBPT_Equipment_Unique()
  1141. {
  1142. m_nSizeOfEntry = sizeof(KBASICPROP_EQUIPMENT_UNIQUE);
  1143. ::strcpy(m_szTabFile, TABFILE_EQUIPMENT_UNIQUE);
  1144. }
  1145. KBPT_Equipment_Unique::~KBPT_Equipment_Unique()
  1146. {
  1147. }
  1148. BOOL KBPT_Equipment_Unique::LoadRecord(int i, KTabFile* pTF)
  1149. {
  1150. _ASSERT(pTF != NULL);
  1151. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1152. // 初始化
  1153. KBASICPROP_EQUIPMENT_UNIQUE* pBuf = (KBASICPROP_EQUIPMENT_UNIQUE*)m_pBuf;
  1154. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1155. const PROPINFO aryPI[] =
  1156. {
  1157. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1158. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nItemGenre), 0},
  1159. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nDetailType), 0},
  1160. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nParticularType), 0},
  1161. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1162. { PI_VARTYPE_CHAR, pBuf->m_szImageName, sizeof(pBuf->m_szImageName)},
  1163. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nObjIdx), 0},
  1164. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1165. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nSeries), 0},
  1166. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPrice), 0},
  1167. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nRarity), 0},
  1168. // TODO: 以上各项的顺序可能还会调整.
  1169. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nType), 0},
  1170. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[0].nPara), 0},
  1171. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nType), 0},
  1172. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[1].nPara), 0},
  1173. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nType), 0},
  1174. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[2].nPara), 0},
  1175. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nType), 0},
  1176. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[3].nPara), 0},
  1177. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nType), 0},
  1178. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[4].nPara), 0},
  1179. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nType), 0},
  1180. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryPropReq[5].nPara), 0},
  1181. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].nPropKind), 0},
  1182. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMin), 0},
  1183. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[0].nMax), 0},
  1184. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMin), 0},
  1185. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[1].nMax), 0},
  1186. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMin), 0},
  1187. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[0].aryRange[2].nMax), 0},
  1188. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].nPropKind), 0},
  1189. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMin), 0},
  1190. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[0].nMax), 0},
  1191. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMin), 0},
  1192. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[1].nMax), 0},
  1193. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMin), 0},
  1194. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[1].aryRange[2].nMax), 0},
  1195. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].nPropKind), 0},
  1196. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMin), 0},
  1197. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[0].nMax), 0},
  1198. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMin), 0},
  1199. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[1].nMax), 0},
  1200. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMin), 0},
  1201. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[2].aryRange[2].nMax), 0},
  1202. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].nPropKind), 0},
  1203. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMin), 0},
  1204. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[0].nMax), 0},
  1205. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMin), 0},
  1206. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[1].nMax), 0},
  1207. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMin), 0},
  1208. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[3].aryRange[2].nMax), 0},
  1209. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].nPropKind), 0},
  1210. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMin), 0},
  1211. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[0].nMax), 0},
  1212. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMin), 0},
  1213. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[1].nMax), 0},
  1214. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMin), 0},
  1215. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[4].aryRange[2].nMax), 0},
  1216. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].nPropKind), 0},
  1217. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMin), 0},
  1218. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[0].nMax), 0},
  1219. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMin), 0},
  1220. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[1].nMax), 0},
  1221. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMin), 0},
  1222. { PI_VARTYPE_INT,  (char*)&(pBuf->m_aryMagicAttribs[5].aryRange[2].nMax), 0},
  1223. };
  1224. // 逐个读入各项属性
  1225. return ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0]));
  1226. }
  1227. /******************************************************************************
  1228. 功能: 获取指定的装备的属性
  1229. 入口: i: 要求获取第i项装备的属性
  1230. 出口: 成功时返回指向该装备属性的指针(一个KBASICPROP_EQUIPMENT结构)
  1231. 失败时返回NULL
  1232. ******************************************************************************/
  1233. const KBASICPROP_EQUIPMENT_UNIQUE* KBPT_Equipment_Unique::GetRecord(int i) const
  1234. {
  1235. _ASSERT(this != NULL);
  1236. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1237. return (i >= 0 && i < m_nNumOfEntries) ?
  1238. (((KBASICPROP_EQUIPMENT_UNIQUE*)m_pBuf) + i) : NULL;
  1239. }
  1240. /******************************************************************************
  1241. 功能: 获取指定的唯一装备属性记录
  1242. 入口: nDetailType: 具体类别
  1243. nParticularType: 详细类别
  1244. nLevel: 等级
  1245. 出口: 成功时返回指向该记录的指针
  1246. 失败时返回NULL
  1247. ******************************************************************************/
  1248. const KBASICPROP_EQUIPMENT_UNIQUE*
  1249. KBPT_Equipment_Unique::FindRecord(IN int nDetailType,
  1250.   IN int nParticularType,
  1251.   IN int nLevel) const
  1252. {
  1253. _ASSERT(this != NULL);
  1254. const KBASICPROP_EQUIPMENT_UNIQUE* pData = NULL;
  1255. // 以下使用顺序查找的算法. 若原始数据是按m_nDetailType及m_nLevel排序的,
  1256. // 则可进行算法优化
  1257. for (int i = 0; i < m_nNumOfEntries; i++)
  1258. {
  1259. const KBASICPROP_EQUIPMENT_UNIQUE* pEqu;
  1260. pEqu = GetRecord(i);
  1261. _ASSERT(NULL != pEqu);
  1262. if (NULL == pEqu)
  1263. continue;
  1264. if (nDetailType == pEqu->m_nDetailType &&
  1265. nParticularType == pEqu->m_nParticularType &&
  1266. nLevel == pEqu->m_nLevel)
  1267. {
  1268. pData = pEqu;
  1269. break;
  1270. }
  1271. }
  1272. return pData;
  1273. }
  1274. //============================================================================
  1275. KBPT_MagicAttrib_TF::KBPT_MagicAttrib_TF()
  1276. {
  1277. m_nSizeOfEntry = sizeof(KMAGICATTRIB_TABFILE);
  1278. ::strcpy(m_szTabFile, TABFILE_MAGICATTRIB);
  1279. ::memset(&m_naryMACount, 0, sizeof(m_naryMACount));
  1280. }
  1281. KBPT_MagicAttrib_TF::~KBPT_MagicAttrib_TF()
  1282. {
  1283. }
  1284. BOOL KBPT_MagicAttrib_TF::LoadRecord(int i, KTabFile* pTF)
  1285. {
  1286. _ASSERT(pTF != NULL);
  1287. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1288. // 初始化
  1289. KMAGICATTRIB_TABFILE* pBuf = (KMAGICATTRIB_TABFILE*)m_pBuf;
  1290. pBuf = pBuf + i; // 读入的属性记在 pBuf 所指结构中
  1291. const PROPINFO aryPI[] =
  1292. {
  1293. { PI_VARTYPE_CHAR, pBuf->m_szName, sizeof(pBuf->m_szName)},
  1294. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nPos), 0},
  1295. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nClass), 0},
  1296. { PI_VARTYPE_INT,  (char*)&(pBuf->m_nLevel), 0},
  1297. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.nPropKind), 0},
  1298. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[0].nMin), 0},
  1299. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[0].nMax), 0},
  1300. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[1].nMin), 0},
  1301. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[1].nMax), 0},
  1302. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[2].nMin), 0},
  1303. { PI_VARTYPE_INT,  (char*)&(pBuf->m_MagicAttrib.aryRange[2].nMax), 0},
  1304. { PI_VARTYPE_CHAR, pBuf->m_szIntro, sizeof(pBuf->m_szIntro)},
  1305. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[0]), 0},
  1306. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[1]), 0},
  1307. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[2]), 0},
  1308. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[3]), 0},
  1309. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[4]), 0},
  1310. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[5]), 0},
  1311. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[6]), 0},
  1312. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[7]), 0},
  1313. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[8]), 0},
  1314. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[9]), 0},
  1315. { PI_VARTYPE_INT,  (char*)&(pBuf->m_DropRate[10]), 0}
  1316. };
  1317. // 逐个读入各项属性
  1318. if (FALSE == ::LoadRecord(pTF, i, aryPI, sizeof(aryPI)/ sizeof(aryPI[0])))
  1319. return FALSE;
  1320.     pBuf->m_nUseFlag = false;       // 初始化为没有使用
  1321. // 数据统计:每种装备可适用的魔法数目
  1322. for (int n = 0; n < MATF_CBDR; n++)
  1323. {
  1324. if (0 != pBuf->m_DropRate[n])
  1325. {
  1326. int nPos;
  1327. nPos = (0 == pBuf->m_nPos) ? 1 : 0;
  1328. m_naryMACount[nPos][n]++;
  1329. }
  1330. }
  1331. return TRUE;
  1332. }
  1333. /******************************************************************************
  1334. 功能: 获取指定的魔法属性
  1335. 入口: i: 要求获取第i项魔法属性
  1336. 出口: 成功时返回指向该魔法属性的指针(一个KMAGICATTRIB_TABFILE结构)
  1337. 失败时返回NULL
  1338. ******************************************************************************/
  1339. const KMAGICATTRIB_TABFILE* KBPT_MagicAttrib_TF::GetRecord(int i) const
  1340. {
  1341. _ASSERT(this != NULL);
  1342. _ASSERT(i >= 0 && i < m_nNumOfEntries);
  1343. return (i >= 0 && i < m_nNumOfEntries) ?
  1344. (((KMAGICATTRIB_TABFILE*)m_pBuf) + i) : NULL;
  1345. }
  1346. void KBPT_MagicAttrib_TF::GetMACount(int* pnCount) const
  1347. {
  1348. _ASSERT(this != NULL);
  1349. _ASSERT(pnCount != NULL);
  1350. ::memcpy(pnCount, m_naryMACount, sizeof(m_naryMACount));
  1351. }
  1352. //============================================================================
  1353. // Magic Item Index Table Class
  1354. KBPT_ClassMAIT::KBPT_ClassMAIT()
  1355. {
  1356. m_pnTable = NULL;
  1357. m_nSize = 0;
  1358. m_nNumOfValidData = 0;
  1359. }
  1360. KBPT_ClassMAIT::~KBPT_ClassMAIT()
  1361. {
  1362.     m_nSize = 0;
  1363. m_nNumOfValidData = 0;
  1364. if (m_pnTable)
  1365.     {
  1366.         delete []m_pnTable;
  1367.         m_pnTable = NULL;
  1368.     }
  1369. }
  1370. /******************************************************************************
  1371. 功能: 将索引表清空,并不释放内存
  1372. 入口:
  1373. 出口: 成功返回非零,失败返回零
  1374. 说明:
  1375. ******************************************************************************/
  1376. BOOL KBPT_ClassMAIT::Clear()
  1377. {
  1378.     m_nNumOfValidData = 0; 
  1379.     
  1380.     return true;   
  1381. }
  1382. /******************************************************************************
  1383. 功能: 从索引表中取值
  1384. 入口: i: 从索引表中该位置取值
  1385. 出口: 返回所取的值
  1386. 说明: 若返回值为nItemIndex, 则调用KLibOfBPT::m_BPTMagicAttrib.GetRecord(nItemIndex)
  1387.             可获得对应的魔法属性
  1388. ******************************************************************************/
  1389. int KBPT_ClassMAIT::Get(int i) const
  1390. {
  1391. _ASSERT(this != NULL);
  1392. _ASSERT(i >= 0 && i < m_nNumOfValidData);
  1393.     _ASSERT(m_pnTable);
  1394. return m_pnTable[i];
  1395. }
  1396. /******************************************************************************
  1397. 功能: 给索引表插入一个新的值
  1398. 入口: nItemIndex: 欲赋之值
  1399. 出口: 成功时返回非零, m_pnTable[m_nNumOfValidData]为所赋之值
  1400. m_nNumOfValidData指向下一空位
  1401. 失败时返回零
  1402. ******************************************************************************/
  1403. BOOL KBPT_ClassMAIT::Insert(int nItemIndex)
  1404. {
  1405.     int nResult = false;
  1406. _ASSERT(this != NULL);
  1407. _ASSERT(nItemIndex >= 0); // nData 为数组下标
  1408.     if (!m_pnTable)
  1409.     {
  1410.         m_pnTable = new int [4];
  1411.         if (!m_pnTable)
  1412.             goto Exit0;
  1413.         m_nNumOfValidData = 0;
  1414.         m_nSize = 4;
  1415.     }
  1416.     if (m_nNumOfValidData >= m_nSize)
  1417.     {
  1418.         int *pnaryTemp = new int [m_nSize + 8];
  1419.         if (!pnaryTemp)
  1420.             goto Exit0;
  1421.         memcpy(pnaryTemp, m_pnTable, m_nNumOfValidData * sizeof(int));
  1422.         m_nSize += 8;
  1423.         delete []m_pnTable;
  1424.         m_pnTable = pnaryTemp;
  1425.         pnaryTemp = NULL;
  1426.     }
  1427. m_pnTable[m_nNumOfValidData++] = nItemIndex;
  1428.     nResult = true;
  1429. Exit0:
  1430.     return nResult;
  1431. }
  1432. //============================================================================
  1433. KBPT_ClassifiedMAT::KBPT_ClassifiedMAT()
  1434. {
  1435. m_pnTable = NULL;
  1436. m_nSize = 0;
  1437. m_nNumOfValidData = 0;
  1438. }
  1439. KBPT_ClassifiedMAT::~KBPT_ClassifiedMAT()
  1440. {
  1441. ReleaseMemory();
  1442. }
  1443. /******************************************************************************
  1444. 功能: 为索引表分配内存
  1445. 入口: nCount: 索引表大小(数据项的数目)
  1446. 出口: m_pnTable 指向分配的内存
  1447. m_nSize = nCount
  1448. ******************************************************************************/
  1449. BOOL KBPT_ClassifiedMAT::GetMemory(int nCount)
  1450. {
  1451. _ASSERT(this != NULL);
  1452. _ASSERT(nCount > 0);
  1453. _ASSERT(NULL == m_pnTable);
  1454. _ASSERT(0 == m_nSize);
  1455. BOOL bEC = FALSE;
  1456. int* pnBuf = new int[nCount];
  1457. if (pnBuf)
  1458. {
  1459. m_pnTable = pnBuf;
  1460. m_nSize = nCount;
  1461. bEC = TRUE;
  1462. }
  1463. return bEC;
  1464. }
  1465. /******************************************************************************
  1466. 功能: 释放索引表所用的内存
  1467. ******************************************************************************/
  1468. void KBPT_ClassifiedMAT::ReleaseMemory()
  1469. {
  1470. if (m_pnTable)
  1471. {
  1472. delete []m_pnTable;
  1473. m_pnTable = NULL;
  1474. m_nSize = 0;
  1475. }
  1476. }
  1477. /******************************************************************************
  1478. 功能: 给索引表赋值
  1479. 入口: nData: 欲赋之值
  1480. 出口: 成功时返回非零, m_pnTable[m_nNumOfValidData]为所赋之值
  1481. m_nNumOfValidData指向下一空位
  1482. 失败时返回零
  1483. ******************************************************************************/
  1484. BOOL KBPT_ClassifiedMAT::Set(int nData)
  1485. {
  1486. _ASSERT(this != NULL);
  1487. _ASSERT(nData >= 0); // nData 为数组下标
  1488. _ASSERT(m_nNumOfValidData >= 0 && m_nNumOfValidData < m_nSize);
  1489. m_pnTable[m_nNumOfValidData++] = nData;
  1490. return TRUE;
  1491. }
  1492. /******************************************************************************
  1493. 功能: 从索引表中取值
  1494. 入口: nIndex: 从索引表中该位置取值
  1495. 出口: 返回所取的值
  1496. 说明: 若返回值为i, 则调用KLibOfBPT::m_BPTMagicAttrib.GetRecord(i)可获得
  1497. 对应的魔法属性
  1498. ******************************************************************************/
  1499. int KBPT_ClassifiedMAT::Get(int nIndex) const
  1500. {
  1501. _ASSERT(this != NULL);
  1502. _ASSERT(nIndex >= 0 && nIndex < m_nSize);
  1503. return (nIndex >= 0 && nIndex < m_nSize) ? m_pnTable[nIndex] : 0;
  1504. }
  1505. /******************************************************************************
  1506. 功能: 将数据导出到给定的缓冲区中
  1507. 入口: pnaryBuf: 级冲区指针
  1508. *pnCount: 缓冲区可容纳多少个int型数据
  1509. 出口: 成功时返回非零, 数据被导出到缓冲区中, *pnCount 给出数据个数
  1510. 失败时返回零
  1511. ******************************************************************************/
  1512. BOOL KBPT_ClassifiedMAT::GetAll(int* pnaryBuf, int* pnCount) const
  1513. {
  1514. _ASSERT(this != NULL);
  1515. _ASSERT(pnaryBuf != NULL);
  1516. _ASSERT(pnCount != NULL);
  1517. BOOL bEC = FALSE;
  1518. if (pnaryBuf && pnCount && *pnCount > 0)
  1519. {
  1520. int nLength = *pnCount;
  1521. if(m_nSize< nLength) nLength = m_nSize;
  1522. ::memcpy(pnaryBuf, m_pnTable, nLength*sizeof(int));
  1523. *pnCount = nLength;
  1524. bEC = TRUE;
  1525. }
  1526. return bEC;
  1527. }