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

模拟服务器

开发平台:

Visual C++

  1. // fnDecode6BitBuf(&lpPacketMsg->szEncodeData[_FEATURESIZE*2], (char*)&stFeatureEx, sizeof(FEATUREEX));
  2. memcpy(&stFeature, &stCharDesc.nFeature, sizeof(FEATURE));
  3. m_nState = stCharDesc.nStatus;
  4. if( m_nState & 0X2 ) m_bOpenHealth = TRUE;
  5. else m_bOpenHealth = FALSE;
  6. ChangeFeature(stFeature, m_stFeatureEx);
  7. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionFrame(_MT_WALK, bDir);
  8. else SetMotionFrame(_MT_HORSEWALK, bDir);
  9. m_bMoveSpeed = _SPEED_WALK;
  10. SetMoving();
  11. }
  12. VOID CHero::OnRun(LPPACKETMSG lpPacketMsg)
  13. {
  14. BYTE bDir;
  15. CHARDESC stCharDesc;
  16. FEATURE stFeature;
  17. // FEATUREEX stFeatureEx;
  18. // m_wPosX = lpPacketMsg->stDefMsg.wParam;
  19. // m_wPosY = lpPacketMsg->stDefMsg.wTag;
  20. bDir  = LOBYTE(lpPacketMsg->stDefMsg.wSeries);
  21. m_bLightSize = HIBYTE(lpPacketMsg->stDefMsg.wSeries);
  22. fnDecode6BitBuf(lpPacketMsg->szEncodeData, (char*)&stCharDesc, sizeof(CHARDESC));
  23. // fnDecode6BitBuf(&lpPacketMsg->szEncodeData[_CHARDESCSIZE], (char*)&stFeatureEx, sizeof(FEATUREEX));
  24. memcpy(&stFeature, &stCharDesc.nFeature, sizeof(FEATURE));
  25. m_nState = stCharDesc.nStatus;
  26. if( m_nState & 0X2 ) m_bOpenHealth = TRUE;
  27. else m_bOpenHealth = FALSE;
  28. ChangeFeature(stFeature, m_stFeatureEx);
  29. if ( m_stFeatureEx.bHorse == _HORSE_NONE )
  30. {
  31. SetMotionFrame(_MT_RUN, bDir);
  32. m_bMoveSpeed = _SPEED_RUN;
  33. }
  34. else
  35. {
  36. SetMotionFrame(_MT_HORSERUN, bDir);
  37. m_bMoveSpeed = _SPEED_HORSERUN;
  38. }
  39. SetMoving();
  40. }
  41. VOID CHero::OnTurn(LPPACKETMSG lpPacketMsg)
  42. {
  43. BYTE bDir;
  44. CHARDESC stCharDesc;
  45. FEATURE stFeature;
  46. INT nPos;
  47. m_wPosX = lpPacketMsg->stDefMsg.wParam;
  48. m_wPosY = lpPacketMsg->stDefMsg.wTag;
  49. bDir  = LOBYTE(lpPacketMsg->stDefMsg.wSeries);
  50. m_bLightSize = HIBYTE(lpPacketMsg->stDefMsg.wSeries);
  51. fnDecode6BitBuf(lpPacketMsg->szEncodeData, (char*)&stCharDesc, sizeof(CHARDESC));
  52. fnDecode6BitBuf(&lpPacketMsg->szEncodeData[_CHARDESCSIZE], (char*)&m_stFeatureEx , sizeof(FEATUREEX));
  53. if (strlen(lpPacketMsg->szEncodeData) > _CHARDESCSIZE)
  54. {
  55. nPos = fnDecode6BitBuf(&lpPacketMsg->szEncodeData[_CHARDESCSIZE +_FEATURESIZEEX], m_szName, sizeof(m_szName));
  56. m_szName[nPos] = '';
  57. CHAR* szClr = strrchr(m_szName, '/');
  58. if ( szClr )
  59. {
  60. m_dwNameClr = GetUserNameColor(atoi(szClr+1));
  61. *szClr = '';
  62. }
  63. }
  64. memcpy(&stFeature, &stCharDesc.nFeature, sizeof(FEATURE));
  65. m_nState = stCharDesc.nStatus;
  66. if( m_nState & 0X2 ) m_bOpenHealth = TRUE;
  67. else m_bOpenHealth = FALSE;
  68. if ( !m_bIsMon )
  69. {
  70. ChangeFeature(stFeature, m_stFeatureEx);
  71. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionFrame(_MT_STAND, bDir);
  72. else SetMotionFrame(_MT_HORSESTAND, bDir);
  73. }
  74. else
  75. {
  76. SetMotionFrame(_MT_MON_STAND, bDir);
  77. }
  78. }
  79. VOID CHero::OnStruck(LPPACKETMSG lpPacketMsg)
  80. {
  81. MESSAGEBODYWL stMsgBodyWl;
  82. FEATURE   stFeature;
  83. FLOAT wHPRate  = (FLOAT)((FLOAT)lpPacketMsg->stDefMsg.wParam/(FLOAT)lpPacketMsg->stDefMsg.wTag);
  84. WORD  wDamage  = lpPacketMsg->stDefMsg.wSeries;
  85. m_wHP  = lpPacketMsg->stDefMsg.wParam;
  86. m_wMAXHP  = lpPacketMsg->stDefMsg.wTag;
  87. m_bHPPercent     = wHPRate*100;
  88. m_bShieldCurrFrm = 0;
  89. fnDecode6BitBuf(lpPacketMsg->szEncodeData, (char*)&stMsgBodyWl, sizeof(MESSAGEBODYWL));
  90. memcpy(&stFeature, &stMsgBodyWl.lParam1, sizeof(LONG));
  91. if ( !m_bIsMon )
  92. {
  93. ChangeFeature(stFeature, m_stFeatureEx);
  94. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionFrame(_MT_HITTED, m_bCurrDir);
  95. else SetMotionFrame(_MT_HORSEHIT, m_bCurrDir);
  96. }
  97. else
  98. {
  99. SetMotionFrame(_MT_MON_HITTED, m_bCurrDir);
  100. }
  101. // 阁胶磐老锭.
  102. if ( m_stHitter.bGender == _GENDER_MON )
  103. {
  104. CMagic* pxMagic;
  105. switch ( m_stHitter.bDress )
  106. {
  107. case 2: // 纳迫肺橇.
  108. pxMagic = new CMagic;
  109. pxMagic->CreateMagic(_MONMAGIC_KEPAL, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this, 0);
  110. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  111. break;
  112. case 8: // 癌林俺固.
  113. pxMagic = new CMagic;
  114. pxMagic->CreateMagic(_MONMAGIC_GREATANT, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
  115. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  116. break;
  117. case 14: // 捍侩俺固.
  118. pxMagic = new CMagic;
  119. pxMagic->CreateMagic(_MONMAGIC_ANT, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
  120. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  121. break;
  122. case 16: // 靛抄俺固.
  123. pxMagic = new CMagic;
  124. pxMagic->CreateMagic(_MONMAGIC_WORKANT, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
  125. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  126. break;
  127. case 67: // 盟锋脚.
  128. pxMagic = new CMagic;
  129. pxMagic->CreateMagic(_MONMAGIC_BIGGINE_CHAR, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
  130. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  131. break;
  132. default :
  133. break;
  134. }
  135. }
  136. ZeroMemory(&m_stHitter, sizeof(FEATURE));
  137. }
  138. VOID CHero::OnHit(LPPACKETMSG lpPacketMsg)
  139. {
  140. BYTE bDir;
  141. bDir = lpPacketMsg->stDefMsg.wSeries;
  142. m_wPosX = lpPacketMsg->stDefMsg.wParam;
  143. m_wPosY = lpPacketMsg->stDefMsg.wTag;
  144. if ( !m_bIsMon )
  145. {
  146. m_dwCurrEffectFrame = 50;
  147. m_dwFstEffectFrame  = 50;
  148. m_dwEndEffectFrame  = 60;
  149. m_bEffectFrame = 0;
  150. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  151. m_bWarMode = TRUE;
  152. if ( lpPacketMsg->stDefMsg.wIdent == SM_WIDEHIT )
  153. {
  154. SetMotionFrame(_MT_ONEHSWING, bDir);
  155. LoadEffect(&g_xGameProc.m_xImage, _SKILL_BANWOL, bDir);
  156. m_bUseSwordEffect = TRUE;
  157. }
  158. else if ( lpPacketMsg->stDefMsg.wIdent == SM_POWERHIT )
  159. {
  160. SetMotionFrame(_MT_ONEVSWING, bDir);
  161. LoadEffect(&g_xGameProc.m_xImage, _SKILL_YEDO, bDir);
  162. m_bUseSwordEffect = TRUE;
  163. }
  164. else if ( lpPacketMsg->stDefMsg.wIdent == SM_FIREHIT )
  165. {
  166. SetMotionFrame(_MT_ONEVSWING, bDir);
  167. LoadEffect(&g_xGameProc.m_xImage, _SKILL_FIRESWORD, bDir);
  168. m_bUseSwordEffect = TRUE;
  169. }
  170. else if ( lpPacketMsg->stDefMsg.wIdent == SM_LONGHIT )
  171. {
  172. SetMotionFrame(_MT_ONEVSWING, bDir);
  173. LoadEffect(&g_xGameProc.m_xImage, _SKILL_ERGUM, bDir);
  174. m_bUseSwordEffect = TRUE;
  175. }
  176. else
  177. {
  178. bDir = LOBYTE(lpPacketMsg->stDefMsg.wSeries);
  179. BYTE bAttackMode = HIBYTE(lpPacketMsg->stDefMsg.wSeries);
  180. SetMotionFrame(_MT_ONEVSWING, bDir);
  181. }
  182. }
  183. }
  184. VOID CHero::OnMagicFire(LPPACKETMSG lpPacketMsg)
  185. {
  186. POINT ptPos;
  187. BYTE bMagicID;
  188. INT nMagicTargetID, nPos;
  189. ptPos.x  = lpPacketMsg->stDefMsg.wParam;
  190. ptPos.y  = lpPacketMsg->stDefMsg.wTag;
  191. bMagicID = lpPacketMsg->stDefMsg.wSeries;
  192. nPos = fnDecode6BitBuf(lpPacketMsg->szEncodeData, (CHAR*)&nMagicTargetID, sizeof(INT));
  193. if ( bMagicID == _SKILL_SKELLETON )
  194. {
  195. return;
  196. }
  197. if ( bMagicID == _SKILL_SHOOTLIGHTEN )
  198. {
  199. CElecMagic* pxElecMagic;
  200. pxElecMagic = new CElecMagic;
  201. pxElecMagic->CreateMagic(bMagicID, m_wPosX, m_wPosY, ptPos.x, ptPos.y, NULL, nMagicTargetID);
  202. g_xGameProc.m_xMagicList.AddNode(pxElecMagic);
  203. }
  204. // if ( bMagicID == _SKILL_SHOOTLIGHTEN || bMagicID == _SKILL_FIRE )
  205. else if ( bMagicID == _SKILL_FIRE )
  206. {
  207. BYTE  bDir16  = (BYTE)g_xGameProc.m_xMap.CalcDirection8(m_wPosX, m_wPosY, ptPos.x, ptPos.y);
  208. POINT ptTileGap  = {0, 0};
  209. POINT ptTileDest = {0, 0};
  210. BYTE  bLoopCnt  = 0;
  211. BYTE  bDelay     = 0;
  212. if ( bMagicID == _SKILL_SHOOTLIGHTEN ) { bLoopCnt = 15; bDelay =  70; }
  213. else { bLoopCnt =  5; bDelay = 150; }
  214. switch ( bDir16 )
  215. {
  216. case 0 : ptTileGap.x =  0; ptTileGap.y = -1; break;
  217. case 1 : ptTileGap.x =  1; ptTileGap.y = -1; break;
  218. case 2 : ptTileGap.x =  1; ptTileGap.y =  0; break;
  219. case 3 : ptTileGap.x =  1; ptTileGap.y =  1; break;
  220. case 4 : ptTileGap.x =  0; ptTileGap.y =  1; break;
  221. case 5 : ptTileGap.x = -1; ptTileGap.y =  1; break;
  222. case 6 : ptTileGap.x = -1; ptTileGap.y =  0; break;
  223. case 7 : ptTileGap.x = -1; ptTileGap.y = -1; break;
  224. }
  225. for ( INT nCnt = 0; nCnt < bLoopCnt; nCnt++ )
  226. {
  227. CMagicStream* pxMagicStream;
  228. pxMagicStream = new CMagicStream;
  229. ptTileDest.x = m_wPosX + ptTileGap.x*(nCnt+1);
  230. ptTileDest.y = m_wPosY + ptTileGap.y*(nCnt+1);
  231. pxMagicStream->CreateMagic(bMagicID, m_wPosX, m_wPosY, ptTileDest.x, ptTileDest.y, NULL, nMagicTargetID, nCnt*bDelay, ptTileGap);
  232. if ( bMagicID == _SKILL_SHOOTLIGHTEN )
  233. g_xGameProc.m_xMagicList.AddNode(pxMagicStream);
  234. else
  235. g_xGameProc.m_xGroundMagicList.AddNode(pxMagicStream);
  236. }
  237. }
  238. else if ( bMagicID == _SKILL_SHIELD )
  239. {
  240. CMagic* pxMagic;
  241. pxMagic = new CMagic;
  242. pxMagic->CreateMagic(bMagicID, m_wPosX, m_wPosY, m_wPosX, m_wPosY, NULL, m_dwIdentity);
  243. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  244. }
  245. else if ( bMagicID != _SKILL_EARTHFIRE &&  bMagicID != _SKILL_HOLYSHIELD )
  246. {
  247. CMagic* pxMagic;
  248. pxMagic = new CMagic;
  249. pxMagic->CreateMagic(bMagicID, m_wPosX, m_wPosY, ptPos.x, ptPos.y, NULL, nMagicTargetID);
  250. g_xGameProc.m_xMagicList.AddNode(pxMagic);
  251. }
  252. m_shCurrMagicID = bMagicID;
  253. }
  254. VOID CHero::OnSpell(LPPACKETMSG lpPacketMsg)
  255. {
  256. BYTE  bMagicDir; 
  257. INT   nMagicID;
  258. POINT ptTargetPos;
  259. ptTargetPos.x = lpPacketMsg->stDefMsg.wParam;
  260. ptTargetPos.y = lpPacketMsg->stDefMsg.wTag;
  261. // bDir   = lpPacketMsg->stDefMsg.wSeries;
  262. // nPos   = fnDecode6BitBuf(lpPacketMsg->szEncodeData, szDecodeMsg, sizeof(szDecodeMsg));
  263. // szDecodeMsg[nPos] = '';
  264. bMagicDir = g_xGameProc.m_xMap.CalcDirection8(m_wPosX, m_wPosY, ptTargetPos.x, ptTargetPos.y);
  265. nMagicID  = atoi(lpPacketMsg->szEncodeData);
  266. if ( nMagicID == _SKILL_FIREBALL     || nMagicID == _SKILL_FIREBALL2 || nMagicID == _SKILL_FIRE      || nMagicID == _SKILL_SHOOTLIGHTEN ||
  267.  nMagicID == _SKILL_HANGMAJINBUB || nMagicID== _SKILL_DEJIWONHO  || nMagicID == _SKILL_FIRECHARM || nMagicID == _SKILL_BIGCLOAK || nMagicID == _SKILL_SINSU )
  268. LoadEffect(&g_xGameProc.m_xImage, nMagicID, bMagicDir);
  269. else
  270. LoadEffect(&g_xGameProc.m_xImage, nMagicID);
  271. if ( nMagicID == _SKILL_SHOWHP ) m_bEffectFrameCnt = 20;
  272. else if ( nMagicID == _SKILL_LIGHTFLOWER ) m_bEffectFrameCnt = 20;
  273. else if ( nMagicID == _SKILL_SPACEMOVE ) m_bEffectFrameCnt = 19;
  274. else if ( nMagicID == _SKILL_LIGHTENING ) m_bEffectFrameCnt = 17;
  275. m_bWarMode = m_bUseEffect = TRUE;
  276. /* if ( nMagicID == _SKILL_SHIELD )
  277. {
  278. m_dwFstEffectFrame  = 50;
  279. m_dwEndEffectFrame  = 60;
  280. m_dwCurrEffectFrame = 50;
  281. m_bEffectFrame = 0;
  282. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  283. }
  284. */ m_shCurrMagicID = nMagicID;
  285. switch( nMagicID )
  286. {
  287. case _SKILL_HANGMAJINBUB:
  288. case _SKILL_DEJIWONHO:
  289. case _SKILL_FIRECHARM:
  290. case _SKILL_FIRE:
  291. case _SKILL_FIREBALL2:
  292. case _SKILL_SINSU:
  293. case _SKILL_FIREBALL:
  294. case _SKILL_SHOOTLIGHTEN:
  295. case _SKILL_BIGCLOAK:
  296. SetMotionFrame(_MT_SPELL1, bMagicDir);
  297. break;
  298. case _SKILL_FIREWIND:
  299. case _SKILL_AMYOUNSUL:
  300. case _SKILL_TAMMING:
  301. case _SKILL_KILLUNDEAD:
  302. case _SKILL_HEALLING:
  303. case _SKILL_HOLYSHIELD:
  304. case _SKILL_BIGHEALLING:
  305. case _SKILL_LIGHTFLOWER:
  306. case _SKILL_SKELLETON:
  307. case _SKILL_SNOWWIND:
  308. case _SKILL_SHIELD:
  309. case _SKILL_SHOWHP:
  310. case _SKILL_EARTHFIRE:
  311. case _SKILL_FIREBOOM:
  312. case _SKILL_SPACEMOVE:
  313. case _SKILL_CLOAK:
  314. case _SKILL_LIGHTENING:
  315. default:
  316. SetMotionFrame(_MT_SPELL2, bMagicDir);
  317. break;
  318. }
  319. }
  320. VOID CHero::OnButch(LPPACKETMSG lpPacketMsg)
  321. {
  322. BYTE bDir;
  323. m_wPosX = lpPacketMsg->stDefMsg.wParam;
  324. m_wPosY = lpPacketMsg->stDefMsg.wTag;
  325. bDir = lpPacketMsg->stDefMsg.wSeries;
  326. SetMotionFrame(_MT_CUT, bDir);
  327. }
  328. /******************************************************************************************************************
  329. 窃荐疙 : CHero::UpdatePacketState()
  330. 累己磊 : 
  331. 累己老 : 
  332. 格利   : 
  333. 免仿   : BOOL 
  334. [老磊][荐沥磊] : 荐沥郴侩
  335. *******************************************************************************************************************/
  336. BOOL CHero::UpdatePacketState()
  337. {
  338. LPPACKETMSG lpPacketMsg = NULL;
  339. if ( m_bCurrMtn == _MT_STAND || m_bCurrMtn == _MT_ATTACKMODE || m_bCurrMtn == _MT_HORSESTAND || (m_bCurrMtn==_MT_SPELL1 && m_dwCurrFrame == m_dwEndFrame-2) )
  340. {
  341. LPPACKETMSG lpPacketMsg;
  342. SHORT shLeftMsgCnt = m_xPacketQueue.GetCount();
  343. if ( shLeftMsgCnt > 0 )
  344. {
  345. lpPacketMsg = (LPPACKETMSG)m_xPacketQueue.PopQ();
  346. if ( shLeftMsgCnt >= 3 ) m_bMsgHurryCheck = TRUE;
  347. else m_bMsgHurryCheck = FALSE;
  348. if ( lpPacketMsg )
  349. {
  350. switch ( lpPacketMsg->stDefMsg.wIdent )
  351. {
  352. case SM_SITDOWN:
  353. case SM_BUTCH: { OnButch(lpPacketMsg); break; }
  354. case SM_FEATURECHANGED: { OnFeatureChanged(lpPacketMsg); break; }
  355. case SM_CHARSTATUSCHANGE: { OnCharStatusChanged(lpPacketMsg); break; }
  356. case SM_OPENHEALTH: { OnOpenHealth(lpPacketMsg); break; }
  357. case SM_CLOSEHEALTH: { OnCloseHealth(lpPacketMsg); break; }
  358. case SM_CHANGELIGHT: { OnChangeLight(lpPacketMsg); break; }
  359. case SM_USERNAME: { OnUserName(lpPacketMsg); break; }
  360. case SM_CHANGENAMECOLOR: { OnChangeNameClr(lpPacketMsg); break; }
  361. case SM_HEALTHSPELLCHANGED: { OnHealthSpellChanged(lpPacketMsg); break; }
  362. case SM_RUSH: { OnRush(lpPacketMsg); break; }
  363. case SM_BACKSTEP: { OnBackStep(lpPacketMsg); break; }
  364. case SM_NOWDEATH:
  365. case SM_DEATH: { OnDeath(lpPacketMsg); break; }
  366. case SM_WALK: { OnWalk(lpPacketMsg); break; }
  367. case SM_RUN: { OnRun(lpPacketMsg); break; }
  368. case SM_TURN: { OnTurn(lpPacketMsg); break; }
  369. case SM_STRUCK: { OnStruck(lpPacketMsg); break; }
  370. case SM_HIT:
  371. case SM_FIREHIT:
  372. case SM_LONGHIT:
  373. case SM_POWERHIT:
  374. case SM_WIDEHIT: { OnHit(lpPacketMsg); break; }
  375. case SM_MAGICFIRE: { OnMagicFire(lpPacketMsg); break; }
  376. case SM_SPELL: { OnSpell(lpPacketMsg); break; }
  377. default:
  378. {
  379. break;
  380. }
  381. }
  382. }
  383. SAFE_DELETE(lpPacketMsg);
  384. return TRUE;
  385. }
  386. }
  387. return FALSE;
  388. }
  389. /******************************************************************************************************************
  390. 窃荐疙 : CHero::UpdateMotionState()
  391. 累己磊 : 
  392. 累己老 : 
  393. 格利   : 
  394. 涝仿   : INT nLoopTime
  395.          BOOL bIsMoveTime
  396. 免仿   : VOID 
  397. [老磊][荐沥磊] : 荐沥郴侩
  398. *******************************************************************************************************************/
  399. VOID CHero::UpdateMotionState(INT nLoopTime, BOOL bIsMoveTime)
  400. {
  401. if ( m_bWarMode ) 
  402. m_dwWarModeTime += nLoopTime;
  403. m_wABlendCurrDelay += nLoopTime;
  404. if ( m_wABlendCurrDelay >= m_wABlendDelay )
  405. {
  406. m_wABlendCurrDelay = 0;
  407. m_wABlendDelay  = 0;
  408. m_bABlendRev = FALSE;
  409. }
  410. if ( m_bCurrMtn == _MT_DIE && m_dwCurrFrame >= m_dwEndFrame-1 )
  411. {
  412. m_bIsDead = TRUE;
  413. }
  414. if ( m_bIsDead )
  415. {
  416. SetMotionFrame(_MT_DIE, m_bCurrDir);
  417. m_dwCurrFrame = m_dwEndFrame - 1;
  418. return;
  419. }
  420. if ( UpdateMove(bIsMoveTime) )
  421. {
  422. UpdatePacketState();
  423. return;
  424. }
  425. else
  426. {
  427. m_wCurrDelay += nLoopTime;
  428. m_wShieldCurrDelay += nLoopTime;
  429. if ( m_wShieldCurrDelay > 150 )  
  430. {
  431. m_bShieldCurrFrm++;
  432. m_wShieldCurrDelay = 0;
  433. if ( m_bShieldCurrFrm > 2 )
  434. m_bShieldCurrFrm = 0;
  435. }
  436. if ( m_wCurrDelay > m_wDelay )
  437. {
  438. m_wCurrDelay = 0;
  439. if ( m_dwCurrFrame < m_dwEndFrame )
  440. {
  441. m_dwCurrFrame++;
  442. PlayActSound();
  443. if ( (m_bCurrMtn == _MT_SPELL2 || m_bCurrMtn == _MT_SPELL1) && m_bUseEffect )
  444. {
  445. m_dwCurrEffectFrame++;
  446. m_bEffectFrame++;
  447. }
  448. if ( m_bMsgHurryCheck )
  449. {
  450. m_wDelay = m_wDelay/2;
  451. m_bMsgHurryCheck = FALSE;
  452. }
  453. }
  454. }
  455. UpdatePacketState();
  456. if ( m_dwWarModeTime > _WARMODE_TIME )
  457. {
  458. m_dwWarModeTime = 0;
  459. m_bWarMode = FALSE;
  460. }
  461. if ( m_dwCurrFrame >= m_dwEndFrame-1 )
  462. {
  463. if ( (m_bCurrMtn == _MT_SPELL2) && m_bUseEffect )
  464. {
  465. if ( m_dwCurrEffectFrame - m_dwFstEffectFrame < m_bEffectFrameCnt-2 )
  466. {
  467. m_dwCurrFrame = m_dwEndFrame - 2;
  468. }
  469. }
  470. }
  471. else if ( m_dwCurrFrame >= m_dwEndFrame-3 )
  472. {
  473. if ( (m_bCurrMtn == _MT_SPELL1) && m_bUseEffect )
  474. {
  475. if ( m_dwCurrEffectFrame - m_dwFstEffectFrame < m_bEffectFrameCnt-5 )
  476. {
  477. m_dwCurrFrame = m_dwEndFrame - 4;
  478. }
  479. }
  480. }
  481. if ( m_dwCurrFrame >= m_dwEndFrame )
  482. {
  483. m_dwCurrEffectFrame = 0;
  484. m_dwFstEffectFrame = 0;
  485. m_dwEndEffectFrame = 0;
  486. m_bEffectFrame = 0;
  487. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  488. m_bUseEffect = FALSE;
  489. m_bUseSwordEffect = FALSE;
  490. m_dwCurrFrame = m_dwFstFrame;
  491. if ( m_stFeatureEx.bHorse == _HORSE_NONE )
  492. {
  493. if ( m_bWarMode )
  494. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  495. else
  496. SetMotionFrame(_MT_STAND, m_bCurrDir);
  497. }
  498. else
  499. {
  500. SetMotionFrame(_MT_HORSESTAND, m_bCurrDir);
  501. }
  502. }
  503. }
  504. }
  505. /******************************************************************************************************************
  506. 窃荐疙 : CHero::ChangeFeature()
  507. 累己磊 : 
  508. 累己老 : 
  509. 格利   : BYTE bGender, BYTE bWear, BYTE bHair, BYTE bWeapon;
  510. 涝仿   : WORD wActor
  511.          BYTE bHair
  512.          BYTE bWeapon
  513. 免仿   : BOOL 
  514. [老磊][荐沥磊] : 荐沥郴侩
  515. *******************************************************************************************************************/
  516. BOOL CHero::ChangeFeature(FEATURE stFeature, FEATUREEX stFeatureEx)
  517. {
  518. if ( CActor::ChangeFeature(stFeature) )
  519. {
  520. CImageHandler* pxImgHandler = &g_xGameProc.m_xImage;
  521. m_stFeatureEx = stFeatureEx;
  522. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  523. // m_stFeatureEx.bHorse = 0;
  524. // m_stFeatureEx.wDressColor = 0XFFFF;
  525. // m_stFeatureEx.wHairColor = 0XFFFF;
  526. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  527. if ( m_stFeature.bHair   >= _MAX_HAIR ) m_stFeature.bHair = _HAIR_NONE;
  528. if ( m_stFeature.bWeapon  >= _MAX_WEAPON ) m_stFeature.bWeapon = _WEAPON_NONE;
  529. if ( m_stFeatureEx.bHorse >= _MAX_HORSE ) m_stFeatureEx.bHorse= _HORSE_NONE;
  530. m_bHorseImgIdx = _IMAGE_HORSE;
  531. if ( m_stFeature.bGender == _GENDER_MAN )
  532. {
  533. m_bHairImgIdx = _IMAGE_M_HAIR;
  534. if ( m_stFeature.bWeapon != _WEAPON_NONE ) m_bWeaponImgIdx = _IMAGE_M_WEAPON1+(m_stFeature.bWeapon-1)/10;
  535. }
  536. else if ( m_stFeature.bGender == _GENDER_WOMAN )
  537. {
  538. m_bHairImgIdx = _IMAGE_WM_HAIR;
  539. if ( m_stFeature.bWeapon != _WEAPON_NONE ) m_bWeaponImgIdx = _IMAGE_WM_WEAPON1+(m_stFeature.bWeapon-1)/10;
  540. }
  541. else return FALSE;
  542. if ( m_stFeature.bHair != _HAIR_NONE ) m_pxHairImage = &pxImgHandler->m_xImageList[m_bHairImgIdx];
  543. else m_pxHairImage = NULL;
  544. if ( m_stFeature.bWeapon != _WEAPON_NONE ) m_pxWeaponImage = &pxImgHandler->m_xImageList[m_bWeaponImgIdx];
  545. else m_pxWeaponImage = NULL;
  546. if ( m_stFeatureEx.bHorse != _HORSE_NONE ) m_pxHorseImage = &pxImgHandler->m_xImageList[m_bHorseImgIdx];
  547. else m_pxHorseImage = NULL;
  548. return TRUE;
  549. }
  550. return FALSE;
  551. }
  552. /******************************************************************************************************************
  553. 窃荐疙 : CHero::DrawActor()
  554. 累己磊 : 
  555. 累己老 : 
  556. 格利   : 
  557. 涝仿   : BOOL bFocused
  558.          BOOL bShadowAblended
  559. 免仿   : BOOL 
  560. [老磊][荐沥磊] : 荐沥郴侩
  561. *******************************************************************************************************************/
  562. BOOL CHero::DrawActor(CMapHandler* pxMap, BOOL bFocused, BOOL bShadowAblended, BOOL bUseScrnPos, BOOL bDrawShadow)
  563. {
  564. // 谅钎贸府.
  565. if ( bUseScrnPos )
  566. {
  567. m_shScrnPosX = (m_wPosX - pxMap->m_shStartViewTileX) * _CELL_WIDTH + _VIEW_CELL_X_START - pxMap->m_shViewOffsetX + m_shShiftPixelX;
  568. m_shScrnPosY = (m_wPosY - pxMap->m_shStartViewTileY) * _CELL_HEIGHT+ _VIEW_CELL_Y_START - pxMap->m_shViewOffsetY + m_shShiftPixelY;
  569. }
  570. BYTE bShadowType;
  571. SHORT shShadowPX;
  572. SHORT shShadowPY;
  573. SHORT shPX, shPY;
  574. //---------------------------------------------------------------------------------------------------------------//
  575. // 阿 捞固瘤 技泼棺 谅钎康开 眉农.
  576. //---------------------------------------------------------------------------------------------------------------//
  577. // 富.
  578. if ( m_stFeatureEx.bHorse != _HORSE_NONE && m_pxHorseImage != NULL )
  579. {
  580. if ( m_bCurrMtn >= _START_HORSE_MTN )
  581. {
  582. m_dwCurrHorseFrame = (m_stFeatureEx.bHorse*_MAX_HORSE_FRAME-_MAX_HORSE_FRAME)+(m_dwCurrFrame-(_MAX_HERO_FRAME*m_stFeature.bDress)-_START_HORSE_FRAME);
  583. if ( !m_pxHorseImage->NewSetIndex(m_dwCurrHorseFrame) )
  584. return FALSE;
  585. shPX = m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPX;
  586. shPY = m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPY;
  587. SetRect(&m_rcHorse, m_shScrnPosX + shPX, m_shScrnPosY + shPY,
  588. m_shScrnPosX + shPX + m_pxHorseImage->m_lpstNewCurrWilImageInfo->shWidth, 
  589. m_shScrnPosX + shPY + m_pxHorseImage->m_lpstNewCurrWilImageInfo->shHeight);
  590. }
  591. // 公扁.
  592. if ( m_stFeature.bWeapon != _WEAPON_NONE && m_pxWeaponImage != NULL )
  593. {
  594. if ( m_bCurrMtn < _MAX_WEAPON_MTN )
  595. {
  596. m_dwCurrWeaponFrame = (((m_stFeature.bWeapon-1)%10)*_MAX_WEAPON_FRAME)+(m_dwCurrFrame-(_MAX_HERO_FRAME*m_stFeature.bDress));
  597. if ( !m_pxWeaponImage->NewSetIndex(m_dwCurrWeaponFrame) )
  598. return FALSE;
  599. shPX = m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPX;
  600. shPY = m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPY;
  601. SetRect(&m_rcWeapon, m_shScrnPosX + shPX, m_shScrnPosY + shPY, 
  602. m_shScrnPosX + shPX + m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth, 
  603. m_shScrnPosY + shPY + m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight);
  604. }
  605. }
  606. // 某腐磐.
  607. if ( m_pxActorImage )
  608. {
  609. if ( !m_pxActorImage->NewSetIndex(m_dwCurrFrame) )
  610. return FALSE;
  611. shPX = m_pxActorImage->m_lpstNewCurrWilImageInfo->shPX;
  612. shPY = m_pxActorImage->m_lpstNewCurrWilImageInfo->shPY;
  613. bShadowType = m_pxActorImage->m_lpstNewCurrWilImageInfo->bShadow;
  614. shShadowPX  = m_pxActorImage->m_lpstNewCurrWilImageInfo->shShadowPX;
  615. shShadowPY  = m_pxActorImage->m_lpstNewCurrWilImageInfo->shShadowPY;
  616. SetRect(&m_rcActor, m_shScrnPosX + shPX, m_shScrnPosY + shPY, 
  617. m_shScrnPosX + shPX + m_pxActorImage->m_lpstNewCurrWilImageInfo->shWidth, 
  618. m_shScrnPosY + shPY + m_pxActorImage->m_lpstNewCurrWilImageInfo->shHeight);
  619. if ( ( m_rcActor.right - m_rcActor.left ) > _CELL_WIDTH + _TARGETRGN_GAPX )
  620. {
  621. m_rcTargetRgn.left  = m_rcActor.left + ( (m_rcActor.right - m_rcActor.left) - (_CELL_WIDTH + _TARGETRGN_GAPX) )/2;
  622. m_rcTargetRgn.right = m_rcActor.left + ( (m_rcActor.right - m_rcActor.left) + (_CELL_WIDTH + _TARGETRGN_GAPX) )/2;
  623. }
  624. else
  625. {
  626. m_rcTargetRgn.left  = m_rcActor.left;
  627. m_rcTargetRgn.right = m_rcActor.right;
  628. }
  629. if ( ( m_rcActor.bottom - m_rcActor.top ) > _CELL_HEIGHT + _TARGETRGN_GAPY )
  630. {
  631. m_rcTargetRgn.top    = m_rcActor.top + ( (m_rcActor.bottom - m_rcActor.top) - (_CELL_HEIGHT + _TARGETRGN_GAPY) )/2;
  632. m_rcTargetRgn.bottom = m_rcActor.top + ( (m_rcActor.bottom - m_rcActor.top) + (_CELL_HEIGHT + _TARGETRGN_GAPY) )/2;
  633. }
  634. else
  635. {
  636. m_rcTargetRgn.top    = m_rcActor.top;
  637. m_rcTargetRgn.bottom = m_rcActor.bottom;
  638. }
  639. }
  640. // 赣府.
  641. if ( m_stFeature.bHair != _HAIR_NONE && m_pxHairImage != NULL )
  642. {
  643. m_dwCurrHairFrame = (m_stFeature.bHair*_MAX_HERO_FRAME-_MAX_HERO_FRAME)+(m_dwCurrFrame-(_MAX_HERO_FRAME*m_stFeature.bDress));
  644. if ( !m_pxHairImage->NewSetIndex(m_dwCurrHairFrame) )
  645. return FALSE;
  646. shPX = m_pxHairImage->m_lpstNewCurrWilImageInfo->shPX;
  647. shPY = m_pxHairImage->m_lpstNewCurrWilImageInfo->shPY;
  648. SetRect(&m_rcHair, m_shScrnPosX + shPX, m_shScrnPosY + shPY, 
  649. m_shScrnPosX + shPX + m_pxHairImage->m_lpstNewCurrWilImageInfo->shWidth, 
  650. m_shScrnPosY + shPY + m_pxHairImage->m_lpstNewCurrWilImageInfo->shHeight);
  651. }
  652. //---------------------------------------------------------------------------------------------------------------//
  653. // 弊覆磊弊府扁.
  654. //---------------------------------------------------------------------------------------------------------------//
  655. BYTE bOpaRate = 70;
  656. WORD wState   = GetCharState();
  657. // 公扁.
  658. if ( m_stFeature.bWeapon != _WEAPON_NONE && m_pxWeaponImage != NULL )
  659. {
  660. if ( m_bCurrMtn < _MAX_WEAPON_MTN )
  661. {
  662. if ( bDrawShadow )
  663. {
  664. if ( !m_bIsDead )
  665. {
  666. g_xMainWnd.DrawWithShadowABlend(
  667. m_rcWeapon.left, m_rcWeapon.top,
  668. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth,
  669. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight,
  670. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPX,
  671. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPY,
  672. (WORD*)m_pxWeaponImage->m_pbCurrImage, 
  673. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, bOpaRate);
  674. }
  675. /* else
  676. {
  677. g_xMainWnd.DrawWithShadowABlend(
  678. m_rcWeapon.left+3, m_rcWeapon.top-2,
  679. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth,
  680. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight,
  681. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPX,
  682. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shPY,
  683. (WORD*)m_pxWeaponImage->m_pbCurrImage, 
  684. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, bOpaRate);
  685. }
  686. */ }
  687. }
  688. }
  689. // 富.
  690. if ( m_stFeatureEx.bHorse != _HORSE_NONE && m_pxHorseImage != NULL )
  691. {
  692. if ( m_bCurrMtn >= _START_HORSE_MTN )
  693. {
  694. if ( bDrawShadow )
  695. {
  696. if ( !m_bIsDead )
  697. {
  698. g_xMainWnd.DrawWithShadowABlend(
  699. m_rcHorse.left, m_rcHorse.top,
  700. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shWidth,
  701. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shHeight,
  702. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPX,
  703. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPY,
  704. (WORD*)m_pxHorseImage->m_pbCurrImage, 
  705. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, bOpaRate);
  706. }
  707. else
  708. {
  709. g_xMainWnd.DrawWithShadowABlend(
  710. m_rcHorse.left+3, m_rcHorse.top+2,
  711. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shWidth,
  712. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shHeight,
  713. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPX,
  714. m_pxHorseImage->m_lpstNewCurrWilImageInfo->shPY,
  715. (WORD*)m_pxHorseImage->m_pbCurrImage, 
  716. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, bOpaRate);
  717. }
  718. }
  719. }
  720. }
  721. // 某腐磐.
  722. if ( m_pxActorImage )
  723. {
  724. INT nStartX1 = m_shScrnPosX + shShadowPX;
  725. INT nStartY1 = m_shScrnPosY + shShadowPY;
  726. if ( bDrawShadow )
  727. {
  728. if ( !m_bIsDead )
  729. {
  730. g_xMainWnd.DrawWithShadowABlend(
  731. nStartX1, nStartY1,
  732. m_pxActorImage->m_lpstNewCurrWilImageInfo->shWidth,
  733. m_pxActorImage->m_lpstNewCurrWilImageInfo->shHeight,
  734. (WORD*)m_pxActorImage->m_pbCurrImage,
  735. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, bShadowType, bOpaRate);
  736. }
  737. else
  738. {
  739. g_xMainWnd.DrawWithShadowABlend(
  740. m_rcActor.left+3, m_rcActor.top+2,
  741. m_pxActorImage->m_lpstNewCurrWilImageInfo->shWidth,
  742. m_pxActorImage->m_lpstNewCurrWilImageInfo->shHeight,
  743. (WORD*)m_pxActorImage->m_pbCurrImage,
  744. _CLIP_WIDTH, _CLIP_HEIGHT, g_xGameProc.m_wShadowClr, bShadowAblended, 50, bOpaRate);
  745. }
  746. }
  747. }
  748. // 赣府绰 弊覆磊甫 弊府瘤 臼绰促.
  749. if ( m_wABlendDelay )
  750. {
  751. bShadowAblended = TRUE;
  752. if ( m_wABlendDelay )
  753. {
  754. if ( !m_bABlendRev )
  755. bOpaRate = 100 - ( (m_wABlendCurrDelay * 100) / m_wABlendDelay );
  756. else
  757. bOpaRate = ( (m_wABlendCurrDelay * 100) / m_wABlendDelay );
  758. }
  759. if ( bFocused )
  760. {
  761. if ( !m_bABlendRev )
  762. bOpaRate -= 20;
  763. else
  764. bOpaRate += 20;
  765. }
  766. if ( bOpaRate < 0 && bOpaRate > 100 ) bOpaRate  = 0;
  767. }
  768. else if ( wState==_STATE_ABLEND ) bShadowAblended = TRUE;
  769. //---------------------------------------------------------------------------------------------------------------//
  770. // 捞固瘤 弊府扁.
  771. //---------------------------------------------------------------------------------------------------------------//
  772. // 富.
  773. if ( m_stFeatureEx.bHorse != _HORSE_NONE && m_pxHorseImage != NULL )
  774. {
  775. if ( m_bCurrMtn >= _START_HORSE_MTN )
  776. {
  777. DrawWithEffected(m_rcHorse.left, m_rcHorse.top, m_pxHorseImage->m_lpstNewCurrWilImageInfo->shWidth, m_pxHorseImage->m_lpstNewCurrWilImageInfo->shHeight, (WORD*)m_pxHorseImage->m_pbCurrImage, 
  778.              0XFFFF, 0XFFFF, bFocused, bOpaRate, wState);
  779. }
  780. }
  781. // 公扁甫 刚历 弊妨具瞪规氢.
  782. if ( m_stFeature.bWeapon != _WEAPON_NONE && m_pxWeaponImage != NULL && g_xSpriteInfo.m_bWOrder[(m_dwCurrFrame-(_MAX_HERO_FRAME*m_stFeature.bDress))] )
  783. {
  784. if ( m_bCurrMtn < _MAX_WEAPON_MTN )
  785. {
  786. DrawWithEffected(m_rcWeapon.left, m_rcWeapon.top, m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth, m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight, (WORD*)m_pxWeaponImage->m_pbCurrImage,
  787.  0XFFFF, 0XFFFF, bFocused, bOpaRate, wState);
  788. /*  g_xMainWnd.DrawWithImageForCompClipRgn(
  789. m_rcWeapon.left, m_rcWeapon.top,
  790. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth,
  791. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight,
  792. (WORD*)m_pxWeaponImage->m_pbCurrImage, _CLIP_WIDTH, _CLIP_HEIGHT, bFocused);
  793. */ }
  794. }
  795. // 某腐磐.
  796. if ( m_pxActorImage != NULL )
  797. {
  798. DrawWithEffected(m_rcActor.left, m_rcActor.top, m_pxActorImage->m_lpstNewCurrWilImageInfo->shWidth, m_pxActorImage->m_lpstNewCurrWilImageInfo->shHeight, (WORD*)m_pxActorImage->m_pbCurrImage,
  799.          m_stFeatureEx.wDressColor, m_stFeatureEx.wHairColor, bFocused, bOpaRate, wState);
  800. }
  801. // 赣府.
  802.   if ( m_stFeature.bHair != _HAIR_NONE && m_pxHairImage != NULL )
  803. {
  804. DrawWithEffected(m_rcHair.left, m_rcHair.top, m_pxHairImage->m_lpstNewCurrWilImageInfo->shWidth, m_pxHairImage->m_lpstNewCurrWilImageInfo->shHeight, (WORD*)m_pxHairImage->m_pbCurrImage, 
  805.          m_stFeatureEx.wDressColor, m_stFeatureEx.wHairColor, bFocused, bOpaRate, wState);
  806. }
  807. // 公扁甫 唱吝俊 弊妨具瞪 规氢.
  808. if ( m_stFeature.bWeapon != _WEAPON_NONE && m_pxWeaponImage != NULL && !g_xSpriteInfo.m_bWOrder[(m_dwCurrFrame-(_MAX_HERO_FRAME*m_stFeature.bDress))] ) 
  809. {
  810. if ( m_bCurrMtn < _MAX_WEAPON_MTN )
  811. {
  812.   DrawWithEffected(m_rcWeapon.left, m_rcWeapon.top, m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth, m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight, (WORD*)m_pxWeaponImage->m_pbCurrImage,
  813.  0XFFFF, 0XFFFF, bFocused, /*bOpaRate*/20, wState);
  814. /* g_xMainWnd.DrawWithImageForCompClipRgn(
  815. m_rcWeapon.left, m_rcWeapon.top,
  816. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shWidth,
  817. m_pxWeaponImage->m_lpstNewCurrWilImageInfo->shHeight,
  818. (WORD*)m_pxWeaponImage->m_pbCurrImage, _CLIP_WIDTH, _CLIP_HEIGHT, bFocused);
  819. */ }
  820. }
  821. DrawEffect();
  822. ShowShield();
  823. if ( !bDrawShadow )
  824. return TRUE;
  825. if ( bUseScrnPos )
  826. {
  827. if ( m_bLightSize == 2 )
  828. g_xGameProc.m_xLightFog.SetLightRadiusWithCircle(m_rcActor.left+_CELL_WIDTH/2, m_rcActor.top+_CELL_HEIGHT/2, 3, 100, 100, 100);
  829. else
  830. g_xGameProc.m_xLightFog.SetLightRadiusWithCircle(m_rcActor.left+_CELL_WIDTH/2, m_rcActor.top+_CELL_HEIGHT/2, m_bLightSize, 255, 255, 255);
  831. }
  832. else
  833. {
  834. if ( m_bLightSize == 2 )
  835. g_xGameProc.m_xLightFog.SetLightRadiusWithCircle(400, 242, 3, 100, 100, 100);
  836. else
  837. g_xGameProc.m_xLightFog.SetLightRadiusWithCircle(400, 242, m_bLightSize, 255, 255, 255);
  838. }
  839. return TRUE;
  840. }
  841. /******************************************************************************************************************
  842. CMyHero Class
  843. *******************************************************************************************************************/
  844. /******************************************************************************************************************
  845. 窃荐疙 : CMyHero::CMyHero()
  846. 累己磊 : 
  847. 累己老 : 
  848. 格利   : 
  849. 免仿   : 
  850. [老磊][荐沥磊] : 荐沥郴侩
  851. *******************************************************************************************************************/
  852. CMyHero::CMyHero()
  853. {
  854. InitActor();
  855. }
  856. /******************************************************************************************************************
  857. 窃荐疙 : CMyHero::~CMyHero()
  858. 累己磊 : 
  859. 累己老 : 
  860. 格利   : 
  861. 免仿   : 
  862. [老磊][荐沥磊] : 荐沥郴侩
  863. *******************************************************************************************************************/
  864. CMyHero::~CMyHero()
  865. {
  866. DestroyActor();
  867. }
  868. VOID CMyHero::InitActor()
  869. {
  870. CHero::InitActor();
  871. m_wOldPosX = 0;
  872. m_wOldPosY = 0;
  873. m_bOldDir = 0;
  874. m_dwWarModeTime = 0;
  875. m_dwMotionLockTime = 0;
  876. m_wMagicDelayTime = 0;
  877. m_wMagicPKDelayTime = 0;
  878. m_bJob = 0;
  879. m_nGlod = 0;
  880. m_dwLastHitTime = timeGetTime();
  881. m_dwLastSpellTime = timeGetTime();
  882. m_dwLastMagicTime = timeGetTime();
  883. m_dwLastStruckTime  = timeGetTime();
  884. m_dwLastPKStruckTime= timeGetTime();
  885. m_dwLastRushTime = timeGetTime();
  886. m_dwLastFireHitTime = timeGetTime();
  887. m_bCanRun = FALSE;
  888. m_bInputLock = FALSE;
  889. m_bMotionLock = FALSE;
  890. m_bWarMode = FALSE;
  891. m_pxMap = NULL;
  892. m_bAttackMode = _MT_ONEHSWING;
  893. ZeroMemory(&m_stAbility, sizeof(ACTORABILITY));
  894. ZeroMemory(&m_stSubAbility, sizeof(ACTORSUBABILITY));
  895. }
  896. VOID CMyHero::DestroyActor()
  897. {
  898. INT nCnt;
  899. SHORT shLeftMsgCnt;
  900. LPPACKETMSG lpPacketMsg;
  901. CHero::DestroyActor();
  902. lpPacketMsg  = NULL;
  903. shLeftMsgCnt = m_xPriorPacketQueue.GetCount();
  904. // 阶咯乐绰 菩哦阑 瘤款促.
  905. if ( shLeftMsgCnt > 0 )
  906. {
  907. for ( nCnt = 0; nCnt < shLeftMsgCnt; nCnt++ )
  908. {
  909. lpPacketMsg = (LPPACKETMSG)m_xPriorPacketQueue.PopQ();
  910. if ( lpPacketMsg )
  911. {
  912. SAFE_DELETE(lpPacketMsg);
  913. }
  914. }
  915. }
  916. InitActor();
  917. }
  918. BOOL CMyHero::Create(CImageHandler* pxImgHandler, BYTE bMtn, BYTE bDir, WORD wPosX, WORD wPosY, 
  919.    FEATURE* pstFeature, FEATUREEX* pstFeatureEx)
  920. {
  921. ZeroMemory(&m_stAbility, sizeof(ACTORABILITY));
  922. ZeroMemory(&m_stSubAbility, sizeof(ACTORSUBABILITY));
  923. if ( !(CHero::Create(pxImgHandler, bMtn, bDir, wPosX, wPosY, pstFeature, pstFeatureEx)) )
  924. return FALSE;
  925. return TRUE;
  926. }
  927. /******************************************************************************************************************
  928. 窃荐疙 : CMyHero::SetMapHandler()
  929. 累己磊 : 
  930. 累己老 : 
  931. 格利   : 
  932. 涝仿   : CMapHandler* pxMap
  933. 免仿   : VOID 
  934. [老磊][荐沥磊] : 荐沥郴侩
  935. *******************************************************************************************************************/
  936. VOID CMyHero::SetMapHandler(CMapHandler* pxMap)
  937. {
  938. m_pxMap = pxMap;
  939. }
  940. VOID CMyHero::OnHealthSpellChanged(LPPACKETMSG lpPacketMsg)
  941. {
  942. m_stAbility.wHP    = lpPacketMsg->stDefMsg.wParam;
  943. m_stAbility.wMaxHP = lpPacketMsg->stDefMsg.wSeries;
  944. m_stAbility.wMP    = lpPacketMsg->stDefMsg.wTag;
  945. if ( m_stAbility.wHP <= 0 ) m_stAbility.wHP = m_bHPPercent = 0;
  946. else
  947. {
  948. FLOAT wHPRate= (FLOAT)((FLOAT)m_stAbility.wHP/(FLOAT)m_stAbility.wMaxHP);
  949. m_bHPPercent = wHPRate * 100;
  950. }
  951. }
  952. /******************************************************************************************************************
  953. 窃荐疙 : CMyHero::UpdatePacketState()
  954. 累己磊 : 
  955. 累己老 : 
  956. 格利   : 
  957. 免仿   : BOOL 
  958. [老磊][荐沥磊] : 荐沥郴侩
  959. *******************************************************************************************************************/
  960. BOOL CMyHero::UpdatePacketState()
  961. {
  962. LPPACKETMSG lpPacketMsg = NULL;
  963. SHORT shLeftMsgCnt = m_xPriorPacketQueue.GetCount();
  964. if ( shLeftMsgCnt > 0 )
  965. {
  966. lpPacketMsg = (LPPACKETMSG)m_xPriorPacketQueue.PopQ();
  967. if ( lpPacketMsg )
  968. {
  969. if ( lpPacketMsg->stDefMsg.wIdent == SM_NOWDEATH || lpPacketMsg->stDefMsg.wIdent == SM_DEATH )
  970. {
  971. OnDeath(lpPacketMsg);
  972. SAFE_DELETE(lpPacketMsg);
  973. return TRUE;
  974. }
  975. }
  976. }
  977. if ( m_bCurrMtn == _MT_STAND || m_bCurrMtn == _MT_ATTACKMODE || m_bCurrMtn == _MT_HORSESTAND || (m_bCurrMtn==_MT_SPELL1 && m_dwCurrFrame==m_dwEndFrame - 2) )
  978. {
  979. LPPACKETMSG lpPacketMsg;
  980. SHORT shLeftMsgCnt = m_xPacketQueue.GetCount();
  981. if ( shLeftMsgCnt > 0 )
  982. {
  983. lpPacketMsg = (LPPACKETMSG)m_xPacketQueue.PopQ();
  984. if ( shLeftMsgCnt >= 3 ) m_bMsgHurryCheck = TRUE;
  985. else m_bMsgHurryCheck = FALSE;
  986. if ( lpPacketMsg )
  987. {
  988. switch ( lpPacketMsg->stDefMsg.wIdent )
  989. {
  990. case SM_STRUCK:
  991. {
  992. m_bInputLock = TRUE;
  993. m_stAbility.wHP    = lpPacketMsg->stDefMsg.wParam;
  994. m_stAbility.wMaxHP = lpPacketMsg->stDefMsg.wTag;
  995. OnStruck(lpPacketMsg);
  996. if ( m_dwNameClr == RGB(255, 0, 0) )
  997. {
  998. m_dwLastPKStruckTime = timeGetTime();
  999. }
  1000. m_dwLastStruckTime = timeGetTime();
  1001. break;
  1002. }
  1003. case SM_RUSH:
  1004. {
  1005. m_bInputLock = TRUE;
  1006. m_wOldPosX  = m_wPosX;
  1007. m_wOldPosY  = m_wPosY;
  1008. m_bOldDir  = m_bCurrDir;
  1009. OnRush(lpPacketMsg);
  1010. if ( !CheckMyPostion() ) AdjustMyPostion();
  1011. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1012. break;
  1013. }
  1014. case SM_BACKSTEP:
  1015. {
  1016. m_bInputLock = TRUE;
  1017. m_wOldPosX = m_wPosX;
  1018. m_wOldPosY = m_wPosY;
  1019. m_bOldDir  = m_bCurrDir;
  1020. OnBackStep(lpPacketMsg);
  1021. if ( !CheckMyPostion() ) AdjustMyPostion();
  1022. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1023. break;
  1024. }
  1025. case SM_FEATURECHANGED: { OnFeatureChanged(lpPacketMsg); break; }
  1026. case SM_OPENHEALTH: { OnOpenHealth(lpPacketMsg); break; }
  1027. case SM_CLOSEHEALTH: { OnCloseHealth(lpPacketMsg); break; }
  1028. case SM_CHANGELIGHT: { OnChangeLight(lpPacketMsg); break; }
  1029. case SM_USERNAME: { OnUserName(lpPacketMsg); break; }
  1030. case SM_CHANGENAMECOLOR: { OnChangeNameClr(lpPacketMsg); break; }
  1031. case SM_CHARSTATUSCHANGE: { OnCharStatusChanged(lpPacketMsg); break; }
  1032. case SM_MAGICFIRE: { OnMagicFire(lpPacketMsg); break; }
  1033. case SM_HEALTHSPELLCHANGED: { OnHealthSpellChanged(lpPacketMsg); break; }
  1034. default:
  1035. {
  1036. break;
  1037. }
  1038. }
  1039. }
  1040. SAFE_DELETE(lpPacketMsg);
  1041. return TRUE;
  1042. }
  1043. }
  1044. return FALSE;
  1045. }
  1046. /******************************************************************************************************************
  1047. 窃荐疙 : CMyHero::SetOldPosition()
  1048. 累己磊 : 
  1049. 累己老 : 
  1050. 格利   : 
  1051. 免仿   : BOOL 
  1052. [老磊][荐沥磊] : 荐沥郴侩
  1053. *******************************************************************************************************************/
  1054. BOOL CMyHero::SetOldPosition()
  1055. {
  1056. m_wPosX    = m_wOldPosX;
  1057. m_wPosY    = m_wOldPosY;
  1058. m_bCurrDir = m_bOldDir;
  1059. if ( m_stFeatureEx.bHorse == _HORSE_NONE )
  1060. {
  1061. if ( SetMotionFrame(_MT_STAND, m_bCurrDir) )
  1062. {
  1063. AdjustMyPostion();
  1064. m_bMotionLock = m_bInputLock = FALSE;
  1065. return TRUE;
  1066. }
  1067. }
  1068. else
  1069. {
  1070. if ( SetMotionFrame(_MT_HORSESTAND, m_bCurrDir) )
  1071. {
  1072. AdjustMyPostion();
  1073. m_bMotionLock = m_bInputLock = FALSE;
  1074. return TRUE;
  1075. }
  1076. }
  1077. return FALSE;
  1078. }
  1079. /******************************************************************************************************************
  1080. 窃荐疙 : CMyHero::CheckMyPostion()
  1081. 累己磊 : 
  1082. 累己老 : 
  1083. 格利   : 
  1084. 免仿   : BOOL 
  1085. [老磊][荐沥磊] : 荐沥郴侩
  1086. *******************************************************************************************************************/
  1087. BOOL CMyHero::CheckMyPostion()
  1088. {
  1089. if ( m_wPosX != m_pxMap->m_shStartViewTileX + _GAPX_TILE_CHAR_MAP ||
  1090.  m_wPosY != m_pxMap->m_shStartViewTileY + _GAPY_TILE_CHAR_MAP )
  1091. {
  1092. return FALSE;
  1093. }
  1094. return TRUE;
  1095. }
  1096. /******************************************************************************************************************
  1097. 窃荐疙 : CMyHero::AdjustMyPostion()
  1098. 累己磊 : 
  1099. 累己老 : 
  1100. 格利   : 
  1101. 免仿   : VOID 
  1102. [老磊][荐沥磊] : 荐沥郴侩
  1103. *******************************************************************************************************************/
  1104. VOID CMyHero::AdjustMyPostion()
  1105. {
  1106. m_pxMap->SetStartViewTile(m_wPosX-_GAPX_TILE_CHAR_MAP, m_wPosY-_GAPY_TILE_CHAR_MAP);
  1107. m_pxMap->LoadNewMapBuffer();
  1108. }
  1109. /******************************************************************************************************************
  1110. 窃荐疙 : CMyHero::SetMotionState()
  1111. 累己磊 : 
  1112. 累己老 : 
  1113. 格利   : 
  1114. 涝仿   : BYTE bMtn
  1115.          BYTE bDir
  1116.          LPPOINT lpptTarget
  1117. 免仿   : VOID 
  1118. [老磊][荐沥磊] : 荐沥郴侩
  1119. *******************************************************************************************************************/
  1120. VOID CMyHero::SetMotionState(BYTE bMtn, BYTE bDir, INT nMouseTargetID, BOOL bIsDead, LPPOINT lpptPos, SHORT shSkill)
  1121. {
  1122. if ( !m_bIsMon )
  1123. {
  1124. switch ( bMtn )
  1125. {
  1126. case _MT_WALK:
  1127. case _MT_HORSEWALK:
  1128. {
  1129. if ( lpptPos )
  1130. {
  1131. POINT ptNext;
  1132. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  1133. {
  1134. m_pxMap->GetNextTileCanMove(lpptPos->x, lpptPos->y, nCnt, 1, &ptNext);
  1135. if ( !m_pxMap->IsDoorOpen(ptNext.x, ptNext.y) )
  1136. {
  1137. g_xClientSocket.SendOpenDoor(ptNext.x, ptNext.y, m_pxMap->GetDoor(ptNext.x, ptNext.y));
  1138. break;
  1139. }
  1140. }
  1141. g_xClientSocket.SendActMsg(CM_WALK, lpptPos->x, lpptPos->y, bDir);
  1142. m_bMotionLock = m_bInputLock = TRUE;
  1143. m_wOldPosX = m_wPosX;
  1144. m_wOldPosY = m_wPosY;
  1145. m_bOldDir  = m_bCurrDir;
  1146. SetMotionFrame(bMtn, bDir);
  1147. m_bMoveSpeed = _SPEED_WALK;
  1148. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1149. }
  1150. break;
  1151. }
  1152. case _MT_RUN:
  1153. case _MT_HORSERUN:
  1154. {
  1155. if ( lpptPos )
  1156. {
  1157. POINT ptNext;
  1158. POINT ptStart;
  1159. if ( bMtn == _MT_RUN )
  1160. m_bMoveSpeed = _SPEED_RUN;
  1161. else
  1162. m_bMoveSpeed = _SPEED_HORSERUN;
  1163. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptStart);
  1164. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  1165. {
  1166. for ( INT nSpeedCnt = 0; nSpeedCnt < m_bMoveSpeed; nSpeedCnt++ )
  1167. {
  1168. m_pxMap->GetNextTileCanMove(ptStart.x, ptStart.y, nCnt, nSpeedCnt+1, &ptNext);
  1169. if ( !m_pxMap->IsDoorOpen(ptNext.x, ptNext.y) )
  1170. {
  1171. g_xClientSocket.SendOpenDoor(ptNext.x, ptNext.y, m_pxMap->GetDoor(ptNext.x, ptNext.y));
  1172. break;
  1173. }
  1174. }
  1175. }
  1176. g_xClientSocket.SendActMsg(CM_RUN, lpptPos->x, lpptPos->y, bDir);
  1177. m_bMotionLock = m_bInputLock = TRUE;
  1178. m_wOldPosX = m_wPosX;
  1179. m_wOldPosY = m_wPosY;
  1180. m_bOldDir  = m_bCurrDir;
  1181. SetMotionFrame(bMtn, bDir);
  1182. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1183. }
  1184. break;
  1185. }
  1186. case _MT_ONEHSWING:
  1187. {
  1188. if ( m_bAttackMode == _MT_ONEHSWING || m_bAttackMode == _MT_ONEVSWING )
  1189. {
  1190. BYTE bAttackStyle = rand()%2;
  1191. if ( bAttackStyle ) m_bAttackMode = _MT_ONEVSWING;
  1192. else m_bAttackMode = _MT_ONEHSWING;
  1193. m_bAttackMode = _MT_ONEVSWING;
  1194. }
  1195. if ( lpptPos && CanNextHit() )
  1196. {
  1197. m_bMotionLock = m_bInputLock = TRUE;
  1198. m_wOldPosX = m_wPosX;
  1199. m_wOldPosY = m_wPosY;
  1200. m_bOldDir = m_bCurrDir;
  1201. m_bWarMode = TRUE;
  1202. m_dwWarModeTime = 0;
  1203. if ( m_bUseErgum && g_xGameProc.TargetInLongAttack(bDir) )
  1204. {
  1205. SetMotionFrame(_MT_ONEVSWING, bDir);
  1206. LoadEffect(&g_xGameProc.m_xImage, _SKILL_ERGUM, bDir);
  1207. m_bUseSwordEffect = TRUE;
  1208. g_xClientSocket.SendActMsg(CM_LONGHIT, lpptPos->x, lpptPos->y, bDir);
  1209. }
  1210. else if ( m_bFireHitCnt == 1 && m_stAbility.wMP > 7 )
  1211. {
  1212. SetMotionFrame(_MT_ONEVSWING, bDir);
  1213. LoadEffect(&g_xGameProc.m_xImage, _SKILL_FIRESWORD, bDir);
  1214. m_bUseSwordEffect = TRUE;
  1215. g_xClientSocket.SendActMsg(CM_FIREHIT, lpptPos->x, lpptPos->y, bDir);
  1216. m_bFireHitCnt = 2;
  1217. }
  1218. else if ( m_bYedoCnt == 1 )
  1219. {
  1220. SetMotionFrame(_MT_ONEVSWING, bDir);
  1221. LoadEffect(&g_xGameProc.m_xImage, _SKILL_YEDO, bDir);
  1222. m_bUseSwordEffect = TRUE;
  1223. g_xClientSocket.SendActMsg(CM_POWERHIT, lpptPos->x, lpptPos->y, bDir);
  1224. m_bYedoCnt = 2;
  1225. }
  1226. else if ( m_bUseBanwol && m_stAbility.wMP > 3 )
  1227. {
  1228. SetMotionFrame(_MT_ONEHSWING, bDir);
  1229. LoadEffect(&g_xGameProc.m_xImage, _SKILL_BANWOL, bDir);
  1230. m_bUseSwordEffect = TRUE;
  1231. g_xClientSocket.SendActMsg(CM_WIDEHIT, lpptPos->x, lpptPos->y, bDir);
  1232. }
  1233. else
  1234. {
  1235. SetMotionFrame(m_bAttackMode, bDir);
  1236. if ( m_bAttackMode == _MT_WHEELWIND )
  1237. {
  1238. LoadEffect(&g_xGameProc.m_xImage, _SKILL_JUMPSHOT, bDir);
  1239. m_bUseSwordEffect = TRUE;
  1240. }
  1241. else if ( m_bAttackMode == _MT_RANDSWING )
  1242. {
  1243. LoadEffect(&g_xGameProc.m_xImage, _SKILL_RANDSWING, bDir);
  1244. m_bUseSwordEffect = TRUE;
  1245. }
  1246. WORD wAttackStyle;
  1247. if ( m_bAttackMode != _MT_ONEVSWING && m_bAttackMode != _MT_ONEHSWING )
  1248. wAttackStyle = _MT_ONEVSWING;
  1249. else
  1250. {
  1251. wAttackStyle = m_bAttackMode;
  1252. }
  1253. g_xClientSocket.SendHitMsg(CM_HIT, lpptPos->x, lpptPos->y, bDir, wAttackStyle);
  1254. }
  1255. }
  1256. break;
  1257. }
  1258. case _MT_MOODEPO:
  1259. {
  1260. if ( lpptPos )
  1261. {
  1262. g_xClientSocket.SendSpellMsg(shSkill, lpptPos->x, lpptPos->y, 0);
  1263. // 公怕焊 矫埃蔼 扁废.
  1264. m_dwLastRushTime = timeGetTime();
  1265. m_bMotionLock = m_bInputLock = TRUE;
  1266. m_bWarMode = TRUE;
  1267. }
  1268. break;
  1269. }
  1270. case _MT_SPELL2:
  1271. case _MT_SPELL1:
  1272. {
  1273. if ( lpptPos )
  1274. {
  1275. g_xClientSocket.SendSpellMsg(shSkill, lpptPos->x, lpptPos->y, nMouseTargetID);
  1276. m_wOldPosX = m_wPosX;
  1277. m_wOldPosY = m_wPosY;
  1278. m_bOldDir  = m_bCurrDir;
  1279. m_bMotionLock = m_bInputLock = TRUE;
  1280. m_bWarMode = TRUE;
  1281. if ( m_shCurrMagicID == _SKILL_FIREBALL || m_shCurrMagicID == _SKILL_FIREBALL2 || m_shCurrMagicID == _SKILL_FIRE || m_shCurrMagicID == _SKILL_SHOOTLIGHTEN ||
  1282.  m_shCurrMagicID == _SKILL_HANGMAJINBUB || m_shCurrMagicID== _SKILL_DEJIWONHO || m_shCurrMagicID == _SKILL_FIRECHARM || m_shCurrMagicID == _SKILL_SINSU ||
  1283.  m_shCurrMagicID == _SKILL_BIGCLOAK )
  1284. LoadEffect(&g_xGameProc.m_xImage, m_shCurrMagicID, bDir);
  1285. else
  1286. LoadEffect(&g_xGameProc.m_xImage, m_shCurrMagicID);
  1287. m_bUseEffect = TRUE;
  1288. /* if ( m_shCurrMagicID == _SKILL_SHIELD )
  1289. {
  1290. m_dwFstEffectFrame = 50;
  1291. m_dwEndEffectFrame = 60;
  1292. m_dwCurrEffectFrame = 50;
  1293. m_bEffectFrame = 0;
  1294. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  1295. }
  1296. */
  1297.   if ( m_shCurrMagicID == _SKILL_SHOWHP )
  1298. m_bEffectFrameCnt = 20;
  1299. else if ( m_shCurrMagicID == _SKILL_LIGHTFLOWER )
  1300. m_bEffectFrameCnt = 15;
  1301. else if ( m_shCurrMagicID == _SKILL_SPACEMOVE )
  1302. m_bEffectFrameCnt = 19;
  1303. else if ( m_shCurrMagicID == _SKILL_LIGHTENING )
  1304. m_bEffectFrameCnt = 17;
  1305. SetMotionFrame(bMtn, bDir);
  1306. }
  1307. break;
  1308. }
  1309. case _MT_CUT:
  1310. {
  1311. m_bInputLock = TRUE;
  1312. m_bMotionLock = TRUE;
  1313. m_wOldPosX = m_wPosX;
  1314. m_wOldPosY = m_wPosY;
  1315. m_bOldDir  = m_bCurrDir;
  1316. SetMotionFrame(bMtn, bDir);
  1317. g_xClientSocket.SendActMsg(CM_SITDOWN, m_wPosX, m_wPosY, bDir);
  1318. if ( nMouseTargetID && bIsDead )
  1319. {
  1320. g_xClientSocket.SendButchAnimal(m_wPosX, m_wPosY, bDir, nMouseTargetID);
  1321. }
  1322. break;
  1323. }
  1324. case _MT_HORSESTAND:
  1325. case _MT_STAND:
  1326. {
  1327. if ( bDir != m_bCurrDir )
  1328. {
  1329. g_xClientSocket.SendActMsg(CM_TRUN, m_wPosX, m_wPosY, bDir);
  1330. m_bMotionLock = TRUE;
  1331. m_bInputLock = TRUE;
  1332. m_wOldPosX = m_wPosX;
  1333. m_wOldPosY = m_wPosY;
  1334. m_bOldDir  = m_bCurrDir;
  1335. SetMotionFrame(bMtn, bDir);
  1336. }
  1337. break;
  1338. }
  1339. }
  1340. }
  1341. else
  1342. {
  1343. switch ( bMtn )
  1344. {
  1345. case _MT_HORSESTAND:
  1346. case _MT_STAND:
  1347. {
  1348. bMtn = _MT_MON_STAND;
  1349. if ( bDir != m_bCurrDir ) g_xClientSocket.SendActMsg(CM_TRUN, m_wPosX, m_wPosY, bDir);
  1350. // m_bMotionLock = TRUE;
  1351. m_wOldPosX = m_wPosX;
  1352. m_wOldPosY = m_wPosY;
  1353. m_bOldDir  = m_bCurrDir;
  1354. SetMotionFrame(bMtn, bDir);
  1355. break;
  1356. }
  1357. case _MT_WALK:
  1358. case _MT_HORSEWALK:
  1359. {
  1360. bMtn = _MT_MON_WALK;
  1361. g_xClientSocket.SendActMsg(CM_WALK, m_wPosX, m_wPosY, bDir);
  1362. m_bMotionLock = m_bInputLock = TRUE;
  1363. m_wOldPosX = m_wPosX;
  1364. m_wOldPosY = m_wPosY;
  1365. m_bOldDir  = m_bCurrDir;
  1366. SetMotionFrame(bMtn, bDir);
  1367. m_bMoveSpeed = _SPEED_WALK;
  1368. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1369. break;
  1370. }
  1371. case _MT_ONEHSWING:
  1372. {
  1373. bMtn = _MT_MON_ATTACK_A;
  1374. m_bMotionLock = m_bInputLock = TRUE;
  1375. m_wOldPosX = m_wPosX;
  1376. m_wOldPosY = m_wPosY;
  1377. m_bOldDir = m_bCurrDir;
  1378. m_bWarMode = TRUE;
  1379. m_dwWarModeTime = 0;
  1380. SetMotionFrame(_MT_MON_ATTACK_A, bDir);
  1381. g_xClientSocket.SendHitMsg(CM_HIT, lpptPos->x, lpptPos->y, bDir, 0);
  1382. break;
  1383. }
  1384. }
  1385. }
  1386. m_dwMotionLockTime = 0;
  1387. }
  1388. /******************************************************************************************************************
  1389. 窃荐疙 : CMyHero::UpdateMotionState()
  1390. 累己磊 : 
  1391. 累己老 : 
  1392. 格利   : 
  1393. 涝仿   : INT nLoopTime
  1394. 免仿   : VOID 
  1395. [老磊][荐沥磊] : 荐沥郴侩
  1396. *******************************************************************************************************************/
  1397. VOID CMyHero::UpdateMotionState(INT nLoopTime, BOOL bIsMoveTime)
  1398. {
  1399. if ( m_bMotionLock ) 
  1400. m_dwMotionLockTime += nLoopTime;
  1401. if ( m_bWarMode ) 
  1402. m_dwWarModeTime += nLoopTime;
  1403. m_wABlendCurrDelay += nLoopTime;
  1404. if ( m_wABlendCurrDelay >= m_wABlendDelay )
  1405. {
  1406. m_wABlendCurrDelay = 0;
  1407. m_wABlendDelay    = 0;
  1408. m_bABlendRev    = FALSE;
  1409. }
  1410. if ( m_bCurrMtn == _MT_DIE && m_dwCurrFrame >= m_dwEndFrame-1 )
  1411. {
  1412. m_bIsDead = TRUE;
  1413. }
  1414. if ( m_bIsDead )
  1415. {
  1416. if ( m_bIsMon )
  1417. SetMotionFrame(_MT_MON_DIE, m_bCurrDir);
  1418. else
  1419. SetMotionFrame(_MT_DIE, m_bCurrDir);
  1420. m_dwCurrFrame = m_dwEndFrame - 1;
  1421. m_bInputLock  = TRUE;
  1422. return;
  1423. }
  1424. if ( UpdateMove(bIsMoveTime) )
  1425. {
  1426. UpdatePacketState();
  1427. return;
  1428. }
  1429. else
  1430. {
  1431. if ( !m_bIsMon )
  1432. {
  1433. m_wCurrDelay += nLoopTime;
  1434. m_wShieldCurrDelay += nLoopTime;
  1435. if ( m_wShieldCurrDelay > 150 )  
  1436. {
  1437. m_bShieldCurrFrm++;
  1438. m_wShieldCurrDelay = 0;
  1439. if ( m_bShieldCurrFrm > 2 )
  1440. m_bShieldCurrFrm = 0;
  1441. }
  1442. if ( m_wCurrDelay > m_wDelay )
  1443. {
  1444. m_wCurrDelay  = 0;
  1445. if ( m_dwCurrFrame < m_dwEndFrame )
  1446. {
  1447. m_dwCurrFrame++;
  1448. PlayActSound();
  1449. if ( (m_bCurrMtn == _MT_SPELL2 || m_bCurrMtn == _MT_SPELL1) && m_bUseEffect )
  1450. {
  1451. m_dwCurrEffectFrame++;
  1452. m_bEffectFrame++;
  1453. }
  1454. }
  1455. }
  1456. UpdatePacketState();
  1457. // 楷加利牢 橇饭烙 吝俊辑 秦具且老.
  1458. if ( m_dwMotionLockTime > _MOTION_LOCKTIME )
  1459. {
  1460. m_dwMotionLockTime = 0;
  1461. m_bMotionLock    = FALSE;
  1462. // SetOldPosition();
  1463. }
  1464. if ( m_dwWarModeTime > _WARMODE_TIME )
  1465. {
  1466. m_dwWarModeTime = 0;
  1467. m_bWarMode = FALSE;
  1468. }
  1469. if ( m_dwCurrFrame >= m_dwEndFrame-1 )
  1470. {
  1471. if ( (m_bCurrMtn == _MT_SPELL2) && m_bUseEffect )
  1472. {
  1473. if ( m_dwCurrEffectFrame - m_dwFstEffectFrame < m_bEffectFrameCnt-2 )
  1474. {
  1475. m_dwCurrFrame = m_dwEndFrame - 2;
  1476. }
  1477. }
  1478. }
  1479. else if ( m_dwCurrFrame >= m_dwEndFrame-3 )
  1480. {
  1481. if ( (m_bCurrMtn == _MT_SPELL1) && m_bUseEffect )
  1482. {
  1483. if ( m_dwCurrEffectFrame - m_dwFstEffectFrame < m_bEffectFrameCnt-5 )
  1484. {
  1485. m_dwCurrFrame = m_dwEndFrame - 4;
  1486. }
  1487. }
  1488. }
  1489. if ( m_dwCurrFrame >= m_dwEndFrame )
  1490. {
  1491. switch ( m_bCurrMtn )
  1492. {
  1493. case _MT_CUT:
  1494. {
  1495. m_bInputLock  = FALSE;
  1496. m_bMotionLock = FALSE;
  1497. m_dwCurrFrame = m_dwFstFrame;
  1498. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionFrame(_MT_STAND, m_bCurrDir);
  1499. else SetMotionFrame(_MT_HORSESTAND, m_bCurrDir);
  1500. }
  1501. break;
  1502. case _MT_STAND:
  1503. case _MT_HORSESTAND:
  1504. {
  1505. m_bInputLock  = FALSE;
  1506. m_bMotionLock = FALSE;
  1507. m_bUseEffect = FALSE;
  1508. m_bUseSwordEffect = FALSE;
  1509. m_dwCurrFrame = m_dwFstFrame;
  1510. break;
  1511. }
  1512. case _MT_ATTACKMODE:
  1513. {
  1514. if ( !m_bWarMode )
  1515. SetMotionFrame(_MT_STAND, m_bCurrDir);
  1516. else
  1517. {
  1518. m_bInputLock  = FALSE;
  1519. m_bMotionLock = FALSE;
  1520. m_dwCurrFrame = m_dwFstFrame;
  1521. }
  1522. break;
  1523. }
  1524. default:
  1525. {
  1526. m_dwCurrEffectFrame = 0;
  1527. m_dwFstEffectFrame = 0;
  1528. m_dwEndEffectFrame = 0;
  1529. m_bEffectFrame = 0;
  1530. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  1531. m_bUseEffect = FALSE;
  1532. m_bUseSwordEffect = FALSE;
  1533. if ( !m_bMotionLock )
  1534. {
  1535. m_bInputLock = FALSE;
  1536. if ( m_stFeatureEx.bHorse == _HORSE_NONE )
  1537. {
  1538. if ( m_bWarMode )
  1539. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  1540. else
  1541. SetMotionFrame(_MT_STAND, m_bCurrDir);
  1542. }
  1543. else
  1544. {
  1545. SetMotionFrame(_MT_HORSESTAND, m_bCurrDir);
  1546. }
  1547. }
  1548. else
  1549. {
  1550. m_dwCurrFrame = m_dwEndFrame-1;
  1551. }
  1552. }
  1553. break;
  1554. }
  1555. }
  1556. if ( m_bCurrMtn == _MT_STAND || m_bCurrMtn == _MT_HORSESTAND )
  1557. {
  1558. POINT ptMouse;
  1559. GetCursorPos(&ptMouse);
  1560. ScreenToClient(g_xMainWnd.GetSafehWnd(), &ptMouse);
  1561. m_bCanRun = FALSE;
  1562. if ( HIBYTE(GetKeyState(VK_RBUTTON)) || ( HIBYTE(GetKeyState(VK_LBUTTON)) && HIBYTE(GetKeyState(VK_CONTROL))) )
  1563. {
  1564. OnRButtonDown(ptMouse);
  1565. }
  1566. else if ( HIBYTE(GetKeyState(VK_LBUTTON)) )
  1567. {
  1568. OnLButtonDown(ptMouse);
  1569. /* LPARAM lParam = MAKELPARAM((WORD)ptMouse.x, (WORD)ptMouse.y);
  1570. WPARAM wParam = 0;
  1571. g_xGameProc.OnLButtonDown(wParam, lParam);
  1572. */ }
  1573. }
  1574. }
  1575. else
  1576. {
  1577. m_wCurrDelay += nLoopTime;
  1578. m_wShieldCurrDelay += nLoopTime;
  1579. m_wABlendCurrDelay += nLoopTime;
  1580. if ( m_wShieldCurrDelay > 150 )  
  1581. {
  1582. m_bShieldCurrFrm++;
  1583. m_wShieldCurrDelay = 0;
  1584. if ( m_bShieldCurrFrm > 2 )
  1585. m_bShieldCurrFrm = 0;
  1586. }
  1587. if ( m_wCurrDelay > m_wDelay )
  1588. {
  1589. m_wCurrDelay  = 0;
  1590. if ( m_dwCurrFrame < m_dwEndFrame )
  1591. {
  1592. m_dwCurrFrame++;
  1593. }
  1594. }
  1595. UpdatePacketState();
  1596. // 楷加利牢 橇饭烙 吝俊辑 秦具且老.
  1597. if ( m_dwMotionLockTime > _MOTION_LOCKTIME )
  1598. {
  1599. m_dwMotionLockTime = 0;
  1600. m_bMotionLock    = FALSE;
  1601. // SetOldPosition();
  1602. }
  1603. if ( m_dwWarModeTime > _WARMODE_TIME )
  1604. {
  1605. m_dwWarModeTime = 0;
  1606. m_bWarMode = FALSE;
  1607. }
  1608. if ( m_dwCurrFrame >= m_dwEndFrame )
  1609. {
  1610. switch ( m_bCurrMtn )
  1611. {
  1612. case _MT_MON_STAND:
  1613. {
  1614. m_bInputLock  = FALSE;
  1615. m_bMotionLock = FALSE;
  1616. m_bUseEffect = FALSE;
  1617. m_bUseSwordEffect = FALSE;
  1618. m_dwCurrFrame = m_dwFstFrame;
  1619. break;
  1620. }
  1621. default:
  1622. {
  1623. m_dwCurrEffectFrame = 0;
  1624. m_dwFstEffectFrame = 0;
  1625. m_dwEndEffectFrame = 0;
  1626. m_bEffectFrame = 0;
  1627. m_bEffectFrameCnt = _DEFAULT_SPELLFRAME;
  1628. m_bUseEffect = FALSE;
  1629. m_bUseSwordEffect = FALSE;
  1630. if ( !m_bMotionLock )
  1631. {
  1632. m_bInputLock = FALSE;
  1633. SetMotionFrame(_MT_MON_STAND, m_bCurrDir);
  1634. }
  1635. else
  1636. {
  1637. m_dwCurrFrame = m_dwEndFrame-1;
  1638. }
  1639. }
  1640. break;
  1641. }
  1642. }
  1643. if ( m_bCurrMtn == _MT_MON_STAND )
  1644. {
  1645. POINT ptMouse;
  1646. GetCursorPos(&ptMouse);
  1647. ScreenToClient(g_xMainWnd.GetSafehWnd(), &ptMouse);
  1648. m_bCanRun = FALSE;
  1649. if ( HIBYTE(GetKeyState(VK_RBUTTON)) || ( HIBYTE(GetKeyState(VK_LBUTTON)) && HIBYTE(GetKeyState(VK_CONTROL))) )
  1650. {
  1651. OnRButtonDown(ptMouse);
  1652. }
  1653. else if ( HIBYTE(GetKeyState(VK_LBUTTON)) )
  1654. {
  1655. OnLButtonDown(ptMouse);
  1656. /* LPARAM lParam = MAKELPARAM((WORD)ptMouse.x, (WORD)ptMouse.y);
  1657. WPARAM wParam = 0;
  1658. g_xGameProc.OnLButtonDown(wParam, lParam);
  1659. */ }
  1660. }
  1661. }
  1662. }
  1663. }
  1664. /******************************************************************************************************************
  1665. 窃荐疙 : CMyHero::UpdateMove(BOOL bIsMoveTime)
  1666. 累己磊 : 
  1667. 累己老 : 
  1668. 格利   : 
  1669. 涝仿   : BOOL bIsMoveTime
  1670. 免仿   : BOOL 
  1671. [老磊][荐沥磊] : 荐沥郴侩
  1672. *******************************************************************************************************************/
  1673. BOOL CMyHero::UpdateMove(BOOL bIsMoveTime)
  1674. {
  1675. if ( !m_bIsMon )
  1676. {
  1677. if ( m_bCurrMtn == _MT_WALK || m_bCurrMtn == _MT_RUN || m_bCurrMtn == _MT_HORSEWALK || m_bCurrMtn == _MT_HORSERUN || m_bCurrMtn == _MT_MOODEPO || m_bCurrMtn == _MT_PUSHBACK)
  1678. {
  1679. m_wCurrDelay = 0;
  1680. if ( bIsMoveTime )
  1681. {
  1682. if ( m_bCurrMtn == _MT_PUSHBACK )
  1683. {
  1684. m_bBackStepFrame += 2;
  1685. if ( m_bBackStepFrame >= m_bBackStepFrameCnt )
  1686. {
  1687. m_dwCurrFrame++;
  1688. m_bBackStepFrame = m_bBackStepFrameCnt;
  1689. }
  1690. }
  1691. else if ( m_bCurrMtn == _MT_MOODEPO )
  1692. {
  1693. m_dwCurrFrame += 2;
  1694. if ( m_dwCurrFrame >= m_dwEndFrame )
  1695. {
  1696. m_dwCurrFrame = m_dwEndFrame;
  1697. }
  1698. }
  1699. else
  1700. {
  1701. m_dwCurrFrame++;
  1702. PlayMoveSound();
  1703. /* if ( m_bMsgHurryCheck )
  1704. {
  1705. m_dwCurrFrame++;
  1706. }
  1707. */ }
  1708. if ( m_bCurrMtn == _MT_PUSHBACK )
  1709. {
  1710. if ( m_bBackStepFrame >= m_bBackStepFrameCnt-m_bMoveNextFrmCnt && !m_bIsMoved )
  1711. {
  1712. SetMoved();
  1713. m_bIsMoved = TRUE;
  1714. }
  1715. }
  1716. else
  1717. {
  1718. if ( m_dwCurrFrame >= m_dwEndFrame-m_bMoveNextFrmCnt && !m_bIsMoved )
  1719. {
  1720. SetMoved();
  1721. m_bIsMoved = TRUE;
  1722. }
  1723. }
  1724. }
  1725. // 楷加利牢 橇饭烙 吝俊辑 秦具且老.
  1726. if ( m_dwCurrFrame >= m_dwEndFrame )
  1727. {
  1728. m_dwCurrFrame = m_dwEndFrame-1;
  1729. m_bCanRun = FALSE;
  1730. switch ( m_bCurrMtn )
  1731. {
  1732. case _MT_MOODEPO:
  1733. {
  1734. if ( m_bInputLock )
  1735. {
  1736. m_bIsMoved = FALSE;
  1737. m_bInputLock = FALSE;
  1738. m_pxMap->SetMovedTileBuffer(m_shShiftTileX, m_shShiftTileY);
  1739. m_bMoveSpeed = 0;
  1740. m_shShiftPixelX = 0;
  1741. m_shShiftPixelY = 0;
  1742. m_shShiftTileX = 0;
  1743. m_shShiftTileY = 0;
  1744. // 捞悼饶 谅钎犬牢.
  1745. if ( CheckMyPostion() == FALSE )
  1746. AdjustMyPostion();
  1747. if ( m_bWarMode )
  1748. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  1749. else
  1750. SetMotionFrame(_MT_STAND, m_bCurrDir);
  1751. }
  1752. break;
  1753. }
  1754. case _MT_PUSHBACK:
  1755. {
  1756. if ( m_bInputLock )
  1757. {
  1758. m_bIsMoved = FALSE;
  1759. m_bInputLock = FALSE;
  1760. m_pxMap->SetMovedTileBuffer(m_shShiftTileX, m_shShiftTileY);
  1761. m_bMoveSpeed = 0;
  1762. m_shShiftPixelX = 0;
  1763. m_shShiftPixelY = 0;
  1764. m_shShiftTileX = 0;
  1765. m_shShiftTileY = 0;
  1766. m_bBackStepFrame = 0;
  1767. m_bBackStepFrameCnt = 0;
  1768. // 捞悼饶 谅钎犬牢.
  1769. if ( CheckMyPostion() == FALSE )
  1770. AdjustMyPostion();
  1771. if ( m_bWarMode )
  1772. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  1773. else
  1774. SetMotionFrame(_MT_STAND, m_bCurrDir);
  1775. }
  1776. break;
  1777. }
  1778. case _MT_WALK:
  1779. case _MT_HORSEWALK:
  1780. {
  1781. if ( !m_bMotionLock && m_bInputLock )
  1782. {
  1783. m_bIsMoved = FALSE;
  1784. m_bInputLock = FALSE;
  1785. m_pxMap->SetMovedTileBuffer(m_shShiftTileX, m_shShiftTileY);
  1786. m_bMoveSpeed = 0;
  1787. m_shShiftPixelX = 0;
  1788. m_shShiftPixelY = 0;
  1789. m_shShiftTileX = 0;
  1790. m_shShiftTileY = 0;
  1791. if ( m_bCurrMtn == _MT_WALK && m_stFeatureEx.bHorse == _HORSE_NONE )
  1792. {
  1793. if ( m_bWarMode )
  1794. {
  1795. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  1796. }
  1797. else SetMotionFrame(_MT_STAND, m_bCurrDir);
  1798. }
  1799. else SetMotionFrame(_MT_HORSESTAND, m_bCurrDir);
  1800. // 捞悼饶 谅钎犬牢.
  1801. if ( CheckMyPostion() == FALSE )
  1802. AdjustMyPostion();
  1803. POINT ptMouse;
  1804. GetCursorPos(&ptMouse);
  1805. ScreenToClient(g_xMainWnd.GetSafehWnd(), &ptMouse);
  1806. if ( HIBYTE(GetKeyState(VK_RBUTTON)) || ( HIBYTE(GetKeyState(VK_LBUTTON)) && HIBYTE(GetKeyState(VK_CONTROL))) )
  1807. {
  1808. m_bCanRun = TRUE;
  1809. OnRButtonDown(ptMouse);
  1810. }
  1811. else if ( HIBYTE(GetKeyState(VK_LBUTTON)) )
  1812. {
  1813. OnLButtonDown(ptMouse);
  1814. }
  1815. }
  1816. break;
  1817. }
  1818. case _MT_RUN:
  1819. case _MT_HORSERUN:
  1820. {
  1821. if ( !m_bMotionLock && m_bInputLock )
  1822. {
  1823. m_bIsMoved = FALSE;
  1824. m_bInputLock = FALSE;
  1825. m_pxMap->SetMovedTileBuffer(m_shShiftTileX, m_shShiftTileX);
  1826. m_bMoveSpeed = 0;
  1827. m_shShiftPixelX = 0;
  1828. m_shShiftPixelY = 0;
  1829. m_shShiftTileX = 0;
  1830. m_shShiftTileY = 0;
  1831. if ( m_bCurrMtn == _MT_RUN && m_stFeatureEx.bHorse == _HORSE_NONE )
  1832. {
  1833. if ( m_bWarMode )
  1834. {
  1835. SetMotionFrame(_MT_ATTACKMODE, m_bCurrDir);
  1836. }
  1837. else SetMotionFrame(_MT_STAND, m_bCurrDir);
  1838. }
  1839. else SetMotionFrame(_MT_HORSESTAND, m_bCurrDir);
  1840. if ( CheckMyPostion() == FALSE )
  1841. AdjustMyPostion();
  1842. POINT ptMouse;
  1843. GetCursorPos(&ptMouse);
  1844. ScreenToClient(g_xMainWnd.GetSafehWnd(), &ptMouse);
  1845. if ( HIBYTE(GetKeyState(VK_RBUTTON)) || ( HIBYTE(GetKeyState(VK_LBUTTON)) && HIBYTE(GetKeyState(VK_CONTROL))) )
  1846. {
  1847. m_bCanRun = TRUE;
  1848. OnRButtonDown(ptMouse);
  1849. }
  1850. else if ( HIBYTE(GetKeyState(VK_LBUTTON)) )
  1851. {
  1852. OnLButtonDown(ptMouse);
  1853. }
  1854. }
  1855. break;
  1856. }
  1857. }
  1858. }
  1859. else
  1860. {
  1861. switch ( m_bCurrMtn )
  1862. {
  1863. case _MT_WALK:
  1864. case _MT_RUN:
  1865. case _MT_HORSEWALK:
  1866. case _MT_HORSERUN:
  1867. case _MT_MOODEPO:
  1868. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1869. // m_pxMap->ScrollMap(m_bMoveDir, m_wCurrDelay, m_wDelay*(m_dwEndFrame-m_dwFstFrame), m_bMoveSpeed);
  1870. break;
  1871. case _MT_PUSHBACK:
  1872. m_pxMap->ScrollMap(m_bMoveDir, m_bBackStepFrame, m_bMoveSpeed);
  1873. break;
  1874. }
  1875. }
  1876. // 楷加利牢 橇饭烙 吝俊辑 秦具且老.
  1877. if ( m_dwMotionLockTime > _MOTION_LOCKTIME )
  1878. {
  1879. m_dwMotionLockTime = 0;
  1880. m_bMotionLock    = FALSE;
  1881. // SetOldPosition();
  1882. }
  1883. if ( m_dwWarModeTime > _WARMODE_TIME )
  1884. {
  1885. m_dwWarModeTime = 0;
  1886. m_bWarMode = FALSE;
  1887. }
  1888. return TRUE;
  1889. }
  1890. }
  1891. else
  1892. {
  1893. if ( m_bCurrMtn == _MT_MON_WALK )
  1894. {
  1895. m_wCurrDelay = 0;
  1896. if ( bIsMoveTime )
  1897. {
  1898. m_dwCurrFrame++;
  1899. if ( m_dwCurrFrame >= m_dwEndFrame-m_bMoveNextFrmCnt && !m_bIsMoved )
  1900. {
  1901. SetMoved();
  1902. m_bIsMoved = TRUE;
  1903. }
  1904. }
  1905. if ( m_dwCurrFrame >= m_dwEndFrame )
  1906. {
  1907. m_dwCurrFrame = m_dwEndFrame-1;
  1908. m_bCanRun = FALSE;
  1909. switch ( m_bCurrMtn )
  1910. {
  1911. case _MT_MON_WALK:
  1912. {
  1913. if ( !m_bMotionLock && m_bInputLock )
  1914. {
  1915. m_bIsMoved = FALSE;
  1916. m_bInputLock = FALSE;
  1917. m_pxMap->SetMovedTileBuffer(m_shShiftTileX, m_shShiftTileY);
  1918. m_bMoveSpeed = 0;
  1919. m_shShiftPixelX = 0;
  1920. m_shShiftPixelY = 0;
  1921. m_shShiftTileX = 0;
  1922. m_shShiftTileY = 0;
  1923. SetMotionFrame(_MT_MON_STAND, m_bCurrDir);
  1924. // 捞悼饶 谅钎犬牢.
  1925. if ( CheckMyPostion() == FALSE )
  1926. AdjustMyPostion();
  1927. POINT ptMouse;
  1928. GetCursorPos(&ptMouse);
  1929. ScreenToClient(g_xMainWnd.GetSafehWnd(), &ptMouse);
  1930. if ( HIBYTE(GetKeyState(VK_LBUTTON)) )
  1931. {
  1932. OnLButtonDown(ptMouse);
  1933. }
  1934. }
  1935. break;
  1936. }
  1937. }
  1938. }
  1939. else
  1940. {
  1941. switch ( m_bCurrMtn )
  1942. {
  1943. case _MT_MON_WALK:
  1944. m_pxMap->ScrollMap(m_bMoveDir, m_dwCurrFrame-m_dwFstFrame, m_bMoveSpeed);
  1945. break;
  1946. }
  1947. }
  1948. // 楷加利牢 橇饭烙 吝俊辑 秦具且老.
  1949. if ( m_dwMotionLockTime > _MOTION_LOCKTIME )
  1950. {
  1951. m_dwMotionLockTime = 0;
  1952. m_bMotionLock    = FALSE;
  1953. // SetOldPosition();
  1954. }
  1955. if ( m_dwWarModeTime > _WARMODE_TIME )
  1956. {
  1957. m_dwWarModeTime = 0;
  1958. m_bWarMode = FALSE;
  1959. }
  1960. return TRUE;
  1961. }
  1962. }
  1963. return FALSE;
  1964. }
  1965. /******************************************************************************************************************
  1966. 窃荐疙 : CMyHero:DrawActor()
  1967. 累己磊 : 
  1968. 累己老 : 
  1969. 格利   : 
  1970. 涝仿   : BOOL bFocused
  1971.          BOOL bShadowAblended
  1972. 免仿   : BOOL 
  1973. [老磊][荐沥磊] : 荐沥郴侩
  1974. *******************************************************************************************************************/
  1975. BOOL CMyHero::DrawActor(BOOL bFocused, BOOL bShadowAblended, BOOL bUseScrnPos, BOOL bDrawShadow)
  1976. {
  1977. // 某腐磐 谅钎绰 绊沥.
  1978. m_shScrnPosX = _CHAR_CENTER_XPOS - 24; 
  1979. m_shScrnPosY = _CHAR_CENTER_YPOS - 16;
  1980. if ( m_bIsMon )
  1981. {
  1982. if ( CActor::DrawActor(m_pxMap, bFocused, bShadowAblended, bUseScrnPos, bDrawShadow) )
  1983. return TRUE;
  1984. }
  1985. else
  1986. {
  1987. if ( CHero::DrawActor(m_pxMap, bFocused, bShadowAblended, bUseScrnPos, bDrawShadow) )
  1988. return TRUE;
  1989. }
  1990. return FALSE;
  1991. }
  1992. /******************************************************************************************************************
  1993. 窃荐疙 : CMyHero::CalcDirection()
  1994. 累己磊 : 
  1995. 累己老 : 
  1996. 格利   : 
  1997. 涝仿   : INT nTargetTileX
  1998.          INT nTargetTileY
  1999. 免仿   : 
  2000. [老磊][荐沥磊] : 荐沥郴侩
  2001. *******************************************************************************************************************/
  2002. BYTE CMyHero::CalcDirection(INT nTargetTileX, INT nTargetTileY)
  2003. {
  2004. INT nWidth = nTargetTileX - m_wPosX;
  2005. INT nHeight = nTargetTileY - m_wPosY;
  2006. FLOAT rLineLength, rBottomInTriangle;
  2007. INT nDimension;
  2008. BYTE bDir;
  2009. rLineLength = (FLOAT)sqrt(nWidth*nWidth+nHeight*nHeight);
  2010. // 扁夯.
  2011. // 7  0  1          
  2012. // 6     2
  2013. // 5  4  3
  2014. // 老窜篮 4俺狼 盒搁(90档扁霖)栏肺 唱穿绊 盒搁俊 措茄 cos蔼阑 利侩茄促.
  2015. ( nWidth >= 0 ) ?
  2016. ( nHeight <  0 ? (rBottomInTriangle=(FLOAT)-nHeight, nDimension=0) : (rBottomInTriangle=(FLOAT) nWidth, nDimension=2) ):
  2017. ( nHeight >= 0 ? (rBottomInTriangle=(FLOAT) nHeight, nDimension=4) : (rBottomInTriangle=(FLOAT)-nWidth, nDimension=6) );
  2018. // 6(cos45)  0(cos 0)  0(cos45)
  2019. // 4(cos90)  2(cos 0)  2(cos 0)
  2020. // 4(cos45)  2(cos90)  2(cos45)
  2021. FLOAT rCosVal = rBottomInTriangle/rLineLength;
  2022. // cos(0), cos(pi/8), cos(pi/4), cos(pi/2)
  2023. CONST FLOAT rCosVal8[4] = { 1.0f, 0.923880f, 0.707107f, 0.382683f };
  2024. // 阿盒搁阑 3俺狼 康开栏肺 唱穿绢辑 康开阑 犁炼沥茄促.
  2025. bDir = 0;
  2026. for ( INT nCnt = 0; nCnt < 4; nCnt++ )
  2027. {
  2028. if( rCosVal <= rCosVal8[nCnt] )
  2029. bDir = nDimension+(nCnt+1)/2;
  2030. else break;
  2031. }
  2032. if( bDir >= 8 ) bDir = 0;
  2033. return bDir;
  2034. }
  2035. /******************************************************************************************************************
  2036. 窃荐疙 : CMyHero::GetPosMouseToTile()
  2037. 累己磊 : 
  2038. 累己老 : 
  2039. 格利   : 
  2040. 涝仿   : INT nXPos
  2041.          INT nYPos
  2042. 免仿   : POINT 
  2043. [老磊][荐沥磊] : 荐沥郴侩
  2044. *******************************************************************************************************************/
  2045. POINT CMyHero::GetPosMouseToTile(INT nXPos, INT nYPos)
  2046. {
  2047. POINT ptTilePos;
  2048. if ( m_pxMap )
  2049. {
  2050. ptTilePos.x = m_pxMap->m_shStartViewTileX + (nXPos - _VIEW_CELL_X_START) / _CELL_WIDTH;
  2051. ptTilePos.y = m_pxMap->m_shStartViewTileY + (nYPos - _VIEW_CELL_Y_START) / _CELL_HEIGHT;
  2052. }
  2053. return ptTilePos;
  2054. }
  2055. BOOL CMyHero::CanNextHit()
  2056. {
  2057. DWORD dwCurrTick;
  2058. INT nNextHit, nLevelFast;
  2059. BOOL bAttackSlow = FALSE;
  2060. nLevelFast = min(370, m_stAbility.bLevel*14);
  2061. nLevelFast = min(800, nLevelFast + m_shHitSpeed * 60);
  2062. if ( m_stAbility.bHandWeight > m_stAbility.bMaxHandWeight )
  2063. bAttackSlow = TRUE;
  2064. if ( bAttackSlow ) nNextHit = 1400 - nLevelFast + 1500;
  2065. else nNextHit = 1400 - nLevelFast;
  2066. dwCurrTick = timeGetTime();
  2067. if ( dwCurrTick - m_dwLastHitTime > nNextHit )
  2068. {
  2069. m_dwLastHitTime = dwCurrTick;
  2070. return TRUE;
  2071. }
  2072. return FALSE;
  2073. }
  2074. BOOL CMyHero::CanWalk()
  2075. {
  2076.    if ( timeGetTime() - m_dwLastSpellTime < m_wMagicPKDelayTime )
  2077.       return TRUE;
  2078.    return FALSE;
  2079. }
  2080. BOOL CMyHero::CanRun()
  2081. {
  2082.    if ( m_stAbility.wHP < _RUN_MINHEALTH )
  2083.       return FALSE;
  2084.    if ( (timeGetTime() - m_dwLastPKStruckTime < 3000) || (timeGetTime() - m_dwLastSpellTime < m_wMagicPKDelayTime ) )
  2085.       return FALSE;
  2086.    return TRUE;
  2087. }
  2088. //---------------------------------------------------------------------------------------------------------------//
  2089. //  蜡历 涝仿窃荐.
  2090. //---------------------------------------------------------------------------------------------------------------//
  2091. /******************************************************************************************************************
  2092. 窃荐疙 : CMyHero::OnLButtonDown()
  2093. 累己磊 : 
  2094. 累己老 : 
  2095. 格利   : 
  2096. 涝仿   : POINT ptMouse
  2097.          INT nTargetID
  2098.          POINT* lpptTargetPos
  2099. 免仿   : BOOL 
  2100. [老磊][荐沥磊] : 荐沥郴侩
  2101. *******************************************************************************************************************/
  2102. BOOL CMyHero::OnLButtonDown(POINT ptMouse, INT nTargetID, BOOL bIsDead, POINT* lpptTargetPos)
  2103. {
  2104. POINT ptTargetTile;
  2105. POINT ptMouseTilePos;
  2106. BYTE  bDir;
  2107. if ( g_xGameProc.m_xInterface.OnLButtonDown(ptMouse) )
  2108. return FALSE;
  2109. if ( m_wABlendDelay )
  2110. return FALSE;
  2111. if ( !m_bMotionLock && !m_bInputLock )
  2112. {
  2113. SHORT shLeftMsgCnt = m_xPacketQueue.GetCount();
  2114. if ( shLeftMsgCnt > 0 )
  2115. {
  2116. UpdatePacketState();
  2117. return FALSE;
  2118. }
  2119. ptMouseTilePos = GetPosMouseToTile(ptMouse.x, ptMouse.y);
  2120. bDir    = CalcDirection(ptMouseTilePos.x, ptMouseTilePos.y);
  2121. if ( m_wPosX == ptMouseTilePos.x && m_wPosY == ptMouseTilePos.y )
  2122. bDir = m_bCurrDir;
  2123. INT nLength;
  2124. if ( lpptTargetPos ) 
  2125. nLength = (INT)sqrt((m_wPosX-lpptTargetPos->x)*(m_wPosX-lpptTargetPos->x) + (m_wPosY-lpptTargetPos->y)*(m_wPosY-lpptTargetPos->y));
  2126. else
  2127. nLength = (INT)sqrt((m_wPosX-ptMouseTilePos.x)*(m_wPosX-ptMouseTilePos.x) + (m_wPosY-ptMouseTilePos.y)*(m_wPosY-ptMouseTilePos.y));
  2128. // 1. SHIFT.(碍力 傍拜)
  2129. if ( HIBYTE(GetKeyState(VK_SHIFT)) )
  2130. {
  2131. if ( m_stFeatureEx.bHorse == _HORSE_NONE )
  2132. {
  2133. if ( m_bUseErgum && g_xGameProc.TargetInLongAttack(bDir) )
  2134. {
  2135. if ( m_stFeatureEx.bHorse == _HORSE_NONE && !bIsDead )
  2136. {
  2137. // 傍拜茄促.
  2138. ptTargetTile.x = m_wPosX;
  2139. ptTargetTile.y = m_wPosY;
  2140. SetMotionState(_MT_ONEHSWING, bDir, nTargetID, bIsDead, &ptTargetTile);
  2141. }
  2142. }
  2143. else
  2144. {
  2145. ptTargetTile.x = m_wPosX;
  2146. ptTargetTile.y = m_wPosY;
  2147. SetMotionState(_MT_ONEHSWING, bDir, nTargetID, bIsDead, &ptTargetTile);
  2148. }
  2149. }
  2150. }
  2151. // 2. ALT.(戒扁)
  2152. else if ( HIBYTE(GetKeyState(VK_MENU)) )
  2153. {
  2154. SetMotionState(_MT_CUT, bDir, nTargetID, bIsDead, &ptTargetTile);
  2155. }
  2156. /*
  2157. // 3. 努腐茄鸥老捞 郴 某腐磐啊 困摹茄 镑牢啊?
  2158. else if ()
  2159. {
  2160. // 酒捞袍捞 乐绰啊?
  2161. if ()
  2162. {
  2163. // 酒捞袍阑 凛绰促.
  2164. }
  2165. }*/
  2166. // 4. 努腐茄 谅钎啊 Actor 康开 救俊 乐绰啊?
  2167. else if ( nTargetID != -1 && lpptTargetPos )
  2168. {
  2169. //1. 鸥百 鸥老狼 困摹啊 1鸥老 捞郴牢啊?
  2170. if ( nLength < 2 && nLength > 0 ) 
  2171. {
  2172. if ( m_stFeatureEx.bHorse == _HORSE_NONE && !bIsDead )
  2173. {
  2174. // 傍拜茄促.
  2175. ptTargetTile.x = m_wPosX;
  2176. ptTargetTile.y = m_wPosY;
  2177. bDir = CalcDirection(lpptTargetPos->x, lpptTargetPos->y);
  2178. SetMotionState(_MT_ONEHSWING, bDir, nTargetID, bIsDead, &ptTargetTile);
  2179. }
  2180. }
  2181. // Actor啊 乐绰 规氢栏肺 捞悼 啊瓷茄啊?(甘加己眉农) 
  2182. else if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) && nLength > 0)
  2183. {
  2184. // 1鸥老 捞悼茄促.
  2185. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_WALK, bDir, nTargetID, bIsDead, &ptTargetTile);
  2186. else SetMotionState(_MT_HORSEWALK, bDir, nTargetID, bIsDead, &ptTargetTile);
  2187. }
  2188. else
  2189. {
  2190. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_STAND, bDir);
  2191. else SetMotionState(_MT_HORSESTAND, bDir);
  2192. }
  2193. /*// Actor啊 NPC牢啊?
  2194. if ()
  2195. {
  2196. // 措拳芒捞唱 惑痢芒阑 楷促.
  2197. }
  2198. // Actor啊 傍拜 啊瓷茄啊?
  2199. else if()
  2200. {
  2201. // Actor狼 困摹啊 1鸥老 郴牢啊?
  2202. if ()
  2203. {
  2204. // 傍拜茄促.
  2205. }
  2206. // Actor啊 乐绰 规氢栏肺 捞悼 啊瓷茄啊?(甘加己眉农) 
  2207. else if ()
  2208. {
  2209. // 1鸥老 捞悼茄促.
  2210. }
  2211. }*/
  2212. }
  2213. // 6. 泅犁 付快胶鸥老规氢栏肺 捞悼 啊瓷茄啊?(甘加己眉农)
  2214. else if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) && nLength > 0 )
  2215. {
  2216. // 1鸥老 捞悼茄促.
  2217. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_WALK, bDir, nTargetID, bIsDead, &ptTargetTile);
  2218. else SetMotionState(_MT_HORSEWALK, bDir, nTargetID, bIsDead, &ptTargetTile);
  2219. }
  2220. // 7. 捞悼 且荐 绝促搁 林函俊 捞悼且荐 乐绰 鸥老阑 茫酒郴绢 格利 鸥老苞狼 啊厘 啊鳖款 鸥老阑 茫酒辰促.
  2221. else if ( !m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) )
  2222. {
  2223. INT nSelectedDir = -1;
  2224. INT nDistance;
  2225. INT nSelectedDistance = 100;
  2226. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  2227. {
  2228. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nCnt, 1, &ptTargetTile) )
  2229. {
  2230. nDistance = (INT)(sqrt((ptTargetTile.x-ptMouseTilePos.x)*(ptTargetTile.x-ptMouseTilePos.x) + 
  2231.   (ptTargetTile.y-ptMouseTilePos.y)*(ptTargetTile.y-ptMouseTilePos.y)));
  2232. if ( nDistance <= nSelectedDistance )
  2233. {
  2234. nSelectedDistance = nDistance;
  2235. nSelectedDir = nCnt;
  2236. }
  2237. }
  2238. }
  2239. if ( nSelectedDir != -1 && nDistance > 0 )
  2240. {
  2241. // 1鸥老 捞悼茄促.
  2242. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nSelectedDir, 1, &ptTargetTile);
  2243. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_WALK, nSelectedDir, nTargetID, bIsDead, &ptTargetTile);
  2244. else SetMotionState(_MT_HORSEWALK, nSelectedDir, nTargetID, bIsDead, &ptTargetTile);
  2245. }
  2246. else
  2247. {
  2248. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_STAND, bDir);
  2249. else SetMotionState(_MT_HORSESTAND, bDir);
  2250. }
  2251. }
  2252. else
  2253. {
  2254. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_STAND, bDir);
  2255. else SetMotionState(_MT_HORSESTAND, bDir);
  2256. }
  2257. }
  2258. return FALSE;
  2259. }
  2260. /******************************************************************************************************************
  2261. 窃荐疙 : CMyHero::OnRButtonDown()
  2262. 累己磊 : 
  2263. 累己老 : 
  2264. 格利   : 
  2265. 涝仿   : POINT ptMouse
  2266. 免仿   : BOOL 
  2267. [老磊][荐沥磊] : 荐沥郴侩
  2268. *******************************************************************************************************************/
  2269. BOOL CMyHero::OnRButtonDown(POINT ptMouse)
  2270. {
  2271. POINT ptTargetTile;
  2272. POINT ptMouseTilePos;
  2273. BYTE  bDir;
  2274. if ( m_wABlendDelay )
  2275. return FALSE;
  2276. if ( !m_bMotionLock && !m_bInputLock )
  2277. {
  2278. SHORT shLeftMsgCnt = m_xPacketQueue.GetCount();
  2279. if ( shLeftMsgCnt > 0 )
  2280. {
  2281. UpdatePacketState();
  2282. return FALSE;
  2283. }
  2284. ptMouseTilePos = GetPosMouseToTile(ptMouse.x, ptMouse.y);
  2285. bDir    = CalcDirection(ptMouseTilePos.x, ptMouseTilePos.y);
  2286. //1. 鸥百 鸥老狼 困摹啊 1鸥老 捞郴牢啊?
  2287. if ( (INT)(sqrt((m_wPosX-ptMouseTilePos.x)*(m_wPosX-ptMouseTilePos.x) + (m_wPosY-ptMouseTilePos.y)*(m_wPosY-ptMouseTilePos.y)))
  2288.  < 2 ) 
  2289. {
  2290. // 规氢阑 官槽促.
  2291. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_STAND, bDir);
  2292. else SetMotionState(_MT_HORSESTAND, bDir);
  2293. }
  2294. //2. 框流牢促.
  2295. else
  2296. {
  2297. // 崔副荐 乐阑锭.
  2298. if ( m_bCanRun )
  2299. {
  2300. m_bCanRun = FALSE;
  2301. if ( m_stFeatureEx.bHorse != _HORSE_NONE )
  2302. {
  2303. // 格利瘤鸥老苞狼 规氢栏肺 1, 2, 3鸥老掳狼 困摹俊 规秦拱捞 绝阑锭.
  2304. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) && 
  2305.  m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 2, &ptTargetTile) &&
  2306.  m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 3, &ptTargetTile) )
  2307. {
  2308. // 3鸥老 捞悼茄促.
  2309. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 3, &ptTargetTile);
  2310. SetMotionState(_MT_HORSERUN, bDir, 0, FALSE, &ptTargetTile);
  2311. }
  2312. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 绝阑锭.
  2313. else if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) )
  2314. {
  2315. SetMotionState(_MT_HORSEWALK, bDir, 0, FALSE, &ptTargetTile);
  2316. }
  2317. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 乐阑锭.
  2318. else
  2319. {
  2320. INT nSelectedDir = -1;
  2321. INT nDistance;
  2322. INT nSelectedDistance = 100;
  2323. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  2324. {
  2325. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nCnt, 1, &ptTargetTile) )
  2326. {
  2327. nDistance = (INT)(sqrt((ptTargetTile.x-ptMouseTilePos.x)*(ptTargetTile.x-ptMouseTilePos.x) + 
  2328.   (ptTargetTile.y-ptMouseTilePos.y)*(ptTargetTile.y-ptMouseTilePos.y)));
  2329. if ( nDistance <= nSelectedDistance )
  2330. {
  2331. nSelectedDistance = nDistance;
  2332. nSelectedDir = nCnt;
  2333. }
  2334. }
  2335. }
  2336. if ( nSelectedDir != -1 )
  2337. {
  2338. // 1鸥老 捞悼茄促.
  2339. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nSelectedDir, 1, &ptTargetTile);
  2340. SetMotionState(_MT_HORSEWALK, nSelectedDir, 0, FALSE, &ptTargetTile);
  2341. }
  2342. else
  2343. {
  2344. SetMotionState(_MT_HORSESTAND, nSelectedDir);
  2345. }
  2346. }
  2347. }
  2348. // 富阑 救鸥绊 乐阑锭.
  2349. else
  2350. {
  2351. // 格利瘤鸥老苞狼 规氢栏肺 1, 2鸥老掳狼 困摹俊 规秦拱捞 绝阑锭.
  2352. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) && 
  2353.  m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 2, &ptTargetTile) )
  2354. {
  2355. // 2鸥老 捞悼茄促.
  2356. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 2, &ptTargetTile);
  2357. SetMotionState(_MT_RUN, bDir, 0, FALSE, &ptTargetTile);
  2358. }
  2359. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 绝阑锭.
  2360. else if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) )
  2361. {
  2362. SetMotionState(_MT_WALK, bDir, 0, FALSE, &ptTargetTile);
  2363. }
  2364. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 乐阑锭.
  2365. else
  2366. {
  2367. INT nSelectedDir = -1;
  2368. INT nDistance;
  2369. INT nSelectedDistance = 100;
  2370. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  2371. {
  2372. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nCnt, 1, &ptTargetTile) )
  2373. {
  2374. nDistance = (INT)(sqrt((ptTargetTile.x-ptMouseTilePos.x)*(ptTargetTile.x-ptMouseTilePos.x) + 
  2375.   (ptTargetTile.y-ptMouseTilePos.y)*(ptTargetTile.y-ptMouseTilePos.y)));
  2376. if ( nDistance <= nSelectedDistance )
  2377. {
  2378. nSelectedDistance = nDistance;
  2379. nSelectedDir = nCnt;
  2380. }
  2381. }
  2382. }
  2383. if ( nSelectedDir != -1 )
  2384. {
  2385. // 1鸥老 捞悼茄促.
  2386. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nSelectedDir, 1, &ptTargetTile);
  2387. SetMotionState(_MT_WALK, nSelectedDir, 0, FALSE, &ptTargetTile);
  2388. }
  2389. else
  2390. {
  2391. SetMotionState(_MT_STAND, nSelectedDir);
  2392. }
  2393. }
  2394. }
  2395. }
  2396. else
  2397. {
  2398. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 绝阑锭.
  2399. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, bDir, 1, &ptTargetTile) )
  2400. {
  2401. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_WALK, bDir, 0, FALSE, &ptTargetTile);
  2402. else SetMotionState(_MT_HORSEWALK, bDir, 0, FALSE, &ptTargetTile);
  2403. }
  2404. // 格利瘤鸥老苞狼 规氢栏肺 1鸥老掳狼 困摹俊 规秦拱捞 乐阑锭.
  2405. else
  2406. {
  2407. INT nSelectedDir = -1;
  2408. INT nDistance;
  2409. INT nSelectedDistance = 100;
  2410. for ( INT nCnt = 0; nCnt < _MAX_DIRECTION; nCnt++ )
  2411. {
  2412. if ( m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nCnt, 1, &ptTargetTile) )
  2413. {
  2414. nDistance = (INT)(sqrt((ptTargetTile.x-ptMouseTilePos.x)*(ptTargetTile.x-ptMouseTilePos.x) + 
  2415.   (ptTargetTile.y-ptMouseTilePos.y)*(ptTargetTile.y-ptMouseTilePos.y)));
  2416. if ( nDistance <= nSelectedDistance )
  2417. {
  2418. nSelectedDistance = nDistance;
  2419. nSelectedDir = nCnt;
  2420. }
  2421. }
  2422. }
  2423. if ( nSelectedDir != -1 )
  2424. {
  2425. // 1鸥老 捞悼茄促.
  2426. m_pxMap->GetNextTileCanMove(m_wPosX, m_wPosY, nSelectedDir, 1, &ptTargetTile);
  2427. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_WALK, nSelectedDir, 0, FALSE, &ptTargetTile);
  2428. else SetMotionState(_MT_HORSEWALK, nSelectedDir, 0, FALSE, &ptTargetTile);
  2429. }
  2430. else
  2431. {
  2432. if ( m_stFeatureEx.bHorse == _HORSE_NONE ) SetMotionState(_MT_STAND, bDir);
  2433. else SetMotionState(_MT_HORSESTAND, bDir);
  2434. }
  2435. }
  2436. }
  2437. }
  2438. }
  2439. return FALSE;
  2440. }
  2441. VOID CMyHero::SetMagic(LPCLIENTMAGICRCD pstMagic, BYTE bKeyNum, BYTE bDir, INT nTargetID, FEATURE stTargetFeature, POINT ptTargetPos)
  2442. {
  2443. DWORD dwCurrTick = timeGetTime();
  2444. if ( !m_bMotionLock && !m_bInputLock )
  2445. {
  2446. switch ( m_shCurrMagicID )
  2447. {
  2448. case _SKILL_MOOTEBO:
  2449.             if ( dwCurrTick - m_dwLastRushTime > 3000 )
  2450. {
  2451. SetMotionState(_MT_MOODEPO, bDir, 0, FALSE, &ptTargetPos, m_shCurrMagicID);
  2452. // SetMotionState(_MT_MOODEPO, bDir, &ptTargetPos, bKeyNum, 0);
  2453. }
  2454. break;
  2455. case _SKILL_HANGMAJINBUB:
  2456. case _SKILL_DEJIWONHO:
  2457. case _SKILL_FIRECHARM:
  2458. case _SKILL_FIRE:
  2459. case _SKILL_FIREBALL2:
  2460. case _SKILL_SINSU:
  2461. case _SKILL_FIREBALL:
  2462. case _SKILL_SHOOTLIGHTEN:
  2463. case _SKILL_BIGCLOAK:
  2464. m_dwLastSpellTime = dwCurrTick;
  2465.             m_wMagicDelayTime = 200 + pstMagic->stStdMagic.nDelayTime;
  2466. SetMotionState(_MT_SPELL1, bDir, nTargetID, TRUE, &ptTargetPos, m_shCurrMagicID);
  2467. break;
  2468. case _SKILL_FIREWIND:
  2469. case _SKILL_AMYOUNSUL:
  2470. case _SKILL_TAMMING:
  2471. case _SKILL_KILLUNDEAD:
  2472. case _SKILL_HEALLING:
  2473. case _SKILL_HOLYSHIELD:
  2474. case _SKILL_BIGHEALLING:
  2475. case _SKILL_LIGHTFLOWER:
  2476. case _SKILL_SKELLETON:
  2477. case _SKILL_SNOWWIND:
  2478. case _SKILL_SHIELD:
  2479. case _SKILL_SHOWHP:
  2480. case _SKILL_EARTHFIRE:
  2481. case _SKILL_FIREBOOM:
  2482. case _SKILL_SPACEMOVE:
  2483. case _SKILL_CLOAK:
  2484. case _SKILL_LIGHTENING:
  2485. m_dwLastSpellTime = dwCurrTick;
  2486.             m_wMagicDelayTime = 200 + pstMagic->stStdMagic.nDelayTime;
  2487. SetMotionState(_MT_SPELL2, bDir, nTargetID, TRUE, &ptTargetPos, m_shCurrMagicID);
  2488. break;
  2489. }
  2490. }
  2491. switch ( m_shCurrMagicID )
  2492. {
  2493. // 堪拳搬.
  2494. case _SKILL_FIRESWORD:
  2495.         if ( dwCurrTick - m_dwLastFireHitTime > 10000 )
  2496. g_xClientSocket.SendSpellMsg(m_shCurrMagicID, 0, 0, nTargetID);
  2497. break;
  2498. // 堪拳搬捞寇狼 八过.
  2499. case _SKILL_BANWOL:
  2500. case _SKILL_ERGUM:
  2501.         if ( dwCurrTick - m_dwLastSpellTime > 200 )
  2502. {
  2503. m_dwLastSpellTime = dwCurrTick;
  2504. m_wMagicDelayTime = 0;
  2505. g_xClientSocket.SendSpellMsg(m_shCurrMagicID, 0, 0, nTargetID);
  2506. }
  2507. break;
  2508. }
  2509. // 傍拜付过老锭 立加辆丰 给窍霸窍绰 Delay.
  2510. switch ( m_shCurrMagicID )
  2511. {
  2512. case _SKILL_MOOTEBO: case _SKILL_FIRESWORD: case _SKILL_BANWOL: case _SKILL_ERGUM: case _SKILL_FIRECHARM:
  2513. case _SKILL_FIRE: case _SKILL_FIREBALL2: case _SKILL_FIREBALL: case _SKILL_SHOOTLIGHTEN: case _SKILL_AMYOUNSUL:
  2514. case _SKILL_KILLUNDEAD: case _SKILL_LIGHTFLOWER: case _SKILL_SNOWWIND: case _SKILL_EARTHFIRE:
  2515. m_dwLastMagicTime = dwCurrTick;
  2516. break;
  2517. }
  2518. // 荤恩阑 傍拜沁阑锭 框流烙 菩澄萍 Delay.
  2519. m_wMagicPKDelayTime = 0;
  2520. if ( nTargetID )
  2521. {
  2522. if ( stTargetFeature.bGender == 0 || stTargetFeature.bGender == 1 )
  2523. m_wMagicPKDelayTime = 300 + GetRandomNum(1, 1100);
  2524. }
  2525. }
  2526. /******************************************************************************************************************
  2527. 窃荐疙 : CMyHero::OnKeyDown()
  2528. 累己磊 : 
  2529. 累己老 : 
  2530. 格利   : 
  2531. 涝仿   : WPARAM wParam
  2532.          LPARAM lParam
  2533.          POINT ptMouse
  2534. 免仿   : BOOL 
  2535. [老磊][荐沥磊] : 荐沥郴侩
  2536. *******************************************************************************************************************/
  2537. BOOL CMyHero::OnKeyDown(WPARAM wParam, LPARAM lParam, POINT ptMouse, POINT ptTargetPos, INT nMosueTargetID, FEATURE stTargetFeature)
  2538. {
  2539. BYTE bDir, bMagicKey;
  2540. POINT ptTargetTile, ptMouseTilePos;
  2541. LPCLIENTMAGICRCD pstMagic;
  2542. DWORD dwCurrTick;
  2543. bMagicKey = 0;
  2544. ZeroMemory(&ptTargetTile, sizeof(POINT));
  2545. switch ( wParam )
  2546. {
  2547. case 'A':
  2548. {
  2549. }
  2550. case VK_F1: { bMagicKey = '1'; break; }
  2551. case VK_F2: { bMagicKey = '2'; break; }
  2552. case VK_F3: { bMagicKey = '3'; break; }
  2553. case VK_F4: { bMagicKey = '4'; break; }
  2554. case VK_F5: { bMagicKey = '5'; break; }
  2555. case VK_F6: { bMagicKey = '6'; break; }
  2556. case VK_F7: { bMagicKey = '7'; break; }
  2557. case VK_F8: { bMagicKey = '8'; break; }
  2558. case VK_SPACE:
  2559. {
  2560. static INT nMode = 0;
  2561. nMode++;
  2562. switch ( nMode )
  2563. {
  2564. case 0: m_bAttackMode = _MT_ONEHSWING; break;
  2565. case 1: m_bAttackMode = _MT_ONEVSWING; break;
  2566. case 2: m_bAttackMode = _MT_TWOVSWING; break;
  2567. case 3: m_bAttackMode = _MT_TWOHSWING; break;
  2568. case 4: m_bAttackMode = _MT_SPEARVSWING; break;
  2569. case 5: m_bAttackMode = _MT_SPEARHSWING; break;
  2570. case 6: m_bAttackMode = _MT_WHEELWIND; break;
  2571. case 7: m_bAttackMode = _MT_RANDSWING; break;
  2572. case 8: m_bAttackMode = _MT_BACKDROPKICK; break;
  2573. case 9: m_bAttackMode = _MT_ONEHSWING; break;
  2574. }
  2575. if ( nMode > 8 ) nMode = 0;
  2576. break;
  2577. }
  2578. }
  2579. dwCurrTick = timeGetTime();
  2580. // 付过捞侩啊瓷 Delay Time Check.
  2581. if ( dwCurrTick - m_dwLastSpellTime > 500 + m_wMagicDelayTime )
  2582. {
  2583. // 付过捞 力措肺 技泼登菌绰瘤 Check.
  2584. if ( bMagicKey )
  2585. {
  2586. if ( nMosueTargetID == NULL ) ptMouseTilePos = GetPosMouseToTile(ptMouse.x, ptMouse.y);
  2587. else ptMouseTilePos = ptTargetPos;
  2588. bDir = CalcDirection(ptMouseTilePos.x, ptMouseTilePos.y);
  2589. pstMagic = g_xGameProc.m_xInterface.m_xStatusWnd.GetMagicByKey(bMagicKey);
  2590. if ( pstMagic )
  2591. {
  2592. if ( (10 + pstMagic->stStdMagic.bDefSpell) <= m_stAbility.wMP )
  2593. {
  2594. m_shCurrMagicID = pstMagic->stStdMagic.wMagicID;
  2595. SetMagic(pstMagic, bMagicKey, bDir, nMosueTargetID, stTargetFeature, ptMouseTilePos);
  2596. }
  2597. else
  2598. g_xGameProc.m_xInterface.m_xClientSysMsg.AddSysMsg("付仿捞 葛磊而聪促.");
  2599. }
  2600. }
  2601. }
  2602. return TRUE;
  2603. }