www.pudn.com > 3D_OnlineGame_Humen.rar > MenuLoadOldPlay.cpp
// MenuLoadOldPlay.cpp: implementation of the CMenuLoadOldPlay class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "XMudClient.h" #include "MenuLoadOldPlay.h" #include "FacePlate.h" #include "3DSound.h" #include "StartGameMenu.h" #include "InitInternet.h" #include "MenuCreateNew.h" #include "InterNetMsg.h" #include "CommunicateMsg.h" #include "MainScreen.h" #include "MapInfo.h" #include "MyMusic.h" #include#include "MyDInput.h" //add header file #include "wgs/WGS.h" //end #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif extern D3DVECTOR pSysSoundPos; extern rmfullglobals myglobs; extern D3DAppInfo* d3dapp; extern LPDIRECT3DRM3 g_lpD3DRM; extern char g_tszPathName[256]; //extern CString g_csSendToServerMsg; extern char g_szReceive[]; extern int g_nGameState; extern g_bInternConnect; extern int g_nReceiveMsgState; extern HANDLE gSendToSvrThread; extern CStartGameMenu m_StartGameMenu; extern CMenuCreateNew m_MenuCreateNew; extern CMainScreen m_MainScreen; extern int nSpareTime; //剩下的時間(單位:秒) extern int nRecTimes; //收到的信息次數 extern void QuitResolution(void); extern char szSendBuf[]; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMenuLoadOldPlay::CMenuLoadOldPlay() { nHaveUsed = 0;//記錄玩家角色個數 bWaittingConnect = FALSE; bShowMsg = FALSE;//是否顯示錯誤信息 bStatGame = FALSE; bCreateNewPlay = FALSE; bBackUp = FALSE; bPlayer0 = FALSE; bPlayer1 = FALSE; bPlayer2 = FALSE; bPlayer3 = FALSE; bPlayer4 = FALSE; bPlayerState0 = FALSE; bPlayerState1 = FALSE; bPlayerState2 = FALSE; bPlayerState3 = FALSE; bPlayerState4 = FALSE; //add data of load play bDeletePlay=FALSE; SetRect(&rcBulletin,452,144,766,313); SetRect(&rcDeletePlayButton,627,498,704,517); SetRect(&rcDeletePlayButtonSource,600,1285,677,1304); messlistBulletin.Initiate(myglobs.hWndMain,18,169/18,&rcBulletin,16,"細明體",0); //end SetRect(&rcStatGameButton,449,498,526,517); SetRect(&rcCreateNewPlayButton,532,498,621,517); SetRect(&rcBackUpButton,710,498,769,517); SetRect(&rcPlayerPos0,452,344,766,363); SetRect(&rcPlayerPos1,452,367,766,386); SetRect(&rcPlayerPos2,452,390,766,409); SetRect(&rcPlayerPos3,452,413,766,432); SetRect(&rcPlayerPos4,452,436,766,455); SetRect(&rcStatGameButtonSource,432,1285,509,1304); SetRect(&rcCreateNewPlayButtonSource,510,1285,599,1304); SetRect(&rcBackUpButtonSource,678,1285,737,1304); SetRect(&rcPlayerPosSource,320,1240,634,1259); SetRect(&rcMainSurfaceSource,0,600,799,1199); } CMenuLoadOldPlay::~CMenuLoadOldPlay() { //add CMenuLoadOldPlay release messlistBulletin.Release(); //end } void CMenuLoadOldPlay::PrepareOldPlay() { CFile file; LPTSTR lpsz; CString buf,strtmp; CString parm; char *ps; CString ns; CStringList strls; int i=0,n=0; char tmpFileName[256]; strcpy(tmpFileName,g_tszPathName); strcat(tmpFileName,"\\player.sav"); if(file.Open(tmpFileName,CFile::modeRead)) { CArchive ar(&file,CArchive::load); while(ar.ReadString(buf)) { n++; if( n > 5 ) { Msg("Read Player.Sav Error"); Free2DSurfaces(); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } int k=0; lpsz = buf.GetBuffer(buf.GetLength()+1); parm=CString("\t"); ps=strtok(lpsz,(const char*)parm); if( ps == NULL ) { Msg("Read Player.Sav Error"); Free2DSurfaces(); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } strls.AddTail(ps); for(;;) { ps=strtok(NULL,(const char*)parm); if(ps==NULL)break; k++; strls.AddTail(ps); } if ( k != 2 ) { Msg("Read Player.Sav Error"); Free2DSurfaces(); QuitDirectMusic(); QuitResolution(); QuitIME(myglobs.hWndMain); exit(1); } strtmp=strls.GetAt(strls.FindIndex(0)); m_CName[i]=strtmp.Mid(1,strtmp.GetLength()-2); strtmp=strls.GetAt(strls.FindIndex(1)); m_EName[i]=strtmp.Mid(1,strtmp.GetLength()-2); strtmp=strls.GetAt(strls.FindIndex(2)); m_Password[i]=strtmp.Mid(1,strtmp.GetLength()-2); i++; strls.RemoveAll(); } ar.Close(); file.Close(); } nHaveUsed = i; } HRESULT CMenuLoadOldPlay::Draw2DSetup() { bltObject(0,0,myglobs.g_lpDDSGameMenu,&rcMainSurfaceSource,DDBLTFAST_SRCCOLORKEY); DrawAllMenuBottonElement(); DrawOldPlayeName(); //add show messlistBulletin if(ERR_SYSTEM==messlistBulletin.ShowMessageList(d3dapp->lpBackBuffer)) return E_FAIL; //end // //進入網絡等待狀態 // if(bWaittingConnect) { // //暗淡背景,然後進入等待驗證,準備接收數據,進入遊戲前的準備 // DrawInterLace(); DrawProgress( TRUE ); } return DD_OK; } HRESULT CMenuLoadOldPlay::DrawAllMenuBottonElement() { LPDIRECTDRAWSURFACE lpdds = myglobs.g_lpDDSGameMenu; //在LoadPlayerSurface圖片上畫需要的button if(bStatGame) bltButtonObject(&rcStatGameButton,&rcStatGameButtonSource,lpdds,DDBLTFAST_SRCCOLORKEY); else if(bCreateNewPlay) bltButtonObject(&rcCreateNewPlayButton,&rcCreateNewPlayButtonSource,lpdds,DDBLTFAST_SRCCOLORKEY); else if(bBackUp) bltButtonObject(&rcBackUpButton,&rcBackUpButtonSource,lpdds,DDBLTFAST_SRCCOLORKEY); //add Show deleteplayer button else if (bDeletePlay) bltButtonObject(&rcDeletePlayButton,&rcDeletePlayButtonSource,lpdds,DDBLTFAST_SRCCOLORKEY); //end return DD_OK; } // //在舊玩家的ListBox中填寫信息 // HRESULT CMenuLoadOldPlay::DrawOldPlayeName() { LPDIRECTDRAWSURFACE lpdds = myglobs.g_lpDDSGameMenu; if(nHaveUsed >= 1) { if(bPlayer0) { bltButtonObject(&rcPlayerPos0,&rcPlayerPosSource,lpdds,DDBLTFAST_SRCCOLORKEY); } // 畫舊玩家中文姓名文字 DrawGameString(m_CName[0].GetBuffer(m_CName[0].GetLength()) ,&rcPlayerPos0 ,DT_LEFT | DT_VCENTER ,bPlayerState0 == TRUE ? RGB(255,255,0):RGB(125,125,0) ,RGB(0,0,0),FALSE); } if(nHaveUsed>=2) { if(bPlayer1) { bltButtonObject(&rcPlayerPos1,&rcPlayerPosSource,lpdds,DDBLTFAST_SRCCOLORKEY); } // 畫舊玩家中文姓名文字 DrawGameString(m_CName[1].GetBuffer(m_CName[1].GetLength()) ,&rcPlayerPos1 ,DT_LEFT | DT_VCENTER ,bPlayerState1 == TRUE ? RGB(255,255,0):RGB(125,125,0) ,RGB(0,0,0),FALSE); } if(nHaveUsed>=3) { if(bPlayer2) { bltButtonObject(&rcPlayerPos2,&rcPlayerPosSource,lpdds,DDBLTFAST_SRCCOLORKEY); } // 畫舊玩家中文姓名文字 DrawGameString(m_CName[2].GetBuffer(m_CName[2].GetLength()) ,&rcPlayerPos2 ,DT_LEFT | DT_VCENTER ,bPlayerState2 == TRUE ? RGB(255,255,0):RGB(125,125,0) ,RGB(0,0,0),FALSE); } if(nHaveUsed>=4) { if(bPlayer3) { bltButtonObject(&rcPlayerPos3,&rcPlayerPosSource,lpdds,DDBLTFAST_SRCCOLORKEY); } // 畫舊玩家中文姓名文字 DrawGameString(m_CName[3].GetBuffer(m_CName[3].GetLength()) ,&rcPlayerPos3 ,DT_LEFT | DT_VCENTER ,bPlayerState3 == TRUE ? RGB(255,255,0):RGB(125,125,0) ,RGB(0,0,0),FALSE); } if(nHaveUsed>=5) { if(bPlayer4) { bltButtonObject(&rcPlayerPos4,&rcPlayerPosSource,lpdds,DDBLTFAST_SRCCOLORKEY); } // 畫舊玩家中文姓名文字 DrawGameString(m_CName[4].GetBuffer(m_CName[4].GetLength()) ,&rcPlayerPos4 ,DT_LEFT | DT_VCENTER ,bPlayerState4 == TRUE ? RGB(255,255,0):RGB(125,125,0) ,RGB(0,0,0),FALSE); } return DD_OK; } void CMenuLoadOldPlay::LoadPlayerOnLButtonDown(POINT Pos) { if( (Pos.x > rcBackUpButton.left) &&(Pos.x < rcBackUpButton.right) &&(Pos.y > rcBackUpButton.top) &&(Pos.y < rcBackUpButton.bottom) ) { PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); bBackUp = TRUE; return; } if(bWaittingConnect) return; // //選擇玩家角色 // if( (Pos.x > rcPlayerPos0.left) &&(Pos.x < rcPlayerPos0.right) &&(Pos.y > rcPlayerPos0.top) &&(Pos.y < rcPlayerPos0.bottom) ) { if(nHaveUsed<1)return; bPlayer0 = TRUE; bPlayer1 = FALSE; bPlayer2 = FALSE; bPlayer3 = FALSE; bPlayer4 = FALSE; return; } if( (Pos.x > rcPlayerPos1.left) &&(Pos.x < rcPlayerPos1.right) &&(Pos.y > rcPlayerPos1.top) &&(Pos.y < rcPlayerPos1.bottom) ) { if(nHaveUsed<2)return; bPlayer0 = FALSE; bPlayer1 = TRUE; bPlayer2 = FALSE; bPlayer3 = FALSE; bPlayer4 = FALSE; return; } if( (Pos.x > rcPlayerPos2.left) &&(Pos.x < rcPlayerPos2.right) &&(Pos.y > rcPlayerPos2.top) &&(Pos.y < rcPlayerPos2.bottom) ) { if(nHaveUsed<3)return; bPlayer0 = FALSE; bPlayer1 = FALSE; bPlayer2 = TRUE; bPlayer3 = FALSE; bPlayer4 = FALSE; return; } if( (Pos.x > rcPlayerPos3.left) &&(Pos.x < rcPlayerPos3.right) &&(Pos.y > rcPlayerPos3.top) &&(Pos.y < rcPlayerPos3.bottom) ) { if(nHaveUsed<4)return; bPlayer0 = FALSE; bPlayer1 = FALSE; bPlayer2 = FALSE; bPlayer3 = TRUE; bPlayer4 = FALSE; return; } if( (Pos.x > rcPlayerPos4.left) &&(Pos.x < rcPlayerPos4.right) &&(Pos.y > rcPlayerPos4.top) &&(Pos.y < rcPlayerPos4.bottom) ) { if(nHaveUsed<5)return; bPlayer0 = FALSE; bPlayer1 = FALSE; bPlayer2 = FALSE; bPlayer3 = FALSE; bPlayer4 = TRUE; return; } if( (Pos.x > rcStatGameButton.left) &&(Pos.x < rcStatGameButton.right) &&(Pos.y > rcStatGameButton.top) &&(Pos.y < rcStatGameButton.bottom) ) { PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); bStatGame = TRUE; return; } if( (Pos.x > rcCreateNewPlayButton.left) &&(Pos.x < rcCreateNewPlayButton.right) &&(Pos.y > rcCreateNewPlayButton.top) &&(Pos.y < rcCreateNewPlayButton.bottom) ) { PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); bCreateNewPlay = TRUE; return; } //add press deleteplayer button if(PtInRect(&rcDeletePlayButton,Pos)) { PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); bDeletePlay=TRUE; } //end } void CMenuLoadOldPlay::LoadPlayerOnLButtonUp(POINT Pos) { //返回上一層的按鈕按下 if( (Pos.x > rcBackUpButton.left) &&(Pos.x < rcBackUpButton.right) &&(Pos.y > rcBackUpButton.top) &&(Pos.y < rcBackUpButton.bottom) ) { bBackUp = FALSE; // //掛斷sock,在退回上一層 // // AppPause(TRUE); CPmudNet_End(); m_StartGameMenu.bStartConnect = FALSE; m_StartGameMenu.bWaittingConnect = FALSE; g_bInternConnect = FALSE; g_nGameState = GAME_SETUP; PlaySoundDS(CLOSEMENU,pSysSoundPos,0); // AppPause(FALSE); return; } if(bWaittingConnect)return; //開始遊戲的按鈕按下 if( (Pos.x > rcStatGameButton.left) &&(Pos.x < rcStatGameButton.right) &&(Pos.y > rcStatGameButton.top) &&(Pos.y < rcStatGameButton.bottom) ) { bStatGame = FALSE; if(bShowMsg) bShowMsg = FALSE; if( !bPlayer0 && !bPlayer1 && !bPlayer2 && !bPlayer3 && !bPlayer4 ) { TCHAR szTemp[50]; wsprintf(szTemp,"%c12m請選擇您要扮演的角色!%c10m",27,27); AddMessage(szTemp); return; } if(!g_bInternConnect) { TCHAR szTemp[50]; wsprintf(szTemp,"%c12m您已與伺服器失去聯繫,請再連接試一次!%c10m",27,27); AddMessage(szTemp); return; } PlaySoundDS(OPENMENU,pSysSoundPos,0); if(UsreLoadOldPlayerSend()){ bWaittingConnect = TRUE; } return; } if( (Pos.x > rcCreateNewPlayButton.left) &&(Pos.x < rcCreateNewPlayButton.right) &&(Pos.y > rcCreateNewPlayButton.top) &&(Pos.y < rcCreateNewPlayButton.bottom) ) { bCreateNewPlay = FALSE; if(nHaveUsed >= 5) return; m_MenuCreateNew.PrepareCreateNew(); g_nGameState = GAME_CREATEPLAYER; PlaySoundDS(CLOSEMENU,pSysSoundPos,0); return; } if(bDeletePlay){ bDeletePlay=FALSE; if( !bPlayer0 && !bPlayer1 && !bPlayer2 && !bPlayer3 && !bPlayer4 ){ TCHAR szTemp[50]; wsprintf(szTemp,"%c12m請選擇您要刪除的角色!%c10m",27,27); AddMessage(szTemp); return; } if(IDYES!=MessageBox(myglobs.hWndMain,"確定要刪除此人物?","",MB_YESNO)) return; int iSelected; if(bPlayer0) iSelected=0; else if(bPlayer1) iSelected=1; else if(bPlayer2) iSelected=2; else if(bPlayer3) iSelected=3; else if(bPlayer4) iSelected=4; wsprintf(szSendBuf,"%s %s",SZPLAYERDELETE,m_EName[iSelected]); Send(); DeletePlayer(); } bStatGame = FALSE; bCreateNewPlay = FALSE; bBackUp = FALSE; } void CMenuLoadOldPlay::LoadPlayerOnRButtonDown(POINT Pos) { bShowMsg = FALSE; bPlayer0 = FALSE; bPlayer1 = FALSE; bPlayer2 = FALSE; bPlayer3 = FALSE; bPlayer4 = FALSE; bPlayerState0 = FALSE; bPlayerState1 = FALSE; bPlayerState2 = FALSE; bPlayerState3 = FALSE; bPlayerState4 = FALSE; } void CMenuLoadOldPlay::LoadPlayerOnMouseMove(POINT Pos) { bPlayerState0 = bPlayerState1 = bPlayerState2 = bPlayerState3 = bPlayerState4 = FALSE; if( (Pos.x > rcPlayerPos0.left) &&(Pos.x < rcPlayerPos0.right) &&(Pos.y > rcPlayerPos0.top) &&(Pos.y < rcPlayerPos0.bottom) ) { if(nHaveUsed<1)return; if(bPlayerState0 )return; bPlayerState0 = TRUE; PlaySoundDS(OPENMENU,pSysSoundPos,0); return; } if( (Pos.x > rcPlayerPos1.left) &&(Pos.x < rcPlayerPos1.right) &&(Pos.y > rcPlayerPos1.top) &&(Pos.y < rcPlayerPos1.bottom) ) { if(nHaveUsed<2)return; if(bPlayerState1)return; bPlayerState1 = TRUE; PlaySoundDS(OPENMENU,pSysSoundPos,0); return; } if( (Pos.x > rcPlayerPos2.left) &&(Pos.x < rcPlayerPos2.right) &&(Pos.y > rcPlayerPos2.top) &&(Pos.y < rcPlayerPos2.bottom) ) { if(nHaveUsed<3)return; if(bPlayerState2)return; bPlayerState2 = TRUE; PlaySoundDS(OPENMENU,pSysSoundPos,0); return; } if( (Pos.x > rcPlayerPos3.left) &&(Pos.x < rcPlayerPos3.right) &&(Pos.y > rcPlayerPos3.top) &&(Pos.y < rcPlayerPos3.bottom) ) { if(nHaveUsed<4)return; if(bPlayerState3)return; bPlayerState3 = TRUE; PlaySoundDS(OPENMENU,pSysSoundPos,0); return; } if( (Pos.x > rcPlayerPos4.left) &&(Pos.x < rcPlayerPos4.right) &&(Pos.y > rcPlayerPos4.top) &&(Pos.y < rcPlayerPos4.bottom) ) { if(nHaveUsed<5)return; if(bPlayerState4)return; bPlayerState4 = TRUE; PlaySoundDS(OPENMENU,pSysSoundPos,0); return; } } BOOL CMenuLoadOldPlay::UsreLoadOldPlayerSend() { // //準備發送的數據 // CString parm = (" "); if(bPlayer0) { //cary wsprintf(szSendBuf,"%s %s %s",szLoadOldPlayer,m_EName[0],m_Password[0]); // g_csSendToServerMsg = szLoadOldPlayer // + parm + m_EName[0] + parm // + parm + m_Password[0]; //end } else if(bPlayer1) { //cary wsprintf(szSendBuf,"%s %s %s",szLoadOldPlayer,m_EName[1],m_Password[1]); // g_csSendToServerMsg = szLoadOldPlayer // + parm + m_EName[1] + parm // + parm + m_Password[1]; //end } else if(bPlayer2) { //cary wsprintf(szSendBuf,"%s %s %s",szLoadOldPlayer,m_EName[2],m_Password[2]); // g_csSendToServerMsg = szLoadOldPlayer // + parm + m_EName[2] + parm // + parm + m_Password[2]; //end } else if(bPlayer3) { //cary wsprintf(szSendBuf,"%s %s %s",szLoadOldPlayer,m_EName[3],m_Password[3]); // g_csSendToServerMsg = szLoadOldPlayer // + parm + m_EName[3] + parm // + parm + m_Password[3]; //end } else if(bPlayer4) { //cary wsprintf(szSendBuf,"%s %s %s",szLoadOldPlayer,m_EName[4],m_Password[4]); // g_csSendToServerMsg = szLoadOldPlayer // + parm + m_EName[4] + parm // + parm + m_Password[4]; //end } Send(); g_nReceiveMsgState = SVRMSG_LOADOLD; nSpareTime = MAXLOADMAPTIME; //剩下的時間(單位:秒) nRecTimes = 0; //接收到的信息次數 return TRUE; } extern CString lastRcvBuf; BOOL CMenuLoadOldPlay::UsreLoadOldPlayerReceive() { CStringList strls; CString parm; CString strtmp; char *ps; char tmpRcv[8192]; lstrcpy(tmpRcv,lastRcvBuf); parm = CString(" \n\t\r"); ps = strtok(tmpRcv,(const char*)parm); strls.AddTail(ps); for(;;) { ps=strtok(NULL,(const char*)parm); if(ps==NULL)break; strls.AddTail(ps); } //判斷從服務器返回的結果 strtmp=strls.GetAt(strls.FindIndex(0)); strtmp.MakeUpper(); if(strtmp=="OK") { strls.RemoveAll(); // //進入主遊戲畫面 // // AppPause(TRUE); // //裝入遊戲的各種數據,並準備進入主游戲的畫面 //填寫地圖信息,人物角色,裝備,技能等等信息. //初始化主遊戲畫面surface,裝入3D場景 if(!GetNewMap(lastRcvBuf))goto failure;//獲取地圖信息,函數在MapInfo.h中定義 if(!m_MenuCreateNew.GetMyselfInfo(lastRcvBuf))goto failure;//獲取自我信息失敗 if(!m_MenuCreateNew.GetMyEquipInfo(lastRcvBuf))goto failure;//獲取自我裝備信息失敗 if(!m_MenuCreateNew.GetMySkillInfo(lastRcvBuf))goto failure;//獲取自我技能信息失敗 if(!m_MainScreen.PrepareMainScreen())//做主遊戲畫面的準備工作(例如安排2D圖片的位置等等) goto failure; if (!BuildScene(g_lpD3DRM, myglobs.dev, myglobs.view, myglobs.scene, myglobs.camera)) goto failure;//裝入3D人物和場景 g_nGameState = GAME_MAIN; EnableIME(myglobs.hWndMain); // AppPause(FALSE); return TRUE; } else { int i; strtmp.Empty(); for(i=1;i