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

模拟服务器

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. CMagic::CMagic()
  3. {
  4. m_bActiveState = _MAGIC_FINISH;
  5. m_bRepeat = FALSE;
  6. m_bFixed = FALSE;
  7. m_bShowLight = TRUE;
  8. m_pxOwner = NULL;
  9. m_pxTarget = NULL;
  10. m_pxMap = NULL;
  11. m_shScrnX = m_shScrnY   = 0;
  12. m_shTileX = m_shTileY   = 0;
  13. m_shFireScrnX = m_shFireScrnY   = 0;
  14. m_shFireTileX = m_shFireTileY   = 0;
  15. m_shTargetScrnX = m_shTargetScrnY = 0;
  16. m_shTargetTileX = m_shTargetTileY = 0;
  17. m_bMagicNum = 0;
  18. m_wCurrDelay = 0;
  19. m_wFrmDelay = 0;
  20. m_wMagicLife = 0;
  21. m_dwFstFrame = 0;
  22. m_dwEndFrame = 0;
  23. m_dwCurrFrame = 0;
  24. m_bBlendType = 0;
  25. m_bOpacity = 0;
  26. m_bSwingCnt = 0;
  27. m_bDir16 = 0;
  28. m_nPrevDistanceX = 10000;
  29. m_nPrevDistanceY = 10000;
  30. ZeroMemory(m_bLightRadius, 2);
  31. ZeroMemory(m_bLightColor, 2*3);
  32. ZeroMemory(m_bMagicColor, 3);
  33. m_nDuplicateNum  = MAX_DUPLE_COUNT;
  34. ZeroMemory(m_lpddsMagicTextr, sizeof(LPDIRECTDRAWSURFACE7)*60);
  35. }
  36. CMagic::~CMagic()
  37. {
  38. }
  39. BOOL CMagic::CreateMagic(BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY, 
  40.                  SHORT shTargetTileX, SHORT shTargetTileY, CActor* pxOwner, INT nTarget)
  41. {
  42. LPEFFECTSPRINFO pstMagicSpr = g_xSpriteInfo.GetMagicInfo(bMagicNum);
  43. if ( pstMagicSpr )
  44. {
  45. //------------------------------------------------------------------------------------------------------------
  46. // 谅钎技泼.
  47. //------------------------------------------------------------------------------------------------------------
  48. m_pxMap = &g_xGameProc.m_xMap;
  49. m_pxTarget = NULL;
  50. if ( nTarget )
  51. {
  52. if ( nTarget == g_xGameProc.m_xMyHero.m_dwIdentity )
  53. {
  54. m_pxTarget = &g_xGameProc.m_xMyHero;
  55. }
  56. else
  57. {
  58. g_xGameProc.m_xActorList.MoveCurrentToTop();
  59. CActor* pxActor;
  60. for ( INT nCnt = 0; nCnt < g_xGameProc.m_xActorList.GetCounter(); nCnt++ )
  61. {
  62. pxActor = g_xGameProc.m_xActorList.GetCurrentData();
  63. if ( pxActor->m_dwIdentity == nTarget )
  64. {
  65. m_pxTarget = pxActor;
  66. }
  67. g_xGameProc.m_xActorList.MoveNextNode();
  68. }
  69. }
  70. }
  71. // 惯荤瘤痢.
  72. m_shFireTileX = shFireTileX;
  73. m_shFireTileY = shFireTileY;
  74. m_pxMap->GetScrnPosFromTilePos(m_shFireTileX, m_shFireTileY, m_shFireScrnX, m_shFireScrnY);
  75. // 格利瘤痢.
  76. m_shTargetTileX = shTargetTileX;
  77. m_shTargetTileY = shTargetTileY;
  78. m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
  79. // 泅犁困摹.
  80. m_shTileX = m_shFireTileX;
  81. m_shTileY = m_shFireTileY;
  82. m_shScrnX = m_fFloatScrnX = m_shFireScrnX;
  83. m_shScrnY = m_fFloatScrnY = m_shFireScrnY;
  84. m_bMagicColor[0] = 255;
  85. m_bMagicColor[1] = 255;
  86. m_bMagicColor[2] = 255;
  87.     SHORT shScrnGapX, shScrnGapY;
  88.     if ( m_shFireScrnX != m_shTargetScrnX ) shScrnGapX = abs(m_shTargetScrnX-m_shFireScrnX);
  89.     else shScrnGapX = 1;
  90.     if ( m_shFireScrnY != m_shTargetScrnY ) shScrnGapY = abs(m_shTargetScrnY-m_shFireScrnY);
  91.     else shScrnGapY = 1;
  92.     FLOAT fGapRateX = (FLOAT)(500/(FLOAT)shScrnGapX);
  93.     FLOAT fGapRateY = (FLOAT)(500/(FLOAT)shScrnGapY);
  94.     if ( shScrnGapX > shScrnGapY )
  95. {
  96. m_nDistanceX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateX);
  97. m_nDistanceY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateX);
  98. }
  99.     else
  100. {
  101. m_nDistanceX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateY);
  102. m_nDistanceY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateY);
  103. }
  104. m_bDir16 = (BYTE)m_pxMap->CalcDirection16(m_shFireTileX, m_shFireTileY, shTargetTileX, shTargetTileY);
  105. //------------------------------------------------------------------------------------------------------------
  106. //------------------------------------------------------------------------------------------------------------
  107. // 扁夯沥焊涝仿.
  108. //------------------------------------------------------------------------------------------------------------
  109. m_pxOwner = pxOwner;
  110. m_bActiveState= _MAGIC_ACTIVE;
  111. m_bFixed = TRUE;
  112. m_bRepeat = FALSE;
  113. m_wMagicLife= 0;
  114. m_bMagicNum = bMagicNum;
  115. m_bCurrSwing = 0;
  116. m_wCurrLightDelay = 0;
  117. //------------------------------------------------------------------------------------------------------------
  118. //------------------------------------------------------------------------------------------------------------
  119. // 付过俊 蝶弗 沥焊技泼.
  120. //------------------------------------------------------------------------------------------------------------
  121. switch ( bMagicNum )
  122. {
  123. case _SKILL_FIRECHARM:
  124. case _SKILL_FIREBALL2:
  125. case _SKILL_FIREBALL:
  126. case _SKILL_SHOOTLIGHTEN:
  127. m_bRepeat = TRUE;
  128. m_bFixed = FALSE;
  129. break;
  130. case _SKILL_SINSU:
  131. m_bRepeat = TRUE;
  132. m_bFixed = FALSE;
  133. break;
  134. case _SKILL_BIGCLOAK:
  135. case _SKILL_HANGMAJINBUB:
  136. case _SKILL_DEJIWONHO:
  137. m_pxTarget = NULL;
  138. m_bRepeat = TRUE;
  139. m_bFixed = FALSE;
  140. break;
  141. // 阁胶磐.
  142. case _MONMAGIC_MAARROW:
  143. case _MONMAGIC_CHIM:
  144. m_bRepeat = TRUE;
  145. m_bFixed = FALSE;
  146. m_bShowLight = FALSE;
  147. break;
  148. // 阁胶磐.
  149. case _MONMAGIC_ANTHEAL:
  150. case _MONMAGIC_DUALAXE:
  151. m_bRepeat = TRUE;
  152. m_bFixed = FALSE;
  153. m_bDir16 = (BYTE)m_pxMap->CalcDirection8(m_shFireTileX, m_shFireTileY, shTargetTileX, shTargetTileY);
  154. m_bShowLight = FALSE;
  155. break;
  156. case _SKILL_FIRE:
  157. m_bDir16 = 0;                                                    
  158. m_bRepeat = FALSE;
  159. m_bFixed = TRUE;
  160. m_pxTarget = NULL;
  161. break;
  162. // 阁胶磐.
  163. case _MONMAGIC_COWGHOST:
  164. case _MONMAGIC_SINSU:
  165. case _MONMAGIC_ZOMBIE:
  166. case _MONMAGIC_JUMAWANG:
  167. case _MONMAGIC_COWFLAME:
  168. case _MONMAGIC_SSEGI:
  169. if ( m_pxOwner )
  170. m_bDir16 = m_pxOwner->m_bCurrDir;  
  171. m_bRepeat = FALSE;
  172. m_bFixed = TRUE;
  173. m_pxTarget = NULL;
  174. m_bShowLight = FALSE;
  175. break;
  176. case _SKILL_LIGHTENING:
  177. case _SKILL_FIREBOOM:
  178. case _SKILL_EARTHFIRE:
  179. case _SKILL_SNOWWIND:
  180. case _SKILL_HOLYSHIELD:
  181. case _SKILL_BIGHEALLING:
  182. m_bRepeat = FALSE;
  183. m_bFixed = TRUE;
  184. m_bDir16 = 0;
  185. m_pxTarget = NULL;
  186. break;
  187. case _SKILL_AMYOUNSUL:
  188. case _SKILL_MOOTEBO:
  189. case _SKILL_TAMMING:
  190. case _SKILL_KILLUNDEAD:
  191. case _SKILL_HEALLING:
  192. case _SKILL_SKELLETON:
  193. case _SKILL_SHIELD:
  194. case _SKILL_SHOWHP:
  195. case _SKILL_SPACEMOVE2:
  196. case _SKILL_SPACEMOVE3:
  197. // 阁胶磐.
  198. case _MONMAGIC_KEPAL:
  199. case _MONMAGIC_EXPLODE:
  200. case _MONMAGIC_EXPLODE1:
  201. case _MONMAGIC_BLACK1:
  202. case _MONMAGIC_BLACK2:
  203. case _MONMAGIC_GREATANT:
  204. case _MONMAGIC_MAGENUMA:
  205. case _MONMAGIC_ANT:
  206. case _MONMAGIC_WORKANT:
  207. case _MONMAGIC_BIGGINE_CHAR:
  208. case _MONMAGIC_RED1:
  209. case _MONMAGIC_RED2:
  210. case _MONMAGIC_BAODIE:
  211. case _MONMAGIC_ZOMBIE_DIE:
  212. case _MONMAGIC_HUSU_DIE:
  213. case _MONMAGIC_SINGI_DIE:
  214. case _MONMAGIC_BIGGINE_ATT:
  215. case _MONMAGIC_SANDFISH:
  216. m_bRepeat = FALSE;
  217. m_bFixed = TRUE;
  218. m_bDir16 = 0;
  219. m_bShowLight = FALSE;
  220. break;
  221. }
  222. //------------------------------------------------------------------------------------------------------------
  223. //------------------------------------------------------------------------------------------------------------
  224. // 捞固瘤肺爹.
  225. //------------------------------------------------------------------------------------------------------------
  226. //------------------------------------------------------------------------------------------------------------
  227. // 橇饭烙沥焊掘扁.
  228. //------------------------------------------------------------------------------------------------------------
  229. m_dwFstFrame = pstMagicSpr->dwFstFrm+(10)*m_bDir16;
  230. m_dwEndFrame = pstMagicSpr->dwEndFrm+(10)*m_bDir16;
  231. m_dwCurrFrame = m_dwFstFrame;
  232. m_wFrmDelay = pstMagicSpr->wDelay;
  233. m_bLightRadius[0] = pstMagicSpr->bLightRadius[0];
  234. m_bLightRadius[1] = pstMagicSpr->bLightRadius[1];
  235. m_bLightColor[0][0] = pstMagicSpr->bLightColor[0][0];
  236. m_bLightColor[0][1] = pstMagicSpr->bLightColor[0][1];
  237. m_bLightColor[0][2] = pstMagicSpr->bLightColor[0][2];
  238. m_bLightColor[1][0] = pstMagicSpr->bLightColor[1][0];
  239. m_bLightColor[1][1] = pstMagicSpr->bLightColor[1][1];
  240. m_bLightColor[1][2] = pstMagicSpr->bLightColor[1][2];
  241. m_bBlendType = pstMagicSpr->bBlendType;
  242. m_bOpacity = pstMagicSpr->bOpa;
  243. m_bSwingCnt = pstMagicSpr->bSwingCnt;
  244. //------------------------------------------------------------------------------------------------------------
  245. WORD wImgIdx = pstMagicSpr->wImgIdx;
  246. WORD wFileType;
  247. m_pxMagicImg = &g_xGameProc.m_xImage.m_xImageList[wImgIdx];
  248.  
  249. for ( INT nCnt = m_dwFstFrame; nCnt < m_dwEndFrame; nCnt++ )
  250. {
  251. if ( wImgIdx == _IMAGE_MAGIC )
  252. {
  253. wFileType = _TEXTR_FILE_MAGIC;
  254. }
  255. else if ( wImgIdx == _IMAGE_MONMAGIC )
  256. {
  257. wFileType = _TEXTR_FILE_MONMAGIC;
  258. }
  259. g_xGameProc.m_xImage.AddTextr(wFileType, wImgIdx, nCnt);
  260. m_lpddsMagicTextr[nCnt-m_dwFstFrame] = g_xGameProc.m_xImage.GetTextrImg(wFileType, wImgIdx, nCnt);
  261. }
  262.   D3DVECTOR vNorm(0, 0, -1);
  263. m_avMagic[0]  = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
  264. m_avMagic[1]  = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
  265. m_avMagic[2]  = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
  266. m_avMagic[3]  = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);
  267. //------------------------------------------------------------------------------------------------------------
  268. const INT nMagicSndTbl[31] = 
  269. {
  270.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  271.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  272. 28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  273. 30,
  274. };
  275. INT nWaveNum = -1;
  276. BOOL bLoop = FALSE;
  277. if ( m_bMagicNum == _SKILL_EARTHFIRE )
  278. bLoop = TRUE;
  279. static DWORD dwLastTick = 0;
  280. if ( timeGetTime() - dwLastTick > 100 )
  281. {
  282. if ( m_bMagicNum < 31 )
  283. {
  284. if ( m_bFixed )
  285. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  286. else
  287. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
  288. }
  289. /* if ( nWaveNum > 10010 )
  290. m_nDuplicateNum = g_xSound.PlayActorWav(m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY, nWaveNum, 100, bLoop);
  291. */ }
  292. dwLastTick = timeGetTime();
  293. return TRUE;
  294. }
  295. return FALSE;
  296. }
  297. BOOL CMagic::DrawLight(CLightFog* xLightFog, INT nLoopTime)
  298. {
  299. BYTE bSwingCnt = 0; // 橇饭烙捞 函拳灯阑锭父.
  300. m_wCurrLightDelay  += nLoopTime;
  301. if ( m_bMagicNum == _SKILL_EARTHFIRE || m_bMagicNum == _SKILL_HOLYSHIELD || m_bMagicNum == _SKILL_FIRE || m_bMagicNum == _SKILL_SPACEMOVE2 || m_bMagicNum == _SKILL_SINSU || m_bMagicNum == _SKILL_LIGHTENING )
  302. {
  303. if ( m_bActiveState == _MAGIC_ACTIVE )
  304. {
  305. if ( m_wCurrLightDelay > 200 )
  306. {
  307. m_wCurrLightDelay = 0;
  308. m_bCurrSwing++;
  309. if ( m_bCurrSwing > m_bSwingCnt )
  310. {
  311. m_bCurrSwing = 0;
  312. }
  313. }
  314. }
  315. else if( m_bActiveState == _LIGHT_ACTIVE ) 
  316. {
  317. m_bCurrSwing = 0;
  318. m_bLightColor[0][0] -= 2;
  319. if ( m_bLightColor[0][0] <= 2 ) m_bLightColor[0][0] = 2;
  320. m_bLightColor[0][1] -= 2;
  321. if ( m_bLightColor[0][1] <= 2 ) m_bLightColor[0][1] = 2;
  322. m_bLightColor[0][2] -= 2;
  323. if ( m_bLightColor[0][2] <= 2 ) m_bLightColor[0][2] = 2;
  324. m_bLightColor[1][0] -= 2;
  325. if ( m_bLightColor[1][0] <= 2 ) m_bLightColor[1][0] = 2;
  326. m_bLightColor[1][1] -= 2;
  327. if ( m_bLightColor[1][1] <= 2 ) m_bLightColor[1][1] = 2;
  328. m_bLightColor[1][2] -= 2;
  329. if ( m_bLightColor[1][2] <= 2 ) m_bLightColor[1][2] = 2;
  330. if ( m_bLightColor[0][0] == 2 &&   
  331.  m_bLightColor[0][1] == 2 &&
  332.  m_bLightColor[0][2] == 2 &&
  333.  m_bLightColor[1][0] == 2 && 
  334.  m_bLightColor[1][1] == 2 &&
  335.  m_bLightColor[1][2] == 2)
  336. {
  337.  m_bActiveState = _MAGIC_FINISH;
  338.  return FALSE;
  339. }
  340. }
  341. }
  342. else
  343. {
  344. if ( m_wCurrLightDelay > 200 )
  345. {
  346. if ( m_bActiveState == _MAGIC_ACTIVE )
  347. {
  348. m_wCurrLightDelay = 0;
  349. m_bCurrSwing++;
  350. if ( m_bCurrSwing > m_bSwingCnt )
  351. {
  352. m_bCurrSwing = 0;
  353. }
  354. }
  355. else if( m_bActiveState == _LIGHT_ACTIVE )
  356. {
  357. m_bCurrSwing = 0;
  358. m_wCurrLightDelay = 150;
  359. if ( m_bLightRadius[0] > 1 )
  360. {
  361. m_bLightRadius[0]--;
  362. m_bLightRadius[1]--;
  363. }
  364. else if ( m_bLightRadius[0] == 1 )
  365. {
  366. m_bActiveState = _MAGIC_FINISH;
  367. return FALSE;
  368. }
  369. }
  370. }
  371. }
  372. if ( !m_bShowLight ) return TRUE;
  373. if ( m_bActiveState == _MAGIC_ACTIVE || m_bActiveState == _LIGHT_ACTIVE )
  374. {
  375. if ( !m_bFixed )
  376. xLightFog->SetLightRadiusWithRing(m_shScrnX+24,
  377.      m_shScrnY+16, 
  378.   m_bLightRadius[0] + m_bCurrSwing, m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2],
  379.   m_bLightRadius[1] + m_bCurrSwing, m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
  380. else
  381. {
  382. SHORT shPosX, shPosY;
  383. m_pxMap->GetScrnPosFromTilePos(m_shTileX, m_shTileY, shPosX, shPosY);
  384. xLightFog->SetLightRadiusWithRing(shPosX+24,
  385.      shPosY+16, 
  386.   m_bLightRadius[0] + m_bCurrSwing, m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2],
  387.   m_bLightRadius[1] + m_bCurrSwing, m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
  388. }
  389. }
  390. return TRUE;
  391. }
  392. BOOL CMagic::DrawMagic()
  393. {
  394. // 烙矫.
  395. POINT ptArr[16] = 
  396. {
  397. {40, 34}, {42, 35}, {49, 33}, {59, 31}, {65, 31}, {62, 33}, {54, 36}, {41, 44}, {47, 48}, {47, 45}, 
  398. {43, 37}, {41, 38}, {40, 36}, {42, 37}, {43, 35}, {46, 34}
  399. };
  400. POINT ptArr2[16] = 
  401. {
  402. {34, 37}, {47, 38}, {62, 48}, {73, 41}, {76, 34}, {72, 43}, {58, 53}, {50, 48}, {34, 49}, {45, 49}, 
  403. {55, 49}, {56, 43}, {48, 35}, {46, 40}, {46, 47}, {47, 38}, 
  404. };
  405. if ( g_xMainWnd.Get3DDevice() )
  406. {
  407. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  408. {
  409. D3DVECTOR vTrans;
  410. D3DMATRIX matTrans;
  411. D3DMATRIX matScale;
  412. D3DMATRIX matRot;
  413. D3DMATRIX matWorld;
  414. D3DMATRIX matTempWorld;
  415. D3DMATRIX matWorldOriginal;
  416. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  417. D3DMATERIAL7 mtrl;
  418. if ( m_bActiveState == _MAGIC_ACTIVE )
  419. {
  420. if ( m_pxMagicImg->NewSetIndex(m_dwCurrFrame) )
  421. {
  422. vTrans.x = (FLOAT) m_shScrnX+(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth /2+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX-400; 
  423. vTrans.y = (FLOAT)-m_shScrnY-(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight/2-m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+300; 
  424. vTrans.z = 0;
  425. // 烙矫.
  426. if ( !m_bFixed )
  427. {
  428. if ( m_bMagicNum == _SKILL_FIREBALL2 )
  429. {
  430. g_xGameProc.m_xFlyingTail.SetFlyTailParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr[m_bDir16].y, 0));
  431. g_xGameProc.m_xSmoke.SetSmokeParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr[m_bDir16].y, 0));
  432. }
  433. else if ( m_bMagicNum == _SKILL_FIREBALL )
  434. {
  435. g_xGameProc.m_xFlyingTail.SetFlyTailParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr2[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr2[m_bDir16].y, 0));
  436. g_xGameProc.m_xSmoke.SetSmokeParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr2[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr2[m_bDir16].y, 0));
  437. }
  438. }
  439. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  440. D3DUtil_SetScaleMatrix(matScale, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight, 0.0f);
  441. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  442. // D3DMath_MatrixMultiply(matTempWorld, matScale, matTrans);
  443. // D3DUtil_SetRotationMatrix(matRot, D3DVECTOR(1.0f,1.0f,0.0f), g_PI/m_dwCurrFrame);
  444. // D3DMath_MatrixMultiply(matWorld, matRot, matTempWorld);
  445. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  446. if ( m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame] )
  447. g_xMainWnd.Get3DDevice()->SetTexture(0, m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame]);
  448. D3DUtil_InitMaterial(mtrl, 
  449.  (FLOAT)m_bMagicColor[0]/255.0f,
  450.  (FLOAT)m_bMagicColor[1]/255.0f,
  451.  (FLOAT)m_bMagicColor[2]/255.0f);
  452. /*  (FLOAT)255/255.0f,
  453.  (FLOAT)255/255.0f,
  454.  (FLOAT)255/255.0f);
  455. */ mtrl.diffuse.a = (m_bOpacity+1)/255.0f;
  456. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  457. SetBlendRenderState(g_xMainWnd.Get3DDevice(), m_bBlendType, mtrl);
  458. g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avMagic, 4, NULL);
  459. // 盔惑汗蓖.
  460. ZeroMemory(&mtrl, sizeof(mtrl));
  461. mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f;
  462. mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f;
  463. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  464. ResetBlendenderState(g_xMainWnd.Get3DDevice());
  465. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  466. }
  467. }
  468. g_xMainWnd.Get3DDevice()->EndScene();
  469. return S_OK;
  470. }
  471. }
  472. return E_FAIL;
  473. }
  474. VOID CMagic::DestoryMagic()
  475. {
  476. }
  477. BOOL CMagic::UpdateMagic(INT nLoopTime)
  478. {
  479. m_wCurrDelay += nLoopTime;
  480. m_wMagicLife += nLoopTime;
  481. if ( !DrawLight(&g_xGameProc.m_xLightFog, nLoopTime) )
  482. return FALSE;
  483. if ( m_wCurrDelay > m_wFrmDelay )
  484. {
  485. m_dwCurrFrame++;
  486. m_wCurrDelay = 0;
  487. if ( m_bMagicNum == _SKILL_SINSU && m_dwCurrFrame >= 2362 && m_dwCurrFrame <=2373 )
  488. {
  489. m_wFrmDelay = 30;
  490. }
  491. else if ( m_bMagicNum == _SKILL_SINSU )
  492. {
  493. m_wFrmDelay = 110;
  494. }
  495. if ( m_nDuplicateNum < MAX_DUPLE_COUNT )
  496. {
  497. INT nWaveNum = -1;
  498. const INT nMagicSndTbl[31] = 
  499. {
  500.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  501.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  502. 28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  503. 30,
  504. };
  505. if ( m_bMagicNum < 31 )
  506. {
  507. if ( m_bFixed )
  508. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  509. else
  510. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1; 
  511. }
  512. /* if ( nWaveNum > 10010 )
  513. g_xSound.ChgPlayingSet(nWaveNum, m_nDuplicateNum, m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY);
  514. */ }
  515. if ( m_dwCurrFrame >= m_dwEndFrame )
  516. {
  517. if ( m_bRepeat )
  518. {
  519. m_dwCurrFrame = m_dwFstFrame;
  520. }
  521. else
  522. {
  523. m_dwCurrFrame  = m_dwEndFrame-1;
  524. m_bActiveState = _LIGHT_ACTIVE;
  525. return FALSE;
  526. }
  527. }
  528. }
  529. BOOL bCrash = FALSE;
  530. SHORT shScrnGapX, shScrnGapY;
  531. if ( !m_bFixed )
  532. {
  533. if ( m_pxTarget )
  534. {
  535. // 鸥百狼 谅钎甫 犁汲沥茄促.
  536. m_shTargetTileX = m_pxTarget->m_wPosX;
  537. m_shTargetTileY = m_pxTarget->m_wPosY;
  538. m_shTargetScrnX = m_pxTarget->m_shScrnPosX;
  539. m_shTargetScrnY = m_pxTarget->m_shScrnPosY;
  540. m_shTileX = m_shFireTileX;
  541. m_shTileY = m_shFireTileY;
  542. // m_shScrnX = m_fFloatScrnX = m_shFireScrnX;
  543. // m_shScrnY = m_fFloatScrnY = m_shFireScrnY;
  544. // 芭府犁汲沥.
  545.    if ( m_shScrnX != m_shTargetScrnX ) shScrnGapX = abs(m_shTargetScrnX-m_shScrnX);
  546.    else shScrnGapX = 1;
  547.    if ( m_shScrnY != m_shTargetScrnY ) shScrnGapY = abs(m_shTargetScrnY-m_shScrnY);
  548.    else shScrnGapY = 1;
  549.    if ( shScrnGapX > shScrnGapY )
  550.    {
  551.    m_nDistanceX = (m_shTargetScrnX-m_shScrnX) * (500/shScrnGapX);
  552.    m_nDistanceY = (m_shTargetScrnY-m_shScrnY) * (500/shScrnGapX);
  553.    }
  554.    else
  555.    {
  556.    m_nDistanceX = (m_shTargetScrnX-m_shScrnX) * (500/shScrnGapY);
  557.    m_nDistanceY = (m_shTargetScrnY-m_shScrnY) * (500/shScrnGapY);
  558.    }
  559.    m_fFloatScrnX += (FLOAT)(((FLOAT)m_nDistanceX/700) * nLoopTime);
  560.    m_fFloatScrnY += (FLOAT)(((FLOAT)m_nDistanceY/700) * nLoopTime);
  561.    m_shScrnX = m_fFloatScrnX;
  562.    m_shScrnY = m_fFloatScrnY;
  563.    // 泅犁 胶农赴谅钎甫 鸥老谅钎肺 函券窍咯 付过烹苞咯何甫 搬沥茄促.
  564. //    if ( 付过捞 烹苞且荐 绝栏搁 )
  565.    INT nabsX, nabsY;
  566.    nabsX = abs(m_shTargetScrnX-m_shScrnX);
  567.    nabsY = abs(m_shTargetScrnY-m_shScrnY);
  568.      if ( (nabsX <= 48 && nabsY <= 32) || (nabsX >= m_nPrevDistanceX && nabsY >= m_nPrevDistanceY) )
  569.    {
  570.    bCrash = TRUE;
  571.    }
  572.    else
  573.    {
  574. m_nPrevDistanceX = nabsX;
  575. m_nPrevDistanceY = nabsY;
  576.    }
  577. }
  578. // Target Actor啊 绝促搁.
  579. else
  580. {
  581. FLOAT fDisX = (FLOAT)((FLOAT)m_nDistanceX/900);
  582. FLOAT fDisY = (FLOAT)((FLOAT)m_nDistanceY/900);
  583. m_fFloatScrnX += ((fDisX) * (FLOAT)nLoopTime);
  584. m_fFloatScrnY += ((fDisY) * (FLOAT)nLoopTime);
  585. m_shScrnX = (SHORT)m_fFloatScrnX;
  586. m_shScrnY = (SHORT)m_fFloatScrnY;
  587. m_pxMap->GetTilePosFromScrnPos(m_shScrnX, m_shScrnY, m_shTileX, m_shTileY);
  588.    if ( m_bMagicNum == _SKILL_FIRECHARM || m_bMagicNum == _SKILL_FIREBALL2 || m_bMagicNum == _SKILL_FIREBALL || m_bMagicNum == _SKILL_SHOOTLIGHTEN )
  589.    {
  590.    if ( m_wMagicLife >= 3000 )
  591.    {
  592.    bCrash = TRUE;
  593.    m_bActiveState = _MAGIC_FINISH;
  594.    }
  595.    }
  596.    else
  597.    {
  598.    if ( (abs(m_shTargetScrnX-m_shScrnX) <= 32 && abs(m_shTargetScrnY-m_shScrnY) <= 20) )
  599.    {
  600.    bCrash = TRUE;
  601.    }
  602.    }
  603. }
  604. }
  605. // 框流捞瘤 臼绰 瓤苞扼搁.
  606. else
  607. {
  608. if ( m_pxTarget )
  609. {
  610. m_shTileX = m_shTargetTileX = m_pxTarget->m_wPosX;
  611. m_shTileY = m_shTargetTileY = m_pxTarget->m_wPosY;
  612. m_shScrnX = m_shTargetScrnX = m_pxTarget->m_shScrnPosX;
  613. m_shScrnY = m_shTargetScrnY = m_pxTarget->m_shScrnPosY;
  614. }
  615. else
  616. {
  617. m_shTileX = m_shTargetTileX;
  618. m_shTileY = m_shTargetTileY;
  619. m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
  620. m_shScrnX = m_shTargetScrnX;
  621. m_shScrnY = m_shTargetScrnY;
  622. }
  623. }
  624. if ( bCrash )
  625. {
  626. m_bFixed = TRUE;
  627. m_bRepeat= FALSE;
  628. bCrash = TRUE;
  629. // 气惯橇饭烙栏肺傈券茄促.
  630. LPEFFECTSPRINFO pstMagicSpr = g_xSpriteInfo.GetExplosionInfo(m_bMagicNum);
  631. if ( !pstMagicSpr )
  632. {
  633. // 气惯橇饭烙捞 绝促搁.
  634. m_bActiveState = _MAGIC_FINISH;
  635. return FALSE;
  636. }
  637. //------------------------------------------------------------------------------------------------------------
  638. // 橇饭烙沥焊掘扁.
  639. //------------------------------------------------------------------------------------------------------------
  640. m_dwFstFrame = pstMagicSpr->dwFstFrm;
  641. m_dwEndFrame = pstMagicSpr->dwEndFrm;
  642. m_dwCurrFrame = m_dwFstFrame;
  643. m_wFrmDelay = pstMagicSpr->wDelay;
  644. m_bLightRadius[0] = pstMagicSpr->bLightRadius[0];
  645. m_bLightRadius[1] = pstMagicSpr->bLightRadius[1];
  646. m_bLightColor[0][0] = pstMagicSpr->bLightColor[0][0];
  647. m_bLightColor[0][1] = pstMagicSpr->bLightColor[0][1];
  648. m_bLightColor[0][2] = pstMagicSpr->bLightColor[0][2];
  649. m_bLightColor[1][0] = pstMagicSpr->bLightColor[1][0];
  650. m_bLightColor[1][1] = pstMagicSpr->bLightColor[1][1];
  651. m_bLightColor[1][2] = pstMagicSpr->bLightColor[1][2];
  652. m_bBlendType = pstMagicSpr->bBlendType;
  653. m_bOpacity = pstMagicSpr->bOpa;
  654. m_bSwingCnt = pstMagicSpr->bSwingCnt;
  655. //------------------------------------------------------------------------------------------------------------
  656. //------------------------------------------------------------------------------------------------------------
  657. // 捞固瘤肺爹.
  658. //------------------------------------------------------------------------------------------------------------
  659. WORD wFileType;
  660. WORD wImgIdx = pstMagicSpr->wImgIdx;
  661. m_pxMagicImg = &g_xGameProc.m_xImage.m_xImageList[wImgIdx];
  662.  
  663. for ( INT nCnt = pstMagicSpr->dwFstFrm; nCnt < pstMagicSpr->dwEndFrm; nCnt++ )
  664. {
  665. if ( wImgIdx == _IMAGE_MAGIC )
  666. {
  667. wFileType = _TEXTR_FILE_MAGIC;
  668. }
  669. else if ( wImgIdx == _IMAGE_MONMAGIC )
  670. {
  671. wFileType = _TEXTR_FILE_MONMAGIC;
  672. }
  673. g_xGameProc.m_xImage.AddTextr(wFileType, wImgIdx, nCnt);
  674. m_lpddsMagicTextr[nCnt-m_dwFstFrame] = g_xGameProc.m_xImage.GetTextrImg(wFileType, wImgIdx, nCnt);
  675. }
  676. D3DVECTOR vNorm(0, 0, -1);
  677. m_avMagic[0]  = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
  678. m_avMagic[1]  = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
  679. m_avMagic[2]  = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
  680. m_avMagic[3]  = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);
  681. //------------------------------------------------------------------------------------------------------------
  682. const INT nMagicSndTbl[31] = 
  683. {
  684.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  685.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  686. 28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  687. 30,
  688. };
  689. INT nWaveNum = -1;
  690. static DWORD dwLastTick = 0;
  691. if ( timeGetTime() - dwLastTick > 100 )
  692. {
  693. if ( m_bMagicNum < 31 )
  694. {
  695. if ( m_bFixed )
  696. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  697. else
  698. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
  699. }
  700. /* if ( nWaveNum > 10000 )
  701. g_xSound.PlayActorWav(m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY, nWaveNum);
  702. */ }
  703. dwLastTick = timeGetTime();
  704. }
  705. return TRUE;
  706. }
  707. BOOL CElecMagic::CreateMagic(BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY, SHORT shTargetTileX, SHORT shTargetTileY, CActor* pxOwner, INT nTarget)
  708. {
  709. if ( CMagic::CreateMagic(bMagicNum, shFireTileX, shFireTileY, shTargetTileX, shTargetTileY, pxOwner, nTarget) )
  710. {
  711. m_xElec.InitElec();
  712. m_xElec.SetupElec();
  713. m_bArrived = FALSE;
  714. m_shEPosX = m_shFireScrnX;
  715. m_shEPosY = m_shFireScrnY;
  716. SHORT shScrnGapX, shScrnGapY;
  717. INT nDisX, nDisY;
  718.     if ( m_shFireScrnX != m_shTargetScrnX ) shScrnGapX = abs(m_shTargetScrnX-m_shFireScrnX);
  719.     else shScrnGapX = 1;
  720.     if ( m_shFireScrnY != m_shTargetScrnY ) shScrnGapY = abs(m_shTargetScrnY-m_shFireScrnY);
  721.     else shScrnGapY = 1;
  722.     FLOAT fGapRateX = (FLOAT)(25/(FLOAT)shScrnGapX);
  723.     FLOAT fGapRateY = (FLOAT)(25/(FLOAT)shScrnGapY);
  724.     if ( shScrnGapX > shScrnGapY )
  725. {
  726. nDisX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateX);
  727. nDisY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateX);
  728. }
  729.     else
  730. {
  731. nDisX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateY);
  732. nDisY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateY);
  733. }
  734. m_shTargetScrnX += nDisX;
  735. m_shTargetScrnY += nDisY;
  736. return TRUE;
  737. }
  738. return FALSE;
  739. }
  740. BOOL CElecMagic::UpdateMagic(INT nLoopTime)
  741. {
  742. m_wMagicLife += nLoopTime;
  743. if ( !DrawLight(&g_xGameProc.m_xLightFog, nLoopTime) )
  744. return FALSE;
  745. FLOAT fDisX = (FLOAT)((FLOAT)m_nDistanceX/300);
  746. FLOAT fDisY = (FLOAT)((FLOAT)m_nDistanceY/300);
  747. m_fFloatScrnX += ((fDisX) * (FLOAT)nLoopTime);
  748. m_fFloatScrnY += ((fDisY) * (FLOAT)nLoopTime);
  749. if ( !m_bArrived )
  750. {
  751. m_shScrnX = (SHORT)m_fFloatScrnX;
  752. m_shScrnY = (SHORT)m_fFloatScrnY;
  753. m_pxMap->GetTilePosFromScrnPos(m_shScrnX, m_shScrnY, m_shTileX, m_shTileY);
  754. if ( (abs(m_shTargetScrnX-m_shScrnX) <= 32 && abs(m_shTargetScrnY-m_shScrnY) <= 20) )
  755. {
  756. m_fFloatScrnX = m_shFireScrnX;
  757. m_fFloatScrnY = m_shFireScrnY;
  758. m_bArrived = TRUE;
  759. }
  760. }
  761. else 
  762. {
  763. m_shEPosX = (SHORT)m_fFloatScrnX;
  764. m_shEPosY = (SHORT)m_fFloatScrnY;
  765. m_pxMap->GetTilePosFromScrnPos(m_shScrnX, m_shScrnY, m_shTileX, m_shTileY);
  766. if ( (abs(m_shTargetScrnX-m_shEPosX) <= 32 && abs(m_shTargetScrnY-m_shEPosY) <= 20) )
  767. {
  768. m_bActiveState = _MAGIC_FINISH;
  769. }
  770. }
  771. if ( m_wMagicLife > 2000 )
  772. m_bActiveState = _MAGIC_FINISH;
  773. return TRUE;
  774. }
  775. BOOL CElecMagic::DrawMagic()
  776. {
  777. INT nCnt = 0;
  778. while ( nCnt < 1 )
  779. {
  780. // m_xElec.UpdateElec(m_shEPosX + 24, m_shEPosY - 32, m_shScrnX + 24, m_shScrnY - 32);
  781. // m_xElec.UpdateElec(m_shFireScrnX + 24, m_shFireScrnY - 32, m_shScrnX + 24, m_shScrnY - 32);
  782. m_xElec.UpdateElec(m_shFireScrnX + 24, m_shFireScrnY - 32, m_shTargetScrnX + 24, m_shTargetScrnY - 32);
  783. m_xElec.RenderElec(g_xMainWnd.Get3DDevice());
  784. nCnt++;
  785. }
  786. return TRUE;
  787. }
  788. BOOL CMagicStream::CreateMagic(BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY, 
  789.                       SHORT shTargetTileX, SHORT shTargetTileY, CActor* pxOwner, INT nTarget, WORD wStartMagicTime, POINT ptTileGap)
  790. {
  791. CMagic::CreateMagic(bMagicNum, shFireTileX, shFireTileY, shTargetTileX, shTargetTileY, pxOwner, nTarget);
  792. m_wMagicStart = wStartMagicTime;
  793. m_ptTileGap   = ptTileGap;
  794. m_bDir16 = (BYTE)m_pxMap->CalcDirection8(m_shFireTileX, m_shFireTileY, shTargetTileX, shTargetTileY);
  795. return TRUE;
  796. }
  797. BOOL CMagicStream::UpdateMagic(INT nLoopTime)
  798. {
  799. m_wCurrDelay += nLoopTime;
  800. m_wMagicLife += nLoopTime;
  801. if ( m_wMagicLife > m_wMagicStart )
  802. {
  803. if ( m_wCurrDelay > m_wFrmDelay )
  804. {
  805. m_dwCurrFrame++;
  806. m_wCurrDelay = 0;
  807. if ( m_nDuplicateNum < MAX_DUPLE_COUNT )
  808. {
  809. INT nWaveNum = -1;
  810. const INT nMagicSndTbl[31] = 
  811. {
  812.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  813.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  814. 28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  815. 30,
  816. };
  817. if ( m_bMagicNum < 31 )
  818. {
  819. if ( m_bFixed )
  820. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  821. else
  822. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
  823. }
  824. /* if ( nWaveNum > 10010 )
  825. g_xSound.ChgPlayingSet(nWaveNum, m_nDuplicateNum, m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY);
  826. */ }
  827. if ( m_bMagicNum == _SKILL_FIRE )
  828. {
  829. if ( m_dwCurrFrame >= 1925 ) m_wFrmDelay = 80;
  830. if ( m_dwCurrFrame <  1915 ) m_dwCurrFrame++;
  831. if ( m_dwCurrFrame >= m_dwEndFrame-30 )
  832. {
  833. m_dwCurrFrame  = m_dwEndFrame-29;
  834. m_bActiveState = _LIGHT_ACTIVE;
  835. }
  836. }
  837. else
  838. {
  839. if ( m_dwCurrFrame >= m_dwEndFrame )
  840. {
  841. m_dwCurrFrame  = m_dwEndFrame-1;
  842. m_bActiveState = _LIGHT_ACTIVE;
  843. }
  844. }
  845. }
  846. }
  847. if ( !DrawLight(&g_xGameProc.m_xLightFog, nLoopTime) )
  848. return FALSE;
  849. return TRUE;
  850. }
  851. BOOL CMagicStream::DrawMagic()
  852. {
  853. if ( m_wMagicLife > m_wMagicStart )
  854. {
  855. m_shTileX = m_shTargetTileX;
  856. m_shTileY = m_shTargetTileY;
  857. m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
  858. m_shScrnX = m_shTargetScrnX;
  859. m_shScrnY = m_shTargetScrnY;
  860. if ( m_bMagicNum == _SKILL_FIRE )
  861. {
  862. BYTE bCanMove  = m_pxMap->GetTileAttribute(m_shTileX, m_shTileY);
  863. if ( bCanMove == _CAN_WALK )
  864. {
  865. CMagic::DrawMagic();
  866. if ( m_bDir16 != 0 && m_bDir16 != 4 )
  867. {
  868. m_dwCurrFrame += 30;
  869. // m_dwFstFrame += 30;
  870. m_shScrnX = m_shScrnX+(m_ptTileGap.x*_CELL_WIDTH/2);
  871. m_shScrnY = m_shScrnY+(m_ptTileGap.y*_CELL_HEIGHT/2);
  872. CMagic::DrawMagic();
  873. m_dwCurrFrame -= 30;
  874. // m_dwFstFrame -= 30;
  875. return TRUE;
  876. }
  877. }
  878. }
  879. else
  880. {
  881. CMagic::DrawMagic();
  882. m_shScrnX = m_shScrnX+(m_ptTileGap.x*_CELL_WIDTH/2);
  883. m_shScrnY = m_shScrnY+(m_ptTileGap.y*_CELL_HEIGHT/2);
  884. CMagic::DrawMagic();
  885. }
  886. }
  887. return FALSE;
  888. }
  889. BOOL CRepeatMagic::CreateMagic(INT nEventID, BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY, 
  890.                       SHORT shTargetTileX, SHORT shTargetTileY, DWORD dwMagicLifeTotal, CActor* pxOwner, INT nTarget)
  891. {
  892. CMagic::CreateMagic(bMagicNum, shFireTileX, shFireTileY, shTargetTileX, shTargetTileY, pxOwner, nTarget);
  893. m_nEventID = nEventID;
  894. m_shTileX = m_shTargetTileX;
  895. m_shTileY = m_shTargetTileY;
  896. m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
  897. m_shScrnX = m_shTargetScrnX;
  898. m_shScrnY = m_shTargetScrnY;
  899. m_dwMagiLifeTotal = dwMagicLifeTotal;
  900. return TRUE;
  901. }
  902. BOOL CRepeatMagic::UpdateMagic(INT nLoopTime)
  903. {
  904. m_wCurrDelay += nLoopTime;
  905. m_wMagicLife += nLoopTime;
  906. if ( m_wCurrDelay > m_wFrmDelay )
  907. {
  908. m_wCurrDelay = 0;
  909. m_dwCurrFrame++;
  910. if ( m_nDuplicateNum < MAX_DUPLE_COUNT )
  911. {
  912. INT nWaveNum = -1;
  913. const INT nMagicSndTbl[31] = 
  914. {
  915.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  916.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  917.   28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  918. 30,
  919. };
  920. if ( m_bMagicNum < 31 )
  921. {
  922. if ( m_bFixed )
  923. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  924. else
  925. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
  926. }
  927. /* if ( nWaveNum > 10010 )
  928. g_xSound.ChgPlayingSet(nWaveNum, m_nDuplicateNum, m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY);
  929. */ }
  930. if ( m_dwCurrFrame >= m_dwEndFrame ) m_dwCurrFrame = m_dwFstFrame;
  931. if ( m_wMagicLife > m_dwMagiLifeTotal )
  932. {
  933. m_bActiveState = _LIGHT_ACTIVE;
  934. }
  935. }
  936. if ( !DrawLight(&g_xGameProc.m_xLightFog, nLoopTime) )
  937. {
  938. INT nWaveNum = -1;
  939. const INT nMagicSndTbl[31] = 
  940. {
  941.  0,  6,  8, 14, 15,  9,  0, 20, 21, 32,
  942.  1,  2, 16, 29, 24, 10, 17, 33, 19, 31,
  943. 28, 22, 13, 21,  5,  0, 12, 11,  0, 18, 
  944. 30,
  945. };
  946. nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
  947. /* if ( m_nDuplicateNum < MAX_DUPLE_COUNT )
  948. g_xSound.StopSound(nWaveNum, m_nDuplicateNum);
  949. else
  950. g_xSound.StopSound(nWaveNum);
  951. */
  952. return FALSE;
  953. }
  954. return TRUE;
  955. }
  956. BOOL CRepeatMagic::DrawMagic()
  957. {
  958. m_shTileX = m_shTargetTileX;
  959. m_shTileY = m_shTargetTileY;
  960. m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
  961. m_shScrnX = m_shTargetScrnX;
  962. m_shScrnY = m_shTargetScrnY;
  963. /* if ( CMagic::DrawMagic() )
  964. return TRUE;
  965. */
  966. if ( g_xMainWnd.Get3DDevice() )
  967. {
  968. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  969. {
  970. D3DVECTOR vTrans;
  971. D3DMATRIX matTrans;
  972. D3DMATRIX matScale;
  973. D3DMATRIX matRot;
  974. D3DMATRIX matWorld;
  975. D3DMATRIX matTempWorld;
  976. D3DMATRIX matWorldOriginal;
  977. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  978. D3DMATERIAL7 mtrl;
  979. if ( m_bActiveState == _MAGIC_ACTIVE || m_bActiveState == _LIGHT_ACTIVE )
  980. {
  981. if ( m_pxMagicImg->NewSetIndex(m_dwCurrFrame) )
  982. {
  983. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  984. vTrans.x = (FLOAT) m_shScrnX+(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth /2+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX-400; 
  985. vTrans.y = (FLOAT)-m_shScrnY-(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight/2-m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+300; 
  986. vTrans.z = 0;
  987. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  988. D3DUtil_SetScaleMatrix(matScale, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight, 0.0f);
  989. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  990. // D3DMath_MatrixMultiply(matTempWorld, matScale, matTrans);
  991. // D3DUtil_SetRotationMatrix(matRot, D3DVECTOR(1.0f,1.0f,0.0f), g_PI/m_dwCurrFrame);
  992. // D3DMath_MatrixMultiply(matWorld, matRot, matTempWorld);
  993. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  994. if ( m_bActiveState == _LIGHT_ACTIVE )
  995. {
  996. m_bMagicColor[0] -= 5;
  997. m_bMagicColor[1] -= 5;
  998. m_bMagicColor[2] -= 5;
  999. if ( m_bMagicColor[0] < 10 ) m_bMagicColor[0] = 5;
  1000. if ( m_bMagicColor[1] < 10 ) m_bMagicColor[1] = 5;
  1001. if ( m_bMagicColor[2] < 10 ) m_bMagicColor[2] = 5;
  1002. }
  1003. if ( m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame] )
  1004. g_xMainWnd.Get3DDevice()->SetTexture(0, m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame]);
  1005. D3DUtil_InitMaterial(mtrl, 
  1006.  (FLOAT)m_bMagicColor[0]/255.0f,
  1007.  (FLOAT)m_bMagicColor[1]/255.0f,
  1008.  (FLOAT)m_bMagicColor[2]/255.0f);
  1009. /*  (FLOAT)255/255.0f,
  1010.  (FLOAT)255/255.0f,
  1011.  (FLOAT)255/255.0f);
  1012. */ mtrl.diffuse.a = (m_bOpacity+1)/255.0f;
  1013. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  1014. SetBlendRenderState(g_xMainWnd.Get3DDevice(), m_bBlendType, mtrl);
  1015. g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avMagic, 4, NULL);
  1016. // 盔惑汗蓖.
  1017. ZeroMemory(&mtrl, sizeof(mtrl));
  1018. mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f;
  1019. mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f;
  1020. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  1021. ResetBlendenderState(g_xMainWnd.Get3DDevice());
  1022. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  1023. }
  1024. }
  1025. g_xMainWnd.Get3DDevice()->EndScene();
  1026. return TRUE;
  1027. }
  1028. }
  1029. return FALSE;
  1030. }