📄 gdoc.cpp
字号:
while(pos)
{
pos0=pos;
pt=(CTriger*) m_listIf.GetNext(pos);
if(pt->m_sID==s2)
{
pt->m_bActive=TRUE;
EchoSend(cmd);
break;
}
}
}
else if(s1=="#p"||s1=="#play")
{
Play(s2);
EchoSend(cmd);
}
}
else
{
CString ret;
if(GetDefine(s1,s2,ret))
{
strCmds=ret+";"+strCmds;
Sending(strCmds);
}
else
SendCmd(cmd);
}
}
void CGDoc::SendTime(UINT nID)
{
CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
switch(nID)
{
case 2:
if(m_bWaiting)
{
pFrame->KillTimer(2);
m_bWaiting=FALSE;
pFrame->SetTimer(2,pFrame->m_nTime,NULL);
}
if(m_sScript.IsEmpty())
if(m_sLoop.IsEmpty())
{
pFrame->KillTimer(2);
break;
}
else
m_sScript=m_sLoop;
Sending(m_sScript);
break;
case 3:
SendCmds(m_sTimer);
}
}
BOOL CGDoc::GetDefine(CString s1, CString s2, CString &ret)
{
POSITION pos=m_listDefine.GetHeadPosition();
while(pos)
{
ret=m_listDefine.GetNext(pos);
if(s1==ret.SpanExcluding("( "))
{
int m,n;
n=ret.Find("(");
m=ret.Find(")",n);
CString ds1,ds2,s(ret.Mid(n+1,m-n-1)+",");
ret=ret.Mid(m+1);
if(!s2.IsEmpty())
{
s.Replace(","," ");
s2+=" ";
while(-1!=(n=s.Find(" ")))
{
ds1=s.Left(n);
s=s.Mid(n);
s.TrimLeft();
m=s2.Find(" ");
ds2=s2.Left(m);
s2=s2.Mid(m);
s2.TrimLeft();
ret.Replace(" "+ds1," "+ds2);
}
}
return TRUE;
}
}
return FALSE;
}
CVar* CGDoc::FindVar(CString name)
{
CVar* pv=NULL;
POSITION pos=m_listVar.GetHeadPosition();
while(pos)
{
pv=(CVar*)m_listVar.GetNext(pos);
if(pv->m_sName==name)
break;
else
pv=NULL;
}
return pv;
}
BOOL CGDoc::Check(CString cmd)
{
if(!cmd.IsEmpty()&&-1!=m_sDirection.Find(cmd))
{
m_directBuffer.AddTail(cmd);
if(m_directBuffer.GetCount()>50)
m_directBuffer.RemoveHead();
return TRUE;
}
return FALSE;
}
void CGDoc::OnBack()
{
if(!m_directBuffer.IsEmpty())
{
CString s=m_directBuffer.RemoveTail();
s=Reverse(s);
SendCmd(s,FALSE);
}
else
::Beep(-1,1);
}
CString CGDoc::Reverse(CString s)
{
if(s=="north"||s=="n")
s="south";
else if(s=="south"||s=="s")
s="north";
else if(s=="west"||s=="w")
s="east";
else if(s=="east"||s=="e")
s="west";
else if(s=="northeast"||s=="ne")
s="southwest";
else if(s=="southwest"||s=="sw")
s="northeast";
else if(s=="northwest"||s=="nw")
s="southeast";
else if(s=="southeast"||s=="se")
s="northwest";
else if(s=="northup"||s=="nu")
s="southdown";
else if(s=="southdown"||s=="sd")
s="northup";
else if(s=="southup"||s=="su")
s="northdown";
else if(s=="westup"||s=="wu")
s="eastdown";
else if(s=="eastup"||s=="eu")
s="westdown";
else if(s=="westdown"||s=="wu")
s="eastup";
else if(s=="eastdown"||s=="eu")
s="westup";
else if(s=="enter")
s="out";
else if(s=="out")
s="enter";
else if(s=="up"||s=="u")
s="down";
else if(s=="down"||s=="d")
s="up";
return s;
}
void CGDoc::ExtractCmds(CString s, CStringList &list)
{
int count,n=-1;
CString ss;
do
{
s=s.Mid(n+1);
ss=s.SpanExcluding(";");
count=1;
ss.TrimLeft();
if('#'==ss.Left(1))
{
CString temp;
int n=ss.Find(' ',1);
if(n!=-1)
{
temp=ss.Mid(1,n-1);
ss=ss.Mid(n+1);
}
else
temp=ss.Mid(1);
count=::atol(LPCTSTR(temp));
}
while(count--)
list.AddTail(ss);
}while(-1!=(n=s.Find(';')));
}
void CGDoc::OnConvert()
{
CString s0,s,fileName;
CStringList sList0,sList;
if(CMainFrame::GetFileName(fileName))
{
CStdioFile file(fileName,CFile::modeRead);
while(file.ReadString(s))
sList0.AddTail(s);
file.Close();
AfxMessageBox("转换结束,请选择储存文件:");
if(CMainFrame::GetFileName(fileName,FALSE))
{
CString last,oneLine;
int count;
file.Open(fileName,CFile::modeCreate|CFile::modeWrite);
POSITION pos0=sList0.GetTailPosition();
while(pos0)
{
s0=sList0.GetPrev(pos0);
sList.RemoveAll();
/////////////////
ExtractCmds(s0,sList);
//////////////////
last.Empty();
oneLine.Empty();
POSITION pos=sList.GetTailPosition();
while(pos)
{
s=sList.GetPrev(pos);
s=Reverse(s);
if(last.IsEmpty())
{
last=s;
count=0;
}
if(last==s)
count++;
if(last!=s)
{
if(count>1)
{
CString temp;
temp.Format("#%d %s",count,last);
last=temp;
}
oneLine+=last+";";
last=s;
count=1;
}
}
if(count>1)
{
CString temp;
temp.Format("#%d %s",count,last);
last=temp;
}
oneLine+=last+"\n";
file.WriteString(oneLine);
}
file.Close();
}
}
}
void CGDoc::OnSaveRoutes()
{
if(m_directBuffer.IsEmpty())
{
AfxMessageBox("没有路径存储!");
return;
}
CString name;
if(CMainFrame::GetFileName(name,FALSE))
{
CStdioFile file(name,CFile::modeCreate|CFile::modeWrite);
POSITION pos=m_directBuffer.GetHeadPosition();
while(pos)
file.WriteString(m_directBuffer.GetNext(pos)+"\n");
file.Close();
}
}
void CGDoc::OnClear()
{
m_directBuffer.RemoveAll();
EchoSend("清除路径纪录");
}
void CGDoc::Play(CString s2)
{
if(s2.IsEmpty())
{
PlaySound(NULL, NULL,0 );
if(m_pMidi)
{
m_pMidi->Close();
delete m_pMidi;
m_pMidi=NULL;
}
}
else
{
int n;
CString s1;
n=s2.ReverseFind('.');
s1=s2.Mid(n+1);
s1.MakeLower();
if(s1=="mid")
{
if(m_pMidi)
delete m_pMidi;
m_pMidi=new CMidi;
if(m_pMidi->Open(s2))
m_pMidi->Play();
else
{
delete m_pMidi;
m_pMidi=NULL;
}
}
else if(s1=="wav")
{
/* if(m_pWave)
delete m_pWave;
m_pWave=new CWave(s2);
if(m_pWave)
m_pWave->Play();*/
PlaySound(s2, NULL, SND_FILENAME | SND_ASYNC | SND_NODEFAULT );
}
else
EchoSend("无法播放!",31);
}
}
void CGDoc::If(CString s1, CString s2)
{
int m,n;
CTriger* pt=NULL;
POSITION pos=m_listIf.GetHeadPosition();
while(pos)
{
pt=(CTriger*) m_listIf.GetNext(pos);
if(pt->m_sID==s1)
break;
pt=NULL;
}
if(!s2.IsEmpty()) //s2不空,修改,增加if
{
CString temp;
if(s2.Left(1)!="\"") //是变量
{
CString a,c;
n=s2.FindOneOf(">=<!");
if(n!=-1)
{
a=s2.Left(n);
s2=s2.Mid(n);
}
else
a=s2.SpanExcluding(" ");
c=s2.SpanIncluding(">=<!");
m=s2.Find(" ");
temp=c.IsEmpty()?"":s2.Mid(c.GetLength(),m-c.GetLength());
s2=s2.Mid(m+1);
if(!pt)
{
CTriger* pt=new CTriger;
pt->Create(s1,a,c,temp,s2);
m_listIf.AddTail(pt);
}
else
pt->Create(s1,a,c,temp,s2);
}
else //是触发#if1 "skdj" c
{
s2=s2.Mid(1);
temp=s2.SpanExcluding("\"");
s2=s2.Mid(temp.GetLength()+1);
s2.TrimLeft();
if(!pt)
{
CTriger* pt=new CTriger;
pt->Create(s1,"","=",temp,s2);
m_listIf.AddTail(pt);
}
else
pt->Create(s1,"","=",temp,s2);
}
}
else if(pt) //s2空,找到 FALSE
pt->m_bActive=FALSE;
}
void CGDoc::OnEnter()
{
SendCmd("",FALSE);
}
void CGDoc::OnAuto()
{
CString name;
if(CMainFrame::GetFileName(name))
SendCmds("#read "+name);
}
void CGDoc::OnStopAuto()
{
SendCmds("#timer;#abort;#loop;#define;#if");
int n=m_listVar.GetCount();
CVar* pv;
while(n--)
{
pv=(CVar*)m_listVar.RemoveTail();
delete pv;
}
EchoSend("清除变量");
}
void CGDoc::OnAutoView()
{
CSdlg dlg(this);
dlg.DoModal();
}
void CGDoc::Var(CString s1, CString s2)
{
int n;
CVar* pv=NULL;
CString name,s,var;
name=s2.SpanExcluding(" ");
s2=s2.Mid(name.GetLength());
s2.TrimLeft();
if(s2.Left(1)!="\"")
{
var=s2;
s2.Empty();
}
else
{
s2.Replace("\"","");
var=VARX;
n=s2.Find(var);
if(n!=-1)
{
s=s2.Left(n);
s2=s2.Mid(n+var.GetLength());
}
else
{
EchoSend("错误");
return;
}
var.Empty();
}
//是否已经存在
POSITION pos=m_listVar.GetHeadPosition();
while(pos)
{
pv=(CVar*)m_listVar.GetNext(pos);
if(pv->m_sName==name)
break;
pv=NULL;
}
if(!pv) //不存在
{
pv=new CVar;
pv->Create(s1,name,s,s2,var);
m_listVar.AddTail(pv);
}
else
pv->Create(s1,name,s,s2,var);
}
LONG CGDoc::OnMciNotify(UINT wFlags, LONG lDevId)
{
if (wFlags==MCI_NOTIFY_SUCCESSFUL)
{
Play(m_soundArray[m_nSound]);
if (++m_nSound >= m_soundArray.GetSize())
m_nSound = 0;
}
return 0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -