📄 gdoc.cpp
字号:
// gDoc.cpp : implementation of the CGDoc class
//
#include "stdafx.h"
#include "g.h"
#include "gDoc.h"
#include "CntrItem.h"
#include "gView.h"
#include "dlg.h"
#include "sdlg.h"
#include "mainFrm.h"
#include "var.h"
#include "midi.h"
#include ".\gdoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define VARX "(%)"
/////////////////////////////////////////////////////////////////////////////
// CGDoc
IMPLEMENT_DYNCREATE(CGDoc, CRichEditDoc)
BEGIN_MESSAGE_MAP(CGDoc, CRichEditDoc)
//{{AFX_MSG_MAP(CGDoc)
ON_COMMAND(IDM_CONNECT, OnConnect)
ON_COMMAND(IDM_BACK, OnBack)
ON_COMMAND(IDM_CONVERT, OnConvert)
ON_COMMAND(IDM_SAVE_ROUTES, OnSaveRoutes)
ON_COMMAND(IDM_CLEAR, OnClear)
ON_COMMAND(ID_ENTER, OnEnter)
ON_COMMAND(IDM_AUTO, OnAuto)
ON_COMMAND(IDM_STOP_AUTO, OnStopAuto)
ON_COMMAND(IDM_AUTO_VIEW, OnAutoView)
//}}AFX_MSG_MAP
// Enable default OLE container implementation
ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, CRichEditDoc::OnUpdateEditLinksMenu)
ON_COMMAND(ID_OLE_EDIT_LINKS, CRichEditDoc::OnEditLinks)
ON_UPDATE_COMMAND_UI_RANGE(ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, CRichEditDoc::OnUpdateObjectVerbMenu)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGDoc construction/destruction
CGDoc::CGDoc()
{
// Use OLE compound files
EnableCompoundFile();
m_pSocket = NULL;
m_pMidi=NULL;
m_bWaiting=m_bMoving=FALSE;
m_sDirection="/up/down/enter/out/northwest/southeast/northeast/southwest/westup/eastup/southup/northup/westdown/eastdown/southdown/northdown/w/e/s/n/u/d/nw/se/ne/sw/wu/eu/su/nu/wd/ed/sd/nd";
//声音
int n;
CString s = AfxGetApp()->GetProfileString("sys", "sound", "");
s.TrimRight();
while (!s.IsEmpty())
{
n = s.Find(" ");
if (n != -1)
{
m_soundArray.Add(s.Left(n));
s = s.Mid(n+1);
}
else
{
m_soundArray.Add(s);
break;
}
}
m_nSound = 0;
}
CGDoc::~CGDoc()
{
}
BOOL CGDoc::OnNewDocument()
{
if (!CRichEditDoc::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
CRichEditCntrItem* CGDoc::CreateClientItem(REOBJECT* preo) const
{
// cast away constness of this
return new CGCntrItem(preo, (CGDoc*) this);
}
/////////////////////////////////////////////////////////////////////////////
// CGDoc serialization
void CGDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
// Calling the base class CRichEditDoc enables serialization
// of the container document's COleClientItem objects.
// TODO: set CRichEditDoc::m_bRTF = FALSE if you are serializing as text
CRichEditDoc::Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CGDoc diagnostics
#ifdef _DEBUG
void CGDoc::AssertValid() const
{
CRichEditDoc::AssertValid();
}
void CGDoc::Dump(CDumpContext& dc) const
{
CRichEditDoc::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGDoc commands
void CGDoc::Receive()
{
char r[4096];
int n=m_pSocket->Receive(r, 4095);
r[n]=0;
CString s(r);
CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
GetView()->Display(pFrame->Filt(r));
if(m_bMoving&&s.Left(4)=="什么")
{
m_bMoving=FALSE;
if(m_directBuffer.GetCount())
m_directBuffer.RemoveTail();
}
//更新变量
POSITION pos;
if((pos=m_listVar.GetHeadPosition()))
{
while(CMyBar::Exclude1(s,CString((char)0x1b),ALETTER));
while(pos)
{
CVar* pv=(CVar*) m_listVar.GetNext(pos);
pv->Update(s);
}
}
//检查触发
pos=m_listIf.GetHeadPosition();
CString cmd;
while(pos)
{
POSITION pos0=pos;
CTriger* pt=(CTriger*) m_listIf.GetNext(pos);
if(pt->m_bActive)
{
cmd=pt->GetTrString(s,&m_listVar);
if(!cmd.IsEmpty())
{
pFrame->KillTimer(2);
m_sScript+=cmd+";";
pFrame->SetTimer(2,pFrame->m_nTime,NULL);
break;
}
}
}
}
void CGDoc::DisConnect()
{
GetView()->Display("\n=========连接中断!===========");
::Beep(-1,1);
m_pSocket->Close();
OnStopAuto();
}
CGView* CGDoc::GetView()
{
for(POSITION pos=GetFirstViewPosition();pos!=NULL;)
{
CView* pView = GetNextView(pos);
CGView* pGView = DYNAMIC_DOWNCAST(CGView, pView);
if (pGView != NULL)
return pGView;
}
return NULL;
}
void CGDoc::OnConnect()
{
CDlg dlg;
if(dlg.DoModal()==IDOK)
{
int n=dlg.m_sHost.Find(":");
int port=::atoi(dlg.m_sHost.Mid(n+1));
DeleteContents();
EchoSend("\n======正在连接......",37);
m_pSocket = new CConnect(this);
if (!m_pSocket->Create())
{
delete m_pSocket;
m_pSocket = NULL;
AfxMessageBox(IDS_CREATEFAILED);
EchoSend("\n======创建连接失败",37);
return;
}
//设置代理
if (dlg.m_bProxy)
{
m_pSocket->SetProxy(2, dlg.m_proxyHost, dlg.m_proxyPort,
dlg.m_proxyUser, dlg.m_proxyPass, TRUE);
}
if (!m_pSocket->Connect(dlg.m_sHost.SpanExcluding(":"), port, dlg.m_bProxy))
{
delete m_pSocket;
m_pSocket = NULL;
EchoSend("\n======连接失败",37);
return;
}
//发送指令
CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
CString data = AfxGetApp()->GetProfileString("sys","precmd","");
data.TrimLeft();
data.TrimRight();
if(!data.IsEmpty())
SendCmds(data);
pFrame->FocusOnSend();
//播放音乐
if (m_soundArray.GetSize())
Play(m_soundArray[0]);
}
}
void CGDoc::Send(CString s)
{
if(m_pSocket)
m_pSocket->Send((LPCTSTR)s,s.GetLength());
}
void CGDoc::EchoSend(CString s, int nColor)
{
char c=0x1b;
CString ss;
ss.Format("%c[%dm%s%c[2;37;0m\n",c,nColor,s,c);
GetView()->Display(ss);
}
BOOL CGDoc::SaveModified()
{
return TRUE;//CRichEditDoc::SaveModified();
}
void CGDoc::DeleteContents()
{
m_directBuffer.RemoveAll();
if (m_pSocket != NULL)
{
delete m_pSocket;
m_pSocket = NULL;
}
CTriger* pt;
int n;
n=m_listIf.GetCount();
while(n--)
{
pt=(CTriger*)m_listIf.RemoveTail();
delete pt;
}
CVar* pv;
n=m_listVar.GetCount();
while(n--)
{
pv=(CVar*)m_listVar.RemoveTail();
delete pv;
}
m_listDefine.RemoveAll();
if(m_pMidi)
{
delete m_pMidi;
m_pMidi=NULL;
}
CRichEditDoc::DeleteContents();
}
void CGDoc::SendCmd(CString s,BOOL bCheck)
{
Send(s+"\r\n");
EchoSend(s,33);
if(bCheck)
m_bMoving=Check(s);
}
void CGDoc::SendCmds(CString cmds)
{
do{
Sending(cmds);
}while(!cmds.IsEmpty());
}
void CGDoc::Sending(CString &strCmds)
{
int m,n;
CString cmd;
n=strCmds.Find(";");
m=strCmds.Find("{");
if(n==-1||m==-1||n<m)
cmd=strCmds.SpanExcluding(";");
else
{
m=strCmds.Find("}",m);
n=strCmds.Find(";",m);
cmd=strCmds.SpanExcluding("}");
cmd.Replace("{"," ");
}
if(n!=-1)
strCmds=strCmds.Mid(n+1);
else
strCmds.Empty();
cmd.TrimLeft();
CString s1,s2;
n=cmd.Find(" ");
s1=cmd.SpanExcluding(" ");
if(n!=-1)
s2=cmd.Mid(n+1);
s2.TrimLeft();
if(cmd.Left(1)=='#')
{
CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
if(::isdigit(s1.GetAt(1)))
{
int num=::atoi((LPTSTR)(LPCTSTR)s1.Mid(1));
if(num>1)
{
s1.Format("#%d {%s};",num-1,s2);
strCmds=s1+strCmds;
}
strCmds=s2+";"+strCmds;
Sending(strCmds);
}
else if(s1=="#l"||s1=="#loop")
{
if(s2.IsEmpty())
{
pFrame->KillTimer(2);
m_sLoop.Empty();
EchoSend("loop ended");
}
else
{
pFrame->KillTimer(2);
m_sLoop=s2+";";
m_sScript=m_sLoop+";"+m_sScript;
pFrame->SetTimer(2,pFrame->m_nTime,NULL);
EchoSend(cmd);
}
}
else if(s1=="#t"||s1=="#timer")
{
if(s2.IsEmpty())
{
pFrame->KillTimer(3);
m_sTimer.Empty();
EchoSend("timer ended");
}
else
{
pFrame->KillTimer(3);
n=s2.Find(" ");
s1=s2.SpanExcluding(" ");
int e=::atoi((LPTSTR)(LPCTSTR)s1);
m_sTimer=s2.Mid(n+1)+";";
pFrame->SetTimer(3,e,NULL);
EchoSend(cmd);
}
}
else if(s1=="#r"||s1=="#read")
{
pFrame->KillTimer(2);
m_sScript.Empty();
CStdioFile file(s2,CFile::modeRead);
while(file.ReadString(s1))
{
s1.TrimRight();
m_sScript+=s1+";";
}
file.Close();
pFrame->SetTimer(2,pFrame->m_nTime,NULL);
}
else if(s1=="#wa"||s1=="#wait")
{
int num=::atoi((LPTSTR)(LPCTSTR)s2);
if(num>pFrame->m_nTime)
{
pFrame->KillTimer(2);
m_bWaiting=TRUE;
pFrame->SetTimer(2,num,NULL);
EchoSend(cmd);
}
}
else if(s1=="#b"||s1=="#back")
{
if(!s2.IsEmpty())
{
n=::atoi(s2.GetBuffer(10));
if(!m_directBuffer.IsEmpty())
OnBack();
if(n<0)
s1="#back -1;";
else if(--n)
s1.Format("#back %d;",n);
else
s1.Empty();
if(!m_directBuffer.IsEmpty())
strCmds=s1+strCmds;
}
else
OnClear();
}
else if(s1=="#a"||s1=="#abort")
{
pFrame->KillTimer(2);
m_sScript.Empty();
EchoSend(cmd);
}
else if(s1=="#d"||s1=="#define")
{
if(s2.IsEmpty())
m_listDefine.RemoveAll();
else
{
POSITION pos=m_listDefine.GetHeadPosition();
while(pos)
{
s1=m_listDefine.GetNext(pos);
if(s1==s2)
return;
}
m_listDefine.AddTail(s2);
}
EchoSend(cmd);
}
else if(s1=="#int"||s1=="#str")
{
Var(s1,s2);
EchoSend(cmd);
}
else if(s1=="#if"&&s2.IsEmpty())
{
n=m_listIf.GetCount();
CTriger* pt;
while(n--)
{
pt=(CTriger*)m_listIf.RemoveTail();
delete pt;
}
EchoSend(cmd);
}
else if(s1.Left(3)=="#if")
{
If(s1,s2);
EchoSend(cmd);
}
else if(s1=="#w"||s1=="#wake")
{
CTriger* pt;
s2="#if"+s2;
POSITION pos0,pos=m_listIf.GetHeadPosition();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -