ROAField.cpp
上传用户:tianheyiqi
上传日期:2010-04-16
资源大小:282k
文件大小:4k
源码类别:

外挂编程

开发平台:

Visual C++

  1. // ROAField.cpp: implementation of the CROAField class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ROA.h"
  6. #include "ROAField.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CROAField::CROAField()
  16. {
  17. m_bLoaded = false;
  18. m_strAlias = "";
  19. m_strFieldname = "";
  20. m_szField.cx = 0;
  21. m_szField.cy = 0;
  22. m_byFields = NULL;
  23. }
  24. CROAField::~CROAField()
  25. {
  26. if(NULL != m_byFields)
  27. {
  28. delete m_byFields;
  29. m_byFields = NULL;
  30. }
  31. m_bmpField.DeleteObject();
  32. m_dcField.DeleteDC();
  33. }
  34. int CROAField::init(LPCTSTR lpszFieldName, LPCTSTR lpszAlias)
  35. {
  36. CString strFieldName;
  37. WORD wSize[2];
  38. strFieldName = "..\fields\";
  39. strFieldName += lpszFieldName;
  40. strFieldName += ".fld";
  41. CFile fField;
  42. int nFileLength;
  43. m_bLoaded = false;
  44. m_strAlias = "";
  45. if(NULL != m_byFields)
  46. {
  47. delete m_byFields;
  48. m_byFields = NULL;
  49. }
  50. if(fField.Open(strFieldName, CFile::modeRead))
  51. {
  52. if(fField.Read(&wSize, 4))
  53. {
  54. m_szField.cx = wSize[0];
  55. m_szField.cy = wSize[1];
  56. nFileLength = fField.GetLength();
  57. if(nFileLength >= (m_szField.cx * m_szField.cy +4))
  58. {
  59. m_byFields = new BYTE[m_szField.cx * m_szField.cy];
  60. fField.ReadHuge(m_byFields, m_szField.cx * m_szField.cy);
  61. m_strAlias = lpszAlias;
  62. m_strFieldname = lpszFieldName;
  63. CreateFieldImage();
  64. m_bLoaded = true;
  65. }
  66. }
  67. fField.Close();
  68. }
  69. // utlSetAutoSearchMvp(false);
  70. return(0);
  71. }
  72. void CROAField::CreateFieldImage()
  73. {
  74. CRect rect;
  75. m_dcField.DeleteDC();
  76. m_dcField.CreateCompatibleDC(AfxGetMainWnd()->GetDC());
  77. m_bmpField.DeleteObject();
  78. m_bmpField.CreateCompatibleBitmap(AfxGetMainWnd()->GetDC(), m_szField.cx, m_szField.cy);
  79. m_dcField.SelectObject(&m_bmpField);
  80. rect.SetRect(0, 0, m_szField.cx-1, m_szField.cy-1);
  81. m_dcField.FillRect(rect, &CBrush(RGB(128, 128, 128)));
  82. for(int y=0; y < m_szField.cy; y++)
  83. for(int x=0; x < m_szField.cx; x++)
  84. if((m_byFields[y*m_szField.cx + x]) == 0)
  85. m_dcField.SetPixel(x, m_szField.cy-y, RGB(255,255,255));
  86. else
  87. {
  88. if((m_byFields[y*m_szField.cx + x]) == 5)
  89. m_dcField.SetPixel(x, m_szField.cy-y, RGB(0,0,255));
  90. }
  91. return;
  92. }
  93. POINT nearPoint[8] =
  94. {
  95. {1, 0},
  96. {1, 1},
  97. {0, 1},
  98. {-1, 1},
  99. {-1, 0},
  100. {-1, -1},
  101. {0, -1},
  102. {1, -1}
  103. };
  104. BOOL CROAField::FindNearestPoint(POINT pntFrom, POINT pntTo, POINT *pNearest)
  105. {
  106. POINT pnt;
  107. BOOL bFound = false;
  108. if(!m_bLoaded || pNearest == NULL)
  109. {
  110. ASSERT(false);
  111. return(false);
  112. }
  113. pNearest->x = -1;
  114. pNearest->y = -1;
  115. if(pntTo.x > m_szField.cx || pntTo.y > m_szField.cy)
  116. return(false);
  117. for(int i=0; i<8; i++)
  118. {
  119. pnt.x = pntTo.x + nearPoint[i].x;
  120. pnt.y = pntTo.y + nearPoint[i].y;
  121. if(pnt.x < 0 || pnt.y < 0 || pnt.x > m_szField.cx || pnt.y > m_szField.cy)
  122. continue;
  123. BOOL bWarpFound = false;
  124. for(int j=0; j<spells.GetSize(); j++)
  125. {
  126. if((spells[j].wSkill == 129 || spells[j].wSkill == 130 ) && spells[j].pntPos.x == pnt.x && spells[j].pntPos.y == pnt.y)
  127. {
  128. bWarpFound = true;
  129. break;
  130. }
  131. }
  132. if(bWarpFound)
  133. continue;
  134. // TRACE("%d): %d  ", i+1, m_byFields[pnt.x+pnt.y*m_szField.cx]);
  135. if(!m_byFields[pnt.x+pnt.y*m_szField.cx])
  136. {
  137. if(pNearest->x == -1 && pNearest->y == -1)
  138. {
  139. *pNearest = pnt;
  140. }
  141. else
  142. {
  143. if(utlDistanceFrom(pntFrom, pnt) < utlDistanceFrom(pntFrom, *pNearest))
  144. {
  145. *pNearest = pnt;
  146. }
  147. }
  148. bFound = true;
  149. }
  150. }
  151. // TRACE("n");
  152. return(bFound);
  153. }
  154. #define ANTIWARPSTEP 2
  155. POINT CROAField::GetAntiWarpPoint(void)
  156. {
  157. POINT pntRtn;
  158. POINT pntOffset;
  159. while(true)
  160. {
  161. pntOffset.x = int(float(rand())/RAND_MAX*ANTIWARPSTEP*2)-ANTIWARPSTEP;
  162. pntOffset.y = int(float(rand())/RAND_MAX*ANTIWARPSTEP*2)-ANTIWARPSTEP;
  163. if(pntOffset.x == 0 && pntOffset.y == 0)
  164. continue;
  165. pntRtn.x = you.pntTo.x + pntOffset.x;
  166. pntRtn.y = you.pntTo.y + pntOffset.y;
  167. if(pntRtn.x < 0 || pntRtn.y < 0 || pntRtn.x > m_szField.cx || pntRtn.y > m_szField.cy)
  168. continue;
  169. if(m_byFields[pntRtn.x+pntRtn.y*m_szField.cx])
  170. {
  171. continue;
  172. }
  173. break;
  174. }
  175. return(pntRtn);
  176. }