///////////////////////////////////////////////////////////////////////////// // // Mud32.cpp : Defines the class behaviors for the application. // // CMudApp #include "stdafx.h" #define DEFINE_STORAGE_HERE #include "gmud32.h" #include "mainfrm.h" #include "childfrm.h" #include "gmud32doc.h" #include "gmud32vw.h" #include "stdlib.h" #include "textclr.h" #include "soundsdi.h" #include "wrapopti.h" #include "io.h" #include "world.h" #include "lowlev.h" #include "ctype.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif CString GetFileName(); BEGIN_MESSAGE_MAP(CMudApp, CWinApp) //{{AFX_MSG_MAP(CMudApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_WINDOW_NEW_OPEN_DOC, OnWindowNewOpenDoc) ON_COMMAND(ID_FILE_EDITWORLDLIST, OnFileEditworldlist) ON_COMMAND(ID_VIEW_FONT, OnViewFont) ON_COMMAND(ID_WINDOW_COLOR, OnWindowColor) ON_COMMAND(ID_SOUNDS_SETTINGS, OnSoundsSettings) ON_COMMAND(ID_VIEW_WRAP, OnViewWrap) ON_COMMAND(ID_FILE_TOGGLELOCALECHOING, OnFileTogglelocalechoing) ON_UPDATE_COMMAND_UI(ID_FILE_TOGGLELOCALECHOING, OnUpdateFileTogglelocalechoing) //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMudApp construction #define GMUD_PRESENCE_IDENTIFIER "GMud is in Memory" CMudApp::CMudApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance char buff[270]; GetCurrentDirectory(270,buff); m_sDir=buff; // WNDCLASS wc; // memset(wc,0,sizeof(WNDCLASS)); // wc.lpszClassName=GMUD_PRESENCE_IDENTIFIER; // RegisterClass(&wc); } CMudApp::~CMudApp() { WriteProfileString("font","Facename",m_LogFont.lfFaceName); WriteProfileInt("Font","Size",m_LogFont.lfHeight); char temps[22]; wsprintf(temps,"%ld",m_colorBackGround); WriteProfileString("colors","Background",temps); wsprintf(temps,"%ld",m_colorForeGround); WriteProfileString("colors","Foreground",temps); WriteProfileInt("Sounds","Bell",m_bBell); WriteProfileInt("Sounds","Trigger",m_bTriggerSound); WriteProfileInt("Sounds","ConnectBeep",m_bConnectBeep); WriteProfileInt("Wrap","Screen",m_bScreenWrap); WriteProfileInt("Wrap","Word",m_bWordWrap); WriteProfileInt("Wrap","Indent",m_bIndent); WriteProfileInt("Display","Ansi",m_bAnsi); WriteProfileInt("Display","LocalEcho",m_bEcho); } CString OldGetFileName() { CString filename="WorldLis.mud"; CString dir; dir=getenv("HOMEPATH"); if(dir=="") { //"//users/username/" char temps[_MAX_PATH]; GetWindowsDirectory(temps,_MAX_PATH); dir=temps; } if(dir[dir.GetLength()-1]!='\\') dir+="\\"; return dir+filename; } CString GetFileName() { CString filename="WorldLis.mud"; return GetApp()->m_sDir+"\\"+filename; } ///////////////////////////////////////////////////////////////////////////// // The one and only CMudApp object ///////////////////////////////////////////////////////////////////////////// // CMudApp initialization BOOL CMudApp::InitInstance() { if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; } // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. Enable3dControls(); LoadStdProfileSettings(); // Load standard INI file options (including MRU) memset(&m_LogFont,0,sizeof(m_LogFont)); strcpy(m_LogFont.lfFaceName,GetProfileString("font","facename","Courier New")); m_LogFont.lfHeight=GetProfileInt("font","size",-12); // get background color CString str=GetProfileString("colors","Background","none"); if(str=="none" || (!atoi(str) && *str!='0')) m_colorBackGround=RGB(0,0,0); else sscanf(str,"%ld",&m_colorBackGround); // get foreground color str=GetProfileString("colors","Foreground","none"); if(str=="none" || (!atoi(str) && *str!='0')) m_colorForeGround=RGB(255,255,255); else sscanf(str,"%ld",&m_colorForeGround); // Get Sounds Settings m_bBell=GetProfileInt("Sounds","Bell",1); m_bTriggerSound=GetProfileInt("Sounds","Trigger",1); m_bConnectBeep=GetProfileInt("Sounds","ConnectBeep",0); // get screen wrapping preferences m_bScreenWrap=GetProfileInt("Wrap","Screen",0); m_bWordWrap=GetProfileInt("Wrap","Word",0); m_bIndent=GetProfileInt("Wrap","Indent",0); m_bEcho=GetProfileInt("Display","LocalEcho",1); // other screen preferences m_bAnsi=GetProfileInt("Display","Ansi",1); // Register the application's document templates. Document templates // Serve as the connection between documents, frame windows and views. CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MudTYPE, RUNTIME_CLASS(CMudDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CMudView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; CMudDoc *pDoc; // create a new (empty) document if(access(GetFileName(),0)) { if(access(OldGetFileName(),0)) { AfxMessageBox("Could not find World List, Creating new world list"); OnFileNew(); } else { AfxMessageBox("Moving world list data file from "+OldGetFileName()+" to "+GetFileName()); pDoc=(CMudDoc *)OpenDocumentFile(OldGetFileName()); } } else pDoc=(CMudDoc *)OpenDocumentFile(GetFileName()); CMDIChildWnd * pChild=pMainFrame->MDIGetActive(); if(pChild) { pDoc=(CMudDoc *)pChild->GetActiveDocument(); pChild->MDIMaximize(); } if(pDoc) pDoc->SetPathName(GetFileName(),FALSE); else { AfxMessageBox("Error creating world list data file "+GetFileName()+", aborting program."); return FALSE; } // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); if(!*m_lpCmdLine) return TRUE; // process command line arguments long port=0; char *progname="GMUD32"; char mudname[255]; CWorld *pWorld = 0; LPSTR pStr; // skip any leading space lstrcpy(mudname,skipspace(m_lpCmdLine)); pStr=mudname; while(*pStr) // skip to end of string pStr++; while(isspace(*(pStr-1))) // remove trailing spaces pStr--; *pStr=0; // null term string pWorld = pDoc->GetWorld(m_lpCmdLine); // try whole string first, in case numbers at end of world string if(!pWorld) // couldn't find it that way... { while(isdigit(*(pStr-1))) // skip back to beginning of port number pStr--; if(isdigit(*pStr)) // we've found a port number { port=atol(pStr); while(isspace(*(pStr-1))) // remove spaces between address/port pStr--; *pStr=0; } pWorld = pDoc->GetWorld(mudname,(WORD)port); } if(!pWorld) // couldn't find world or host/port { if(!port) // weren't specifying port, so error { CString message; message.Format("Could not find world \'%s\'\nUsage: %s worldname\n or: %s hostname port",m_lpCmdLine,progname,progname); AfxMessageBox(message); return TRUE; } pWorld = new CWorld; pWorld->m_sName = mudname; pWorld->m_sHostName = mudname; pWorld->m_wPort = (WORD)port; pDoc->AddWorld(pWorld); } CMudView *pView = (CMudView *)pChild->GetActiveView(); if(pWorld) pView->Connect(pWorld); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Implementation protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //{{AFX_MSG(CAboutDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog void CMudApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CMudApp commands // CWinApp OnWindowNew void CMudApp::OnWindowNewOpenDoc() { if(!GetOpenDocumentCount()) OpenDocumentFile(GetFileName()); else m_pMainWnd->PostMessage(WM_COMMAND,ID_WINDOW_NEW); } void CMudApp::OnFileEditworldlist() { CMudDoc *pDoc=0; int deletedoc=FALSE; if(!GetOpenDocumentCount()) { pDoc = new CMudDoc(); if(!pDoc->OnOpenDocument(GetFileName())) { delete pDoc; pDoc=0; } else deletedoc=TRUE; } else { CMainFrame *pFrame = (CMainFrame *)GetMainWnd(); if(pFrame) { CMDIChildWnd *pChild = pFrame->MDIGetActive(); if(pChild) pDoc=(CMudDoc *)pChild->GetActiveDocument(); } } if(pDoc) { pDoc->EditWorldList(); pDoc->OnSaveDocument(GetFileName()); } else AfxMessageBox("Error opening World List, Cannot edit."); if(deletedoc) delete pDoc; } void CMudApp::OnViewFont() { CFontDialog dlg(&m_LogFont,CF_ANSIONLY|CF_FIXEDPITCHONLY|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS); if(dlg.DoModal()==IDOK) { memcpy(&m_LogFont,dlg.m_cf.lpLogFont,sizeof(LOGFONT)); m_pMainWnd->SendMessageToDescendants(WM_FONTCHANGED); } } void CMudApp::OnWindowColor() { CTextClrDlg dlg; dlg.m_colorBackGround=m_colorBackGround; dlg.m_colorForeGround=m_colorForeGround; dlg.m_bAnsi = m_bAnsi; if(dlg.DoModal()==IDOK) { m_colorBackGround=dlg.m_colorBackGround; m_colorForeGround=dlg.m_colorForeGround; m_bAnsi=dlg.m_bAnsi; m_pMainWnd->SendMessageToDescendants(WM_COLORCHANGED); } } void CMudApp::OnSoundsSettings() { CSoundsDialog dlg; dlg.m_bBell = m_bBell; dlg.m_bTriggerSound=m_bTriggerSound; dlg.m_bConnectBeep=m_bConnectBeep; if(dlg.DoModal()==IDOK) { m_bBell = dlg.m_bBell; m_bTriggerSound=dlg.m_bTriggerSound; m_bConnectBeep=dlg.m_bConnectBeep; } } void CMudApp::OnViewWrap() { CWrapOptions dlg; dlg.m_iWrapWidth = m_bScreenWrap; dlg.m_iWordWrap = m_bWordWrap; dlg.m_bIndent = m_bIndent; if(dlg.DoModal()==IDOK) { m_bScreenWrap = dlg.m_iWrapWidth; m_bWordWrap = dlg.m_iWordWrap; m_bIndent=dlg.m_bIndent; } } BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); CenterWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMudApp::OnFileTogglelocalechoing() { if(m_bEcho) m_bEcho=FALSE; else m_bEcho=TRUE; } void CMudApp::OnUpdateFileTogglelocalechoing(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bEcho); }