MapHandler.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:39k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2.                                                                                                                    
  3. 葛碘疙:
  4. 累己磊:
  5. 累己老:
  6. [老磊][荐沥磊] : 荐沥 郴侩
  7.                                                                                                                    
  8. *******************************************************************************************************************/
  9. #include "StdAfx.h"
  10. /******************************************************************************************************************
  11. 窃荐疙 : CMapHandler::CMapHandler()
  12. 累己磊 : 
  13. 累己老 : 
  14. 格利   : 
  15. 免仿   : 
  16. [老磊][荐沥磊] : 荐沥郴侩
  17. *******************************************************************************************************************/
  18. CMapHandler::CMapHandler()
  19. {
  20. InitMapHandler();
  21. }
  22. /******************************************************************************************************************
  23. 窃荐疙 : CMapHandler::~CMapHandler()
  24. 累己磊 : 
  25. 累己老 : 
  26. 格利   : 
  27. 免仿   : 
  28. [老磊][荐沥磊] : 荐沥郴侩
  29. *******************************************************************************************************************/
  30. CMapHandler::~CMapHandler()
  31. {
  32. DestroyMapHandler();
  33. }
  34. /******************************************************************************************************************
  35. 窃荐疙 : CMapHandler::InitMapHandler()
  36. 累己磊 : 
  37. 累己老 : 
  38. 格利   : 
  39. 免仿   : VOID 
  40. [老磊][荐沥磊] : 荐沥郴侩
  41. *******************************************************************************************************************/
  42. VOID CMapHandler::InitMapHandler()
  43. {
  44. m_pstTileInfo = NULL;
  45. m_pstCellInfo = NULL;
  46. // m_pstDoorInfo = NULL;
  47. // m_pbCellIDoorIdx = NULL;
  48. m_shStartViewTileX = 0;
  49. m_shStartViewTileY = 0;
  50. m_shViewOffsetX = 0;
  51. m_shViewOffsetY = 0;
  52. // m_bDoorCount = 0;
  53. m_ptMovePixelArray[0].x =  8; m_ptMovePixelArray[0].y =  5;
  54. m_ptMovePixelArray[1].x = 16; m_ptMovePixelArray[1].y = 11;
  55. m_ptMovePixelArray[2].x = 24; m_ptMovePixelArray[2].y = 16;
  56. m_ptMovePixelArray[3].x = 32; m_ptMovePixelArray[3].y = 21;
  57. m_ptMovePixelArray[4].x = 40; m_ptMovePixelArray[4].y = 27;
  58. m_ptMovePixelArray[5].x = 48; m_ptMovePixelArray[5].y = 32;
  59. ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
  60. ZeroMemory(m_bAniTileFrame, sizeof(BYTE)*8*16);
  61. ZeroMemory(m_dwAniSaveTime, sizeof(DWORD)*8);
  62. ZeroMemory(&m_stMapFileHeader, sizeof(MAPFILEHEADER));
  63. SetRect(&m_rcView, 0, 0, _VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
  64. ZeroMemory(m_pxTileImg, sizeof(CWHWilImageData*)*_MAX_TILE_FILE);
  65. }
  66. VOID CMapHandler::LoadMapHandler(CHAR* szMapFile, CImageHandler* pxImgHandler, INT nX, INT nY)
  67. {
  68. InitMapHandler();
  69. LoadMapData(szMapFile);
  70. LoadMapImage(pxImgHandler);
  71. LoadNewMapBuffer();
  72. SetStartViewTile(nX, nY);
  73. }
  74. /******************************************************************************************************************
  75. 窃荐疙 : CMapHandler::DestroyMapHandler()
  76. 累己磊 : 
  77. 累己老 : 
  78. 格利   : 
  79. 免仿   : VOID 
  80. [老磊][荐沥磊] : 荐沥郴侩
  81. *******************************************************************************************************************/
  82. VOID CMapHandler::DestroyMapHandler()
  83. {
  84. // INT nCnt;
  85. SAFE_DELETE(m_pstTileInfo);
  86. SAFE_DELETE(m_pstCellInfo);
  87. /* for ( nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  88. {
  89. SAFE_DELETE(m_pstDoorInfo[nCnt].pstDoorImgInfo);
  90. }
  91. SAFE_DELETE(m_pstDoorInfo);
  92. SAFE_DELETE(m_pbCellIDoorIdx);*/
  93. InitMapHandler();
  94. }
  95. /******************************************************************************************************************
  96. 窃荐疙 : CMapHandler::LoadNewMapBuffer()
  97. 累己磊 : 
  98. 累己老 : 
  99. 格利   : 
  100. 免仿   : VOID 
  101. [老磊][荐沥磊] : 荐沥郴侩
  102. *******************************************************************************************************************/
  103. VOID CMapHandler::LoadNewMapBuffer()
  104. {
  105. INT nFileIdx, nImgIdx;
  106. INT nXCnt, nYCnt;
  107. ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
  108. for ( nXCnt = m_shStartViewTileX; nXCnt < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nXCnt++ )
  109. for ( nYCnt = m_shStartViewTileY; nYCnt < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nYCnt++ )
  110. {
  111. if ( nXCnt >= m_stMapFileHeader.shWidth || nYCnt >= m_stMapFileHeader.shHeight || nXCnt < 0 || nYCnt < 0 )
  112. continue; 
  113. if( !( nXCnt % 2 ) && !( nYCnt % 2 ) && nYCnt < m_shStartViewTileY+_VIEW_CELL_Y_COUNT )
  114.   {
  115.   nFileIdx= m_pstTileInfo[(nYCnt/2) + (nXCnt/2)*m_stMapFileHeader.shHeight/2].bFileIdx;
  116. nImgIdx = m_pstTileInfo[(nYCnt/2) + (nXCnt/2)*m_stMapFileHeader.shHeight/2].wTileIdx;
  117.   if( nFileIdx != 255 && nImgIdx != 65535 )
  118. {
  119. m_pxTileImg[nFileIdx]->NewSetIndex(nImgIdx);
  120. g_xMainWnd.DrawWithImageForCompMemToMem(
  121. (nXCnt-m_shStartViewTileX)*_CELL_WIDTH ,
  122. (nYCnt-m_shStartViewTileY)*_CELL_HEIGHT,
  123. m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  124. m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  125. (WORD*)m_pxTileImg[nFileIdx]->m_pbCurrImage,
  126. _VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT, m_wSavedMapBuffer);
  127. }
  128. }
  129. }
  130. }
  131. /******************************************************************************************************************
  132. 窃荐疙 : CMapHandler::LoadMapData()
  133. 累己磊 : 
  134. 累己老 : 
  135. 格利   : 
  136. 涝仿   : CHAR* szMapFile
  137. 免仿   : BOOL 
  138. [老磊][荐沥磊] : 荐沥郴侩
  139. *******************************************************************************************************************/
  140. BOOL CMapHandler::LoadMapData(CHAR* szMapFile)
  141. {
  142. HANDLE hFile;
  143. char szFullPath[128];
  144. sprintf(szFullPath, ".\Map\%s.map", szMapFile);
  145. hFile = CreateFile(szFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  146. if ( hFile != INVALID_HANDLE_VALUE )
  147. {
  148. DWORD dwReadLen;
  149. FreeMapData();
  150. ReadFile(hFile, &m_stMapFileHeader, sizeof(MAPFILEHEADER), &dwReadLen, NULL);
  151. m_pstTileInfo = new TILEINFO[(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight)/4];
  152. ReadFile(hFile, m_pstTileInfo, sizeof(TILEINFO)*(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight)/4, &dwReadLen, NULL);
  153. m_pstCellInfo = new CELLINFO[m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight];
  154. ReadFile(hFile, m_pstCellInfo, sizeof(CELLINFO)*(m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight), &dwReadLen, NULL);
  155. LoadNewMapBuffer();
  156. // ReadFile(hFile, &m_bDoorCount, sizeof(BYTE), &dwReadLen, NULL);
  157. /* m_pstDoorInfo = new DOORINFO[m_bDoorCount];
  158. for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  159. {
  160. ReadFile(hFile, &m_pstDoorInfo[nCnt], sizeof(DOORINFO), &dwReadLen, NULL);
  161. m_pstDoorInfo[nCnt].pstDoorImgInfo = new DOORIMAGEINFO[m_pstDoorInfo[nCnt].bDoorImgCnt];
  162. for ( INT nLoop = 0; nLoop < m_pstDoorInfo[nCnt].bDoorImgCnt; nLoop++ )
  163. {
  164. ReadFile(hFile, &m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop], sizeof(DOORIMAGEINFO), &dwReadLen, NULL);
  165. }
  166. }
  167. m_pbCellIDoorIdx = new BYTE[m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight];
  168. ZeroMemory(m_pbCellIDoorIdx, sizeof(BYTE)*m_stMapFileHeader.shWidth*m_stMapFileHeader.shHeight);
  169. SetDoorIndex();
  170. */
  171. CloseHandle(hFile);
  172. return TRUE;
  173. }
  174. return FALSE;
  175. }
  176. /******************************************************************************************************************
  177. 窃荐疙 : CMapHandler::LoadMapImage(CImageHandler* pxImgHandler)
  178. 累己磊 : 
  179. 累己老 : 
  180. 格利   : 
  181. 免仿   : VOID 
  182. [老磊][荐沥磊] : 荐沥郴侩
  183. *******************************************************************************************************************/
  184. VOID CMapHandler::LoadMapImage(CImageHandler* pxImgHandler)
  185. {
  186. m_pxTileImg[0]  = &(pxImgHandler->m_xImageList[_IMAGE_TILES]);
  187. m_pxTileImg[1]  = &(pxImgHandler->m_xImageList[_IMAGE_TILES30]);
  188. m_pxTileImg[2]  = &(pxImgHandler->m_xImageList[_IMAGE_TILES5]);
  189. m_pxTileImg[3]  = &(pxImgHandler->m_xImageList[_IMAGE_SMTILES]);
  190. m_pxTileImg[4]  = &(pxImgHandler->m_xImageList[_IMAGE_HOUSES]);
  191. m_pxTileImg[5]  = &(pxImgHandler->m_xImageList[_IMAGE_CLIFFS]);
  192. m_pxTileImg[6]  = &(pxImgHandler->m_xImageList[_IMAGE_DUNGEONS]);
  193. m_pxTileImg[7]  = &(pxImgHandler->m_xImageList[_IMAGE_INNERS]);
  194. m_pxTileImg[8]  = &(pxImgHandler->m_xImageList[_IMAGE_FUNITURES]);
  195. m_pxTileImg[9]  = &(pxImgHandler->m_xImageList[_IMAGE_WALLS]);
  196. m_pxTileImg[10] = &(pxImgHandler->m_xImageList[_IMAGE_SMOBJECTS]);
  197. m_pxTileImg[11] = &(pxImgHandler->m_xImageList[_IMAGE_ANIMATIONS]);
  198. m_pxTileImg[12] = &(pxImgHandler->m_xImageList[_IMAGE_OBJECT1]);
  199. m_pxTileImg[13] = &(pxImgHandler->m_xImageList[_IMAGE_OBJECT2]);
  200. }
  201. /******************************************************************************************************************
  202. 窃荐疙 : CMapHandler::FreeMapData()
  203. 累己磊 : 
  204. 累己老 : 
  205. 格利   : 
  206. 免仿   : VOID 
  207. [老磊][荐沥磊] : 荐沥郴侩
  208. *******************************************************************************************************************/
  209. VOID CMapHandler::FreeMapData()
  210. {
  211. ZeroMemory(&m_stMapFileHeader, sizeof(MAPFILEHEADER));
  212. ZeroMemory(m_wSavedMapBuffer, sizeof(WORD)*_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT);
  213. SAFE_DELETE(m_pstTileInfo);
  214. SAFE_DELETE(m_pstCellInfo);
  215. /* for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  216. {
  217. SAFE_DELETE(m_pstDoorInfo[nCnt].pstDoorImgInfo);
  218. }
  219. SAFE_DELETE(m_pstDoorInfo);
  220. SAFE_DELETE(m_pbCellIDoorIdx);
  221. m_bDoorCount = 0;*/
  222. }
  223. /******************************************************************************************************************
  224. 窃荐疙 : CMapHandler::ScrollMap()
  225. 累己磊 : 
  226. 累己老 : 
  227. 格利   : 
  228. 涝仿   : INT nCharDir
  229.          INT nCharFrame
  230.          INT nSpeed
  231. 免仿   : VOID 
  232. [老磊][荐沥磊] : 荐沥郴侩
  233. *******************************************************************************************************************/
  234. VOID CMapHandler::ScrollMap(INT nCharDir, INT nCharFrame, INT nSpeed)
  235. {
  236. nCharFrame %= 10;
  237. switch ( nCharDir )
  238. {
  239. // 流急 困肺 捞悼.
  240. case _DIRECTION_LIST_1:
  241. m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
  242. break;
  243. // 坷弗率困肺 捞悼.
  244. case _DIRECTION_LIST_2:
  245. m_shViewOffsetX =  (m_ptMovePixelArray[nCharFrame].x * nSpeed);
  246. m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
  247. break;
  248. // 坷弗率栏肺 捞悼.
  249. case _DIRECTION_LIST_3:
  250. m_shViewOffsetX =  (m_ptMovePixelArray[nCharFrame].x * nSpeed);
  251. break;
  252. // 坷弗率酒贰肺 捞悼.
  253. case _DIRECTION_LIST_4:
  254. m_shViewOffsetX =  (m_ptMovePixelArray[nCharFrame].x * nSpeed);
  255. m_shViewOffsetY =  (m_ptMovePixelArray[nCharFrame].y * nSpeed);
  256. break;
  257. // 流急 酒贰肺 捞悼.
  258. case _DIRECTION_LIST_5:
  259. m_shViewOffsetY =  (m_ptMovePixelArray[nCharFrame].y * nSpeed);
  260. break;
  261. // 哭率酒贰肺 捞悼.
  262. case _DIRECTION_LIST_6:
  263. m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
  264. m_shViewOffsetY =  (m_ptMovePixelArray[nCharFrame].y * nSpeed);
  265. break;
  266. // 哭率栏肺 捞悼.
  267. case _DIRECTION_LIST_7:
  268. m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
  269. break;
  270. // 哭率困肺 捞悼.
  271. case _DIRECTION_LIST_8:
  272. m_shViewOffsetX = -(m_ptMovePixelArray[nCharFrame].x * nSpeed);
  273. m_shViewOffsetY = -(m_ptMovePixelArray[nCharFrame].y * nSpeed);
  274. break;
  275. }
  276. }
  277. VOID CMapHandler::ScrollMap(INT nCharDir, WORD wCurrDelay, WORD wMoveDelay, INT nSpeed)
  278. {
  279. FLOAT fViewOffSetX = (FLOAT)((FLOAT)((wCurrDelay+1)/wMoveDelay) * _CELL_WIDTH ) * nSpeed;
  280. FLOAT fViewOffSetY = (FLOAT)((FLOAT)((wCurrDelay+1)/wMoveDelay) * _CELL_HEIGHT) * nSpeed;
  281. switch ( nCharDir )
  282. {
  283. // 流急 困肺 捞悼.
  284. case _DIRECTION_LIST_1:
  285. m_shViewOffsetY -= (SHORT)-fViewOffSetY;
  286. break;
  287. // 坷弗率困肺 捞悼.
  288. case _DIRECTION_LIST_2:
  289. m_shViewOffsetX = (SHORT)fViewOffSetX;
  290. m_shViewOffsetY = (SHORT)-fViewOffSetY;
  291. break;
  292. // 坷弗率栏肺 捞悼.
  293. case _DIRECTION_LIST_3:
  294. m_shViewOffsetX = (SHORT)fViewOffSetX;
  295. break;
  296. // 坷弗率酒贰肺 捞悼.
  297. case _DIRECTION_LIST_4:
  298. m_shViewOffsetX = (SHORT)fViewOffSetX;
  299. m_shViewOffsetY = (SHORT)fViewOffSetY;
  300. break;
  301. // 流急 酒贰肺 捞悼.
  302. case _DIRECTION_LIST_5:
  303. m_shViewOffsetY = (SHORT)fViewOffSetY;
  304. break;
  305. // 哭率酒贰肺 捞悼.
  306. case _DIRECTION_LIST_6:
  307. m_shViewOffsetX = (SHORT)-fViewOffSetX;
  308. m_shViewOffsetY = (SHORT)fViewOffSetY;
  309. break;
  310. // 哭率栏肺 捞悼.
  311. case _DIRECTION_LIST_7:
  312. m_shViewOffsetX = (SHORT)-fViewOffSetX;
  313. break;
  314. // 哭率困肺 捞悼.
  315. case _DIRECTION_LIST_8:
  316. m_shViewOffsetX = (SHORT)fViewOffSetX;
  317. m_shViewOffsetY = (SHORT)-fViewOffSetY;
  318. break;
  319. }
  320. }
  321. /******************************************************************************************************************
  322. 窃荐疙 : CMapHandler::DrawBaseTile()
  323. 累己磊 : 
  324. 累己老 : 
  325. 格利   : 
  326. 涝仿   : INT nX
  327.          INT nY
  328. 免仿   : VOID 
  329. [老磊][荐沥磊] : 荐沥郴侩
  330. *******************************************************************************************************************/
  331. VOID CMapHandler::DrawBaseTile(INT nX, INT nY)
  332. {
  333. INT nFileIdx;
  334. INT nImgIdx;
  335. if ( nX >= m_stMapFileHeader.shWidth || nY >= m_stMapFileHeader.shHeight || nX < 0 || nY < 0 )
  336. return; 
  337.   if( !( nX % 2 ) && !( nY % 2 ) && nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT )
  338.   {
  339. nFileIdx= m_pstTileInfo[(nY/2) + (nX/2)*m_stMapFileHeader.shHeight/2].bFileIdx;
  340. nImgIdx = m_pstTileInfo[(nY/2) + (nX/2)*m_stMapFileHeader.shHeight/2].wTileIdx;
  341. if( nFileIdx != 255 && nImgIdx != 65535 )
  342. {
  343. m_pxTileImg[nFileIdx]->NewSetIndex(nImgIdx);
  344. g_xMainWnd.DrawWithImageForCompMemToMem(
  345. (nX-m_shStartViewTileX)*_CELL_WIDTH ,
  346. (nY-m_shStartViewTileY)*_CELL_HEIGHT,
  347. m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  348. m_pxTileImg[nFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  349. (WORD*)m_pxTileImg[nFileIdx]->m_pbCurrImage,
  350. _VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT, m_wSavedMapBuffer);
  351. }
  352. }
  353. }
  354. /******************************************************************************************************************
  355. 窃荐疙 : CMapHandler::DrawOpenDoor()
  356. 累己磊 : 
  357. 累己老 : 
  358. 格利   : 
  359. 涝仿   : INT nX
  360.          INT nY
  361. 免仿   : VOID 
  362. [老磊][荐沥磊] : 荐沥郴侩
  363. *******************************************************************************************************************/
  364. /*VOID CMapHandler::DrawOpenDoor(INT nX, INT nY)
  365. {
  366. if ( GetDoorState(nX, nY) )
  367. {
  368. BYTE bDoorIndex = m_pbCellIDoorIdx[nX + nY*m_stMapFileHeader.shWidth];
  369. for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  370. {
  371. if ( m_pstDoorInfo[nCnt].bDoorIdx == bDoorIndex )
  372. {
  373. for ( INT nLoop = 0; nLoop < m_pstDoorInfo[nCnt].bDoorImgCnt; nLoop++ )
  374. {
  375. WORD wPosX = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosX;
  376. WORD wPosY = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosY;
  377. if ( nX == wPosX && nY == wPosY )
  378. {
  379. WORD wImgIndex = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wImageNum;
  380. // 弊覆阑 弊赴促.
  381. // ".\Data\housesc.wil"
  382. m_pxTileImg[4].NewSetIndex(wImgIndex);
  383. g_xMainWnd.DrawWithImageForCompClipRgn(
  384. (nX-m_shStartViewTileX)*_CELL_WIDTH +_VIEW_CELL_X_START-m_shViewOffsetX,
  385. (nY-m_shStartViewTileY)*_CELL_HEIGHT+_VIEW_CELL_Y_START-m_pxTileImg[4].m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-m_shViewOffsetY,
  386. m_pxTileImg[4].m_lpstNewCurrWilImageInfo->shWidth,
  387. m_pxTileImg[4].m_lpstNewCurrWilImageInfo->shHeight,
  388. (WORD*)m_pxTileImg[4].m_pbCurrImage,
  389. _CLIP_WIDTH, _CLIP_HEIGHT);
  390. break;
  391. }
  392. }
  393. }
  394. }
  395. }
  396. }
  397. VOID CMapHandler::SetDoorIndex()
  398. {
  399. for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  400. {
  401. for ( INT nLoop = 0; nLoop < m_pstDoorInfo[nCnt].bDoorImgCnt; nLoop++ )
  402. {
  403. WORD wPosX = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosX;
  404. WORD wPosY = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosY;
  405. m_pbCellIDoorIdx[wPosX + wPosY*m_stMapFileHeader.shWidth] = m_pstDoorInfo[nCnt].bDoorIdx;
  406. }
  407. }
  408. }
  409. BOOL CMapHandler::GetDoorState(INT nX, INT nY)
  410. {
  411. if ( (nX == 432 || nX == 433) && (nY == 70 || nY == 71 ||nY == 72 ) )
  412. int a = 0;
  413. if ( (m_pstCellInfo[nX + nY*m_stMapFileHeader.shWidth].wLigntNEvent == 65535) ||
  414.  !(m_pstCellInfo[nX + nY*m_stMapFileHeader.shWidth].wLigntNEvent & 0X08) )
  415. return FALSE;
  416. // 巩捞凯妨乐促.
  417. return TRUE;
  418. }
  419. VOID CMapHandler::SetDoorState(BYTE bIndex, BOOL bDoorOpen)
  420. {
  421. for ( INT nCnt = 0; nCnt < m_bDoorCount; nCnt++ )
  422. {
  423. if ( m_pstDoorInfo[nCnt].bDoorIdx == bIndex )
  424. {
  425. for ( INT nLoop = 0; nLoop < m_pstDoorInfo[nCnt].bDoorImgCnt; nLoop++ )
  426. {
  427. WORD wPosX = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosX;
  428. WORD wPosY = m_pstDoorInfo[nCnt].pstDoorImgInfo[nLoop].wPosY;
  429. if ( bDoorOpen )
  430. m_pstCellInfo[wPosX + wPosY*m_stMapFileHeader.shWidth].wLigntNEvent = m_pstCellInfo[wPosX + wPosY*m_stMapFileHeader.shWidth].wLigntNEvent | 0X08;
  431. else
  432. m_pstCellInfo[wPosX + wPosY*m_stMapFileHeader.shWidth].wLigntNEvent = m_pstCellInfo[wPosX + wPosY*m_stMapFileHeader.shWidth].wLigntNEvent & 0XFFF7;
  433. }
  434. }
  435. }
  436. }
  437. */
  438. INT CMapHandler::GetDoor(INT nX, INT nY)
  439. {
  440. INT nResult = 0;
  441.   if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorIdx & 0X80) > 0 )
  442. {
  443. nResult = m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorIdx & 0X7F;
  444. }
  445. return nResult;
  446. }
  447. BOOL CMapHandler::IsDoorOpen(INT nX, INT nY)
  448. {
  449. if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorIdx & 0X80) > 0 )
  450. {
  451. if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorOffset & 0X80) == 0 )
  452. {
  453. return FALSE;
  454. }
  455. }
  456. return TRUE;
  457. }
  458. VOID CMapHandler::OpenDoor(INT nX, INT nY, INT nIdx)
  459. {
  460. for ( INT nCntY = nY-8; nCntY < nY+10; nCntY++ )
  461. {
  462. for ( INT nCntX = nX-8; nCntX < nX+10; nCntX++ )
  463. {
  464. if ( nCntX >= 0 && nCntY >= 0 && nCntX < m_stMapFileHeader.shWidth && nCntY < m_stMapFileHeader.shHeight )
  465. {
  466. if ( (m_pstCellInfo[nCntY + nCntX*m_stMapFileHeader.shWidth].bDoorIdx & 0X7F) == nIdx )
  467. {
  468. m_pstCellInfo[nCntY + nCntX*m_stMapFileHeader.shWidth].bDoorOffset |= 0X80;
  469. }
  470. }
  471. }
  472. }
  473. }
  474. VOID CMapHandler::CloseDoor(INT nX, INT nY, INT nIdx)
  475. {
  476. for ( INT nCntY = nY-8; nCntY < nY+10; nCntY++ )
  477. {
  478. for ( INT nCntX = nX-8; nCntX < nX+10; nCntX++ )
  479. {
  480. if ( nCntX >= 0 && nCntY >= 0 && nCntX < m_stMapFileHeader.shWidth && nCntY < m_stMapFileHeader.shHeight )
  481. {
  482. if ( (m_pstCellInfo[nCntY + nCntX*m_stMapFileHeader.shWidth].bDoorIdx & 0X7F) == nIdx )
  483. {
  484. m_pstCellInfo[nCntY + nCntX*m_stMapFileHeader.shWidth].bDoorOffset &= 0X7F;
  485. }
  486. }
  487. }
  488. }
  489. }
  490. INT CMapHandler::GetDoorImgIdx(INT nX, INT nY)
  491. {
  492. INT nDoorIdx = 0;
  493.   if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorOffset & 0X80) > 0 )
  494. {
  495.   if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorIdx & 0X7F) > 0 )
  496. nDoorIdx += m_pstCellInfo[nY + nX*m_stMapFileHeader.shWidth].bDoorOffset & 0X7F;
  497. }
  498. return nDoorIdx;
  499. }
  500. /******************************************************************************************************************
  501. 窃荐疙 : CMapHandler::SetMovedTileBuffer()
  502. 累己磊 : 
  503. 累己老 : 
  504. 格利   : 
  505. 涝仿   : SHORT shMovedTileX
  506.          SHORT shMovedTileY
  507. 免仿   : VOID 
  508. [老磊][荐沥磊] : 荐沥郴侩
  509. *******************************************************************************************************************/
  510. VOID CMapHandler::SetMovedTileBuffer(SHORT shMovedTileX, SHORT shMovedTileY)
  511. {
  512. m_shStartViewTileX += shMovedTileX;
  513. m_shStartViewTileY += shMovedTileY;
  514. m_shViewOffsetX = 0;
  515. m_shViewOffsetY = 0;
  516. INT nX, nY;
  517. // 泅犁 鸥老滚欺俊 乐绰 皋葛府甫 舅嘎霸 捞悼矫虐绊 眠啊登绰弊覆阑 弊赴促.
  518. // 伎窜困啊 酒囱 鸥老窜困肺 诀单捞飘茄促.
  519. // 泅犁 Y鸥老捞芭唱, 酒贰肺 哎锭.
  520. if ( shMovedTileY >= 0 )
  521. {
  522. if ( shMovedTileX >= 0 )
  523. {
  524. // 坷弗率栏肺 哎锭.
  525. for ( INT nYCnt = 0; nYCnt < _VIEW_CELL_Y_COUNT*_CELL_HEIGHT-_CELL_HEIGHT*shMovedTileY; nYCnt++ )
  526. {
  527. memmove(&m_wSavedMapBuffer[(nYCnt*_VIEW_CELL_X_COUNT*_CELL_WIDTH)], 
  528. &m_wSavedMapBuffer[((nYCnt+_CELL_HEIGHT*shMovedTileY)*_VIEW_CELL_X_COUNT*_CELL_WIDTH)+_CELL_WIDTH*shMovedTileX], 
  529. sizeof(WORD)*_CELL_WIDTH*(_VIEW_CELL_X_COUNT-shMovedTileX));
  530. }
  531. // 弊覆惑栏肺 坷弗率苞 酒贰何盒狼 鸥老阑 盎脚秦拎具茄促.
  532. // 扁夯鸥老篮 2伎肺 捞凤廉乐绊 (坷弗率苞 酒贰绰 1伎父狼 咯蜡)甫 啊瘤扁 锭巩俊 1伎究阑 歹 佬绢拎辑 盎脚阑 矫挪促.
  533. // 酒贰客 鞍篮 屈怕捞促. '1'篮 memmove肺 颗败柳 单捞鸥捞绊 'o'啊 货肺 盎脚矫懦 鸥老弊覆单捞鸥捞促. '0'篮 歹佬绢临 单捞鸥捞促.
  534. // 11111111111111...0o
  535. // 11111111111111...0o
  536. // 11111111111111...0o
  537. // .................0o
  538. // .................0o
  539. // 00000000000000...0o
  540. // oooooooooooooo...oo
  541. // 扁夯鸥老 盎脚.
  542. for ( nX = m_shStartViewTileX+_VIEW_CELL_X_COUNT-shMovedTileX-1; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  543. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  544. {
  545. DrawBaseTile(nX, nY);
  546. }
  547. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  548. for ( nY = m_shStartViewTileY+_VIEW_CELL_Y_COUNT-shMovedTileY-1; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  549. {
  550. DrawBaseTile(nX, nY);
  551. }
  552. }
  553. else
  554. {
  555. // 哭率栏肺 哎锭.
  556. // 哭率苞 酒贰何盒狼 鸥老阑 盎脚.
  557. // o11111111111111...1
  558. // o11111111111111...1
  559. // o11111111111111...1
  560. // o1................1
  561. // o1................1
  562. // o00000000000000...0
  563. // ooooooooooooooo...o
  564. // 扁夯鸥老 盎脚.
  565. // 谅螟篮 2鸥老狼 咯蜡甫 啊瘤骨肺 1伎究父 佬绊, 酒贰肺绰 茄鸥老父狼 咯蜡甫 啊瘤骨肺 酒贰肺绰 1伎究阑 歹 佬绢霖促.
  566. for ( INT nYCnt = 0; nYCnt < _VIEW_CELL_Y_COUNT*_CELL_HEIGHT-_CELL_HEIGHT*shMovedTileY; nYCnt++ )
  567. {
  568. memmove(&m_wSavedMapBuffer[(nYCnt*_VIEW_CELL_X_COUNT*_CELL_WIDTH)+_CELL_WIDTH*(-shMovedTileX)], 
  569. &m_wSavedMapBuffer[((nYCnt+_CELL_HEIGHT*shMovedTileY)*_VIEW_CELL_X_COUNT*_CELL_WIDTH)], sizeof(WORD)*_CELL_WIDTH*(_VIEW_CELL_X_COUNT-(-shMovedTileX)));
  570. }
  571. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+(-shMovedTileX); nX++ )
  572. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  573. {
  574. DrawBaseTile(nX, nY);
  575. }
  576. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  577. for ( nY = m_shStartViewTileY+_VIEW_CELL_Y_COUNT-shMovedTileY-1; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  578. {
  579. DrawBaseTile(nX, nY);
  580. }
  581. }
  582. }
  583. // 困肺 哎锭.
  584. else
  585. {
  586. if ( shMovedTileX >= 0 )
  587. {
  588. // 坷弗率栏肺 哎锭.
  589. // ooooooooooooo...0o
  590. // 1111111111111...0o
  591. // ................0o
  592. // ................0o
  593. // 1111111111111...0o
  594. // 1111111111111...0o
  595. // 1111111111111...0o
  596. for ( INT nYCnt = (_VIEW_CELL_Y_COUNT*_CELL_HEIGHT)+(_CELL_HEIGHT*shMovedTileY)-1; nYCnt >= 0 ; nYCnt-- )
  597. {
  598. memmove(&m_wSavedMapBuffer[((nYCnt+_CELL_HEIGHT*(-shMovedTileY))*_VIEW_CELL_X_COUNT*_CELL_WIDTH)], 
  599. &m_wSavedMapBuffer[(nYCnt*_VIEW_CELL_X_COUNT*_CELL_WIDTH)+_CELL_WIDTH*shMovedTileX], sizeof(WORD)*_CELL_WIDTH*(_VIEW_CELL_X_COUNT-shMovedTileX));
  600. }
  601. for ( nX = m_shStartViewTileX+_VIEW_CELL_X_COUNT-shMovedTileX-1; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  602. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  603. {
  604. DrawBaseTile(nX, nY);
  605. }
  606. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  607. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+(-shMovedTileY); nY++ )
  608. {
  609. DrawBaseTile(nX, nY);
  610. }
  611. }
  612. else
  613. {
  614. for ( INT nYCnt = (_VIEW_CELL_Y_COUNT*_CELL_HEIGHT)+(_CELL_HEIGHT*shMovedTileY)-1; nYCnt >= 0 ; nYCnt-- )
  615. {
  616. // 哭率栏肺 哎锭.
  617. memmove(&m_wSavedMapBuffer[((nYCnt+_CELL_HEIGHT*(-shMovedTileY))*_VIEW_CELL_X_COUNT*_CELL_WIDTH)+_CELL_WIDTH*(-shMovedTileX)], 
  618.   &m_wSavedMapBuffer[(nYCnt*_VIEW_CELL_X_COUNT*_CELL_WIDTH)], sizeof(WORD)*_CELL_WIDTH*(_VIEW_CELL_X_COUNT-(-shMovedTileX)));
  619. }
  620. // oooooooooooooo...o
  621. // o1111111111111...1
  622. // o1...............1
  623. // o1...............1
  624. // o1111111111111...1
  625. // o1111111111111...1
  626. // o1111111111111...1
  627. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+(-shMovedTileX); nX++ )
  628. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT; nY++ )
  629. {
  630. DrawBaseTile(nX, nY);
  631. }
  632. for ( nX = m_shStartViewTileX; nX < m_shStartViewTileX+_VIEW_CELL_X_COUNT; nX++ )
  633. for ( nY = m_shStartViewTileY; nY < m_shStartViewTileY+(-shMovedTileY); nY++ )
  634. {
  635. DrawBaseTile(nX, nY);
  636. }
  637. }
  638. }
  639. }
  640. VOID CMapHandler::SetStartViewTile(INT nX, INT nY)
  641. {
  642. m_shStartViewTileX = nX;
  643. m_shStartViewTileY = nY;
  644. m_shViewOffsetX = 0;
  645. m_shViewOffsetY = 0;
  646. }
  647. BYTE CMapHandler::GetTileAttribute(INT nX, INT nY)
  648. {
  649. if ( m_pstCellInfo )
  650. {
  651. BYTE bAttr = _CAN_WALK;
  652. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].bFlag & 0X01 )
  653. return bAttr;
  654. }
  655. return _CAN_NOTWALK;
  656. }
  657. LIGHTINFO CMapHandler::GetTileLightInfo(INT nX, INT nY)
  658. {
  659. LIGHTINFO stLight = {FALSE, -1, -1};
  660. if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent == 0) && 
  661.  ((m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent & 0X07) != 1) )
  662. return stLight;
  663. stLight.bIsLight = TRUE;
  664. stLight.cLightSizeType = ((m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent & 0XC000) >> 14);
  665. stLight.cLightColorType = ((m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent & 0X3FF0) >> 4);
  666. return stLight;
  667. }
  668. BYTE CMapHandler::GetEventNum(INT nX, INT nY)
  669. {
  670. BYTE bEventNum = -1;
  671. if ( (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent == -1) && 
  672.  ((m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent & 0X07) != 3) )
  673. return bEventNum;
  674. bEventNum = ((m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].wLigntNEvent & 0XF0) >> 4);
  675. return bEventNum;
  676. }
  677. BOOL CMapHandler::GetNextTileCanMove(INT nXPos, INT nYPos, BYTE bDir, INT nGap, POINT* lpptTarget)
  678. {
  679. INT  nXGapPos, nYGapPos;
  680. BYTE bCanMove = _CAN_WALK;
  681. nXGapPos = nYGapPos = 0;
  682. switch ( bDir )
  683. {
  684. case _DIRECTION_LIST_1:
  685. {
  686. nXGapPos = nXPos;
  687. nYGapPos = nYPos-nGap;
  688. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  689. }
  690. break;
  691. case _DIRECTION_LIST_2:
  692. {
  693. nXGapPos = nXPos+nGap;
  694. nYGapPos = nYPos-nGap;
  695. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  696. }
  697. break;
  698. case _DIRECTION_LIST_3:
  699. {
  700. nXGapPos = nXPos+nGap;
  701. nYGapPos = nYPos;
  702. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  703. }
  704. break;
  705. case _DIRECTION_LIST_4:
  706. {
  707. nXGapPos = nXPos+nGap;
  708. nYGapPos = nYPos+nGap;
  709. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  710. }
  711. break;
  712. case _DIRECTION_LIST_5:
  713. {
  714. nXGapPos = nXPos;
  715. nYGapPos = nYPos+nGap;
  716. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  717. }
  718. break;
  719. case _DIRECTION_LIST_6:
  720. {
  721. nXGapPos = nXPos-nGap;
  722. nYGapPos = nYPos+nGap;
  723. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  724. }
  725. break;
  726. case _DIRECTION_LIST_7:
  727. {
  728. nXGapPos = nXPos-nGap;
  729. nYGapPos = nYPos;
  730. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  731. }
  732. break;
  733. case _DIRECTION_LIST_8:
  734. {
  735. nXGapPos = nXPos-nGap;
  736. nYGapPos = nYPos-nGap;
  737. bCanMove  = GetTileAttribute(nXGapPos, nYGapPos);
  738. }
  739. break;
  740. }
  741. lpptTarget->x = nXGapPos;
  742. lpptTarget->y = nYGapPos;
  743. if ( bCanMove != _CAN_WALK )
  744. return FALSE;
  745. if ( g_xGameProc.m_xActorList.GetCounter() != 0 )
  746. {
  747. g_xGameProc.m_xActorList.MoveCurrentToTop();
  748. CActor* pxActor;
  749. for ( INT nCnt = 0; nCnt < g_xGameProc.m_xActorList.GetCounter(); nCnt++ )
  750. {
  751. pxActor = g_xGameProc.m_xActorList.GetCurrentData();
  752. if ( pxActor->m_wPosX == nXGapPos &&  pxActor->m_wPosY == nYGapPos && !pxActor->m_bIsDead )
  753. {
  754. return FALSE;
  755. }
  756. g_xGameProc.m_xActorList.MoveNextNode();
  757. }
  758. return TRUE;
  759. }
  760. VOID CMapHandler::SetAniTileFrame(INT nLoopTime)
  761. {
  762. INT nCnt;
  763. for ( nCnt = 0; nCnt < 8; nCnt++ )
  764. {
  765. m_dwAniSaveTime[nCnt] += nLoopTime;
  766. }
  767. if ( m_dwAniSaveTime[0] > _TILE_ANI_DELAY_1 )
  768. {
  769. for ( nCnt = 0; nCnt < 16; nCnt++ )
  770. {
  771. m_bAniTileFrame[0][nCnt]++;
  772. if ( m_bAniTileFrame[0][nCnt] >= nCnt )
  773. m_bAniTileFrame[0][nCnt] = 0;
  774. }
  775. m_dwAniSaveTime[0] = 0;
  776. }
  777. if ( m_dwAniSaveTime[1] > _TILE_ANI_DELAY_2 )
  778. {
  779. for ( nCnt = 0; nCnt < 16; nCnt++ )
  780. {
  781. m_bAniTileFrame[1][nCnt]++;
  782. if ( m_bAniTileFrame[1][nCnt] >= nCnt )
  783. m_bAniTileFrame[1][nCnt] = 0;
  784. }
  785. m_dwAniSaveTime[1] = 0;
  786. }
  787. if ( m_dwAniSaveTime[2] > _TILE_ANI_DELAY_3 )
  788. {
  789. for ( nCnt = 0; nCnt < 16; nCnt++ )
  790. {
  791. m_bAniTileFrame[2][nCnt]++;
  792. if ( m_bAniTileFrame[2][nCnt] >= nCnt )
  793. m_bAniTileFrame[2][nCnt] = 0;
  794. }
  795. m_dwAniSaveTime[2] = 0;
  796. }
  797. if ( m_dwAniSaveTime[3] > _TILE_ANI_DELAY_4 )
  798. {
  799. for ( nCnt = 0; nCnt < 16; nCnt++ )
  800. {
  801. m_bAniTileFrame[3][nCnt]++;
  802. if ( m_bAniTileFrame[3][nCnt] >= nCnt )
  803. m_bAniTileFrame[3][nCnt] = 0;
  804. }
  805. m_dwAniSaveTime[3] = 0;
  806. }
  807. if ( m_dwAniSaveTime[4] > _TILE_ANI_DELAY_5 )
  808. {
  809. for ( nCnt = 0; nCnt < 16; nCnt++ )
  810. {
  811. m_bAniTileFrame[4][nCnt]++;
  812. if ( m_bAniTileFrame[4][nCnt] >= nCnt )
  813. m_bAniTileFrame[4][nCnt] = 0;
  814. }
  815. m_dwAniSaveTime[4] = 0;
  816. }
  817. if ( m_dwAniSaveTime[5] > _TILE_ANI_DELAY_6 )
  818. {
  819. for ( nCnt = 0; nCnt < 16; nCnt++ )
  820. {
  821. m_bAniTileFrame[5][nCnt]++;
  822. if ( m_bAniTileFrame[5][nCnt] >= nCnt )
  823. m_bAniTileFrame[5][nCnt] = 0;
  824. }
  825. m_dwAniSaveTime[5] = 0;
  826. }
  827. if ( m_dwAniSaveTime[6] > _TILE_ANI_DELAY_7 )
  828. {
  829. for ( nCnt = 0; nCnt < 16; nCnt++ )
  830. {
  831. m_bAniTileFrame[6][nCnt]++;
  832. if ( m_bAniTileFrame[6][nCnt] >= nCnt )
  833. m_bAniTileFrame[6][nCnt] = 0;
  834. }
  835. m_dwAniSaveTime[6] = 0;
  836. }
  837. if ( m_dwAniSaveTime[7] > _TILE_ANI_DELAY_8 )
  838. {
  839. for ( nCnt = 0; nCnt < 16; nCnt++ )
  840. {
  841. m_bAniTileFrame[7][nCnt]++;
  842. if ( m_bAniTileFrame[7][nCnt] >= nCnt )
  843. m_bAniTileFrame[7][nCnt] = 0;
  844. }
  845. m_dwAniSaveTime[7] = 0;
  846. }
  847. }
  848. VOID CMapHandler::GetScrnPosFromTilePos(SHORT shTileX, SHORT shTileY, SHORT& shScrnX, SHORT& shScrnY)
  849. {
  850. shScrnX = (shTileX - m_shStartViewTileX)*_CELL_WIDTH  - m_shViewOffsetX + _VIEW_CELL_X_START;
  851. shScrnY = (shTileY - m_shStartViewTileY)*_CELL_HEIGHT - m_shViewOffsetY + _VIEW_CELL_Y_START;
  852. }
  853. VOID CMapHandler::GetTilePosFromScrnPos(SHORT shScrnX, SHORT shScrnY, SHORT& shTileX, SHORT& shTileY)
  854. {
  855. shTileX = m_shStartViewTileX + (shScrnX - _VIEW_CELL_X_START) / _CELL_WIDTH;
  856. shTileY = m_shStartViewTileY + (shScrnY - _VIEW_CELL_Y_START) / _CELL_HEIGHT;
  857. }
  858. BYTE CMapHandler::CalcDirection16(WORD wFireTileX, WORD wFireTileY, WORD wDestTileX, WORD wDestTileY)
  859. {
  860. INT nWidth = wDestTileX - wFireTileX;
  861. INT nHeight = wDestTileY - wFireTileY;
  862. FLOAT rLineLength, rBottomInTriangle;
  863. INT nDimension;
  864. BYTE bDir;
  865. rLineLength = (FLOAT)sqrt(nWidth*nWidth+nHeight*nHeight);
  866. // 扁夯.
  867. // 7  0  1          
  868. // 6     2
  869. // 5  4  3
  870. // 老窜篮 4俺狼 盒搁(90档扁霖)栏肺 唱穿绊 盒搁俊 措茄 cos蔼阑 利侩茄促.
  871. ( nWidth >= 0 ) ?
  872. ( nHeight <  0 ? (rBottomInTriangle=(FLOAT)-nHeight, nDimension=0) : (rBottomInTriangle=(FLOAT) nWidth, nDimension=4) ):
  873. ( nHeight >= 0 ? (rBottomInTriangle=(FLOAT) nHeight, nDimension=8) : (rBottomInTriangle=(FLOAT)-nWidth, nDimension=12) );
  874. // 6(cos45)  0(cos 0)  0(cos45)
  875. // 4(cos90)  2(cos 0)  2(cos 0)
  876. // 4(cos45)  2(cos90)  2(cos45)
  877. FLOAT rCosVal = rBottomInTriangle/rLineLength;
  878. CONST FLOAT rCosVal16[8] = { 1.0f, 0.980785f, 0.923880f, 0.831470f, 0.707107f, 0.555570f, 0.382683f, 0.195090f };
  879. // 阿盒搁阑 3俺狼 康开栏肺 唱穿绢辑 康开阑 犁炼沥茄促.
  880. bDir = 0;
  881. for ( INT nCnt = 0; nCnt < 8; nCnt++ )
  882. {
  883. if( rCosVal <= rCosVal16[nCnt] )
  884. bDir = nDimension+(nCnt+1)/2;
  885. else break;
  886. }
  887. if( bDir >= 16 ) bDir = 0;
  888. return bDir;
  889. }
  890. BYTE CMapHandler::CalcDirection8(WORD wFireTileX, WORD wFireTileY, WORD wDestTileX, WORD wDestTileY)
  891. {
  892. INT nWidth = wDestTileX - wFireTileX;
  893. INT nHeight = wDestTileY - wFireTileY;
  894. FLOAT rLineLength, rBottomInTriangle;
  895. INT nDimension;
  896. BYTE bDir;
  897. rLineLength = (FLOAT)sqrt(nWidth*nWidth+nHeight*nHeight);
  898. // 扁夯.
  899. // 7  0  1          
  900. // 6     2
  901. // 5  4  3
  902. // 老窜篮 4俺狼 盒搁(90档扁霖)栏肺 唱穿绊 盒搁俊 措茄 cos蔼阑 利侩茄促.
  903. ( nWidth >= 0 ) ?
  904. ( nHeight <  0 ? (rBottomInTriangle=(FLOAT)-nHeight, nDimension=0) : (rBottomInTriangle=(FLOAT) nWidth, nDimension=2) ):
  905. ( nHeight >= 0 ? (rBottomInTriangle=(FLOAT) nHeight, nDimension=4) : (rBottomInTriangle=(FLOAT)-nWidth, nDimension=6) );
  906. // 6(cos45)  0(cos 0)  0(cos45)
  907. // 4(cos90)  2(cos 0)  2(cos 0)
  908. // 4(cos45)  2(cos90)  2(cos45)
  909. FLOAT rCosVal = rBottomInTriangle/rLineLength;
  910. // cos(0), cos(pi/8), cos(pi/4), cos(pi/2)
  911. CONST FLOAT rCosVal8[4] = { 1.0f, 0.923880f, 0.707107f, 0.382683f };
  912. // 阿盒搁阑 3俺狼 康开栏肺 唱穿绢辑 康开阑 犁炼沥茄促.
  913. bDir = 0;
  914. for ( INT nCnt = 0; nCnt < 4; nCnt++ )
  915. {
  916. if( rCosVal <= rCosVal8[nCnt] )
  917. bDir = nDimension+(nCnt+1)/2;
  918. else break;
  919. }
  920. if( bDir >= 8 ) bDir = 0;
  921. return bDir;
  922. }
  923. /*
  924. VOID CMapHandler::DrawOneCellObjTile(INT nX, INT nY)
  925. {
  926. if ( nY >= m_stMapFileHeader.shHeight )
  927. return;
  928. INT nObjFileIdx, nImgIdx;
  929. // 坷宏璃飘啊 乐阑锭.
  930. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx != -1 )
  931. {
  932. // 坷宏璃飘1捞 乐阑锭.
  933. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj1 != -1 )
  934. {
  935. nObjFileIdx = (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx & 0XF0) >> 4;
  936. nImgIdx = m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj1;
  937. m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
  938. if ( m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
  939.  m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight == 32 )
  940. {
  941. g_xMainWnd.DrawWithImageForCompClipRgn(
  942. (nX-m_shStartViewTileX)*_CELL_WIDTH +_VIEW_CELL_X_START-m_shViewOffsetX,
  943. (nY-m_shStartViewTileY)*_CELL_HEIGHT+_VIEW_CELL_Y_START-m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-m_shViewOffsetY,
  944. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  945. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  946. (WORD*)m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
  947. _CLIP_WIDTH, _CLIP_HEIGHT);
  948. }
  949. }
  950. // 坷宏璃飘2啊 乐阑锭.
  951. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj2 != -1 )
  952. {
  953. nObjFileIdx = (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx & 0X0F);
  954. nImgIdx = m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj2;
  955. m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
  956. if ( m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
  957.  m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight == 32 )
  958. {
  959. g_xMainWnd.DrawWithImageForCompClipRgn(
  960. (nX-m_shStartViewTileX)*_CELL_WIDTH +_VIEW_CELL_X_START-m_shViewOffsetX,
  961. (nY-m_shStartViewTileY)*_CELL_HEIGHT+_VIEW_CELL_Y_START-m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-m_shViewOffsetY,
  962. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  963. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  964. (WORD*)m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
  965. _CLIP_WIDTH, _CLIP_HEIGHT);
  966. }
  967. }
  968. }
  969. }
  970. BOOL CMapHandler::DrawOneCellOverObjTile(INT nX, INT nY)
  971. {
  972. if ( nY >= m_stMapFileHeader.shHeight )
  973. return FALSE;
  974. INT nObjFileIdx, nImgIdx;
  975. // 坷宏璃飘啊 乐阑锭.
  976. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx != -1 )
  977. {
  978. // 坷宏璃飘1捞 乐阑锭.
  979. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj1 != -1 )
  980. {
  981. nObjFileIdx = (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx & 0XF0) >> 4;
  982. nImgIdx = m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj1;
  983. m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
  984. if ( m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth != 48 ||
  985.  m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight != 32 )
  986. {
  987. g_xMainWnd.DrawWithImageForCompClipRgn(
  988. (nX-m_shStartViewTileX)*_CELL_WIDTH +_VIEW_CELL_X_START-m_shViewOffsetX,
  989. (nY-m_shStartViewTileY)*_CELL_HEIGHT+_VIEW_CELL_Y_START-m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-m_shViewOffsetY,
  990. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  991. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  992. (WORD*)m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
  993. _CLIP_WIDTH, _CLIP_HEIGHT);
  994. return TRUE;
  995. }
  996. }
  997. // 坷宏璃飘2啊 乐阑锭.
  998. if ( m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj2 != -1 )
  999. {
  1000. nObjFileIdx = (m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].cFileIdx & 0X0F);
  1001. nImgIdx = m_pstCellInfo[nY + nX*m_stMapFileHeader.shHeight].shObj2;
  1002. m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
  1003. if ( m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth != 48 ||
  1004.  m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight != 32 )
  1005. {
  1006. g_xMainWnd.DrawWithImageForCompClipRgn(
  1007. (nX-m_shStartViewTileX)*_CELL_WIDTH +_VIEW_CELL_X_START-m_shViewOffsetX,
  1008. (nY-m_shStartViewTileY)*_CELL_HEIGHT+_VIEW_CELL_Y_START-m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-m_shViewOffsetY,
  1009. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
  1010. m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
  1011. (WORD*)m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
  1012. _CLIP_WIDTH, _CLIP_HEIGHT);
  1013. return TRUE;
  1014. }
  1015. }
  1016. }
  1017. return FALSE;
  1018. }
  1019. */
  1020. /******************************************************************************************************************
  1021. 窃荐疙 : CMapHandler::DrawSMTile()
  1022. 累己磊 : 
  1023. 累己老 : 
  1024. 格利   : 
  1025. 涝仿   : INT nX
  1026.          INT nY
  1027. 免仿   : VOID 
  1028. [老磊][荐沥磊] : 荐沥郴侩
  1029. *******************************************************************************************************************/
  1030. /*
  1031. VOID CMapHandler::DrawSMTile(INT nX, INT nY)
  1032. {
  1033. INT nObjImgIdx, nMidImgIdx;
  1034. if ( nX >= m_stMapFileHeader.wWidth || nY >= m_stMapFileHeader.wHeight || nX < 0 || nY < 0 )
  1035. return; 
  1036. nObjImgIdx = (m_lpstCellInfo[nY + nX*m_stMapFileHeader.wHeight].bArea * 10000) + (m_lpstCellInfo[nY + nX*m_stMapFileHeader.wHeight].wFrImgIdx & 0x7FFF) - 1;
  1037. if (m_lpstCellInfo[nY + nX*m_stMapFileHeader.wHeight].bArea < 8 )//<---------------??????????3锅甘俊 救静搁 俊矾巢
  1038. {
  1039. nMidImgIdx = m_lpstCellInfo[nY + nX*m_stMapFileHeader.wHeight].wMidImgIdx - 1;
  1040. if ( nMidImgIdx >= 0 && nMidImgIdx < 938 && nY < m_shStartViewTileY+_VIEW_CELL_Y_COUNT )
  1041. {
  1042. m_xSMTileImg.SetIndex(nMidImgIdx);
  1043. g_xMainWnd.DrawWithImageForCompMemToMem(
  1044. (nX-m_shStartViewTileX)*_CELL_WIDTH ,
  1045. (nY-m_shStartViewTileY)*_CELL_HEIGHT,
  1046. m_xSMTileImg.m_lpstCurrWilImageInfo->shWidth,
  1047. m_xSMTileImg.m_lpstCurrWilImageInfo->shHeight,
  1048. (WORD*)m_xSMTileImg.m_pbCurrImage,
  1049. _VIEW_CELL_X_COUNT*_CELL_WIDTH, _VIEW_CELL_Y_COUNT*_CELL_HEIGHT, m_wSavedMapBuffer);
  1050. }
  1051. }
  1052. }
  1053. */