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

模拟服务器

开发平台:

Visual C++

  1. // MirSound.cpp: implementation of the CMirSound class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "StdAfx.h"
  5. #define MAX_KINDS_OF_WAVE 50
  6. //#define MAX_DUPLE_COUNT 5
  7. #define MAX_LIM_TIME 60000
  8. #define MAX_MP3_WAR -1000
  9. #define MAX_MP3_PEACE -100
  10. #define _PI 3.1415927
  11. #define MAKEPOS(a1,a2,a3) {a1.x = a2;a1.y = a3;}
  12. void CALLBACK AmbianceTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
  13. void CALLBACK FadeInTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
  14. void CALLBACK FadeOutTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. ///////////////////////////////////////////////////////////////////////
  19. //  Name : CMirSound
  20. //  Destination : Constructor
  21. //
  22. //  Parameter : none
  23. //
  24. // Return Value: void
  25. //  Update :
  26. ///////////////////////////////////////////////////////////////////////
  27. CMirSound::CMirSound()
  28. {
  29. m_ppWavList = NULL;
  30. m_pWavListHeader = NULL;
  31. m_ppBuffer = NULL;
  32. m_3DEnable = FALSE;
  33. m_bPlay = TRUE;
  34. m_bBGMPlay = TRUE; // 烙矫
  35. ReadWavFileList("SoundList.wwl");
  36. m_ppBuffer = new CSBuffer*[MAX_KINDS_OF_WAVE];
  37. for(int i = 0 ; i < MAX_KINDS_OF_WAVE ; i++)
  38. {
  39. m_ppBuffer[i] = new CSBuffer;
  40. }
  41. m_pMp3 = new CBMMp3;
  42. m_lWavMaxVol = -100;
  43. m_lMp3MaxVol = -1000;
  44. m_nUseCount = 0;
  45. m_bRunningTimer = FALSE;
  46. m_bIsWarMode = FALSE;
  47. }
  48. ///////////////////////////////////////////////////////////////////////
  49. //  Name : ~CMirSound
  50. //  Destination : Destructor
  51. //
  52. //  Parameter : none
  53. //
  54. // Return Value: void
  55. //  Update :
  56. ///////////////////////////////////////////////////////////////////////
  57. CMirSound::~CMirSound()
  58. {
  59. unsigned int i;
  60. if(m_ppWavList != NULL)
  61. {
  62. for(i=0;i<m_pWavListHeader->FieldCount;i++)
  63. {
  64. delete m_ppWavList[i];
  65. }
  66. delete[] m_ppWavList;
  67. }
  68. if(m_bAmbiance)
  69. {
  70. KillTimer(g_xMainWnd.GetSafehWnd(),ID_AMBIANCE_TIMER);
  71. for(i = 0 ; i < MAX_AMBIANCE_COUNT ; i++)
  72. {
  73. m_pAmbianceBuffer[i]->Release();
  74. delete m_pAmbianceBuffer[i];
  75. }
  76. }
  77. m_CommonWavBuffer.Release();
  78. if(m_ppBuffer!=NULL)
  79. {
  80. for(int j =0;j<m_nUseCount;j++) // Buffer Class
  81. {
  82. m_ppBuffer[j]->Release();
  83. delete m_ppBuffer[j];
  84. }
  85. delete[] m_ppBuffer;
  86. }
  87. if(m_pWavListHeader != NULL) delete m_pWavListHeader;
  88. if(m_pMp3!=NULL) delete m_pMp3;
  89. if(m_pSound!=NULL) delete m_pSound; // Sound Class 
  90. }
  91. ///////////////////////////////////////////////////////////////////////
  92. //  Name : CalsDistance
  93. //  Destination : Calculate Distance from User to Sound Source
  94. //
  95. //  Parameter : Position  Src
  96. // Position Chr
  97. //
  98. // Return Value: int Distance
  99. //  Update :
  100. ///////////////////////////////////////////////////////////////////////
  101. float CMirSound::CalsDistanceX(POINT Src,POINT Chr) // 家府 惯积 困摹客 泅犁 纳腐磐埃狼 芭府 炼荤
  102. {
  103. float l_Result;
  104. l_Result = (float)((Chr.x - Src.x)%13); // 芭府绰 12 捞惑老荐 绝促.
  105. l_Result = (float)(1.0-(float)sqrt(1.0 - l_Result/(float)12.0))*((float)-1.0);
  106. return l_Result;
  107. }
  108. float CMirSound::CalsDistanceY(POINT Src,POINT Chr) // 家府 惯积 困摹客 泅犁 纳腐磐埃狼 芭府 炼荤
  109. {
  110. float l_Result;
  111. l_Result = (float)((Chr.y- Src.y)%13); // 芭府绰 12 捞惑老荐 绝促.
  112. l_Result =float(1.0-(float)sqrt(1.0 - (double)(l_Result)/12.0))*((float)-1.0);
  113. return l_Result;
  114. }
  115. INT CMirSound::CalsDistance(POINT Src,POINT Chr)
  116. {
  117. INT Cx,Cy;
  118. INT nResult;
  119. Cx = Src.x - Chr.x;
  120. Cy = Src.y - Chr.y;
  121. Cx = Cx<0 ? Cx*(-1) : Cx;
  122. Cy = Cy<0 ? Cy*(-1) : Cy;
  123. nResult = Cx >Cy ? Cx : Cy;
  124. return nResult;
  125. }
  126. ///////////////////////////////////////////////////////////////////////
  127. //  Name : CalsPan
  128. //  Destination : Calculate Pans value
  129. //
  130. //  Parameter : int Direction
  131. // int Distance
  132. //
  133. // Return Value: int Pans
  134. //  Update :
  135. ///////////////////////////////////////////////////////////////////////
  136. int CMirSound::CalsPan(int Dir,int Dis)
  137. {
  138. int pans;
  139. pans = Dir*(int)(5000.0*(sin(_PI*(Dis/26.0))));
  140. return pans;
  141. }
  142. ///////////////////////////////////////////////////////////////////////
  143. //  Name :
  144. //  Destination :
  145. //
  146. //  Parameter :
  147. //
  148. //
  149. // Return Value:
  150. //  Update :
  151. ///////////////////////////////////////////////////////////////////////
  152. int CMirSound::CalsVolume(int Dis) // 荐沥 夸噶
  153. {
  154. int l_Result;
  155. if(Dis!=0)
  156. {
  157. l_Result = (int)((cos(_PI*(Dis/26.0)))*100);
  158. l_Result = (101 - l_Result); // 弥措 杭冯 0 弥家 杭俘 (-1)*x : 泅力狼 100-(x)%
  159. l_Result = m_lWavMaxVol+l_Result*(-20); // 弥家澜樊 -2000 ~ 弥措澜樊 0
  160. return l_Result;
  161. }
  162. else
  163. {
  164. return m_lWavMaxVol; // 般媚 廉 乐芭唱 夯牢狼 家府 弥措 澜樊栏肺
  165. }
  166. }
  167. ///////////////////////////////////////////////////////////////////////
  168. //  Name :
  169. //  Destination :
  170. //
  171. //  Parameter :
  172. //
  173. //
  174. // Return Value:
  175. //  Update :
  176. ///////////////////////////////////////////////////////////////////////
  177. void CMirSound::ReadWavFileList(char* fName)
  178. {
  179. unsigned int i;
  180. int Count;
  181. DWORD dwReadSize;
  182. DWORD dwError;
  183. WAVELIST* l_WavList;
  184. HANDLE hFile = ::CreateFile(fName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
  185. dwError = GetLastError();
  186. if(dwError==ERROR_SUCCESS)
  187. {
  188. // Header Reading
  189. m_pWavListHeader = new WAVELISTHEADER;
  190. ReadFile(hFile,m_pWavListHeader,sizeof(WAVELISTHEADER),&dwReadSize,NULL);
  191. // fclose(hFile);
  192. m_ppWavList = new WAVELIST*[m_pWavListHeader->FieldCount];
  193. // List Reading
  194. Count = 0;
  195. for(i=0;i<m_pWavListHeader->ListCount ; i++)
  196. {
  197. l_WavList = new WAVELIST;
  198. ZeroMemory(l_WavList,sizeof(WAVELIST));
  199. ReadFile(hFile,l_WavList,sizeof(WAVELIST),&dwReadSize,NULL);
  200. if(l_WavList->ID != 0) 
  201. {
  202. for(unsigned int j=0; j<strlen(l_WavList->Des);j++)
  203. {
  204. char temp[4];
  205. int cmpResult;
  206. strncpy(temp,l_WavList->Des+j,3);
  207. temp[3] = NULL;
  208. cmpResult = strcmp(temp,"wav");
  209. if(cmpResult==0)
  210. {
  211. *(l_WavList->Des+j+3)=NULL;
  212. }
  213. }
  214. l_WavList->Des;
  215. m_ppWavList[Count] = l_WavList;
  216. Count++;
  217. }
  218. else
  219. {
  220. delete l_WavList;
  221. }
  222. }
  223. CloseHandle(hFile);
  224. }
  225. else
  226. {
  227. m_bPlay = FALSE;
  228. }
  229. }
  230. ///////////////////////////////////////////////////////////////////////
  231. //  Name :
  232. //  Destination :
  233. //
  234. //  Parameter :
  235. //
  236. //
  237. // Return Value:
  238. //  Update :
  239. ///////////////////////////////////////////////////////////////////////
  240. void CMirSound::PlayMagicEffect(POINT Target, POINT Chr, int Wavnum)
  241. {
  242. if(m_bPlay)
  243. {
  244. FreeNotUseBuffer();
  245. }
  246. }
  247. ///////////////////////////////////////////////////////////////////////
  248. //  Name :
  249. //  Destination :
  250. //
  251. //  Parameter :
  252. //
  253. // Return Value:
  254. //  Update :
  255. ///////////////////////////////////////////////////////////////////////
  256. void CMirSound::PlayAmbianceWav(int WavNum)
  257. {
  258. if(m_bAmbiance)
  259. {
  260. FreeNotUseBuffer();
  261. m_pAmbianceBuffer[WavNum]->SetVolume(m_lWavMaxVol);
  262. m_pAmbianceBuffer[WavNum]->Play(0);
  263. }
  264. }
  265. ///////////////////////////////////////////////////////////////////////
  266. //  Name : PlayBkMusic
  267. //  Destination : Play Wave File with stream
  268. //
  269. //  Parameter : bool looped
  270. //
  271. // Return Value: void
  272. //  Update :
  273. ///////////////////////////////////////////////////////////////////////
  274. void CMirSound::PlayBkMusicMp3(BOOL Looped,INT nIndex)
  275. {
  276. if(m_bBGMPlay)
  277. {
  278. CHAR szMp3FileName[MAX_PATH];
  279. ZeroMemory(szMp3FileName,MAX_PATH);
  280. if(m_pMp3->IsPlaying())
  281. {
  282. // Play吝
  283. m_pMp3->OnStop();
  284. }
  285. // FindBGMFileName(nIndex,szMp3FileName);
  286. strcpy(szMp3FileName,"1.mp3"); // 烙矫
  287. if(szMp3FileName[0]!=NULL)
  288. {
  289. m_pMp3->LoadMp3(szMp3FileName,g_xMainWnd.GetSafehWnd());
  290. m_pMp3->OnPlay(-5000,Looped);
  291. BGMFadeIn();
  292. }
  293. else
  294. {
  295. }
  296. }
  297. }
  298. ///////////////////////////////////////////////////////////////////////
  299. //  Name : StopBkMusic
  300. //  Destination : Stop play BackGround Sound
  301. //
  302. //  Parameter : none
  303. //
  304. // Return Value: void
  305. //  Update :
  306. ///////////////////////////////////////////////////////////////////////
  307. void CMirSound::StopBkMusicMp3(void)
  308. {
  309. BGMFadeOut();
  310. }
  311. ///////////////////////////////////////////////////////////////////////
  312. //  Name : PlayActorWav
  313. //  Destination : Play Wave File with any effect
  314. //
  315. //  Parameter : Position Mon
  316. // Position Chr
  317. // int WavNum
  318. //
  319. // Return Value: void
  320. //  Update :
  321. ///////////////////////////////////////////////////////////////////////
  322. INT CMirSound::PlayActorWav(INT Sx,INT Sy,INT Dx,INT Dy,int Wavnum,INT lVolume,BOOL bLooping)
  323. {
  324. CSBuffer* pBuffer;
  325. char* fname;
  326. POINT Mon,Chr;
  327. INT Dis;
  328. INT Dir;
  329. MAKEPOS(Mon,Sx,Sy);
  330. MAKEPOS(Chr,Dx,Sy);
  331.   if(m_bPlay)
  332. {
  333. FreeNotUseBuffer();
  334. fname = SeekFileName(Wavnum);
  335. if(fname != NULL)
  336. {
  337. pBuffer= FindBuffer(Wavnum,TRUE);
  338. if(pBuffer!=NULL)
  339. {
  340. if(m_3DEnable)
  341. {
  342. pBuffer->PlayExtended((float)CalsDistanceX(Mon,Chr),(float)CalsDistanceY(Mon,Chr),(float)0.1,0); // 3D pan
  343. }
  344. else
  345. {
  346. Dis = CalsDistance(Mon,Chr);
  347. Dir = CalsDirection(Mon,Chr);
  348. if(bLooping)
  349. {
  350. pBuffer->PlayExtended(DSBPLAY_LOOPING,CalsPan(Dir,Dis),CalsVolume(Dis),0);     // 2D pan
  351. }
  352. else
  353. {
  354. lVolume = CalsVolume(Dis)*((100-lVolume==0)?1:(100-lVolume)/5);
  355. pBuffer->PlayExtended(0,CalsPan(Dir,Dis),lVolume,0);     // 2D pan
  356. }
  357. return pBuffer->nBufferIdx;
  358. }
  359. }
  360. }
  361. }
  362. return MAX_DUPLE_COUNT;
  363. }
  364. ///////////////////////////////////////////////////////////////////////
  365. //  Name : StopAllSound
  366. //  Destination : Stop All playing Sound
  367. //
  368. //  Parameter : none
  369. //
  370. // Return Value: void
  371. //  Update :
  372. ///////////////////////////////////////////////////////////////////////
  373. void CMirSound::StopAllSound(void)
  374. {
  375. for(int i = 0;i<m_nUseCount;i++)
  376. {
  377. m_ppBuffer[i]->Stop();
  378. }
  379. }
  380. ///////////////////////////////////////////////////////////////////////
  381. //  Name : StopSound
  382. //  Destination : Stop play Sound
  383. //
  384. //  Parameter : int nNum
  385. //
  386. // Return Value: void
  387. //  Update :
  388. ///////////////////////////////////////////////////////////////////////
  389. void CMirSound::StopSound(int nNum)
  390. {
  391. CSBuffer* pBuffer;
  392. pBuffer = NULL;
  393. pBuffer = FindBuffer(nNum,FALSE);
  394. if(pBuffer != NULL)
  395. pBuffer->Stop();
  396. }
  397. void CMirSound::StopSound(int nNum,int BufIdx)
  398. {
  399. CSBuffer* pBuffer;
  400. pBuffer = NULL;
  401. pBuffer = FindBuffer(nNum,FALSE);
  402. if(pBuffer != NULL)
  403. pBuffer->Stop(BufIdx);
  404. }
  405. ///////////////////////////////////////////////////////////////////////
  406. //  Name : SeekFileName
  407. //  Destination : Find File name with Wave number
  408. //
  409. //  Parameter : int wavnum
  410. //
  411. // Return Value: char*
  412. //  Update :
  413. ///////////////////////////////////////////////////////////////////////
  414. char* CMirSound::SeekFileName(int wavnum)
  415. {
  416. unsigned int i;
  417. if(m_bPlay)
  418. {
  419. for(i=0;i<m_pWavListHeader->FieldCount;i++)
  420. {
  421. if(wavnum == m_ppWavList[i]->ID) 
  422. return m_ppWavList[i]->Des;
  423. }
  424. }
  425. return NULL;
  426. }
  427. ///////////////////////////////////////////////////////////////////////
  428. //  Name : FindBuffer
  429. //  Destination :
  430. //
  431. //
  432. //  Parameter :
  433. //
  434. // Return Value:
  435. //  Update :
  436. ///////////////////////////////////////////////////////////////////////
  437. CSBuffer* CMirSound::FindBuffer(int nNum,BOOL ForLoad) // 绝阑锭 Load窍绰 巴捞搁 TRUE 酒聪搁 FASLE
  438. {
  439. if(m_nUseCount>0)
  440. {
  441. for(int i=0 ; i<MAX_KINDS_OF_WAVE;i++)
  442. {
  443. if(m_ppBuffer[i]->m_ID==nNum) // 佬绢 初篮 巴甸吝俊 乐衬?
  444. {
  445. return m_ppBuffer[i];
  446. }
  447. }
  448. }
  449. // 佬绢 初篮巴吝俊 绝窜富捞衬?
  450. if(ForLoad)
  451. {
  452. if(m_nUseCount<MAX_KINDS_OF_WAVE)
  453. {
  454. char* fname;
  455. // 弊烦 佬磊!
  456. fname = SeekFileName(nNum);
  457. if(m_3DEnable) m_ppBuffer[m_nUseCount]->Enable3d();
  458. if(m_ppBuffer[m_nUseCount]->Load(m_pSound,fname,5)!=E_FAIL)
  459. {
  460. m_ppBuffer[m_nUseCount]->m_ID = nNum;
  461. m_nUseCount++;
  462. return m_ppBuffer[m_nUseCount-1];
  463. }
  464. }
  465. else
  466. { // 卿! 佬阑 傍埃 付历 绝窜 富捞衬?
  467. // 弊烦 富磊!
  468. return NULL;
  469. }
  470. }
  471. return NULL;
  472. }
  473. ///////////////////////////////////////////////////////////////////////
  474. //  Name :
  475. //  Destination :
  476. //
  477. //  Parameter :
  478. //
  479. // Return Value:
  480. //  Update :
  481. ///////////////////////////////////////////////////////////////////////
  482. BOOL CMirSound::InitMirSound(HWND hWnd)
  483. {
  484. if(hWnd != NULL)
  485. {
  486. m_hWnd = hWnd;
  487. m_pSound = new CSound;
  488. m_pSound->Create(m_hWnd,TRUE);
  489. return TRUE;
  490. }
  491. return FALSE;
  492. }
  493. ///////////////////////////////////////////////////////////////////////
  494. //  Name :
  495. //  Destination :
  496. //
  497. //  Parameter :
  498. //
  499. // Return Value:
  500. //  Update :
  501. ///////////////////////////////////////////////////////////////////////
  502. VOID CMirSound::Enable3D(VOID)
  503. {
  504. m_3DEnable = TRUE;
  505. }
  506. ///////////////////////////////////////////////////////////////////////
  507. //  Name :
  508. //  Destination :
  509. //
  510. //  Parameter :
  511. //
  512. // Return Value:
  513. //  Update :
  514. ///////////////////////////////////////////////////////////////////////
  515. INT CMirSound::CalsDirection(POINT Src,POINT Chr)
  516. {
  517. return Src.x>Chr.x ? 1 :Src.x<Chr.x ?-1:0;
  518. }
  519. ///////////////////////////////////////////////////////////////////////
  520. //  Name :
  521. //  Destination :
  522. //
  523. //  Parameter :
  524. //
  525. // Return Value:
  526. //  Update :
  527. ///////////////////////////////////////////////////////////////////////
  528. BOOL CMirSound::FreeNotUseBuffer(VOID)
  529. {
  530. DWORD dwCurrentTime;
  531. DWORD dwTempTime;
  532. CSBuffer* pxTempBuffer;
  533. int i=0;
  534. dwCurrentTime = timeGetTime(); // 泅犁 矫埃阑 备茄促.
  535. do
  536. {
  537. dwTempTime = m_ppBuffer[i]->GetLastUsedTime();
  538. if(dwTempTime!=0)
  539. {
  540. dwTempTime = dwCurrentTime - dwTempTime;
  541. if(dwTempTime >  MAX_LIM_TIME) // 1盒 捞惑 救敬巴阑 朝妨扼
  542. {
  543. m_ppBuffer[i]->Release();
  544. pxTempBuffer = m_ppBuffer[i];
  545. m_nUseCount--;
  546. for(int j = i; j<m_nUseCount;j++)
  547. {
  548. m_ppBuffer[j] = m_ppBuffer[j+1];
  549. }
  550. m_ppBuffer[m_nUseCount] = pxTempBuffer;
  551. i--;
  552. }
  553. i++;
  554. }
  555. }
  556. while(i<m_nUseCount);
  557. return FALSE;
  558. }
  559. ///////////////////////////////////////////////////////////////////////
  560. //  Name :
  561. //  Destination :
  562. //
  563. //  Parameter :
  564. //
  565. // Return Value:
  566. //  Update :
  567. ///////////////////////////////////////////////////////////////////////
  568. VOID CMirSound::SetEnableBGM(VOID)
  569. {
  570. m_bBGMPlay = TRUE;
  571. }
  572. ///////////////////////////////////////////////////////////////////////
  573. //  Name :
  574. //  Destination :
  575. //
  576. //  Parameter :
  577. //
  578. // Return Value:
  579. //  Update :
  580. ///////////////////////////////////////////////////////////////////////
  581. VOID CMirSound::SetDisableBGM(VOID)
  582. {
  583. m_bBGMPlay = FALSE;
  584. }
  585. ///////////////////////////////////////////////////////////////////////
  586. //  Name :
  587. //  Destination :
  588. //
  589. //  Parameter :
  590. //
  591. // Return Value:
  592. //  Update :
  593. ///////////////////////////////////////////////////////////////////////
  594. VOID CMirSound::SetEnablePlay(VOID)
  595. {
  596. m_bPlay = TRUE;
  597. }
  598. ///////////////////////////////////////////////////////////////////////
  599. //  Name :
  600. //  Destination :
  601. //
  602. //  Parameter :
  603. //
  604. // Return Value:
  605. //  Update :
  606. ///////////////////////////////////////////////////////////////////////
  607. VOID CMirSound::SetDisablePlay(VOID)
  608. {
  609. m_bPlay = FALSE;
  610. }
  611. ///////////////////////////////////////////////////////////////////////
  612. //  Name :
  613. //  Destination :
  614. //
  615. //  Parameter :
  616. //
  617. // Return Value:
  618. //  Update :
  619. ///////////////////////////////////////////////////////////////////////
  620. VOID CMirSound::SetDisableAmbiance(VOID)
  621. {
  622. if(m_bAmbiance)
  623. {
  624. m_bAmbiance = FALSE;
  625. for(INT i = 0 ; i < MAX_AMBIANCE_COUNT ; i++)
  626. {
  627. m_pAmbianceBuffer[i]->Release();
  628. delete m_pAmbianceBuffer[i];
  629. }
  630. // m_CommonWavBuffer.Release();
  631. if(m_CommonWavBuffer.Load(m_pSound,"10.wav",1)!=E_FAIL)
  632. {
  633. m_CommonWavBuffer.m_ID = 1;
  634. m_CommonWavBuffer.SetVolume(m_lWavMaxVol);
  635. m_CommonWavBuffer.Play(0);
  636. }
  637. KillTimer(g_xMainWnd.GetSafehWnd(),ID_AMBIANCE_TIMER);
  638. }
  639. }
  640. ///////////////////////////////////////////////////////////////////////
  641. //  Name :
  642. //  Destination :
  643. //
  644. //  Parameter :
  645. //
  646. // Return Value:
  647. //  Update :
  648. ///////////////////////////////////////////////////////////////////////
  649. VOID CMirSound::SetEnableAmbiance(INT nMapNum,INT nCount)
  650. {
  651. CHAR szPname[MAX_PATH];
  652. CHAR szFname[MAX_PATH];
  653. CHAR szTname[MAX_PATH];
  654. if(!m_bAmbiance)
  655. {
  656. m_nAmbienceNum = nMapNum;
  657. m_nAmbianceCount = nCount;
  658. // _itoa(m_nAmbienceNum,szFname,10);
  659. ZeroMemory(szPname,MAX_PATH);
  660. // strcat(szPname,szFname);
  661. if(m_CommonWavBuffer.Load(m_pSound,"00.wav",1)!=E_FAIL) // FadeIn
  662. {
  663. m_CommonWavBuffer.SetVolume(m_lWavMaxVol);
  664. m_CommonWavBuffer.m_ID = 1; // 骏厚攫胶老版快俊父 1肺 秦霖促.
  665. m_CommonWavBuffer.Play(0);
  666. }
  667. for(INT i = 0 ; i < MAX_AMBIANCE_COUNT ; i++)
  668. {
  669. _itoa(i,szTname,10);
  670. strcat(szTname,".wav");
  671. strcpy(szFname,szPname);
  672. strcat(szFname,szTname);
  673. m_pAmbianceBuffer[i] = new CSBuffer;
  674. if(m_3DEnable) m_pAmbianceBuffer[i]->Enable3d();
  675. m_pAmbianceBuffer[i]->Load(m_pSound,szFname,2);
  676. m_pAmbianceBuffer[i]->m_ID = 1; // 骏厚攫胶老版快俊父 1肺 秦霖促.
  677. }
  678. m_bAmbiance = TRUE;
  679. SetTimer(m_hWnd,ID_AMBIANCE_TIMER,1000,(TIMERPROC)(AmbianceTimerProc));
  680. }
  681. }
  682. ///////////////////////////////////////////////////////////////////////
  683. //  Name :
  684. //  Destination :
  685. //
  686. //  Parameter :
  687. //
  688. // Return Value:
  689. //  Update :
  690. ///////////////////////////////////////////////////////////////////////
  691. BOOL CMirSound::BGMFadeIn(LONG lMaxVol)
  692. {
  693. if(!m_bRunningTimer)
  694. {
  695. if(m_pMp3->IsPlaying())
  696. {
  697. m_lMp3MaxVol = lMaxVol;
  698. SetTimer(m_hWnd,ID_TIMER_1,100,(TIMERPROC)(FadeInTimerProc));
  699. m_bRunningTimer = TRUE;
  700. return TRUE;
  701. }
  702. }
  703. return FALSE;
  704. }
  705. ///////////////////////////////////////////////////////////////////////
  706. //  Name :
  707. //  Destination :
  708. //
  709. //  Parameter :
  710. //
  711. // Return Value:
  712. //  Update :
  713. ///////////////////////////////////////////////////////////////////////
  714. BOOL CMirSound::BGMFadeOut(LONG lTime,LONG lMinVol)
  715. {
  716. if(!m_bRunningTimer)
  717. {
  718. if(m_pMp3->IsPlaying())
  719. {
  720. lTime = (lTime*2)/100;
  721. m_lMp3MaxVol = lMinVol;
  722. SetTimer(m_hWnd,ID_TIMER_1,lTime,(TIMERPROC)(FadeOutTimerProc));
  723. m_bRunningTimer = TRUE;
  724. return TRUE;
  725. }
  726. }
  727. return FALSE;
  728. }
  729. ///////////////////////////////////////////////////////////////////////
  730. //  Name :
  731. //  Destination :
  732. //
  733. //  Parameter :
  734. //
  735. // Return Value:
  736. //  Update :
  737. ///////////////////////////////////////////////////////////////////////
  738. HRESULT CMirSound::MessageProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  739. {
  740. switch (message) 
  741. {
  742. case WM_DSHOW_NOTIFY:
  743. {
  744. m_pMp3->MessageProcess();
  745. break;
  746. }
  747. }
  748. return 0l;
  749. }
  750. ///////////////////////////////////////////////////////////////////////
  751. //  Name :
  752. //  Destination :
  753. //
  754. //  Parameter :
  755. //
  756. // Return Value:
  757. //  Update :
  758. ///////////////////////////////////////////////////////////////////////
  759. VOID CMirSound::EndFading(INT nState)
  760. {
  761. if(nState==0)
  762. {
  763. // End of Fade in
  764. KillTimer(g_xMainWnd.GetSafehWnd(),ID_TIMER_1);
  765. //
  766. }
  767. else
  768. {
  769. // End of Fade out
  770. if(m_lMp3MaxVol<=(-5000)) m_pMp3->OnStop();
  771. KillTimer(g_xMainWnd.GetSafehWnd(),ID_TIMER_1);
  772. //
  773. }
  774. m_bRunningTimer = FALSE;
  775. }
  776. ///////////////////////////////////////////////////////////////////////
  777. //  Name :
  778. //  Destination :
  779. //
  780. //  Parameter :
  781. //
  782. // Return Value:
  783. //  Update :
  784. ///////////////////////////////////////////////////////////////////////
  785. VOID CMirSound::SetInWarMode(VOID)
  786. {
  787. if(!m_bIsWarMode)
  788. {
  789. m_lMp3MaxVol =(-2000);
  790. BGMFadeOut(m_lMp3MaxVol);
  791. m_bIsWarMode = TRUE;
  792. }
  793. }
  794. ///////////////////////////////////////////////////////////////////////
  795. //  Name :
  796. //  Destination :
  797. //
  798. //  Parameter :
  799. //
  800. // Return Value:
  801. //  Update :
  802. ///////////////////////////////////////////////////////////////////////
  803. VOID CMirSound::SetInPeaceMode(VOID)
  804. {
  805. if(m_bIsWarMode)
  806. {
  807. m_lMp3MaxVol =(0);
  808. BGMFadeIn(m_lMp3MaxVol);
  809. m_bIsWarMode = FALSE;
  810. }
  811. }
  812. ///////////////////////////////////////////////////////////////////////
  813. //  Name :
  814. //  Destination :
  815. //
  816. //  Parameter :
  817. //
  818. // Return Value:
  819. //  Update :
  820. ///////////////////////////////////////////////////////////////////////
  821. // MAX = 100 Min = 1
  822. BOOL CMirSound::SetMasterVol(INT nVolume)
  823. {
  824. if(nVolume>=1 && nVolume<=100)
  825. {
  826. m_lWavMaxVol = (nVolume-101)*(50); // 100 -> -50    0 -> -5000
  827. m_lMp3MaxVol = (m_lWavMaxVol-1)*(10); // Wav volume狼 -10db
  828. return TRUE;
  829. }
  830. return FALSE;
  831. }
  832. ///////////////////////////////////////////////////////////////////////
  833. //  Name :
  834. //  Destination :
  835. //
  836. //  Parameter :
  837. //
  838. // Return Value:
  839. //  Update :
  840. ///////////////////////////////////////////////////////////////////////
  841. // MAX = 100 Min = 1
  842. BOOL CMirSound::SetBGMVol(INT nVolume)
  843. {
  844. if(nVolume>=0 && nVolume<=100)
  845. {
  846. m_lMp3MaxVol = (m_lWavMaxVol-1)*(10)*(nVolume+1); // Wav volume狼 -10dB狼 割%?
  847. return TRUE;
  848. }
  849. return FALSE;
  850. }
  851. ///////////////////////////////////////////////////////////////////////
  852. //  Name :
  853. //  Destination :
  854. //
  855. //  Parameter :
  856. //
  857. // Return Value:
  858. //  Update :
  859. ///////////////////////////////////////////////////////////////////////
  860. BOOL CMirSound::SetWavVol(INT nVolume)
  861. {
  862. return SetMasterVol(nVolume);
  863. }
  864. ///////////////////////////////////////////////////////////////////////
  865. //  Name :
  866. //  Destination :
  867. //
  868. //  Parameter :
  869. //
  870. // Return Value:
  871. //  Update :
  872. ///////////////////////////////////////////////////////////////////////
  873. void CALLBACK FadeInTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
  874. {
  875. LONG lVolume;
  876. lVolume = g_xSound.m_pMp3->GetVolume();
  877. // if End of Fade-out SendMessage to Window WM_USER_ENDTIMER
  878. if(lVolume>=(g_xSound.m_lMp3MaxVol))
  879. SendMessage(g_xMainWnd.GetSafehWnd(),WM_USER_ENDTIMER,(WPARAM)0,NULL);
  880. lVolume = lVolume + 100;
  881. g_xSound.m_pMp3->SetVolume(lVolume);
  882. }
  883. ///////////////////////////////////////////////////////////////////////
  884. //  Name :
  885. //  Destination :
  886. //
  887. //  Parameter :
  888. //
  889. // Return Value:
  890. //  Update :
  891. ///////////////////////////////////////////////////////////////////////
  892. void CALLBACK FadeOutTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )
  893. {
  894. LONG lVolume;
  895. lVolume = g_xSound.m_pMp3->GetVolume();
  896. // if End of Fade-out SendMessage to Window WM_USER_ENDTIMER
  897. if(lVolume<(g_xSound.m_lMp3MaxVol))
  898. SendMessage(g_xMainWnd.GetSafehWnd(),WM_USER_ENDTIMER,(WPARAM)1,NULL);
  899. lVolume = lVolume - 100;
  900. g_xSound.m_pMp3->SetVolume(lVolume);
  901. }
  902. ///////////////////////////////////////////////////////////////////////
  903. //  Name :
  904. //  Destination :
  905. //
  906. //  Parameter :
  907. //
  908. // Return Value:
  909. //  Update :
  910. ///////////////////////////////////////////////////////////////////////
  911. void CALLBACK AmbianceTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )
  912. {
  913. static INT nCount = 11;
  914. static INT nReply = 0;
  915. INT nNum;
  916. INT Fact_1,Fact_2;
  917. Fact_1 = (rand())%10+1;
  918. Fact_2 = (rand())%10+1;
  919. nCount++;
  920. if((Fact_1+Fact_2)<=6)  // 15%捞惑狼 犬伏肺 Play   1~15% = 15%
  921. nNum = 1;
  922. else
  923. if((Fact_1+Fact_2)<=8)  // 28%捞惑狼 犬伏肺 Play  16~28% = 12%
  924. nNum = 2;
  925. else
  926. if((Fact_1+Fact_2)<=10)  // 45%捞惑狼 犬伏肺 Play   27~45%  = 18%
  927. nNum = 3;
  928. else
  929. if((Fact_1+Fact_2)<=11)  // 55%捞惑狼 犬伏肺 Play   46~55% = 10%
  930. nNum = 4;
  931. else
  932. if((Fact_1+Fact_2)<=13)  // 72%捞惑狼 犬伏肺 Play  56~72% = 16%
  933. nNum = 5;
  934. else
  935. if((Fact_1+Fact_2)<=16)  // 90%捞惑狼 犬伏肺 Play 72~90 = 18%
  936. nNum = 7;
  937. else
  938. nNum = 8;  // 10%
  939. if(nCount>=13)
  940. {
  941. nNum = 0;
  942. nCount = 0;
  943. nReply++;
  944. }
  945. if(nNum >= 0 && nNum <= 8)
  946. {
  947. g_xSound.PlayAmbianceWav(nNum); // 盔贰
  948. }
  949. if(nReply>=g_xSound.m_nAmbianceCount)
  950. {
  951. nReply = 0;
  952. g_xSound.SetDisableAmbiance();
  953. return;
  954. }
  955. }
  956. BOOL CMirSound::ChgPlayingSet(INT nWavIdx,INT nBufferIdx,INT Sx,INT Sy,INT Dx,INT Dy)
  957. {
  958. POINT Mon,Chr;
  959. INT Dis;
  960. INT Dir;
  961. CSBuffer* pBuffer;
  962. MAKEPOS(Mon,Sx,Sy);
  963. MAKEPOS(Chr,Dx,Sy);
  964. pBuffer= FindBuffer(nWavIdx,FALSE);
  965. if(pBuffer!=NULL)
  966. {
  967. Dis = CalsDistance(Mon,Chr);
  968. Dir = CalsDirection(Mon,Chr);
  969. pBuffer->Pause(nBufferIdx);
  970. pBuffer->SetPan(nBufferIdx,CalsPan(Dir,Dis));
  971. pBuffer->SetVolume(nBufferIdx,CalsVolume(Dis));
  972. pBuffer->Continue(nBufferIdx);
  973. return TRUE;
  974. }
  975. else
  976. {
  977. return FALSE;
  978. }
  979. }