// Mud32doc.cpp : implementation of the CMudDoc class // #include "stdafx.h" #include "gmud32.h" #include "gmud32doc.h" #include "csmartsocket.h" #include "connectd.h" #include "selarray.h" #include "triggerd.h" #include "selarraydlg.h" #include "world.h" #include "triggerarray.h" #include "macroarray.h" #include "macro.h" #include "AliasArray.h" #include "AliasDialog.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMudDoc IMPLEMENT_DYNCREATE(CMudDoc, CDocument) BEGIN_MESSAGE_MAP(CMudDoc, CDocument) //{{AFX_MSG_MAP(CMudDoc) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMudDoc construction/destruction #define new DEBUG_NEW CMudDoc::CMudDoc() { // TODO: add one-time construction code here } CMudDoc::~CMudDoc() { for(int loop=0;loop<m_aWorlds.GetSize();loop++) delete m_aWorlds[loop]; } BOOL CMudDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; CTriggerArray *pArray = new CTriggerArray; pArray->SetName("Default"); m_aTriggers.Add(pArray); CMacroArray *pMacroArray = new CMacroArray; pMacroArray->SetName("Default"); m_aMacros.Add(pMacroArray); for(int mloop=1;mloop<11;mloop++) { char temps[4]; wsprintf(temps,"F%d",mloop); CMacro *pMac = new CMacro; pMac->SetName(temps); pMac->m_sText=""; pMacroArray->Add(pMac); } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMudDoc serialization void CMudDoc::Serialize(CArchive& ar) { #define DOCVER 3 CObject::Serialize(ar); WORD wVer=DOCVER; if (ar.IsStoring()) { ar << wVer; m_aWorlds.Serialize(ar); m_aTriggers.Serialize(ar); m_aMacros.Serialize(ar); m_aAliases.Serialize(ar); } else { if (ar.GetFile()->GetLength() == 0) { CTriggerArray *pArray = new CTriggerArray; pArray->SetName("Default"); m_aTriggers.Add(pArray); CMacroArray *pMacroArray = new CMacroArray; pMacroArray->SetName("Default"); m_aMacros.Add(pMacroArray); CAliasArray *pAliases = new CAliasArray; pAliases->SetName("Default"); m_aAliases.Add(pAliases); for(int mloop=1;mloop<11;mloop++) { char temps[4]; wsprintf(temps,"F%d",mloop); CMacro *pMac = new CMacro; pMac->SetName(temps); pMac->m_sText=""; pMacroArray->Add(pMac); } } else { ar >> wVer; if(wVer >DOCVER) { AfxMessageBox("Error: World List file is a newer version than program, can not load, aborting load."); return; } m_aWorlds.Serialize(ar); if(wVer<2) { AfxMessageBox("Upgrading your world list to new format with multiple macro / trigger setups."); CTriggerArray *pArray = new CTriggerArray; pArray->SetName("Default"); m_aTriggers.Add(pArray); CObArray ary; ary.Serialize(ar); for(int loop=0;loop<ary.GetSize();loop++) pArray->Add( (CSelectable *)(ary.GetAt(loop))); CMacroArray *pMacroArray = new CMacroArray; pMacroArray->SetName("Default"); m_aMacros.Add(pMacroArray); for(int mloop=1;mloop<11;mloop++) { char temps[4]; wsprintf(temps,"F%d",mloop); CMacro *pMac = new CMacro; pMac->SetName(temps); pMac->m_sText=AfxGetApp()->GetProfileString("MACROS",temps); pMacroArray->Add(pMac); } } else { m_aTriggers.Serialize(ar); m_aMacros.Serialize(ar); } if(wVer < 3) { CAliasArray *pAliases = new CAliasArray; pAliases->SetName("Default"); m_aAliases.Add(pAliases); } else { m_aAliases.Serialize(ar); } } } } ///////////////////////////////////////////////////////////////////////////// // CMudDoc diagnostics #ifdef _DEBUG void CMudDoc::AssertValid() const { CDocument::AssertValid(); } void CMudDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMudDoc commands BOOL CMudDoc::CanCloseFrame(CFrameWnd* /* pFrame */) { return DoSave(m_strPathName); } BOOL CMudDoc::SaveModified() { return DoSave(m_strPathName); } int CMudDoc::EditWorldList() { CConnectDialog dlg; dlg.m_bShowConnect=FALSE; dlg.m_paWorlds = &m_aWorlds; dlg.m_pTriggers=&m_aTriggers; dlg.m_pMacros = &m_aMacros; dlg.m_pAliases= &m_aAliases; SetModifiedFlag(); return dlg.DoModal(); } int CMudDoc::EditTriggerList(CWorld *pWorld) { if(pWorld) { CTriggerDialog dlg; CSelArray *pArray = (CSelArray *)m_aTriggers.Get(pWorld->m_sTriggerList); if(!pArray) { AfxMessageBox("Cannot find trigger list for this world, switching to default trigger list."); pArray = (CSelArray *)m_aTriggers.Get("default"); } ASSERT_VALID(pArray); dlg.SetTriggers(pArray); SetModifiedFlag(); return dlg.DoModal(); } return FALSE; } CWorld *CMudDoc::GetWorld(CString sName,WORD wPort) { for(int loop=0;loop<m_aWorlds.GetSize();loop++) { CWorld *pWorld = (CWorld *)m_aWorlds[loop]; if(wPort) { if(pWorld->m_sHostName.CompareNoCase(sName)==0 && pWorld->m_wPort == wPort) return pWorld; } else { if(pWorld->m_sName.CompareNoCase(sName)==0) return pWorld; } } return NULL; } CMudDoc::AddWorld(CWorld *pWorld) { return m_aWorlds.Add(pWorld); } int CMudDoc::EditAliasList(CWorld * pWorld) { if(pWorld) { CAliasDialog dlg; CSelArray *pArray = (CSelArray *)m_aAliases.Get(pWorld->m_sAliasList); if(!pArray) { AfxMessageBox("Cannot find alias list for this world, switching to default trigger list."); pArray = (CSelArray *)m_aTriggers.Get("default"); } ASSERT_VALID(pArray); dlg.SetAliases((CAliasArray *)pArray); SetModifiedFlag(); return dlg.DoModal(); } return FALSE; }