/* ** AreaEditor - a program for editing SMAUG and ROM area files. ** Author: Nick Gammon ** http://www.gammon.com.au/ ** See Copyright Notice at the end of AreaEditor.h */ // ObjectResetsPage.cpp : implementation file // #include "stdafx.h" #include "AreaEditor.h" #include "AreaEditorDoc.h" #include "ObjectResetsPage.h" #include "defaults.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CObjectResetsPage dialog CObjectResetsPage::CObjectResetsPage(CWnd* pParent /*=NULL*/) : CDialog(CObjectResetsPage::IDD, pParent) { //{{AFX_DATA_INIT(CObjectResetsPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_object = NULL; } void CObjectResetsPage::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CObjectResetsPage) DDX_Control(pDX, IDC_GOTO_RESET, m_ctlGoToReset); DDX_Control(pDX, IDC_LOADED, m_ctlLoadedList); //}}AFX_DATA_MAP if (!pDX->m_bSaveAndValidate) AddResets (); } BEGIN_MESSAGE_MAP(CObjectResetsPage, CDialog) //{{AFX_MSG_MAP(CObjectResetsPage) ON_BN_CLICKED(IDC_GOTO_RESET, OnGotoReset) ON_LBN_DBLCLK(IDC_LOADED, OnDblclkLoaded) ON_LBN_SELCANCEL(IDC_LOADED, OnSelcancelLoaded) ON_LBN_SELCHANGE(IDC_LOADED, OnSelchangeLoaded) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CObjectResetsPage message handlers void CObjectResetsPage::AddResets (void) { POSITION resetPos; CReset * reset; CMUDObject * object; CRoom * room; CMobile * mob = NULL; CString strMob; CString strResult; m_ctlLoadedList.ResetContent (); // scan all open areas for resets for (POSITION docPos = App.m_pDocTemplate->GetFirstDocPosition(); docPos != NULL; ) { CAreaEditorDoc * pDoc = (CAreaEditorDoc *) App.m_pDocTemplate->GetNextDoc(docPos); // process each reset for (resetPos = pDoc->m_ResetList.GetHeadPosition (); resetPos; ) { reset = pDoc->m_ResetList.GetNext (resetPos); switch (reset->command) { case 'M': // load mobile - remember for next Equip mob = pDoc->get_mob_index( reset->arg1); if (mob) strMob = mob->Summary (); else if (mob = FindMob (reset->arg1)) strMob = (FullMobName (mob)); else strMob = CFormat ("#%i (not in area)", reset->arg1); break; case 'E': // equip case 'G': // equip if (reset->arg1 != m_object->vnum) break; // wrong object - forget it reset->AddToListBox (m_ctlLoadedList, CFormat ("Mob %s: %s", reset->command == 'E' ? "equip" : "give", (LPCTSTR) strMob)); break; case 'O': // load object if (reset->arg1 != m_object->vnum) break; // wrong object - forget it room = pDoc->get_room_index ( reset->arg3); if (room) strResult = room->Summary (); else if (room = FindRoom (reset->arg3)) strResult = (FullRoomName (room)); else strResult = CFormat ("#%i (not in area)", reset->arg3); reset->AddToListBox (m_ctlLoadedList, CFormat ("Room: %s", (LPCTSTR) strResult)); break; case 'P': // put object if (reset->arg1 == m_object->vnum) { object = pDoc->get_obj_index( reset->arg3); if (object) strResult = object->Summary (); else if (object = FindObj ( reset->arg3 )) strResult = FullObjName (object); else strResult = CFormat ("#%i (not in area)", reset->arg3); // aha! - add to list of resets reset->AddToListBox (m_ctlLoadedList, CFormat ("Put into object: %s", (LPCTSTR) strResult)); } // end of match on arg1 if (reset->arg3 != m_object->vnum) break; // wrong object - forget it object = pDoc->get_obj_index( reset->arg1); if (object) strResult = object->Summary (); else if (object = FindObj ( reset->arg1 )) strResult = FullObjName (object); else strResult = CFormat ("#%i (not in area)", reset->arg1); // aha! - add to list of resets reset->AddToListBox (m_ctlLoadedList, CFormat ("Contains object: %s", (LPCTSTR) strResult)); break; } // end of switch } // end of processing each reset // now look for program cross-references // process each mob CMUDprogram * program; CString strErrorMessage; for (POSITION mobPos = pDoc->m_MobList.GetHeadPosition (); mobPos; ) { mob = pDoc->m_MobList.GetNext (mobPos); for (POSITION progPos = mob->programlist.GetHeadPosition (); progPos; ) { POSITION pos; program = mob->programlist.GetNext (progPos); for (pos = program->xref_objects.GetHeadPosition (); pos; ) if (program->xref_objects.GetNext (pos) == m_object->vnum) program->AddToListBox (m_ctlLoadedList, CFormat ("Mob prog: %s <%s>", (LPCTSTR) mob->Summary (), (LPCTSTR) program->Summary ())); } // end of each program } // end of each mob // process each room for (POSITION RoomPos = pDoc->m_RoomList.GetHeadPosition (); RoomPos; ) { room = pDoc->m_RoomList.GetNext (RoomPos); for (POSITION progPos = room->programlist.GetHeadPosition (); progPos; ) { POSITION pos; program = room->programlist.GetNext (progPos); for (pos = program->xref_objects.GetHeadPosition (); pos; ) if (program->xref_objects.GetNext (pos) == m_object->vnum) program->AddToListBox (m_ctlLoadedList, CFormat ("Room prog: %s <%s>", (LPCTSTR) room->Summary (), (LPCTSTR) program->Summary ())); } // end of each program // process each exit to see if it uses this object as a key CExit * exit; for (POSITION exitPos = room->exitlist.GetHeadPosition (); exitPos; ) { exit = room->exitlist.GetNext (exitPos); // forget it, if the wrong object if (exit->key != m_object->vnum) continue; exit->AddToListBox (m_ctlLoadedList, CFormat ("Key to %s from #%i (%s)", (LPCTSTR) RoomDirectionList.ReturnName (exit->vdir, false), room->vnum, (LPCTSTR) room->name)); } } // end of each room // process each object for (POSITION ObjectPos = pDoc->m_ObjectList.GetHeadPosition (); ObjectPos; ) { object = pDoc->m_ObjectList.GetNext (ObjectPos); for (POSITION progPos = object->programlist.GetHeadPosition (); progPos; ) { POSITION pos; program = object->programlist.GetNext (progPos); for (pos = program->xref_objects.GetHeadPosition (); pos; ) if (program->xref_objects.GetNext (pos) == m_object->vnum) program->AddToListBox (m_ctlLoadedList, CFormat ("Object prog: %s <%s>", (LPCTSTR) object->Summary (), (LPCTSTR) program->Summary ())); } // end of each program } // end of each object } // end of doing each document OnSelchangeLoaded (); } // end of CObjectResetsPage::AddEntrances void CObjectResetsPage::OnGotoReset() { // find which item they selected, and go to it int nItem = m_ctlLoadedList.GetCurSel( ); if (nItem != LB_ERR) ((CMUDitem *) m_ctlLoadedList.GetItemData (nItem))->GoTo (); } void CObjectResetsPage::OnSelchangeLoaded() { // find which item they selected int nItem = m_ctlLoadedList.GetCurSel( ); m_ctlGoToReset.EnableWindow (nItem != LB_ERR); } void CObjectResetsPage::OnDblclkLoaded() { OnGotoReset (); } void CObjectResetsPage::OnSelcancelLoaded() { OnSelchangeLoaded (); }