/* * Arcanum Editor - ROM area editor * Copyright (C) 1999 Lucas Wall <kthulhu@usa.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * If you make changes to the source and want to make the public you can * mail the diferences to me <kthulhu@usa.net> and I'll add them to the * main distribution. Of course your name will be added to the program with * information about the changes you made. * * * Packed on Thu Aug 19 03:02:24 1999 * */ /* * File: RoomEd.cpp * * Changes: * * 19/08/99 Lucas Wall <kthulhu@usa.net> * First source release. Its quite messy and has no * comments. I never planed to release the source code... :-) * */ // RoomEd.cpp : implementation file // #include "stdafx.h" #include "arcaed.h" #include "RoomEd.h" #include "ResetEd.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CRoomEd dialog CRoomEd::CRoomEd(CWnd* pParent /*=NULL*/) : CDialog(CRoomEd::IDD, pParent) { //{{AFX_DATA_INIT(CRoomEd) m_Clan = _T(""); m_Description = _T(""); m_Name = _T(""); m_Owner = _T(""); m_Vnum = 0; m_HitGain = 0; m_ManaGain = 0; m_ExitDescription = _T(""); m_ExitKeyword = _T(""); m_ExitVnum = 0; m_ExitAbajo = FALSE; m_ExitArriba = FALSE; m_ExitEste = FALSE; m_ExitNorte = FALSE; m_ExitOeste = FALSE; m_ExitSur = FALSE; m_ExitLlave = 0; m_ExtraEd = _T(""); //}}AFX_DATA_INIT m_pDoc = NULL; m_maxvnum = m_minvnum = -999; m_index = -1; m_cursector = 0; m_roomflags = 0; m_imagelist.Create( 16, 16, ILC_COLOR, 2, 1 ); m_imagelist.SetBkColor( RGB( 255, 255, 255 ) ); m_imagelist.Add( AfxGetApp()->LoadIcon( IDI_OFF ) ); m_imagelist.Add( AfxGetApp()->LoadIcon( IDI_ON ) ); m_accel = LoadAccelerators( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDR_ROOMED_ACC ) ); } void CRoomEd::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRoomEd) DDX_Control(pDX, IDC_ROOMED_RESET_DOWN, m_ResetsDown); DDX_Control(pDX, IDC_ROOMED_RESET_UP, m_ResetsUp); DDX_Control(pDX, IDC_ROOMED_RESETS, m_Resets); DDX_Control(pDX, IDC_ROOMED_FLAGS, m_Flags); DDX_Control(pDX, IDC_ROOMED_EXIT_FLAGS, m_ExitFlags); DDX_Control(pDX, IDC_ROOMED_SECTORTYPE, m_SectorType); DDX_Control(pDX, IDC_ROOMED_EXTRAED_LIST, m_ExtraEdList); DDX_Control(pDX, IDC_ROOMED_EXIT_VNUM_SPIN, m_ExitVnumSpin); DDX_Control(pDX, IDC_ROOMED_EXIT_LLAVE_SPIN, m_ExitLlaveSpin); DDX_Control(pDX, IDC_ROOMED_VNUM_SPIN, m_VnumSpin); DDX_Control(pDX, IDC_ROOMED_MANA_SPIN, m_ManaGainSpin); DDX_Control(pDX, IDC_ROOMED_HIT_SPIN, m_HitGainSpin); DDX_Text(pDX, IDC_ROOMED_CLAN, m_Clan); DDX_Text(pDX, IDC_ROOMED_DESCRIPTION, m_Description); DDX_Text(pDX, IDC_ROOMED_NAME, m_Name); DDX_Text(pDX, IDC_ROOMED_OWNER, m_Owner); DDX_Text(pDX, IDC_ROOMED_VNUM, m_Vnum); DDV_MinMaxInt(pDX, m_Vnum, 0, 32767); DDX_Text(pDX, IDC_ROOMED_HIT, m_HitGain); DDV_MinMaxInt(pDX, m_HitGain, 0, 32767); DDX_Text(pDX, IDC_ROOMED_MANA, m_ManaGain); DDV_MinMaxInt(pDX, m_ManaGain, 0, 32767); DDX_Text(pDX, IDC_ROOMED_EXIT_DESCR, m_ExitDescription); DDX_Text(pDX, IDC_ROOMED_EXIT_KEYWORD, m_ExitKeyword); DDX_Text(pDX, IDC_ROOMED_EXIT_VNUM, m_ExitVnum); DDV_MinMaxInt(pDX, m_ExitVnum, 0, 32767); DDX_Check(pDX, IDC_ROOMED_ABAJO, m_ExitAbajo); DDX_Check(pDX, IDC_ROOMED_ARRIBA, m_ExitArriba); DDX_Check(pDX, IDC_ROOMED_ESTE, m_ExitEste); DDX_Check(pDX, IDC_ROOMED_NORTE, m_ExitNorte); DDX_Check(pDX, IDC_ROOMED_OESTE, m_ExitOeste); DDX_Check(pDX, IDC_ROOMED_SUR, m_ExitSur); DDX_Text(pDX, IDC_ROOMED_EXIT_LLAVE, m_ExitLlave); DDV_MinMaxInt(pDX, m_ExitLlave, -1, 32767); DDX_Text(pDX, IDC_ROOMED_EXTRAED, m_ExtraEd); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRoomEd, CDialog) //{{AFX_MSG_MAP(CRoomEd) ON_BN_CLICKED(IDC_ROOMED_ABAJO, OnRoomedExit) ON_CBN_SELCHANGE(IDC_ROOMED_EXTRAED_LIST, OnSelchangeRoomedExtraedList) ON_BN_CLICKED(IDC_ROOMED_EXTRAED_ADD, OnRoomedExtraedAdd) ON_EN_CHANGE(IDC_ROOMED_EXTRAED, OnChangeRoomedExtraed) ON_CBN_SELCHANGE(IDC_ROOMED_SECTORTYPE, OnSelchangeRoomedSectortype) ON_NOTIFY(NM_CLICK, IDC_ROOMED_FLAGS, OnClickRoomedFlags) ON_NOTIFY(NM_CLICK, IDC_ROOMED_EXIT_FLAGS, OnClickRoomedExitFlags) ON_BN_CLICKED(IDC_ROOMED_EXTRAED_BORRAR, OnRoomedExtraedBorrar) ON_EN_CHANGE(IDC_ROOMED_VNUM, OnChangeRoomedVnum) ON_NOTIFY(NM_RCLICK, IDC_ROOMED_RESETS, OnRclickRoomedResets) ON_BN_CLICKED(IDC_ROOMED_RESET_UP, OnRoomedResetUp) ON_BN_CLICKED(IDC_ROOMED_RESET_DOWN, OnRoomedResetDown) ON_NOTIFY(NM_CLICK, IDC_ROOMED_RESETS, OnClickRoomedResets) ON_NOTIFY(NM_DBLCLK, IDC_ROOMED_RESETS, OnDblclkRoomedResets) ON_COMMAND(ID_EDIT_COPIARCUARTO, OnEditCopiarcuarto) ON_COMMAND(ID_EDIT_PEGARCUARTO, OnEditPegarcuarto) ON_BN_CLICKED(IDC_ROOMED_ARRIBA, OnRoomedExit) ON_BN_CLICKED(IDC_ROOMED_SUR, OnRoomedExit) ON_BN_CLICKED(IDC_ROOMED_ESTE, OnRoomedExit) ON_BN_CLICKED(IDC_ROOMED_NORTE, OnRoomedExit) ON_BN_CLICKED(IDC_ROOMED_OESTE, OnRoomedExit) //}}AFX_MSG_MAP ON_COMMAND(ID_RESETPOP_AGREGAR, OnResetsPopAgregar) ON_COMMAND(ID_RESETPOP_BORRAR, OnResetsPopBorrar) ON_COMMAND(ID_RESETPOP_EDITAR, OnResetsPopEditar) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRoomEd message handlers BOOL CRoomEd::OnInitDialog() { int i, j, index; LV_ITEM itemdata; LV_COLUMN column; char buf[500]; CDialog::OnInitDialog(); m_VnumSpin.SetBuddy( GetDlgItem( IDC_ROOMED_VNUM ) ); m_ManaGainSpin.SetBuddy( GetDlgItem( IDC_ROOMED_MANA ) ); m_HitGainSpin.SetBuddy( GetDlgItem( IDC_ROOMED_HIT ) ); m_ExitVnumSpin.SetBuddy( GetDlgItem( IDC_ROOMED_EXIT_VNUM ) ); m_ExitLlaveSpin.SetBuddy( GetDlgItem( IDC_ROOMED_EXIT_LLAVE ) ); m_VnumSpin.SetRange( 0, 32767 ); m_ManaGainSpin.SetRange( 0, 32767 ); m_HitGainSpin.SetRange( 0, 32767 ); m_ExitVnumSpin.SetRange( 0, 32767 ); m_ExitLlaveSpin.SetRange( -1, 32767 ); m_ExitNorte = TRUE; m_ExitSur = FALSE; m_ExitEste = FALSE; m_ExitOeste = FALSE; m_ExitArriba = FALSE; m_ExitAbajo = FALSE; m_seldir = 0; m_ExitDescription = m_exits[0].m_description; m_ExitLlave = m_exits[0].m_key; m_ExitKeyword = m_exits[0].m_keyword; m_ExitVnum = m_exits[0].m_vnum; for ( i = 0; i < m_extradescr.GetSize(); i++ ) { index = m_ExtraEdList.AddString( m_extradescr[i]->m_keyword ); m_ExtraEdList.SetItemDataPtr( index, m_extradescr[i] ); } if ( m_extradescr.GetSize() > 0 ) { m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword ); m_ExtraEd = m_extradescr[0]->m_description; } for ( i = 0; i < tables.m_sectortypes.GetSize(); i++ ) { index = m_SectorType.AddString( tables.m_sectortypes[i]->m_text ); m_SectorType.SetItemData( index, tables.m_sectortypes[i]->m_num ); if ( tables.m_sectortypes[i]->m_num == m_cursector ) m_SectorType.SetCurSel( index ); } m_Flags.SetImageList( &m_imagelist, LVSIL_SMALL ); for ( i = 0; i < tables.m_roomflags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_roomflags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_roomflags[i]->m_num; itemdata.iImage = m_roomflags & itemdata.lParam ? 1 : 0; m_Flags.InsertItem( &itemdata ); } m_ExitFlags.SetImageList( &m_imagelist, LVSIL_SMALL ); for ( i = 0; i < tables.m_exitflags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_exitflags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_exitflags[i]->m_num; itemdata.iImage = m_exits[0].m_flags & itemdata.lParam ? 1 : 0; m_ExitFlags.InsertItem( &itemdata ); } CString text; text.LoadString( IDS_TYPE ); column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; column.pszText = text.GetBuffer(0); column.cx = 40; column.iSubItem = 0; m_Resets.InsertColumn( 0, &column ); column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; column.pszText = "arg1"; column.cx = 55; column.iSubItem = 1; m_Resets.InsertColumn( 1, &column ); column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; column.pszText = "arg2"; column.cx = 55; column.iSubItem = 2; m_Resets.InsertColumn( 2, &column ); column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; column.pszText = "arg3"; column.cx = 55; column.iSubItem = 3; m_Resets.InsertColumn( 3, &column ); column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; column.pszText = "arg4"; column.cx = 55; column.iSubItem = 4; m_Resets.InsertColumn( 4, &column ); for ( i = 0; i < m_resets.GetSize(); i++ ) { buf[0] = m_resets[i]->m_type; buf[1] = 0; index = m_Resets.InsertItem( i, buf ); for ( j = 0; j < 4; j++ ) { itoa( m_resets[i]->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } m_ResetsUp.SetIcon( AfxGetApp()->LoadIcon( IDI_UP ) ); m_ResetsDown.SetIcon( AfxGetApp()->LoadIcon( IDI_DOWN ) ); m_ResetsDown.EnableWindow( FALSE ); m_ResetsUp.EnableWindow( FALSE ); UpdateData( FALSE ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CRoomEd::OnRoomedExit() { int dir, i; DWORD botones[6], foco; LV_ITEM itemdata; botones[0] = (DWORD) GetDlgItem( IDC_ROOMED_NORTE ); botones[1] = (DWORD) GetDlgItem( IDC_ROOMED_ESTE ); botones[2] = (DWORD) GetDlgItem( IDC_ROOMED_SUR ); botones[3] = (DWORD) GetDlgItem( IDC_ROOMED_OESTE ); botones[4] = (DWORD) GetDlgItem( IDC_ROOMED_ARRIBA ); botones[5] = (DWORD) GetDlgItem( IDC_ROOMED_ABAJO ); foco = (DWORD) GetFocus(); for ( dir = 0; dir < 6; dir++ ) if ( botones[dir] == foco ) break; if ( dir >= 6 ) return; UpdateData( TRUE ); m_ExitNorte = FALSE; m_ExitSur = FALSE; m_ExitEste = FALSE; m_ExitOeste = FALSE; m_ExitArriba = FALSE; m_ExitAbajo = FALSE; switch ( dir ) { case 0: m_ExitNorte = TRUE; break; case 1: m_ExitEste = TRUE; break; case 2: m_ExitSur = TRUE; break; case 3: m_ExitOeste = TRUE; break; case 4: m_ExitArriba = TRUE; break; case 5: m_ExitAbajo = TRUE; break; } m_exits[m_seldir].m_description = m_ExitDescription; m_exits[m_seldir].m_key = m_ExitLlave; m_exits[m_seldir].m_keyword = m_ExitKeyword; m_exits[m_seldir].m_vnum = m_ExitVnum; m_seldir = dir; m_ExitDescription = m_exits[dir].m_description; m_ExitLlave = m_exits[dir].m_key; m_ExitKeyword = m_exits[dir].m_keyword; m_ExitVnum = m_exits[dir].m_vnum; for ( i = 0; i < tables.m_exitflags.GetSize(); i++ ) { itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.iImage = m_exits[dir].m_flags & tables.m_exitflags[i]->m_num ? 1 : 0; m_ExitFlags.SetItem( &itemdata ); } UpdateData( FALSE ); } void CRoomEd::OnOK() { char buf[500]; CString text, tit; UpdateData( TRUE ); if ( m_Vnum < m_minvnum || m_Vnum > m_maxvnum ) { text.LoadString( IDS_VNUMRANGE ); tit.LoadString( IDS_ERROR ); sprintf( buf, text, m_minvnum, m_maxvnum ); MessageBox( buf, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_ROOMED_VNUM ) ); return; } if ( m_pDoc->FindRoom( m_Vnum, m_index ) != -1 ) { text.LoadString( IDS_VNUMUSE ); tit.LoadString( IDS_ERROR ); MessageBox( text, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_ROOMED_VNUM ) ); return; } m_exits[m_seldir].m_description = m_ExitDescription; m_exits[m_seldir].m_key = m_ExitLlave; m_exits[m_seldir].m_keyword = m_ExitKeyword; m_exits[m_seldir].m_vnum = m_ExitVnum; CDialog::OnOK(); } void CRoomEd::OnSelchangeRoomedExtraedList() { CExtraDescr *extra; int index; if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR ) return; extra = (CExtraDescr *) m_ExtraEdList.GetItemDataPtr( index ); UpdateData( TRUE ); m_ExtraEd = extra->m_description; UpdateData( FALSE ); } void CRoomEd::OnRoomedExtraedAdd() { CString newkey; int index; CExtraDescr *extra; m_ExtraEdList.GetWindowText( newkey ); if ( newkey == "" ) return; if ( ( index = m_ExtraEdList.FindStringExact( -1, newkey ) ) != CB_ERR ) { m_ExtraEdList.SetCurSel( index ); OnSelchangeRoomedExtraedList(); return; } UpdateData( TRUE ); extra = new CExtraDescr(); extra->m_keyword = newkey; extra->m_description = m_ExtraEd; m_extradescr.Add( extra ); index = m_ExtraEdList.AddString( extra->m_keyword ); m_ExtraEdList.SetItemDataPtr( index, extra ); m_ExtraEdList.SetCurSel( index ); GotoDlgCtrl( GetDlgItem( IDC_ROOMED_EXTRAED ) ); UpdateData( FALSE ); } void CRoomEd::OnChangeRoomedExtraed() { CExtraDescr *extra; int index; if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR ) return; extra = (CExtraDescr *) m_ExtraEdList.GetItemDataPtr( index ); UpdateData( TRUE ); extra->m_description = m_ExtraEd; } void CRoomEd::OnSelchangeRoomedSectortype() { int index = m_SectorType.GetCurSel(); if ( index == CB_ERR ) return; m_cursector = m_SectorType.GetItemData( index ); } void CRoomEd::OnClickRoomedFlags(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_Flags.GetItemCount(); i++ ) { if ( m_Flags.GetItemState( i, LVIS_SELECTED ) ) { m_roomflags ^= m_Flags.GetItemData( i ); LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.iImage = m_roomflags & m_Flags.GetItemData( i ) ? 1 : 0; m_Flags.SetItem( &itemdata ); } } *pResult = 0; } void CRoomEd::OnClickRoomedExitFlags(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_ExitFlags.GetItemCount(); i++ ) { if ( m_ExitFlags.GetItemState( i, LVIS_SELECTED ) ) { m_exits[m_seldir].m_flags ^= m_ExitFlags.GetItemData( i ); LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.iImage = m_exits[m_seldir].m_flags & m_ExitFlags.GetItemData( i ) ? 1 : 0; m_ExitFlags.SetItem( &itemdata ); } } *pResult = 0; } void CRoomEd::OnRoomedExtraedBorrar() { CString key; int index; CExtraDescr *extra; m_ExtraEdList.GetWindowText( key ); if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR ) return; m_ExtraEdList.DeleteString( index ); for ( index = 0; index < m_extradescr.GetSize(); index++ ) if ( m_extradescr[index]->m_keyword == key ) break; if ( index >= m_extradescr.GetSize() ) return; m_extradescr.RemoveAt( index ); UpdateData( TRUE ); m_ExtraEdList.SetCurSel( 0 ); if ( m_extradescr.GetSize() > 0 ) { extra = (CExtraDescr *) m_ExtraEdList.GetItemData( 0 ); m_ExtraEd = extra->m_description; } else m_ExtraEd = ""; UpdateData( FALSE ); } void CRoomEd::OnChangeRoomedVnum() { int vnum = m_VnumSpin.GetPos(); for ( int i = 0; i < m_Resets.GetItemCount(); i++ ) { char buf[500]; switch ( m_resets[i]->m_type ) { case 'M': case 'O': case 'P': m_resets[i]->m_num[2] = vnum; itoa( m_resets[i]->m_num[2], buf, 10 ); m_Resets.SetItemText( i, 3, buf ); break; case 'D': case 'R': m_resets[i]->m_num[0] = vnum; itoa( m_resets[i]->m_num[0], buf, 10 ); m_Resets.SetItemText( i, 1, buf ); break; } } } void CRoomEd::OnRclickRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) { POINT curPos; CMenu menu; int i; CString text; for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; GetCursorPos( &curPos ); menu.CreatePopupMenu(); text.LoadString( IDS_MADD ); menu.AppendMenu( MF_ENABLED, ID_RESETPOP_AGREGAR, text ); text.LoadString( IDS_MDEL ); menu.AppendMenu( i < m_Resets.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_RESETPOP_BORRAR, text ); text.LoadString( IDS_MEDIT ); menu.AppendMenu( i < m_Resets.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_RESETPOP_EDITAR, text ); menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, curPos.x, curPos.y, this ); *pResult = 0; } int CRoomEd::ResetEd(CResetData * reset) { CResetEd dlg; int i; dlg.m_type = reset->m_type; for ( i = 0; i < 4; i++ ) dlg.m_num[i] = reset->m_num[i]; dlg.m_vnum = m_VnumSpin.GetPos(); dlg.m_doc = m_pDoc; if ( dlg.DoModal() == IDOK ) { reset->m_type = dlg.m_type; for ( i = 0; i < 4; i++ ) reset->m_num[i] = dlg.m_num[i]; return IDOK; } return IDCANCEL; } void CRoomEd::OnResetsPopAgregar() { CResetData *reset; char buf[500]; reset = new CResetData(); if ( ResetEd( reset ) == IDOK ) { m_resets.Add( reset ); buf[0] = reset->m_type; buf[1] = 0; int i = m_Resets.GetItemCount(); int index = m_Resets.InsertItem( i, buf ); for ( int j = 0; j < 4; j++ ) { itoa( reset->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } else delete reset; } void CRoomEd::OnResetsPopBorrar() { int i; for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; if ( i >= m_Resets.GetItemCount() ) return; m_resets.RemoveAt( i ); m_Resets.DeleteItem( i ); } void CRoomEd::OnResetsPopEditar() { int i; char buf[500]; for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; if ( i >= m_Resets.GetItemCount() ) return; if ( ResetEd( m_resets[i] ) == IDOK ) { buf[0] = m_resets[i]->m_type; buf[1] = 0; m_Resets.DeleteItem( i ); int index = m_Resets.InsertItem( i, buf ); for ( int j = 0; j < 4; j++ ) { itoa( m_resets[i]->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } } void CRoomEd::OnRoomedResetUp() { int i, k; char buf[500]; CResetData *reset; for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; if ( i >= m_Resets.GetItemCount() ) return; if ( i <= 0 ) return; reset = m_resets[i-1]; m_resets[i-1] = m_resets[i]; m_resets[i] = reset; for ( k = i-1; k <= i; k++ ) { buf[0] = m_resets[k]->m_type; buf[1] = 0; m_Resets.DeleteItem( k ); int index = m_Resets.InsertItem( k, buf ); for ( int j = 0; j < 4; j++ ) { itoa( m_resets[k]->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } m_Resets.SetItemState( i-1, LVIS_SELECTED, LVIS_SELECTED ); m_Resets.EnsureVisible( --i, FALSE ); m_ResetsDown.EnableWindow( FALSE ); m_ResetsUp.EnableWindow( FALSE ); if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow(); if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow(); } void CRoomEd::OnRoomedResetDown() { int i, k; char buf[500]; CResetData *reset; for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; if ( i >= m_Resets.GetItemCount() - 1 ) return; reset = m_resets[i+1]; m_resets[i+1] = m_resets[i]; m_resets[i] = reset; for ( k = i; k <= i+1; k++ ) { buf[0] = m_resets[k]->m_type; buf[1] = 0; m_Resets.DeleteItem( k ); int index = m_Resets.InsertItem( k, buf ); for ( int j = 0; j < 4; j++ ) { itoa( m_resets[k]->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } m_Resets.SetItemState( i+1, LVIS_SELECTED, LVIS_SELECTED ); m_Resets.EnsureVisible( ++i, FALSE ); m_ResetsDown.EnableWindow( FALSE ); m_ResetsUp.EnableWindow( FALSE ); if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow(); if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow(); } void CRoomEd::OnClickRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) { int i; m_ResetsDown.EnableWindow( FALSE ); m_ResetsUp.EnableWindow( FALSE ); for ( i = 0; i < m_Resets.GetItemCount(); i++ ) if ( m_Resets.GetItemState( i, LVIS_SELECTED ) ) break; if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow(); if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow(); *pResult = 0; } void CRoomEd::OnDblclkRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; OnResetsPopEditar(); } void CRoomEd::OnEditCopiarcuarto() { UINT clfmt = RegisterClipboardFormat( "ARCAED_ROOM" ); COleDataSource *source = new COleDataSource(); UpdateData( TRUE ); TRY { CSharedFile file( GMEM_ZEROINIT|GMEM_DDESHARE|GMEM_MOVEABLE ); TRY { CArchive ar (&file, CArchive::store); TRY { ar << m_Clan << m_Description; ar << m_extradescr.GetSize(); for ( int i = 0; i < m_extradescr.GetSize(); i++ ) { ar << m_extradescr[i]->m_keyword; ar << m_extradescr[i]->m_description; } ar << m_HitGain << m_ManaGain << m_Name << m_Owner; ar << m_resets.GetSize(); for ( i = 0; i < m_resets.GetSize(); i++ ) { ar << m_resets[i]->m_type; for ( int j = 0; j < 4; j++ ) ar << m_resets[i]->m_num[j]; } ar << m_roomflags << m_cursector; ar.Close(); } CATCH_ALL( eArWrite ) { ASSERT( FALSE ); } END_CATCH_ALL; } CATCH_ALL( eArError ) { ASSERT( FALSE ); } END_CATCH_ALL; source->CacheGlobalData( clfmt, file.Detach() ); } CATCH_ALL( eShFileError ) { ASSERT( FALSE ); } END_CATCH_ALL; source->SetClipboard(); } void CRoomEd::OnEditPegarcuarto() { int i, j, index; LV_ITEM itemdata; char buf[500]; UINT clfmt = RegisterClipboardFormat( "ARCAED_ROOM" ); COleDataObject source; if ( !source.AttachClipboard() ) return; CFile *pFile = source.GetFileData( clfmt ); if ( pFile == NULL ) return; UpdateData( TRUE ); TRY { CArchive ar( pFile, CArchive::load ); TRY { int num, i; CExtraDescr *extradesc; CResetData *reset; ar >> m_Clan; ar >> m_Description; m_extradescr.RemoveAll(); ar >> num; for ( i = 0; i < num; i++ ) { extradesc = new CExtraDescr(); ar >> extradesc->m_keyword; ar >> extradesc->m_description; m_extradescr.Add( extradesc ); } ar >> m_HitGain >> m_ManaGain >> m_Name >> m_Owner; m_resets.RemoveAll(); ar >> num; for ( i = 0; i < num; i++ ) { reset = new CResetData(); ar >> reset->m_type; for ( j = 0; j < 4; j++ ) ar >> reset->m_num[j]; m_resets.Add( reset ); } ar >> m_roomflags >> m_cursector; ar.Close(); } CATCH_ALL( eArRead ) { ASSERT( FALSE ); } END_CATCH_ALL; } CATCH_ALL( eArClose ) { ASSERT( FALSE ); } END_CATCH_ALL; m_ExtraEdList.ResetContent(); for ( i = 0; i < m_extradescr.GetSize(); i++ ) { index = m_ExtraEdList.AddString( m_extradescr[i]->m_keyword ); m_ExtraEdList.SetItemDataPtr( index, m_extradescr[i] ); } if ( m_extradescr.GetSize() > 0 ) { m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword ); m_ExtraEd = m_extradescr[0]->m_description; } m_SectorType.ResetContent(); for ( i = 0; i < tables.m_sectortypes.GetSize(); i++ ) { index = m_SectorType.AddString( tables.m_sectortypes[i]->m_text ); m_SectorType.SetItemData( index, tables.m_sectortypes[i]->m_num ); if ( tables.m_sectortypes[i]->m_num == m_cursector ) m_SectorType.SetCurSel( index ); } m_Flags.DeleteAllItems(); for ( i = 0; i < tables.m_roomflags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_roomflags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_roomflags[i]->m_num; itemdata.iImage = m_roomflags & itemdata.lParam ? 1 : 0; m_Flags.InsertItem( &itemdata ); } m_Resets.DeleteAllItems(); for ( i = 0; i < m_resets.GetSize(); i++ ) { buf[0] = m_resets[i]->m_type; buf[1] = 0; index = m_Resets.InsertItem( i, buf ); for ( j = 0; j < 4; j++ ) { itoa( m_resets[i]->m_num[j], buf, 10 ); m_Resets.SetItemText( index, j+1, buf ); } } m_ResetsDown.EnableWindow( FALSE ); m_ResetsUp.EnableWindow( FALSE ); UpdateData( FALSE ); delete pFile; } BOOL CRoomEd::PreTranslateMessage(MSG* pMsg) { if ( TranslateAccelerator( this->m_hWnd, m_accel, pMsg ) ) return TRUE; return CDialog::PreTranslateMessage(pMsg); }