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

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include "KItem.h"
  3. #include "MyAssert.H"
  4. #include "KInventory.h"
  5. KInventory::KInventory()
  6. {
  7. m_pArray = NULL;
  8. m_nWidth = 0;
  9. m_nHeight = 0;
  10. }
  11. KInventory::~KInventory()
  12. {
  13.     Release();
  14. }
  15. BOOL KInventory::Init(int nWidth, int nHeight)
  16. {
  17. if (m_pArray)
  18. {
  19. delete [] m_pArray;
  20. m_pArray = NULL;
  21. }
  22. m_pArray = new int[nWidth * nHeight];
  23. if (!m_pArray)
  24. return FALSE;
  25. ZeroMemory(m_pArray, sizeof(int) * nWidth * nHeight);
  26. m_nWidth = nWidth;
  27. m_nHeight = nHeight;
  28. return TRUE;
  29. }
  30. void KInventory::Release()
  31. {
  32. if (m_pArray)
  33. {
  34. delete []m_pArray;
  35. }
  36. m_pArray = NULL;
  37. this->m_nWidth = 0;
  38. this->m_nHeight = 0;
  39. this->m_nMoney = 0;
  40. }
  41. void KInventory::Clear()
  42. {
  43. if (m_pArray)
  44. memset(m_pArray, 0, sizeof(int) * m_nWidth * m_nHeight);
  45. m_nMoney = 0;
  46. }
  47. #pragma optimize( "y", off)
  48. BOOL KInventory::PlaceItem(int nX, int nY, int nIdx, int nWidth, int nHeight)
  49. {
  50. if (!m_pArray)
  51. return FALSE;
  52. if (nX < 0 || nY < 0 || nWidth < 1 || nHeight < 1 || nX + nWidth > m_nWidth || nY + nHeight > m_nHeight)
  53. return FALSE;
  54. if (nIdx <= 0)
  55. {
  56. _ASSERT(0);
  57. return FALSE;
  58. }
  59. int i, j;
  60. int nOldIdx = 0;
  61. for (i = nX; i < nX + nWidth; i++)
  62. {
  63. for (j = nY; j < nY + nHeight; j++)
  64. {
  65. if (!nOldIdx)
  66. nOldIdx = m_pArray[j * m_nWidth + i];
  67. // 位置上有东西
  68. if (nOldIdx)
  69. {
  70. // 位置上有多个东西,无法放置
  71. if (nOldIdx != m_pArray[j * m_nWidth + i])
  72. return FALSE;
  73. /*#pragma message(ATTENTION("需要在道具系统完成后去检查是否可叠放"))
  74. // 检查是否为可叠放物品
  75. if (Item[nIdx].CanStack(nOldIdx) && i == nX && j == nY)
  76. {
  77. return Item[nOldIdx].Stack(nIdx);
  78. } // 检查是否是容器
  79. else if (Item[nOldIdx].IsReceptacle())
  80. {
  81. return Item[nOldIdx].HoldItem(nIdx);
  82. }
  83. */
  84. return FALSE;
  85. }
  86. }
  87. }
  88. // Set Item Idx to Inventory
  89. for (i = nX; i < nX + nWidth; i++)
  90. {
  91. for (j = nY; j < nY + nHeight; j++)
  92. {
  93. m_pArray[j * m_nWidth + i] = nIdx;
  94. }
  95. }
  96. #ifdef _DEBUG
  97. //#define _DEBUG_ITEM 1
  98. #ifdef _DEBUG_ITEM
  99. for (int kk = 0; kk < 10; kk++)
  100. {
  101. g_DebugLog("%d%d%d%d%d%d", 
  102. m_pArray[kk * m_nWidth],
  103. m_pArray[kk * m_nWidth + 1],
  104. m_pArray[kk * m_nWidth + 2],
  105. m_pArray[kk * m_nWidth + 3],
  106. m_pArray[kk * m_nWidth + 4],
  107. m_pArray[kk * m_nWidth + 5]);
  108. }
  109. #endif
  110. #endif
  111. return TRUE;
  112. }
  113. #pragma optimize( "", on)
  114. BOOL KInventory::HoldItem(int nIdx, int nWidth, int nHeight)
  115. {
  116. int i, j;
  117. for (i = 0; i < m_nWidth - nWidth + 1; i++)
  118. {
  119. for (j = 0; j < m_nHeight - nHeight + 1; j++)
  120. {
  121. if (PlaceItem(i, j, nIdx, nWidth, nHeight))
  122. return TRUE;
  123. }
  124. }
  125. return FALSE;
  126. }
  127. BOOL KInventory::PickUpItem(int nIdx, int nX, int nY, int nWidth, int nHeight)
  128. {
  129. if (nX < 0 || nY < 0 || nWidth < 1  || nHeight < 1 || nX + nWidth > this->m_nWidth || nY + nHeight > this->m_nHeight)
  130. return FALSE;
  131. int i;
  132. for (i = nX; i < nX + nWidth; i++)
  133. {
  134. for (int j = nY; j < nY + nHeight; j++)
  135. {
  136. if (m_pArray[j * m_nWidth + i] != nIdx)
  137. {
  138. _ASSERT(0);
  139. return FALSE;
  140. }
  141. }
  142. }
  143. for (i = nX; i < nX + nWidth; i++)
  144. {
  145. for (int j = nY; j < nY + nHeight; j++)
  146. {
  147. m_pArray[j * m_nWidth + i] = 0;
  148. }
  149. }
  150. return TRUE;
  151. }
  152. int KInventory::FindItem(int nX, int nY)
  153. {
  154. if (!m_pArray)
  155. return -1;
  156. if (nX < 0 || nX >= this->m_nWidth || nY < 0 || nY >= this->m_nHeight)
  157. return -1;
  158. int nPos = nY * m_nWidth + nX;
  159. int *pArray = &m_pArray[nPos];
  160. if (*pArray <= 0)
  161. return 0;
  162. int nIdx = *pArray;
  163. if ((nPos > 0 && *(pArray - 1) == nIdx) || (nPos >= m_nWidth && *(pArray - m_nWidth) == nIdx))
  164. return -1;
  165. return nIdx;
  166. /*
  167. for (int i = 0; i < nY * m_nWidth + nX; i++)
  168. {
  169. if (m_pArray[i] == nIdx)
  170. return -1;
  171. }
  172. return nIdx;
  173. */
  174. }
  175. BOOL KInventory::FindRoom(int nWidth, int nHeight, POINT* pPos)
  176. {
  177. if (!pPos)
  178. return FALSE;
  179. if (nWidth < 1 || nWidth > m_nWidth || nHeight < 1 || nHeight > m_nHeight)
  180. return FALSE;
  181. int i, j;
  182. for (i = 0; i < m_nWidth - nWidth + 1; i++)
  183. {
  184. for (j = 0; j < m_nHeight - nHeight + 1; j++)
  185. {
  186. if (CheckRoom(i, j, nWidth, nHeight))
  187. {
  188. pPos->x = i;
  189. pPos->y = j;
  190. return TRUE;
  191. }
  192. }
  193. }
  194. pPos->x = 0;
  195. pPos->y = 0;
  196. return FALSE;
  197. }
  198. BOOL KInventory::CheckRoom(int nX, int nY, int nWidth, int nHeight)
  199. {
  200. if (!m_pArray)
  201. {
  202. _ASSERT(0);
  203. return FALSE;
  204. }
  205. if (nX < 0 || nY < 0 || nWidth < 1 || nHeight < 1 || nX + nWidth > m_nWidth || nY + nHeight > m_nHeight)
  206. return FALSE;
  207. int i, j;
  208. int nOldIdx = 0;
  209. for (i = nX; i < nX + nWidth; i++)
  210. {
  211. for (j = nY; j < nY + nHeight; j++)
  212. {
  213. if (m_pArray[j * m_nWidth + i])
  214. {
  215. return FALSE;
  216. }
  217. }
  218. }
  219. return TRUE;
  220. }
  221. BOOL KInventory::AddMoney(int nMoney)
  222. {
  223. if (m_nMoney + nMoney < 0)
  224. return FALSE;
  225. m_nMoney += nMoney;
  226. return TRUE;
  227. }
  228. int KInventory::GetNextItem(int nStartIdx, int nXpos, int nYpos, int *pX, int *pY)
  229. {
  230. if (!m_pArray)
  231. return 0;
  232. if (nXpos < 0 || nYpos < 0 || nXpos >= m_nWidth || nYpos >= m_nHeight || !pX || !pY)
  233. return 0;
  234. int nSize = m_nWidth * m_nHeight;
  235. int i = nYpos * m_nWidth + nXpos;
  236. int *pArray = &m_pArray[i];
  237. for ( ; i < nSize; i++, pArray++)
  238. {
  239. if (*pArray <= 0)
  240. continue;
  241. if (*pArray == nStartIdx)
  242. continue;
  243. if (i < m_nWidth || pArray[-m_nWidth] != *pArray)
  244. {
  245. *pX = i % m_nWidth;
  246. *pY = i / m_nWidth;
  247. return *pArray;
  248. }
  249. }
  250. return 0;
  251. }
  252. int KInventory::CalcSameDetailType(int nGenre, int nDetail)
  253. {
  254. if (!m_pArray)
  255. return 0;
  256. int nNum = 0;
  257. int nCurIdx = 0;
  258. int nSize = m_nWidth * m_nHeight;
  259. int *pArray = m_pArray;
  260. for (int i = 0; i < nSize; i++)
  261. {
  262. if (*pArray <= 0)
  263. {
  264. pArray++;
  265. continue;
  266. }
  267. if (nCurIdx == *pArray)
  268. {
  269. pArray++;
  270. continue;
  271. }
  272. if (i < m_nWidth || pArray[-m_nWidth] != *pArray)
  273. {
  274. nCurIdx = *pArray;
  275. if (Item[nCurIdx].GetGenre() == nGenre && Item[nCurIdx].GetDetailType() == nDetail)
  276. nNum++;
  277. }
  278. pArray++;
  279. }
  280. return nNum;
  281. }
  282. BOOL KInventory::FindEmptyPlace(int nWidth, int nHeight, POINT *pPos)
  283. {
  284. if (!m_pArray)
  285. return FALSE;
  286. if (!pPos || nWidth <= 0 || nHeight <= 0 || nWidth > m_nWidth || nHeight > m_nHeight)
  287. return FALSE;
  288. int i, j, nIdx, a, b, nFind;
  289. for (i = 0; i < m_nHeight - nHeight + 1; i++)
  290. {
  291. for (j = 0; j < m_nWidth - nWidth + 1; )
  292. {
  293. nIdx = m_pArray[i * m_nWidth + j];
  294. if (nIdx)
  295. {
  296. _ASSERT(Item[nIdx].GetWidth() > 0);
  297. j += Item[nIdx].GetWidth();
  298. }
  299. else
  300. {
  301. nFind = 1;
  302. for (a = i; a < i + nHeight; a++)
  303. {
  304. for (b = j; b < j + nWidth; b++)
  305. {
  306. if (m_pArray[a * m_nWidth + b])
  307. {
  308. nFind = 0;
  309. break;
  310. }
  311. }
  312. if (nFind == 0)
  313. break;
  314. }
  315. if (nFind)
  316. {
  317. pPos->x = a;
  318. pPos->y = b;
  319. return TRUE;
  320. }
  321. j++;
  322. }
  323. }
  324. }
  325. return FALSE;
  326. }
  327. //---------------------------------------------------------------------------------
  328. // 功能:输入物品类型和具体类型,察看Inventory里面有没有相同的物品,输出位置和编号
  329. //---------------------------------------------------------------------------------
  330. BOOL KInventory::FindSameDetailType(int nGenre, int nDetail, int *pnIdx, int *pnX, int *pnY)
  331. {
  332. if (!m_pArray)
  333. return FALSE;
  334. if (!pnIdx || !pnX || !pnY)
  335. return FALSE;
  336. int *pArray = m_pArray;
  337. int i, nSize = m_nWidth * m_nHeight;
  338. for (i = 0; i < nSize; i++, pArray++)
  339. {
  340. if (*pArray <= 0)
  341. continue;
  342. if (Item[*pArray].GetGenre() == nGenre && Item[*pArray].GetDetailType() == nDetail)
  343. {
  344. *pnIdx = *pArray;
  345. *pnX = i % m_nWidth;
  346. *pnY = i / m_nWidth;
  347. return TRUE;
  348. }
  349. }
  350. return FALSE;
  351. /*
  352. int j;
  353. for (i = 0; i < this->m_nHeight; i++)
  354. {
  355. for (j = 0; j < this->m_nWidth; j++)
  356. {
  357. if (!m_pArray[i * m_nWidth + j])
  358. continue;
  359. if (Item[m_pArray[i * m_nWidth + j]].GetGenre() != nGenre)
  360. continue;
  361. if (Item[m_pArray[i * m_nWidth + j]].GetDetailType() != nDetail)
  362. continue;
  363. *pnIdx = m_pArray[i * m_nWidth + j];
  364. *pnX = j;
  365. *pnY = i;
  366. return TRUE;
  367. }
  368. }
  369. return FALSE;
  370. */
  371. }
  372. //---------------------------------------------------------------------------------
  373. // 功能:输入物品类型和具体类型,察看Inventory里面有没有相同的物品
  374. //---------------------------------------------------------------------------------
  375. BOOL KInventory::CheckSameDetailType(int nGenre, int nDetail)
  376. {
  377. if (!m_pArray)
  378. return FALSE;
  379. int *pArray = m_pArray;
  380. int i, nSize = m_nWidth * m_nHeight;
  381. for (i = 0; i < nSize; i++, pArray++)
  382. {
  383. if (*pArray <= 0)
  384. continue;
  385. if (Item[*pArray].GetGenre() == nGenre && Item[*pArray].GetDetailType() == nDetail)
  386. return TRUE;
  387. }
  388. return FALSE;
  389. }