?? 代碼說明.txt
字號:
VC編寫,6.0以上版本的VC都可以編譯.
說明:
需要在工作目錄放入盛大的GROUP.DAT才能顯示區(qū)域服務(wù)器等信息.
在工作目錄\DATA下放入MMAP.WIL,MMAP.WIX就可以顯示大地圖,在工作目錄\MAP下放入盛大的地圖就可以顯示障礙地圖.
|-MIRGUI.EXE
|-GROUP.DAT
+-DATA
| ?。停停粒校祝桑?| ?。埽停停粒校祝桑?+-MAP
?。停粒校ㄊ⒋髠髌娴牡貓D文件)
DATA/MAP文件夾可以不存在.
但是GROUP.DAT必須存在,沒有它就無法顯示游戲區(qū)域和服務(wù)器,也就無法進(jìn)入游戲.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bindef.h 二進(jìn)制定義文件,看看就知道了,就是定義了一些B00001111類似的序列,方便二進(jìn)制操作
mircode.cpp 消息解碼相關(guān)
mircode.h 消息解碼相關(guān)頭文件
mircore.cpp 開始做測試用代碼,現(xiàn)在都轉(zhuǎn)移到MIRGAME.CPP中了。
mircore.h
mirgame.cpp 消息處理,動作處理的核心代碼
mirgame.h
mirgamemap.cpp 游戲地圖的處理,障礙地圖的繪制
mirgamemap.h
mirgroup.cpp 對GROUP.DAT的處理,得到服務(wù)器和區(qū)域列表,并且有個(gè)接口可以將列表輸出到COMBOBOX控件
mirgroup.h
mirgroup1.cpp 本來想把上面的處理寫到類里面,可是時(shí)間問題,我就。。。。
mirgroup1.h
mirgui.cpp 界面處理,
mirgui.h
mirminimap.cpp 小地圖處理和繪制類
mirminimap.h
mirmsg.cpp 消息發(fā)送接收等處理的類
mirmsg.h
mirprocmsg.cpp 本來想把消息處理獨(dú)立開,不過后來沒時(shí)間就。。。。
mirprocmsg.h
mirsocket.cpp 對socket得簡單封裝。。。。
mirsocket.h
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MIRCODE的接口說明
mircode.cpp 詳細(xì)介紹
char ucase(char c); 輸入一個(gè)字符,如果是小寫字母,返回這個(gè)字符的大寫。如果是其他的,直接返回。
int hex2int(charc); 輸入一個(gè)十六進(jìn)制字符,轉(zhuǎn)換成十進(jìn)制int型,如果不是16進(jìn)制字符,返回0
char int2hex(int v); 輸入一個(gè)0-15的十進(jìn)制,返回16進(jìn)制字符
int UnNameCode( char * in, char * out ); 對人物出現(xiàn)消息內(nèi)的人物名字進(jìn)行解碼,in為輸入buffer,out為輸出
int CodeGateCode( char * in, char * out); 對消息進(jìn)行加密,就是盛大以前的一個(gè)補(bǔ)?。校遥希裕牛茫裕停桑业墓δ?int UnGateCode( char * in,char * out); 對加密的消息進(jìn)行解密.
int UnGameCode( char * p, BYTE*out ); 對游戲消息進(jìn)行解碼,返回解碼后長度
int CodeGameCode( BYTE*in, int size,BYTE * out); 對游戲消息進(jìn)行編碼,in,輸入緩沖,size輸入字節(jié),out輸出緩沖,返回編碼后長度
這些基本上就是傳奇的編碼和解碼核心了。
傳奇的消息格式,(二進(jìn)制)
DWORD dwId;
WORD wCmd;
WORD wParam01;
WORD wParam02;
WORD wParam03;
char buffer[?]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MIRGAME接口說明!^_^
mirgame.cpp
DWORD MessageProc( PVOID * p ); 消息處理線程
class CMirGame 傳奇游戲類
{
public:
friend DWORD MessageProc( PVOID * p ); 作為友員函數(shù),方便訪問
void Walk( int dir ); 請求行走 參數(shù) 方向
BOOL SelectChar( char * charname ); 選擇人物 參數(shù) 角色名字
BOOL GetSelCharInfo( SELCHARINFO * pInfo ); 取得選人信息 參數(shù) 選人信息返回地址
BOOL EnterServer( char * ServerName ); 進(jìn)入服務(wù)器 參數(shù) 服務(wù)器名字
BOOL Login( char * username, char * password ); 登陸 參數(shù) 賬號,密碼
BOOL OpenGateServer( char * ip ); 連接GATE服務(wù)器 參數(shù) ip
int GetString( char * string ); 分割/隔開的字符串的函數(shù) 參數(shù) 字符串
public:
void LogToList( HWND hList, char * line ); 向listbox寫log
void LogChat( char * line,... );
void LogSystem( char * line,... );
public:
BOOL EnterGame( int CharIndex ); 進(jìn)入游戲 參數(shù) 人物編號,0/1
BOOL CloseAll(); 關(guān)閉所有連接
BOOL EnterSelCharServer(); 進(jìn)入選人服務(wù)器 無參數(shù)
BOOL CloseGateServer(); 關(guān)閉gate服務(wù)器 無參數(shù)
BOOL InitLogSystem( HWND hSysLog, HWND hChatLog, int MaxLine); 初始化log listbox
BOOL GetMsgInfo( SOCKET s ); 取得消息信息(廢除)
BOOL GetMsg( MMSG * pMsg ); 得到一條消息 參數(shù) 返回消息指針
public:
BOOL RunThrough( int dir ); 穿人^_^ 參數(shù) 方向
CMirMiniMap * GetMiniMap(); 得到小地圖
CMirGameMap * GetGameMap(); 得到游戲障礙地圖
void SetCharacterPos( int x, int y ); 設(shè)置角色坐標(biāo)
void Turn( int dir ); 轉(zhuǎn)向 參數(shù) 方向
void Run(int dir ); 跑 參數(shù) 方向
void HandleCommand( char * command ); 接受控制命令 參數(shù) 命令字符串(其實(shí)就是用另外一個(gè)人來控制該角色)
BOOL CloseSelCharServer(); 關(guān)閉選人服務(wù)器
BOOL Logout(); 退出游戲世界
BOOL Say( char * word, ...); 說話
BOOL StartGame(); 開始游戲(創(chuàng)建消息收取線程)
CMirGame();
virtual ~CMirGame();
private:
CMsgQueue2 m_MsgQueue;
DWORD m_dwGameState;
SOCKET m_sGate;
SOCKET m_sSelChar;
SOCKET m_sGame;
SELCHARINFO m_SelCharInfo;
BOOL m_bInGame;
char m_Account[32];
char m_SelCharIp[20];
char m_GameServerIp[20];
int m_SelCharPort;
int m_GameServerPort;
char m_SID[32];
private:
void ActionFail(); 動作失敗處理
void ActionOk(); 動作成功處理
BOOL CanDoAction(); 是否可以做動作(當(dāng)前是否有動作還沒有被確認(rèn))
private:
int m_LeftHours;
HWND m_hSysLog;
HWND m_hChatLog;
TSTRING m_StringList[20];
int m_MaxLogLine;
char * m_tmpBuffer;
char * m_tmpBuffer2;
char * m_MsgLeftBuf;
ACTION_LAST m_LastAction;
CHARACTERINFO m_CharSelf;
CMirMsg m_MirMsg;
CMirSocket m_MirSocket;
CMirMiniMap m_MiniMap;
CMirGameMap m_GameMap;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MIRGAMEMAP
mirgamemap.cpp
class CMirGameMap
{
public:
BOOL TestMap( int x, int y ); 測試地圖坐標(biāo)是否有障礙
BOOL TestMapTo( int x, int y, int dir ); 測試坐標(biāo)的那個(gè)方向上的坐標(biāo)是否有障礙
void SetPersonInfo( DWORD x, DWORD y, DWORD dir ); 設(shè)置角色坐標(biāo)
BOOL SetGameMap( char * mapname, DWORD x, DWORD y ); 設(shè)置地圖信息和當(dāng)前坐標(biāo)
void Draw( HDC dc, int dx, int dy); 在DC的DX,DY位置上繪制障礙地圖
CMirGameMap();
virtual ~CMirGameMap();
private:
MIRMAPBLOCK* Loadmap( char * map ); 讀取地圖
MIRMAPHEADER m_Header;
MIRMAPBLOCK * m_pData;
DWORD m_xpos;
DWORD m_ypos;
DWORD m_dir;
int m_DrawWidth;
int m_DrawHeight;
int m_DrawMapWidth;
int m_DrawMapHeight;
MAPDRAWCOLOR m_DrawColor[MOBJ_TELEPORT + 1];
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MIRGROUP
MIRGROUP
int SetAreaList( HWND hWnd ); 輸出區(qū)域信息到指定的LISTBOX或者COMBOBOX
int SetServerCaptionList( HWND hWnd, int AreaID ); 輸出服務(wù)器顯示名字到指定的COMBOBOX
int GetServerName( int AreaID, int ServerIndex, char * ServerName ); 得到制定區(qū)的指定服務(wù)器的名字(消息中用到的名字)
int SetGroupFile( char * file ); 設(shè)置GROUP.DAT的文件
int GetIpAddress( int AreaID, char * IpAddr ); 得到區(qū)域登陸服務(wù)器的名字
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MIRMINIMAP
MIRMINIMAP
class CMirMiniMap
{
public:
void SetCurPos( int x, int y ); 設(shè)置當(dāng)前坐標(biāo)
void Draw( HDC dc, int x, int y, int w, int h ); 載dc上的x,y處繪制w,h大小的小地圖
BOOL SetMMap( DWORD index ); 設(shè)置當(dāng)前的小地圖
BOOL InitMiniMap( char * wixfile, char * wilfile ); 初始化小地圖資源信息
CMirMiniMap();
virtual ~CMirMiniMap();
private:
DWORD LoadOfs( char * szWixFile, DWORD ** ofsbuf ); 讀取每個(gè)圖片的偏移量信息
char * LoadBuf( DWORD idx, DWORD & width, DWORD & height ); 讀取編號為idx的圖片,返回大小
BOOL LoadPal( char * ppal); 讀取調(diào)色板信息
int MakeBitmapHeader( BITMAPFILEHEADER * pBfHeader, BITMAPINFOHEADER * pBiHeader, int width, int height, int bits ); 創(chuàng)建bitmap頭,用來繪制圖片到dc
private:
DWORD * m_pResOfs;
DWORD m_dwCntMMap;
char m_szWixFile[1024];
char m_szWilFile[1024];
char * m_ImageData;
DWORD m_dwImageWidth;
DWORD m_dwImageHeight;
FILE * m_fpWilFile;
DWORD m_dwMapIndex;
st_mybi m_BitmapHeader;
DWORD m_xpos;
DWORD m_ypos;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MirSocket 說明
class CMirSocket
{
public:
CMirSocket();
virtual ~CMirSocket();
int SetNoBlock( SOCKET s ); 設(shè)置無阻塞模式
void CloseConnection( SOCKET s ); 關(guān)閉連接
SOCKET OpenConnection( char * ip, unsigned short port ); 打開一個(gè)連接到IP,PORT
BOOL NetCleanup(); 關(guān)閉winsock調(diào)用
BOOL NetStartup(); 開始winsock調(diào)用
};
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -