⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdoc.cpp

📁 CMUD源码 用来玩MUD游戏的 没开发完
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -