📄 mircore.cpp
字号:
#pragma comment( lib, "ws2_32.lib" )
#include <winsock2.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>
#include "mircode.h"
typedef struct
{
union
{
DWORD dwFlag;
struct
{
WORD wa;
WORD wb;
};
};
WORD wCmd;
WORD w1;
WORD w2;
WORD w3;
char data[1024];
}MMSG;
#define CGIP "61.152.97.21"
#define ACCOUNT "johndragon"
#define PASSWORD "shifully"
#define WORDS "各个姐姐弟弟妹妹们,你们好,我是机器人,请多关照!!"
char g_msgflag = '1';
char rcBuffer[4096];
typedef char TSTRING[256];
TSTRING g_StringList[20];
int g_pos_x, g_pos_y;
char g_mapname[256];
#define MSGHEADERSIZE 12
#define MSGLENGTH 1024
#define MSGQUEUELEN 256
typedef char TMSGLINE[MSGLENGTH];
enum _action
{
ACTION_STAND,
ACTION_WALK,
ACTION_ATTACK,
ACTION_RUN,
ACTION_TRUN,
};
typedef struct
{
int x;
int y;
int dir;
int action;
}ACTION_LAST;
ACTION_LAST g_LastAction = {0, 0, 0, 0 };
class CMsgQueue
{
public:
CMsgQueue()
{
m_iGet = 0;
m_iPut = 0;
Clear();
};
virtual ~CMsgQueue()
{
Clear();
};
int NextPos( int now )
{
now++;
if( now >= MSGQUEUELEN )
now = 0;
return now;
}
int PutMsg( char * pMsg )
{
int iNext = NextPos( m_iPut );
if( pMsg == NULL )
return 0;
if( iNext == m_iGet )
{
return 0;
}
strcpy( m_Msgs[m_iPut], pMsg );
m_iPut = iNext;
return 1;
};
int GetMsg( char * pMsg )
{
if( m_iGet == m_iPut )
return 0;
strcpy( pMsg, m_Msgs[m_iGet] );
// printf( "m_iPut = %d, m_iGet = %d\n", m_iPut, m_iGet );
m_iGet = NextPos( m_iGet );
return 1;
};
int Clear()
{
memset( (void*)m_Msgs, 0, sizeof( TMSGLINE ) * MSGQUEUELEN );
return 1;
};
private:
TMSGLINE m_Msgs[MSGQUEUELEN];
int m_iGet;
int m_iPut;
};
CMsgQueue g_MsgQueue;
HWND m_hSysLog = NULL;
HWND m_hChatLog = NULL;
HWND m_hMainDlg = NULL;
int m_MaxLogLine = 100;
BOOL InitMirCore( HWND hMainWnd, HWND hSysLog, HWND hChatLog, int MaxLogLine )
{
m_hSysLog = hSysLog;
m_hChatLog = hChatLog;
m_hMainDlg = hMainWnd;
m_MaxLogLine = MaxLogLine;
return TRUE;
}
void LogToList( HWND hList, char * line )
{
int cnt = 0;
cnt = ListBox_GetCount( hList );
if( cnt >= m_MaxLogLine )
{
ListBox_DeleteString( hList, 0 );
cnt --;
}
ListBox_AddString( hList, line );
ListBox_SetCurSel( hList, cnt );
}
void LogChat( char * line,... )
{
char szBuff[2048];
va_list vl;
va_start( vl, line );
vsprintf( szBuff, line, vl );
va_end( vl);
LogToList( m_hChatLog, szBuff );
}
void LogSystem( char * line,... )
{
char szBuff[2048];
va_list vl;
va_start( vl, line );
vsprintf( szBuff, line, vl );
va_end( vl);
LogToList( m_hSysLog, szBuff );
}
int ActionOk()
{
printf( "Action Ok!\n" );
switch( g_LastAction.action )
{
case ACTION_RUN:
case ACTION_WALK:
g_pos_x = g_LastAction.x;
g_pos_y = g_LastAction.y;
break;
}
g_LastAction.action = 0;
return 1;
}
int ActionFail()
{
printf( "Action Fail!\n" );
g_LastAction.action = 0;
return 1;
}
int CanDoAction()
{
if( g_LastAction.action == 0 )
return 1;
return 0;
}
int GetString( char * string )
{
int ilen = strlen( string );
int i = 0;
int cnt = 0;
int sptr = 0;
for( i =0;i < ilen;i ++ )
{
if( string[i] == '/' && i != 0 )
{
g_StringList[cnt][sptr] = '\0';
sptr = 0;
cnt++;
}
else
{
g_StringList[cnt][sptr] = string[i];
sptr ++;
}
}
if( sptr > 0 )
{
g_StringList[cnt][sptr] = '\0';
cnt++;
}
return cnt;
}
int SendString( SOCKET s, char * string )
{
int ierr = 0;
int ilen = strlen( string );
// printf( "Send: %s\n", string );
ierr = send( s, string, strlen( string), 0 );
if( ierr == ilen )
{
g_msgflag ++;
if( g_msgflag > '9' )
g_msgflag = '1';
}
return ierr;
}
int RecvString( SOCKET s, char * string, int maxlen )
{
int ierr = 0;
char tmpBuffer[2048];
ierr = recv( s, tmpBuffer, 2048, 0 );
if( ierr !=- 1)
{
if( tmpBuffer[0] == '*' )
{
strcpy( string, &tmpBuffer[1]);
ierr --;
}
else
{
strcpy( string, tmpBuffer );
}
string[ierr] = '\0';
// printf( "Recv:%s\n", string );
}
return ierr;
}
int RecvMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
// char tmpBuffer2[2048];
int ierr;
ierr = RecvString( s, tmpBuffer, 2048 );
if( ierr == -1 )
{
return -1;
}
if(tmpBuffer[ierr-1] == '!' )
{
tmpBuffer[ierr-1] = '\0';
}
UnGameCode( &tmpBuffer[1], (BYTE*)pmsg );
if( pmsg->wCmd == 0x0a )
{
//printf( "Code is %s\n", tmpBuffer );
}
return ierr;
}
int GetMsg( MMSG * pMsg )
{
char tmpBuffer[1024];
int ilen = 0;
if( g_MsgQueue.GetMsg( tmpBuffer ))
{
ilen = strlen( tmpBuffer );
if( tmpBuffer[ilen-1] == '!' )
{
tmpBuffer[ilen-1] = '\0';
}
printf( "Msg: %s\n", tmpBuffer );
if( tmpBuffer[1] == '+' )
{
tmpBuffer[6] = '\0';
printf( "GetWords %s\n", tmpBuffer );
if( stricmp( tmpBuffer, "#+GOOD" ) == 0 )
{
ActionOk();
}
else if( stricmp( tmpBuffer, "#+FAIL" ) == 0 )
{
ActionFail();
}
return 0;
}
UnGameCode( &tmpBuffer[1], (BYTE*)pMsg );
return 1;
}
return 0;
}
int SetNoBlock( SOCKET s )
{
unsigned long mode = 1;
if( ioctlsocket( s, FIONBIO, &mode ) == -1 )
return 0;
return 1;
}
int RecvGateMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int ierr;
ierr = RecvString( s, tmpBuffer, 2048 );
if( ierr == -1 )
{
return -1;
}
tmpBuffer[ierr-1] = '\0';
UnGateCode( &tmpBuffer[1], tmpBuffer2 );
ierr = strlen( tmpBuffer2 );
if(tmpBuffer2[ierr-1] == '!' )
{
tmpBuffer2[ierr-1] = '\0';
}
UnGameCode( &tmpBuffer2[1], (BYTE*)pmsg );
return ierr;
}
int SendMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int msize = 0;
msize = strlen(pmsg->data ) + MSGHEADERSIZE;
CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
return SendString( s,tmpBuffer2 );
}
int SendGateMsg( SOCKET s, MMSG * pmsg )
{
char tmpBuffer[2048];
char tmpBuffer2[2048];
int msize = 0;
msize = strlen(pmsg->data ) + MSGHEADERSIZE;
CodeGameCode( (BYTE*)pmsg, msize, (BYTE*)tmpBuffer );
sprintf( tmpBuffer2, "#%c%s!",g_msgflag, tmpBuffer );
CodeGateCode( tmpBuffer2, tmpBuffer );
sprintf( tmpBuffer2, "<%s>", tmpBuffer );
return SendString( s, tmpBuffer2 );
}
int SendWords( SOCKET s , char * word )
{
MMSG msg;
memset( &msg, 0, sizeof( MMSG ));
sprintf( msg.data, "#(%03d,%03d)-%s", g_pos_x, g_pos_y, word );
msg.wCmd = 0xbd6;
int erri;
erri = SendMsg( s, &msg );
return erri;
}
int TurnDirect( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
memset( &msg, 0, sizeof( MMSG ));
//msg.dwFlag = 0x6000e;
msg.wa = g_pos_x;
msg.wb = g_pos_y;
msg.wCmd = 0xbc2;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return -1;
erri = RecvString( s, tmpBuffer, 256 );
if( erri == -1 )
return 0;
//printf( "%s\n", tmpBuffer );
tmpBuffer[6] = '\0';
if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
{
//g_pos_x += xofs_walk[dir];
//g_pos_y += yofs_walk[dir];
return 1;
}
return 0;
}
int xofs_walk[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int yofs_walk[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int Walk( SOCKET s, int dir )
{
MMSG msg;
char tmpBuffer[2048];
int erri;
int tx,ty;
if( dir <0 || dir > 7 )
return 0;
tx = g_pos_x + xofs_walk[dir];
ty = g_pos_y + yofs_walk[dir];
memset( &msg, 0, sizeof( MMSG ));
//msg.dwFlag = 0x6000e;
msg.wa = tx;//g_pos_x;
msg.wb = ty;//g_pos_y;
msg.wCmd = 0xbc3;
msg.w2 = dir;
erri = SendMsg( s, &msg );
if( erri == -1 )
return -1;
erri = RecvString( s, tmpBuffer, 256 );
if( erri == -1 )
return 0;
// printf( "%s\n", tmpBuffer );
tmpBuffer[6] = '\0';
if( stricmp( &tmpBuffer[1] ,"+GOOD") == 0 )
{
printf( "Good!!\n" );
g_pos_x = tx;// xofs_walk[dir];
g_pos_y = ty;//+= yofs_walk[dir];
return 1;
}
return 0;
}
int Run( SOCKET s, int dir )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -