MirGame.cpp
上传用户:marco7834
上传日期:2010-02-24
资源大小:82k
文件大小:24k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // MirGame.cpp: implementation of the CMirGame class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include <windowsx.h>
  6. #include "MirGame.h"
  7. #include "mircode.h"
  8. #include "mirmsg.h"
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. #define BUFFERLENGTH 4096
  13. FILE * g_fpLog, *g_fpGetLog, * g_fpPutLog;
  14. void LogFile( char * pp )
  15. {
  16. DWORD dwTime = GetTickCount();
  17. // fprintf( g_fpLog, "Log at %d: %sn", dwTime, pp );
  18. }
  19. typedef struct
  20. {
  21. DWORD dwGold;
  22. WORD wCmd;
  23. BYTE bProf;
  24. BYTE bHair;
  25. BYTE bSex;
  26. BYTE bOO;
  27. WORD wUnknow;
  28. BYTE bLevel;
  29. BYTE bunknow;
  30. BYTE ACHi;
  31. BYTE ACLow;
  32. BYTE MACHi;
  33. BYTE MACLow;
  34. BYTE DCHi;
  35. BYTE DCLow;
  36. BYTE MCHi;
  37. BYTE MCLow;
  38. BYTE SCHi;
  39. BYTE SCLow;
  40. WORD Hp;
  41. WORD Mp;
  42. WORD MaxHp;
  43. WORD MaxMp;
  44. DWORD dwUnknow;
  45. DWORD Exp;
  46. DWORD MaxExp;
  47. WORD BagWeight;
  48. WORD MaxBagWeight;
  49. BYTE BodyWeight;
  50. BYTE MaxBodyWeight;
  51. BYTE HandWeight;
  52. BYTE MaxHandWeight;
  53. }MMSGSETCHARINFO;
  54. DWORD MessageProc( PVOID * p )
  55. {
  56. CMirGame * pGame = (CMirGame*)p;
  57. int ierr = 0;
  58. int i = 0;
  59. int leftlen = 0;
  60. char * pSearchString = NULL;
  61. char * m_tmpBuffer;
  62. char * m_tmpBuffer2;
  63. if( pGame == 0 )
  64. {
  65. return 0;
  66. }
  67. m_tmpBuffer = new char[BUFFERLENGTH + 5];
  68. memset( (void*)m_tmpBuffer, 0, BUFFERLENGTH + 5 );
  69. m_tmpBuffer2 = new char[BUFFERLENGTH + 5];
  70. memset( (void*)m_tmpBuffer2, 0, BUFFERLENGTH + 5 );
  71. leftlen = 0;
  72. pGame->LogSystem( "进入接收消息进程!" );
  73. while( pGame->m_bInGame )
  74. {
  75. Sleep( 1 );
  76. ierr = recv( pGame->m_sGame, m_tmpBuffer, BUFFERLENGTH, 0 );
  77. if( ierr == 0 )
  78. {
  79. pGame->Logout();
  80. break;
  81. }
  82. if( ierr != -1 )
  83. {
  84. for( i = 0;i < ierr;i ++ )
  85. {
  86. if( m_tmpBuffer[i] != '*' )
  87. {
  88. m_tmpBuffer2[leftlen++] = m_tmpBuffer[i];
  89. }
  90. else
  91. {
  92. pGame->m_MirMsg.SendString( pGame->m_sGame, "*" );
  93. }
  94. if( m_tmpBuffer[i] == '!' )
  95. {
  96. m_tmpBuffer2[leftlen] = '';
  97. pGame->m_MsgQueue.PutMsg( m_tmpBuffer2 );
  98. leftlen = 0;
  99. }
  100. }
  101. }
  102. }
  103. pGame->LogSystem( "消息线程退出!" );
  104. delete []m_tmpBuffer;
  105. delete []m_tmpBuffer2;
  106. return 0;
  107. }
  108. CMirGame::CMirGame()
  109. {
  110. m_MirSocket.NetStartup();
  111. m_LeftHours = 0;
  112. m_dwGameState = 0;
  113. m_tmpBuffer = new char[BUFFERLENGTH];
  114. m_tmpBuffer2= new char[BUFFERLENGTH];
  115. m_MsgLeftBuf= new char[BUFFERLENGTH * 2];
  116. memset( (void*)m_MsgLeftBuf, 0, BUFFERLENGTH * 2);
  117. memset( &m_LastAction, 0, sizeof( ACTION_LAST ));
  118. m_MiniMap.InitMiniMap( "DATA\mmap.wix", "DATA\mmap.wil" );
  119. m_bInGame = FALSE;
  120. }
  121. CMirGame::~CMirGame()
  122. {
  123. }
  124. BOOL CMirGame::OpenGateServer(char *ip)
  125. {
  126. char tmpBuffer[256];
  127. char tmpBuffer2[256];
  128. int erri = 0;
  129. m_sGate = m_MirSocket.OpenConnection( ip, 7000 );
  130. LogSystem( "连接账号验证服务器..." );
  131. if( m_sGate == 0 )
  132. {
  133. LogSystem( "连接账号验证服务器出错!" );
  134. return 0;
  135. }
  136. m_dwGameState = MGS_GATECONNECTED;
  137. LogSystem( "服务器连接成功!" );
  138. erri = send( m_sGate, MIRVERSION, strlen( MIRVERSION), 0 );
  139. if( erri == -1 )
  140. {
  141. LogSystem( "发生错误,停止连接!n" );
  142. goto err;
  143. }
  144. m_dwGameState = MGS_WAITINGCHECKINFO;
  145. erri = recv( m_sGate, m_tmpBuffer, BUFFERLENGTH, 0 );
  146. if( erri == -1 )
  147. {
  148. goto err;
  149. }
  150. else
  151. {
  152. m_dwGameState = MGS_MAKECLIENTINFO;
  153. LogSystem("验证客户端合法性..." );
  154. m_tmpBuffer[erri-1] = '';
  155. UnGateCode( &m_tmpBuffer[1], tmpBuffer );
  156. strcat( tmpBuffer, "/" );
  157. CodeGateCode( tmpBuffer, tmpBuffer2 );
  158. sprintf( tmpBuffer, "<%s>", tmpBuffer2 );
  159. }
  160. erri = send( m_sGate, tmpBuffer, strlen( tmpBuffer), 0 );
  161. if( erri == -1 )
  162. {
  163. LogSystem( "发送验证信息 %s 出错", tmpBuffer );
  164. goto err;
  165. }
  166. m_dwGameState = MGS_WAITINGCHECKPASS;
  167. erri = recv( m_sGate, m_tmpBuffer, BUFFERLENGTH, 0 );
  168. if( erri == -1 )
  169. {
  170. LogSystem( "接受验证结果出错!" );
  171. goto err;
  172. }
  173. else
  174. m_tmpBuffer[erri]  = '';
  175. if( stricmp( m_tmpBuffer, "<pass>" ) == 0)
  176. {
  177. LogSystem( "客户端验证通过!" );
  178. m_dwGameState = MGS_CLIENTCHECKPASSED;
  179. return TRUE;
  180. }
  181. err:
  182. m_dwGameState = 0;
  183. CloseGateServer();
  184. return FALSE;
  185. }
  186. BOOL CMirGame::Login(char *username, char *password)
  187. {
  188. MMSG msg;
  189. int erri;
  190. memset( &msg, 0, sizeof( MMSG ));
  191. // int msize;
  192. if( strlen( username ) == 0 || strlen( password ) <= 3 )
  193. goto err;
  194. if( m_dwGameState != MGS_CLIENTCHECKPASSED )
  195. goto err;
  196. getpasswordret:
  197. msg.wCmd = 0x7d1;
  198. sprintf( msg.data, "%s/%s", username, password );
  199. // msize = MSGHEADERSIZE + strlen( msg.data );
  200. // LogSystem( msg.data );
  201. erri =  m_MirMsg.SendGateMsg( m_sGate, &msg );
  202. if( erri == -1 )
  203. {
  204. LogSystem( "发送用户名和密码时出错!" );
  205. goto err;
  206. }
  207. LogSystem( "发送密码成功~" );
  208. m_dwGameState = MGS_LOGINWAITING;
  209. LogSystem( "等待接收验证结果~" );
  210. erri = m_MirMsg.RecvGateMsg( m_sGate, &msg );
  211. if( erri == -1 )
  212. {
  213. LogSystem( "接收验证结果处错!" );
  214. goto err;
  215. }
  216. LogSystem( "收到验证结果~" );
  217. if( msg.wCmd == 0x7d1 )
  218. goto getpasswordret;
  219. if( msg.wCmd == 0x211  )
  220. {
  221. LogSystem( "验证通过!" );
  222. if( msg.wb > 0 )
  223. {
  224. LogSystem( "你的账户还有 %d 小时.", msg.wb );
  225. }
  226. m_dwGameState = MGS_SELECTSERVER;
  227. strcpy( m_Account, username );
  228. return TRUE;
  229. }
  230. else
  231. {
  232. if( msg.wCmd == 0x1f7 )
  233. {
  234. if( msg.dwFlag == 0xffffffff )
  235. {
  236. LogSystem( "密码错误!" );
  237. }
  238. if( msg.dwFlag == 0 )
  239. {
  240. LogSystem( "此用户不存在!" );
  241. }
  242. if( msg.dwFlag == 0xfffffffe )
  243. {
  244. LogSystem( "三次密码错误,服务器拒绝!" );
  245. }
  246. if( msg.dwFlag == 0xfffffffd )
  247. {
  248. LogSystem( "该用户正在使用中,可能被踢出服务器。" );
  249. }
  250. }
  251. else
  252. {
  253. LogSystem( "未知错误,错误代号 0x%x, 0x%x", msg.dwFlag, msg.wCmd );
  254. }
  255. }
  256. err:
  257. m_dwGameState = 0;
  258. CloseGateServer();
  259. return FALSE;
  260. }
  261. BOOL CMirGame::EnterServer(char *ServerName)
  262. {
  263. MMSG msg;
  264. int erri;
  265. memset( &msg, 0, sizeof( MMSG ));
  266. msg.wCmd = 0x68;
  267. strcpy( msg.data, ServerName );
  268. erri = m_MirMsg.SendGateMsg( m_sGate, &msg );
  269. if( erri == -1 )
  270. {
  271. LogSystem( "发送服务器名字出错!" );
  272. goto err;
  273. }
  274. m_dwGameState = MGS_WAITFORSELCHARADDRESS;
  275. erri = m_MirMsg.RecvGateMsg( m_sGate, &msg );
  276. if( erri == -1 )
  277. {
  278. LogSystem( "接收结果时出错!" );
  279. goto err;
  280. }
  281. if( msg.wCmd != 0x212 )
  282. {
  283. LogSystem( "未得到服务器地址!" );
  284. goto err;
  285. }
  286. LogSystem( "得到服务器地址:%s", msg.data );
  287. m_dwGameState = MGS_GOTSELCHARADDRESS;
  288. GetString( msg.data );
  289. //printf( "%s %s %sn", g_StringList[0], g_StringList[1], g_StringList[2] );
  290. strcpy( m_SelCharIp, m_StringList[0] );
  291. m_SelCharPort = atoi( m_StringList[1] );
  292. strcpy( m_SID, m_StringList[2] );
  293. CloseGateServer();
  294. return TRUE;
  295. err:
  296. m_dwGameState = 0;
  297. CloseGateServer();
  298. return FALSE;
  299. }
  300. BOOL CMirGame::GetSelCharInfo(SELCHARINFO *pInfo)
  301. {
  302. return FALSE;
  303. }
  304. BOOL CMirGame::SelectChar(char *charname)
  305. {
  306. LogSystem( "使用角色[%s]登陆服务器。", charname );
  307. MMSG msg;
  308. int erri;
  309. memset( &msg, 0, sizeof( MMSG ));
  310. msg.wCmd = 0x67;
  311. sprintf( msg.data, "%s/%s", m_Account, charname );
  312. erri = m_MirMsg.SendMsg( m_sSelChar, &msg );
  313. if( erri == -1 )
  314. {
  315. LogSystem( "发送选人请求时出错!" );
  316. goto err;
  317. }
  318. erri = m_MirMsg.RecvMsg( m_sSelChar, &msg );
  319. if( erri == -1 )
  320. {
  321. LogSystem( "接收选人结果时出错!" );
  322. goto err;
  323. }
  324. if( msg.wCmd != 0x20d )
  325. {
  326. LogSystem( "选人未被服务器接受!" );
  327. goto err;
  328. }
  329. LogSystem( "服务器接受所选角色信息!" );
  330. LogSystem( "正在准备登陆到游戏服务器!" );
  331. //printf( "%sn", msg.data );
  332. GetString( msg.data );
  333. LogSystem( "服务器地址: %s 端口: %sn", m_StringList[0], m_StringList[1] );
  334. return TRUE;
  335. err:
  336. return FALSE;
  337. }
  338. int xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
  339. int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
  340. void CMirGame::Walk(int dir)
  341. {
  342. MMSG msg;
  343. int erri;
  344. int tx,ty;
  345. if( !CanDoAction())
  346. return;
  347. if( dir <0 || dir > 7 )
  348. return;
  349. tx = m_CharSelf.pos_x  + (xofs_walk[dir]);
  350. ty = m_CharSelf.pos_y  + (yofs_walk[dir]);
  351. if( !m_GameMap.TestMap( tx, ty ))
  352. {
  353. LogChat( "前方无法通过!" );
  354. return;
  355. }
  356. memset( &msg, 0, sizeof( MMSG ));
  357. msg.wa = tx;//g_pos_x;
  358. msg.wb = ty;//g_pos_y;
  359. msg.wCmd = 0xbc3;
  360. msg.w2 = dir;
  361. erri = m_MirMsg.SendMsg( m_sGame, &msg );
  362. if( erri == -1 )
  363. return;
  364. m_LastAction.action = ACTION_WALK;
  365. m_LastAction.x = tx;
  366. m_LastAction.y = ty;
  367. m_LastAction.dir = dir;
  368. return ;
  369. }
  370. void CMirGame::LogToList( HWND hList, char * line )
  371. {
  372. int cnt = 0;
  373. cnt = ListBox_GetCount( hList );
  374. if( cnt >= m_MaxLogLine )
  375. {
  376. ListBox_DeleteString( hList, 0 );
  377. cnt --;
  378. }
  379. ListBox_AddString( hList, line );
  380. ListBox_SetCurSel( hList, cnt );
  381. }
  382. void CMirGame::LogChat( char * line,... )
  383. {
  384. char szBuff[2048];
  385. va_list vl;
  386. va_start( vl, line );
  387. vsprintf( szBuff, line, vl );
  388. va_end( vl);
  389. LogToList( m_hChatLog, szBuff );
  390. }
  391. void CMirGame::LogSystem( char * line,... )
  392. {
  393. char szBuff[2048];
  394. va_list vl;
  395. va_start( vl, line );
  396. vsprintf( szBuff, line, vl );
  397. va_end( vl);
  398. LogToList( m_hSysLog, szBuff );
  399. }
  400. BOOL CMirGame::InitLogSystem(HWND hSysLog, HWND hChatLog, int MaxLine)
  401. {
  402. m_hSysLog = hSysLog;
  403. m_hChatLog = hChatLog;
  404. m_MaxLogLine = MaxLine;
  405. return TRUE;
  406. }
  407. BOOL CMirGame::CloseGateServer()
  408. {
  409. LogSystem( "断开密码验证服务器!" );
  410. closesocket(m_sGate);
  411. // m_MirSocket.NetCleanup();
  412. return TRUE;
  413. }
  414. int CMirGame::GetString( char * string )
  415. {
  416. int ilen = strlen( string );
  417. int i = 0;
  418. int cnt = 0;
  419. int sptr = 0;
  420. for( i =0;i < ilen;i ++ )
  421. {
  422. if( string[i] == '/' && i != 0 )
  423. {
  424. m_StringList[cnt][sptr] = '';
  425. sptr = 0;
  426. cnt++;
  427. }
  428. else
  429. {
  430. m_StringList[cnt][sptr] = string[i];
  431. sptr ++;
  432. }
  433. }
  434. if( sptr > 0 )
  435. {
  436. m_StringList[cnt][sptr] = '';
  437. cnt++;
  438. }
  439. return cnt;
  440. }
  441. BOOL CMirGame::EnterSelCharServer()
  442. {
  443. MMSG msg;
  444. int i = 0;
  445. memset( &msg, 0, sizeof( MMSG ));
  446. int erri = 0;
  447. if( m_dwGameState != MGS_GOTSELCHARADDRESS )
  448. return 0;
  449. LogSystem( "连接角色服务器 %s:%d ...", m_SelCharIp, m_SelCharPort );
  450. m_sSelChar = m_MirSocket.OpenConnection( m_SelCharIp, m_SelCharPort );
  451. if( m_sSelChar== 0 )
  452. {
  453. LogSystem( "连接角色服务器出错!" );
  454. m_dwGameState = 0;
  455. CloseGateServer();
  456. return FALSE;
  457. }
  458. m_dwGameState = MGS_SELCHARCONNECTED;
  459. LogSystem( "验证用户SIDn" );
  460. msg.wCmd = 0x64;
  461. sprintf( msg.data, "%s/%s", m_Account, m_SID );
  462. erri = m_MirMsg.SendMsg( m_sSelChar, &msg );
  463. if( erri == -1 )
  464. {
  465. LogSystem( "发送验证信息时出错!" );
  466. goto err;
  467. }
  468. erri = m_MirMsg.RecvMsg( m_sSelChar, &msg );
  469. if( erri == -1 )
  470. {
  471. LogSystem( "接收验证结果时出错!" );
  472. goto err;
  473. }
  474. if( msg.wCmd != 0x208 )
  475. {
  476. LogSystem( "未得到角色列表!" );
  477. goto err;
  478. }
  479. erri = GetString( msg.data);
  480. LogSystem( "发现 %d 个角色", msg.wa & 0xff );
  481. m_SelCharInfo.CharCount = msg.wa & 0xff;
  482. for( i = 0;i < m_SelCharInfo.CharCount;i ++ )
  483. {
  484. if( m_StringList[5 * i][0] == '*' )
  485. {
  486. strcpy( m_SelCharInfo.Chars[i].Name, &m_StringList[5 * i][1] );
  487. m_SelCharInfo.ActiveChar = i;
  488. LogSystem( "上次使用角色 %s", &m_StringList[5 * i][1] );
  489. }
  490. else
  491. strcpy( m_SelCharInfo.Chars[i].Name, m_StringList[5 * i] );
  492. m_SelCharInfo.Chars[i].hair = atoi( m_StringList[5 * i + 1] );
  493. m_SelCharInfo.Chars[i].prof = atoi( m_StringList[5 * i + 2] );
  494. m_SelCharInfo.Chars[i].level = atoi( m_StringList[5 * i + 3] );
  495. m_SelCharInfo.Chars[i].sex = atoi( m_StringList[5 * i + 4] );
  496. LogSystem( "%d [%s] 等级[%s]", i, m_SelCharInfo.Chars[i].Name, m_StringList[5 * i + 3] );
  497. }
  498. return TRUE;
  499. err:
  500. return FALSE;
  501. }
  502. BOOL CMirGame::CloseAll()
  503. {
  504. return TRUE;
  505. }
  506. BOOL CMirGame::EnterGame(int CharIndex)
  507. {
  508. MMSG msg;
  509. int erri;
  510. char * CharName = 0;
  511. g_fpLog = fopen( "d:\msglog.txt", "w" );
  512. g_fpGetLog = fopen( "d:\msggetlog.txt", "w" );
  513. g_fpPutLog = fopen( "d:\msgputlog.txt", "w" );
  514. memset( &msg, 0, sizeof( MMSG ));
  515. if( m_SelCharInfo.CharCount  == 0 )
  516. {
  517. LogSystem( "没有角色,无法进入游戏!" );
  518. return FALSE;
  519. }
  520. if( CharIndex < 0 || CharIndex >= m_SelCharInfo.CharCount )
  521. {
  522. LogSystem( "所选择地角色不存在!" );
  523. return FALSE;
  524. }
  525. CharName = m_SelCharInfo.Chars[CharIndex].Name;
  526. LogSystem( "使用角色[%s]登陆服务器。", CharName );
  527. msg.wCmd = 0x67;
  528. sprintf( msg.data, "%s/%s", m_Account, CharName );
  529. erri = m_MirMsg.SendMsg( m_sSelChar, &msg );
  530. if( erri == -1 )
  531. {
  532. LogSystem( "发送选人请求时出错!" );
  533. goto err;
  534. }
  535. erri = m_MirMsg.RecvMsg( m_sSelChar, &msg );
  536. if( erri == -1 )
  537. {
  538. LogSystem( "接收选人结果时出错!" );
  539. goto err;
  540. }
  541. if( msg.wCmd != 0x20d )
  542. {
  543. LogSystem( "选人未被服务器接受!" );
  544. LogSystem( "得到消息是: 0x%x  [%s]", msg.wCmd,msg.data );
  545. goto err;
  546. }
  547. LogSystem( "服务器接受所选角色信息!" );
  548. LogSystem( "正在准备登陆到游戏服务器!" );
  549. //printf( "%sn", msg.data );
  550. GetString( msg.data );
  551. LogSystem( "服务器地址: %s 端口: %s", m_StringList[0], m_StringList[1] );
  552. CloseSelCharServer();
  553. LogSystem( "正在进入游戏服务器,请稍候..." );
  554. m_sGame = m_MirSocket.OpenConnection( m_StringList[0], atoi( m_StringList[1] ));
  555. if( m_sGame == 0 )
  556. {
  557. LogSystem( "连接游戏服务器出错!");
  558. goto err;
  559. }
  560. sprintf( m_tmpBuffer, "**%s/%s/%s/20020522/0", m_Account, CharName, m_SID );
  561. CodeGameCode( (BYTE*)m_tmpBuffer, strlen( m_tmpBuffer ), (BYTE*)m_tmpBuffer2 );
  562. sprintf( m_tmpBuffer, "#%c%s!", m_MirMsg.GetMsgFlag(), m_tmpBuffer2 );
  563. LogSystem( "验证用户合法性..." );
  564. erri = m_MirMsg.SendString( m_sGame, m_tmpBuffer );
  565. if( erri == -1 )
  566. {
  567. LogSystem( "发送用户验证信息出错!" );
  568. m_MirSocket.CloseConnection( m_sGame );
  569. goto err;
  570. }
  571. return StartGame();
  572. err:
  573. CloseSelCharServer();
  574. return FALSE;
  575. }
  576. #define CLEARMSG(a) memset( &##a, 0, sizeof( MMSG ))
  577. BOOL CMirGame::StartGame()
  578. {
  579. int i2 = 10;
  580. MMSG msg;
  581. char pTxt[256];
  582. MMSGSETCHARINFO * pmsginfo;
  583. DWORD dwTime,pid;
  584. BOOL bInWorld = FALSE;
  585. int ilen = 0;
  586. if( !m_MirSocket.SetNoBlock( m_sGame ))
  587. {
  588. goto err;
  589. }
  590. m_bInGame = TRUE;
  591. CreateThread( NULL, 1024 * 1024 * 1, (LPTHREAD_START_ROUTINE)MessageProc, (LPVOID)this, 0, &pid );
  592. dwTime = GetTickCount();
  593. memset( &m_LastAction, 0, sizeof( m_LastAction ));
  594. while( m_bInGame ) 
  595. {
  596. Sleep( 1 );
  597. if( GetTickCount() - dwTime >= 800 && bInWorld)
  598. {
  599. RunThrough( dwTime & 7 );
  600. dwTime = GetTickCount();
  601. LogChat( "do action!" );
  602. }
  603. if((ilen = GetMsg( &msg )) != 0)
  604. {
  605. // Sleep( 1 );
  606. switch( msg.wCmd )
  607. {
  608. case 0x292:
  609. CLEARMSG( msg );
  610. msg.wCmd = 0x3fa;
  611. if( m_MirMsg.SendMsg( m_sGame, &msg ) == -1 )
  612. {
  613. goto err;
  614. }
  615. LogSystem( "进入游戏世界..." );
  616. break;
  617. case 0x33:
  618. m_CharSelf.pos_x = msg.w1;
  619. m_CharSelf.pos_y = msg.w2;
  620. LogChat( "出现在地图 %d, %d 处", msg.w1,msg.w2 );
  621. SetCharacterPos( msg.w1, msg.w2 );
  622. m_CharSelf.dwServerId = msg.dwFlag;
  623. m_GameMap.SetGameMap( msg.data, msg.w1, msg.w2 );
  624. break;
  625. case 0x22:
  626. if( msg.dwFlag == m_CharSelf.dwServerId )
  627. {
  628. LogChat( "你被杀死了!" );
  629. }
  630. else
  631. {
  632. LogChat( "ServerId = %d 被人杀死了!" );
  633. }
  634. break;
  635. case 0x1f:
  636. if( msg.dwFlag == m_CharSelf.dwServerId )
  637. {
  638. LogChat( "你被别人攻击 减少 %d 的生命,剩下 %d 的生命,总共 %d 的生命.", msg.w3, msg.w1, msg.w2 );
  639. }
  640. else
  641. {
  642. LogChat( "Serverid = %d 被别人攻击 减少 %d 的生命,剩下 %d 的生命,总共 %d 的生命.", msg.dwFlag, msg.w3, msg.w1, msg.w2  );
  643. }
  644. break;
  645. case 0x34:
  646. pmsginfo = (MMSGSETCHARINFO*)&msg;
  647. LogChat( "Level:%u Gold:%u AC:%u-%u MAC:%u-%u DC:%u-%u MC:%u-%u SC:%u-%u",pmsginfo->bLevel,
  648. pmsginfo->dwGold, pmsginfo->ACHi, pmsginfo->ACLow, pmsginfo->MACHi, pmsginfo->MACLow,
  649. pmsginfo->DCHi,pmsginfo->DCLow, pmsginfo->MCHi, pmsginfo->MCLow , pmsginfo->SCHi, pmsginfo->SCLow );
  650. break;
  651. case 0x36:
  652. LogChat( "地图名字是 %s.", msg.data );
  653. i2 = 0;
  654. CLEARMSG(msg);
  655. msg.wCmd = 0x409;
  656. if( m_MirMsg.SendMsg( m_sGame, &msg ) == -1 )
  657. {
  658. goto err;
  659. }
  660. bInWorld = TRUE;
  661. break;
  662. case 0x2c6:
  663. m_MiniMap.SetMMap( msg.w1 );
  664. break;
  665. case 0x64:
  666. LogChat( "系统信息: %s", msg.data );
  667. break;
  668. case 0x67:
  669. HandleCommand( msg.data );
  670. LogChat( msg.data );
  671. break;
  672. case 0x0a:
  673. if( msg.data[8] != (char)0 )
  674. {
  675. UnNameCode( &msg.data[8], pTxt );
  676. LogChat( " %s 出现在(%d,%d)处!", pTxt, msg.w1, msg.w2 );
  677. fprintf( g_fpPutLog, "id = 0x%08x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x d1 = 0x%08x d2 = 0x%08x name = %sn",
  678. msg.dwFlag,msg.w1, msg.w2, msg.w3, ((DWORD*)msg.data)[0], ((DWORD*)msg.data)[1], pTxt );
  679. //Say( " %s 出现在(%d,%d)处!", pTxt, msg.w1, msg.w2 );
  680. }
  681. else
  682. {
  683. LogChat( " %d 出现在(%d,%d)处!", msg.dwFlag,  msg.w1, msg.w2 );
  684. fprintf( g_fpPutLog, "id = 0x%08x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x d1 = 0x%08x d2 = 0x%08x n",
  685. msg.dwFlag,msg.w1, msg.w2, msg.w3, ((DWORD*)msg.data)[0], ((DWORD*)msg.data)[1] );
  686. }
  687. break;
  688. case 0x09:
  689. if( msg.dwFlag == m_CharSelf.dwServerId )
  690. {
  691. SetCharacterPos( msg.w1, msg.w2 );
  692. LogChat( "重新设置角色坐标在 %d, %d ...", msg.w1, msg.w2 );
  693. if( m_LastAction.action != 0 )
  694. {
  695. m_LastAction.x = msg.w1;
  696. m_LastAction.y = msg.w2;
  697. }
  698. }
  699. break;
  700. case 0x27a:
  701. if( msg.dwFlag == m_CharSelf.dwServerId )
  702. {
  703. SetCharacterPos( msg.w1, msg.w2 );
  704. LogChat( "切换地图后,重新设置角色坐标在 %d, %d ...", msg.w1, msg.w2 );
  705. if( m_LastAction.action != 0 )
  706. {
  707. m_LastAction.x = msg.w1;
  708. m_LastAction.y = msg.w2;
  709. }
  710. }
  711. break;
  712. case 0x279:
  713. LogChat( "切換地圖!" );
  714. break;
  715. case 0x28:
  716. //LogChat( "Chat" );
  717. case 0x68:
  718. LogChat( "Chat: %s", msg.data );
  719. break;
  720. default:
  721. fprintf( g_fpLog, "UNKNOW MSG: FLAG = 0x%08x wCmd = 0x%04x w1 = 0x%04x w2 = 0x%04x w3 = 0x%04x data = [%s] hex = [", msg.dwFlag, msg.wCmd, msg.w1, msg.w2, msg.w3, msg.data );
  722. for( i2 = 0;i2 < ilen - MSGHEADERSIZE;i2 ++ )
  723. {
  724. fprintf( g_fpLog, "%02x ", msg.data[i2] & 0xff );
  725. }
  726. fprintf( g_fpLog, "]n" );
  727. }
  728. }
  729. }
  730. memset( &msg, 0,sizeof( MMSG ));
  731. msg.wCmd = 0x3f1;
  732. m_MirMsg.SendMsg( m_sGame, &msg );
  733. LogSystem( "断开游戏服务器!" );
  734. m_MirSocket.CloseConnection( m_sGame );
  735. return TRUE;
  736. err:
  737. return FALSE;
  738. }
  739. int CMirGame::GetMsg( MMSG * pMsg )
  740. {
  741. int ilen = 0;
  742. if( m_MsgQueue.GetMsg( m_tmpBuffer ))
  743. {
  744. ilen = strlen( m_tmpBuffer );
  745. //LogFile( m_tmpBuffer );
  746. fprintf( g_fpGetLog, "%sn", m_tmpBuffer );
  747. if( m_tmpBuffer[ilen-1] == '!' )
  748. {
  749. m_tmpBuffer[ilen-1] = '';
  750. }
  751. if( m_tmpBuffer[1] == '+' )
  752. {
  753. m_tmpBuffer[6] = '';
  754. //LogChat( "GetWords %s", m_tmpBuffer );
  755. if( stricmp( m_tmpBuffer, "#+GOOD" ) == 0 )
  756. {
  757. ActionOk();
  758. }
  759. else if( stricmp( m_tmpBuffer, "#+FAIL" ) == 0 )
  760. {
  761. ActionFail();
  762. }
  763. return GetMsg( pMsg );
  764. }
  765. ilen = UnGameCode( &m_tmpBuffer[1], (BYTE*)pMsg );
  766. if( pMsg->wCmd == 0x0a || pMsg->wCmd == 0x26d )
  767. {
  768. UnNameCode( &pMsg->data[8], m_tmpBuffer2 );
  769. // fprintf( g_fpLog, "%s!n", m_tmpBuffer );
  770. // fprintf( g_fpGetLog, "NAME:%sn", m_tmpBuffer2 );
  771. }
  772. return ilen;
  773. }
  774. return 0;
  775. }
  776. void CMirGame::ActionOk()
  777. {
  778. LogChat( "Action Ok!" );
  779. switch( m_LastAction.action )
  780. {
  781. case ACTION_RUN:
  782. //LogFile( "End Run!");
  783. case ACTION_WALK:
  784. SetCharacterPos( m_LastAction.x, m_LastAction.y );
  785. break;
  786. case ACTION_TRUN:
  787. LogChat( "转身OK!" );
  788. break;
  789. }
  790. LogChat( "Pos( %d, %d)", m_CharSelf.pos_x , m_CharSelf.pos_y );
  791. m_LastAction.action = 0;
  792. memset( &m_LastAction, 0, sizeof( m_LastAction ));
  793. }
  794. void CMirGame::ActionFail()
  795. {
  796. //LogFile( "Action Fail!" );
  797. LogChat( "Action Fail!" );
  798. m_LastAction.action = 0;
  799. memset( &m_LastAction, 0, sizeof( m_LastAction ));
  800. }
  801. BOOL CMirGame::CanDoAction()
  802. {
  803. if( m_LastAction.action == 0 )
  804. return 1;
  805. return 0;
  806. }
  807. BOOL CMirGame::Say(char *word,...)
  808. {
  809. MMSG msg;
  810. char szBuff[2048];
  811. va_list vl;
  812. va_start( vl, word );
  813. vsprintf( szBuff, word, vl );
  814. va_end( vl);
  815. memset( &msg, 0, sizeof( MMSG ));
  816. strcpy( msg.data , szBuff );
  817. //sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word );
  818. msg.wCmd = 0xbd6;
  819. int erri;
  820. erri = m_MirMsg.SendMsg( m_sGame, &msg );
  821. return (erri!= -1);
  822. }
  823. BOOL CMirGame::Logout()
  824. {
  825. m_bInGame = FALSE;
  826. return TRUE;
  827. }
  828. BOOL CMirGame::CloseSelCharServer()
  829. {
  830. LogSystem( "断开角色服务器!" );
  831. m_MirSocket.CloseConnection( m_sSelChar );
  832. return TRUE;
  833. }
  834. void CMirGame::HandleCommand(char *command)
  835. {
  836. //command[9] = '';
  837. char cmd[20];
  838. char param[260];
  839. memcpy( (void*)cmd, (void*)command, 8 );
  840. cmd[8] = '';
  841. if( stricmp( cmd, "渴望5222" ) == 0 )
  842. {
  843. LogChat( "发现控制者,处理控制者指令!" );
  844. }
  845. else
  846. {
  847. return;
  848. }
  849. memcpy( (void*)cmd,(void*)&command[11],4 );
  850. cmd[4] = '';
  851. memcpy( (void*)param, (void*)&command[16], 255 );
  852. //param[2] = '';
  853. if( stricmp( cmd, "link" )== 0 )
  854. {
  855. Say( "控制者 渴望5222 已经连接!" );
  856. }else if( stricmp( cmd, "talk" ) == 0 )
  857. {
  858. Say( param );
  859. }else if( stricmp( cmd, "setx" )== 0)
  860. {
  861. m_CharSelf.pos_x = atoi( param );
  862. Say( "设置新X坐标:%d", m_CharSelf.pos_x );
  863. }else if( stricmp( cmd, "sety" )== 0)
  864. {
  865. m_CharSelf.pos_y = atoi( param );
  866. Say( "设置新Y坐标:%d", m_CharSelf.pos_y );
  867. }else if( stricmp( cmd, "walk" ) == 0 )
  868. {
  869. Walk( atoi( param ));
  870. }else if( stricmp( cmd, "frun" ) == 0 )
  871. {
  872. RunThrough( atoi( param ));
  873. }else if( stricmp( cmd, "turn" ) == 0 )
  874. {
  875. Turn( atoi( param ));
  876. }
  877. else
  878. {
  879. Say( &command[11] );
  880. }
  881. LogChat( "控制者命令 %s(%s)", cmd, param );
  882. }
  883. void CMirGame::Run(int dir)
  884. {
  885. MMSG msg;
  886. int erri;
  887. int tx,ty;
  888. if( !CanDoAction())
  889. return;
  890. if( dir <0 || dir > 7 )
  891. return;
  892. //LogFile( "Start Run!" );
  893. LogChat( "Start Run at ( %d, %d )", m_CharSelf.pos_x,m_CharSelf.pos_y );
  894. tx = m_CharSelf.pos_x  + (xofs_walk[dir]*2);
  895. ty = m_CharSelf.pos_y  + (yofs_walk[dir]*2);
  896. if( !m_GameMap.TestMap( tx, ty ) || !m_GameMap.TestMap(m_CharSelf.pos_x  + xofs_walk[dir], m_CharSelf.pos_y  + yofs_walk[dir]))
  897. {
  898. LogChat( "前方无法通过!" );
  899. return;
  900. }
  901. memset( &msg, 0, sizeof( MMSG ));
  902. msg.wa = tx;
  903. msg.wb = ty;
  904. msg.wCmd = 0xbc5;
  905. msg.w2 = dir;
  906. erri = m_MirMsg.SendMsg( m_sGame, &msg );
  907. if( erri == -1 )
  908. return;
  909. m_LastAction.action = ACTION_RUN;
  910. m_LastAction.x = tx;
  911. m_LastAction.y = ty;
  912. m_LastAction.dir = dir;
  913. return ;
  914. }
  915. void CMirGame::Turn(int dir)
  916. {
  917. MMSG msg;
  918. int erri;
  919. int tx,ty;
  920. if( !CanDoAction())
  921. return;
  922. if( dir <0 || dir > 7 )
  923. return;
  924. tx = m_CharSelf.pos_x;
  925. ty = m_CharSelf.pos_y;
  926. memset( &msg, 0, sizeof( MMSG ));
  927. msg.wa = tx;//g_pos_x;
  928. msg.wb = ty;//g_pos_y;
  929. msg.wCmd = 0xbc2;
  930. msg.w2 = dir;
  931. erri = m_MirMsg.SendMsg( m_sGame, &msg );
  932. if( erri == -1 )
  933. return;
  934. m_LastAction.action = ACTION_TRUN;
  935. m_LastAction.x = tx;
  936. m_LastAction.y = ty;
  937. m_LastAction.dir = dir;
  938. return ;
  939. }
  940. void CMirGame::SetCharacterPos(int x, int y)
  941. {
  942. m_CharSelf.pos_x = x;
  943. m_CharSelf.pos_y = y;
  944. m_MiniMap.SetCurPos( x, y);
  945. m_GameMap.SetPersonInfo( x, y, 0 );
  946. }
  947. CMirGameMap * CMirGame::GetGameMap()
  948. {
  949. return &m_GameMap;
  950. }
  951. CMirMiniMap * CMirGame::GetMiniMap()
  952. {
  953. return &m_MiniMap;
  954. }
  955. BOOL CMirGame::RunThrough(int dir)
  956. {
  957. MMSG msg;
  958. int erri;
  959. int tx,ty;
  960. if( !CanDoAction())
  961. return FALSE;
  962. if( dir <0 || dir > 7 )
  963. return FALSE;
  964. tx = m_CharSelf.pos_x;
  965. ty = m_CharSelf.pos_y;
  966. memset( &msg, 0, sizeof( MMSG ));
  967. msg.wa = m_CharSelf.pos_x;//  + (xofs_walk[dir]);//g_pos_x;
  968. msg.wb = m_CharSelf.pos_y;//  + (yofs_walk[dir]);//g_pos_y;
  969. msg.wCmd = 0xbc8;
  970. msg.w2 = dir;
  971. erri = m_MirMsg.SendMsg( m_sGame, &msg );
  972. if( erri == -1 )
  973. return FALSE;
  974. m_LastAction.action = ACTION_RUNTHROUGH+1;
  975. m_LastAction.x = tx;
  976. m_LastAction.y = ty;
  977. m_LastAction.dir = dir;
  978. return TRUE;
  979. }