/* * 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:23 1999 * */ /* * File: ObjEd.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... :-) * */ // ObjEd.cpp : implementation file // #include "stdafx.h" #include "arcaed.h" #include "ObjEd.h" #include "TrainEd.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CObjEd dialog CObjEd::CObjEd(CWnd* pParent /*=NULL*/) : CDialog(CObjEd::IDD, pParent) { //{{AFX_DATA_INIT(CObjEd) m_Description = _T(""); m_Material = _T(""); m_Name = _T(""); m_ShortDescr = _T(""); m_Vnum = 0; m_Value1 = FALSE; m_Value2 = FALSE; m_Value3 = FALSE; m_Value4 = FALSE; m_Value5 = FALSE; m_Condicion = _T(""); m_Costo = 0; m_Nivel = 0; m_Peso = 0; m_ExtraEd = _T(""); m_AffModify = 0; //}}AFX_DATA_INIT 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_OBJED_ACC ) ); } void CObjEd::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CObjEd) DDX_Control(pDX, IDC_OBJED_AFF_TYPE, m_AffType); DDX_Control(pDX, IDC_OBJED_AFF_MODSPIN, m_AffModifySpin); DDX_Control(pDX, IDC_OBJED_AFF_LOCATION, m_AffLocation); DDX_Control(pDX, IDC_OBJED_AFF_LIST, m_AffList); DDX_Control(pDX, IDC_OBJED_AFF_FLAGS, m_AffFlags); DDX_Control(pDX, IDC_OBJED_EXTRAED_LIST, m_ExtraEdList); DDX_Control(pDX, IDC_OBJED_PESO_SPIN, m_PesoSpin); DDX_Control(pDX, IDC_OBJED_NIVEL_SPIN, m_NivelSpin); DDX_Control(pDX, IDC_OBJED_COSTO_SPIN, m_CostoSpin); DDX_Control(pDX, IDC_OBJED_VALUE_SPIN2, m_ValueSpin2); DDX_Control(pDX, IDC_OBJED_VALUE_EDIT2, m_ValueEdit2); DDX_Control(pDX, IDC_OBJED_VALUE_EDIT, m_ValueEdit); DDX_Control(pDX, IDC_OBJED_VALUE_SPIN, m_ValueSpin); DDX_Control(pDX, IDC_OBJED_VALUE_LIST, m_ValueList); DDX_Control(pDX, IDC_OBJED_VALUE_COMBO, m_ValueCombo); DDX_Control(pDX, IDC_OBJED_WEAR_FLAGS, m_WearFlags); DDX_Control(pDX, IDC_OBJED_EXTRA_FLAGS, m_ExtraFlags); DDX_Control(pDX, IDC_OBJED_OBJTYPE, m_ObjType); DDX_Control(pDX, IDC_OBJED_VNUM_SPIN, m_VnumSpin); DDX_Text(pDX, IDC_OBJED_DESCRIPTION, m_Description); DDX_Text(pDX, IDC_OBJED_MATERIAL, m_Material); DDX_Text(pDX, IDC_OBJED_NAME, m_Name); DDX_Text(pDX, IDC_OBJED_SHORT_DESCR, m_ShortDescr); DDX_Text(pDX, IDC_OBJED_VNUM, m_Vnum); DDV_MinMaxInt(pDX, m_Vnum, 0, 32767); DDX_Check(pDX, IDC_OBJED_VALUE1, m_Value1); DDX_Check(pDX, IDC_OBJED_VALUE2, m_Value2); DDX_Check(pDX, IDC_OBJED_VALUE3, m_Value3); DDX_Check(pDX, IDC_OBJED_VALUE4, m_Value4); DDX_Check(pDX, IDC_OBJED_VALUE5, m_Value5); DDX_CBString(pDX, IDC_OBJED_CONDICION, m_Condicion); DDX_Text(pDX, IDC_OBJED_COSTO, m_Costo); DDV_MinMaxInt(pDX, m_Costo, 0, 32767); DDX_Text(pDX, IDC_OBJED_NIVEL, m_Nivel); DDV_MinMaxInt(pDX, m_Nivel, 0, 32767); DDX_Text(pDX, IDC_OBJED_PESO, m_Peso); DDV_MinMaxInt(pDX, m_Peso, 0, 32767); DDX_Text(pDX, IDC_OBJED_EXTRAED, m_ExtraEd); DDX_Text(pDX, IDC_OBJED_AFF_MODIFY, m_AffModify); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CObjEd, CDialog) //{{AFX_MSG_MAP(CObjEd) ON_CBN_SELCHANGE(IDC_OBJED_OBJTYPE, OnSelchangeObjedObjtype) ON_NOTIFY(NM_CLICK, IDC_OBJED_EXTRA_FLAGS, OnClickObjedExtraFlags) ON_NOTIFY(NM_CLICK, IDC_OBJED_WEAR_FLAGS, OnClickObjedWearFlags) ON_BN_CLICKED(IDC_OBJED_VALUE1, OnObjedValue) ON_NOTIFY(NM_CLICK, IDC_OBJED_VALUE_LIST, OnClickObjedValueList) ON_EN_CHANGE(IDC_OBJED_EXTRAED, OnChangeObjedExtraed) ON_BN_CLICKED(IDC_OBJED_EXTRAED_ADD, OnObjedExtraedAdd) ON_BN_CLICKED(IDC_OBJED_EXTRAED_BORRAR, OnObjedExtraedBorrar) ON_CBN_SELCHANGE(IDC_OBJED_EXTRAED_LIST, OnSelchangeObjedExtraedList) ON_CBN_SELCHANGE(IDC_OBJED_AFF_LIST, OnSelchangeObjedAffList) ON_BN_CLICKED(IDC_OBJED_AFF_AGREGAR, OnObjedAffAgregar) ON_BN_CLICKED(IDC_OBJED_AFF_BORRAR, OnObjedAffBorrar) ON_CBN_SELCHANGE(IDC_OBJED_AFF_TYPE, OnSelchangeObjedAffType) ON_NOTIFY(NM_CLICK, IDC_OBJED_AFF_FLAGS, OnClickObjedAffFlags) ON_BN_CLICKED(IDC_OBJED_TRAINED, OnObjedTrained) ON_BN_CLICKED(IDC_OBJED_VALUE2, OnObjedValue) ON_BN_CLICKED(IDC_OBJED_VALUE3, OnObjedValue) ON_BN_CLICKED(IDC_OBJED_VALUE4, OnObjedValue) ON_BN_CLICKED(IDC_OBJED_VALUE5, OnObjedValue) ON_COMMAND(ID_EDIT_COPIAROBJ, OnEditCopiarobj) ON_COMMAND(ID_EDIT_PEGAROBJ, OnEditPegarobj) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CObjEd message handlers BOOL CObjEd::OnInitDialog() { CDialog::OnInitDialog(); int i, index; LV_ITEM itemdata; m_VnumSpin.SetBuddy( GetDlgItem( IDC_OBJED_VNUM ) ); m_VnumSpin.SetRange( 0, 32767 ); for ( i = 0; i < tables.m_objtypes.GetSize(); i++ ) { index = m_ObjType.AddString( tables.m_objtypes[i]->m_text ); m_ObjType.SetItemData( index, tables.m_objtypes[i]->m_num ); if ( tables.m_objtypes[i]->m_num == m_item_type ) m_ObjType.SetCurSel( index ); } m_ExtraFlags.SetImageList( &m_imagelist, LVSIL_SMALL ); for ( i = 0; i < tables.m_extra_flags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_extra_flags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_extra_flags[i]->m_num; itemdata.iImage = m_extra_flags & itemdata.lParam ? 1 : 0; m_ExtraFlags.InsertItem( &itemdata ); } m_WearFlags.SetImageList( &m_imagelist, LVSIL_SMALL ); for ( i = 0; i < tables.m_wear_flags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_wear_flags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_wear_flags[i]->m_num; itemdata.iImage = m_wear_flags & itemdata.lParam ? 1 : 0; m_WearFlags.InsertItem( &itemdata ); } m_ValueSpin.SetBuddy( &m_ValueEdit ); m_ValueSpin.SetRange( -32768, 32767 ); m_ValueSpin2.SetBuddy( &m_ValueEdit2 ); m_ValueSpin2.SetRange( -32768, 32767 ); m_ValueList.SetImageList( &m_imagelist, LVSIL_SMALL ); UpdateData( FALSE ); SetValueButtons(); UpdateData( TRUE ); m_curvalue = -1; SetValues(); m_NivelSpin.SetBuddy( GetDlgItem( IDC_OBJED_NIVEL ) ); m_PesoSpin.SetBuddy( GetDlgItem( IDC_OBJED_PESO ) ); m_CostoSpin.SetBuddy( GetDlgItem( IDC_OBJED_COSTO ) ); m_NivelSpin.SetRange( 0, 32767 ); m_PesoSpin.SetRange( 0, 32767 ); m_CostoSpin.SetRange( 0, 32767 ); for ( i = 0; i < m_extradescr.GetSize(); i++ ) { index = m_ExtraEdList.AddString( m_extradescr[i]->m_keyword ); m_ExtraEdList.SetItemDataPtr( index, m_extradescr[i] ); } m_AffFlags.SetImageList( &m_imagelist, LVSIL_SMALL ); for ( i = 0; i < tables.m_affect_location.GetSize(); i++ ) { index = m_AffLocation.AddString( tables.m_affect_location[i]->m_text ); m_AffLocation.SetItemData( index, tables.m_affect_location[i]->m_num ); } m_AffModifySpin.SetBuddy( GetDlgItem( IDC_OBJED_AFF_MODIFY ) ); m_AffModifySpin.SetRange( -32768, 32767 ); for ( i = 0; i < tables.m_aff_to.GetSize(); i++ ) { index = m_AffType.AddString( tables.m_aff_to[i]->m_text ); m_AffType.SetItemData( index, tables.m_aff_to[i]->m_num ); } MakeAffList(); UpdateData( FALSE ); if ( m_extradescr.GetSize() > 0 ) { m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword ); OnSelchangeObjedExtraedList(); } if ( tables.m_mudtype != MUD_ARCANUM ) { GetDlgItem( IDC_OBJED_TRAINED )->EnableWindow( FALSE ); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CObjEd::OnSelchangeObjedObjtype() { int index, i; if ( ( index = m_ObjType.GetCurSel() ) == CB_ERR ) return; m_item_type = m_ObjType.GetItemData( index ); SetValueButtons(); m_curvalue = -1; for ( i = 0; i < 5; i++ ) { m_value_num[i] = 0; m_value_str[i] = ""; } SetValues(); } void CObjEd::OnClickObjedExtraFlags(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_ExtraFlags.GetItemCount(); i++ ) { if ( m_ExtraFlags.GetItemState( i, LVIS_SELECTED ) ) { m_extra_flags ^= m_ExtraFlags.GetItemData( i ); LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.iImage = m_extra_flags & m_ExtraFlags.GetItemData( i ) ? 1 : 0; m_ExtraFlags.SetItem( &itemdata ); } } *pResult = 0; } void CObjEd::OnClickObjedWearFlags(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_WearFlags.GetItemCount(); i++ ) { if ( m_WearFlags.GetItemState( i, LVIS_SELECTED ) ) { m_wear_flags ^= m_WearFlags.GetItemData( i ); LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.iImage = m_wear_flags & m_WearFlags.GetItemData( i ) ? 1 : 0; m_WearFlags.SetItem( &itemdata ); } } *pResult = 0; } void CObjEd::SetValues() { int index, i, index2; char buf[500]; CArray< CNumStrData*, CNumStrData* > *table; LV_ITEM itemdata; CString text; UpdateData( TRUE ); m_ValueCombo.ResetContent(); m_ValueEdit.SetWindowText( "" ); m_ValueEdit2.SetWindowText( "" ); m_ValueList.DeleteAllItems(); m_ValueCombo.EnableWindow( FALSE ); m_ValueEdit.EnableWindow( FALSE ); m_ValueEdit2.EnableWindow( FALSE ); m_ValueList.EnableWindow( FALSE ); m_ValueSpin.EnableWindow( FALSE ); m_ValueSpin2.EnableWindow( FALSE ); for ( index = 0; index < tables.m_objtypes.GetSize(); index ++ ) if ( m_item_type == tables.m_objtypes[index]->m_num ) break; if ( index >= tables.m_objtypes.GetSize() ) return; if ( m_Value1 ) m_curvalue = 0; else if ( m_Value2 ) m_curvalue = 1; else if ( m_Value3 ) m_curvalue = 2; else if ( m_Value4 ) m_curvalue = 3; else if ( m_Value5 ) m_curvalue = 4; else return; switch ( tables.m_objtypes[index]->m_value[m_curvalue].m_type ) { case 'I': case 'D': m_ValueEdit.EnableWindow( TRUE ); m_ValueSpin.EnableWindow( TRUE ); sprintf( buf, "%i", m_value_num[m_curvalue] ); m_ValueEdit.SetWindowText( buf ); break; case 'S': case 'W': m_ValueEdit.EnableWindow( TRUE ); m_ValueEdit.SetWindowText( m_value_str[m_curvalue] ); break; case 'F': case 'A': m_ValueList.EnableWindow( TRUE ); table = tables.get_table( m_item_type, m_curvalue ); for ( i = 0; i < (*table).GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = (*table)[i]->m_text.GetBuffer(0); itemdata.lParam = (*table)[i]->m_num; itemdata.iImage = m_value_num[m_curvalue] & itemdata.lParam ? 1 : 0; m_ValueList.InsertItem( &itemdata ); } break; case 'L': m_ValueCombo.EnableWindow( TRUE ); table = tables.get_table( m_item_type, m_curvalue ); for ( i = 0; i < (*table).GetSize(); i++ ) { index2 = m_ValueCombo.AddString( (*table)[i]->m_text ); ASSERT( index2 != CB_ERR && index2 != CB_ERRSPACE ); m_ValueCombo.SetItemData( index2, i ); if ( (*table)[i]->m_text == m_value_str[m_curvalue] ) m_ValueCombo.SetCurSel( index2 ); } index2 = m_ValueCombo.InsertString( 0, "" ); ASSERT( index2 != CB_ERR && index2 != CB_ERRSPACE ); m_ValueCombo.SetItemData( index2, -1 ); break; case 'O': m_ValueCombo.EnableWindow( TRUE ); table = tables.get_table( m_item_type, m_curvalue ); for ( i = 0; i < (*table).GetSize(); i++ ) { index2 = m_ValueCombo.AddString( (*table)[i]->m_show ); ASSERT( index2 != CB_ERR && index2 != CB_ERRSPACE ); m_ValueCombo.SetItemData( index2, i ); if ( (*table)[i]->m_text == m_value_str[m_curvalue] ) m_ValueCombo.SetCurSel( index2 ); } index2 = m_ValueCombo.InsertString( 0, "" ); ASSERT( index2 != CB_ERR && index2 != CB_ERRSPACE ); m_ValueCombo.SetItemData( index2, -1 ); break; case 'U': m_ValueCombo.EnableWindow( TRUE ); table = tables.get_table( m_item_type, m_curvalue ); for ( i = 0; i < (*table).GetSize(); i++ ) { index2 = m_ValueCombo.AddString( (*table)[i]->m_text ); m_ValueCombo.SetItemData( index2, (*table)[i]->m_num ); if ( (*table)[i]->m_num == m_value_num[m_curvalue] ) m_ValueCombo.SetCurSel( index2 ); } index2 = m_ValueCombo.InsertString( 0, "" ); ASSERT( index2 != CB_ERR && index2 != CB_ERRSPACE ); m_ValueCombo.SetItemData( index2, -1 ); break; case 'M': m_ValueEdit.EnableWindow( TRUE ); m_ValueSpin.EnableWindow( TRUE ); m_ValueEdit2.EnableWindow( TRUE ); m_ValueSpin2.EnableWindow( TRUE ); sprintf( buf, "%i", GET_LO( m_value_num[m_curvalue] ) ); m_ValueEdit.SetWindowText( buf ); sprintf( buf, "%i", GET_HI( m_value_num[m_curvalue] ) ); m_ValueEdit2.SetWindowText( buf ); break; case 'B': case 'E': m_ValueCombo.EnableWindow( TRUE ); text.LoadString( IDS_NO ); index2 = m_ValueCombo.AddString( text ); m_ValueCombo.SetItemData( index2, 0 ); if ( !m_value_num[m_curvalue] ) m_ValueCombo.SetCurSel( index2 ); text.LoadString( IDS_YES ); index2 = m_ValueCombo.AddString( text ); m_ValueCombo.SetItemData( index2, 1 ); if ( m_value_num[m_curvalue] ) m_ValueCombo.SetCurSel( index2 ); break; } } void CObjEd::ReadValues() { CString text; int index, index2, num1, num2, i; LV_ITEM itemdata; CArray< CNumStrData*, CNumStrData* > *table; if ( m_curvalue < 0 || m_curvalue > 4 ) return; for ( index = 0; index < tables.m_objtypes.GetSize(); index ++ ) if ( m_item_type == tables.m_objtypes[index]->m_num ) break; if ( index >= tables.m_objtypes.GetSize() ) return; switch ( tables.m_objtypes[index]->m_value[m_curvalue].m_type ) { case 'I': case 'D': m_ValueEdit.GetWindowText( text ); m_value_num[m_curvalue] = atoi( text ); break; case 'S': case 'W': m_ValueEdit.GetWindowText( m_value_str[m_curvalue] ); break; case 'F': case 'A': m_value_num[m_curvalue] = 0; for ( i = 0; i < m_ValueList.GetItemCount(); i++ ) { itemdata.mask = LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; m_ValueList.GetItem( &itemdata ); if ( itemdata.iImage ) m_value_num[m_curvalue] |= itemdata.lParam; } break; case 'L': case 'O': table = tables.get_table( m_item_type, m_curvalue ); index2 = m_ValueCombo.GetCurSel(); if ( index2 != CB_ERR ) { i = m_ValueCombo.GetItemData( index2 ); if ( i != -1 ) m_value_str[m_curvalue] = (*table)[i]->m_text; else m_value_str[m_curvalue] = ""; } break; case 'U': case 'B': case 'E': index2 = m_ValueCombo.GetCurSel(); if ( index2 != CB_ERR ) m_value_num[m_curvalue] = m_ValueCombo.GetItemData( index2 ); break; case 'M': m_ValueEdit.GetWindowText( text ); num1 = atoi( text ); m_ValueEdit2.GetWindowText( text ); num2 = atoi( text ); m_value_num[m_curvalue] = MAKE_NUM( num2, num1 ); break; } } void CObjEd::SetValueButtons() { int index, i, check; CButton *values[5]; CString text; values[0] = (CButton *) GetDlgItem( IDC_OBJED_VALUE1 ); values[1] = (CButton *) GetDlgItem( IDC_OBJED_VALUE2 ); values[2] = (CButton *) GetDlgItem( IDC_OBJED_VALUE3 ); values[3] = (CButton *) GetDlgItem( IDC_OBJED_VALUE4 ); values[4] = (CButton *) GetDlgItem( IDC_OBJED_VALUE5 ); for ( i = 0; i < 5; i++ ) { text.LoadString( IDS_NOUSE ); values[i]->SetWindowText( text ); values[i]->EnableWindow( FALSE ); } for ( index = 0; index < tables.m_objtypes.GetSize(); index ++ ) if ( m_item_type == tables.m_objtypes[index]->m_num ) break; if ( index >= tables.m_objtypes.GetSize() ) return; check = TRUE; for ( i = 0; i < 5; i++ ) { values[i]->SetCheck( 0 ); if ( tables.m_objtypes[index]->m_value[i].m_type != 'N' ) { values[i]->SetWindowText( tables.m_objtypes[index]->m_value[i].m_text ); values[i]->EnableWindow( TRUE ); if ( check ) { check = FALSE; values[i]->SetCheck( 1 ); } } } } void CObjEd::OnObjedValue() { DWORD botones[5], foco; int i; botones[0] = (DWORD) GetDlgItem( IDC_OBJED_VALUE1 ); botones[1] = (DWORD) GetDlgItem( IDC_OBJED_VALUE2 ); botones[2] = (DWORD) GetDlgItem( IDC_OBJED_VALUE3 ); botones[3] = (DWORD) GetDlgItem( IDC_OBJED_VALUE4 ); botones[4] = (DWORD) GetDlgItem( IDC_OBJED_VALUE5 ); foco = (DWORD) GetFocus(); for ( i = 0; i < 5; i++ ) if ( botones[i] == foco ) break; if ( i >= 5 ) return; UpdateData( TRUE ); m_Value1 = FALSE; m_Value2 = FALSE; m_Value3 = FALSE; m_Value4 = FALSE; m_Value5 = FALSE; switch ( i ) { case 0: m_Value1 = TRUE; break; case 1: m_Value2 = TRUE; break; case 2: m_Value3 = TRUE; break; case 3: m_Value4 = TRUE; break; case 4: m_Value5 = TRUE; break; } UpdateData( FALSE ); ReadValues(); SetValues(); } void CObjEd::OnClickObjedValueList(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_ValueList.GetItemCount(); i++ ) { if ( m_ValueList.GetItemState( i, LVIS_SELECTED ) ) { LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; m_ValueList.GetItem( &itemdata ); itemdata.iImage ^= 1; m_ValueList.SetItem( &itemdata ); } } *pResult = 0; } void CObjEd::OnOK() { char buf[500]; CString text, tit; UpdateData( TRUE ); if ( m_Vnum < m_doc->m_minvnum || m_Vnum > m_doc->m_maxvnum ) { text.LoadString( IDS_VNUMRANGE ); tit.LoadString( IDS_ERROR ); sprintf( buf, text, m_doc->m_minvnum, m_doc->m_maxvnum ); MessageBox( buf, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_OBJED_VNUM ) ); return; } if ( m_doc->FindObj( m_Vnum, m_index ) != -1 ) { text.LoadString( IDS_VNUMUSE ); tit.LoadString( IDS_ERROR ); MessageBox( text, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_OBJED_VNUM ) ); return; } if ( !m_item_type ) { text.LoadString( IDS_OBJTYPE ); tit.LoadString( IDS_ERROR ); MessageBox( text, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_OBJED_OBJTYPE ) ); return; } if ( m_Name == "" ) { text.LoadString( IDS_OBJNAME ); tit.LoadString( IDS_ERROR ); MessageBox( text, tit, MB_ICONERROR ); GotoDlgCtrl( GetDlgItem( IDC_OBJED_NAME ) ); return; } ReadValues(); GetAffects(); CDialog::OnOK(); } void CObjEd::OnChangeObjedExtraed() { 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 CObjEd::OnObjedExtraedAdd() { 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 ); OnSelchangeObjedExtraedList(); 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_OBJED_EXTRAED ) ); UpdateData( FALSE ); } void CObjEd::OnObjedExtraedBorrar() { 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 CObjEd::OnSelchangeObjedExtraedList() { 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 CObjEd::SetAffFlags() { int i, affsel; LV_ITEM itemdata; CArray< CNumStrData*, CNumStrData* > *table; if ( ( affsel = m_AffList.GetCurSel() ) == CB_ERR ) return; if ( m_affects[affsel]->m_where != AFF_TO_OBJECT ) m_AffFlags.EnableWindow(); m_AffFlags.DeleteAllItems(); switch( m_affects[affsel]->m_where ) { default: return; case AFF_TO_AFFECTS: table = &tables.m_affect_flags; break; case AFF_TO_IMMUNE: case AFF_TO_RESIST: case AFF_TO_VULN: table = &tables.m_imm_flags; break; } for ( i = 0; i < (*table).GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = (*table)[i]->m_text.GetBuffer(0); itemdata.lParam = (*table)[i]->m_num; itemdata.iImage = 0; m_AffFlags.InsertItem( &itemdata ); } } void CObjEd::SetAffects() { int affsel, i; LV_ITEM itemdata; m_AffFlags.EnableWindow( FALSE ); m_AffLocation.EnableWindow( FALSE ); m_AffType.EnableWindow( FALSE ); m_AffModifySpin.EnableWindow( FALSE ); GetDlgItem( IDC_OBJED_AFF_MODIFY )->EnableWindow( FALSE ); if ( ( affsel = m_AffList.GetCurSel() ) == CB_ERR ) { m_curaff = -1; m_AffFlags.DeleteAllItems(); m_AffLocation.SetCurSel( -1 ); m_AffType.SetCurSel( -1 ); m_AffModifySpin.SetPos( 0 ); return; } m_curaff = affsel; m_AffLocation.EnableWindow(); m_AffType.EnableWindow(); m_AffModifySpin.EnableWindow(); GetDlgItem( IDC_OBJED_AFF_MODIFY )->EnableWindow(); SetAffFlags(); UpdateData( TRUE ); for ( i = 0; i < m_AffFlags.GetItemCount(); i++ ) { itemdata.mask = LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; m_AffFlags.GetItem( &itemdata ); itemdata.mask = LVIF_IMAGE; if ( m_affects[affsel]->m_flags & itemdata.lParam ) itemdata.iImage = 1; else itemdata.iImage = 0; m_AffFlags.SetItem( &itemdata ); } m_AffLocation.SetCurSel( m_affects[affsel]->m_location ); m_AffModify = m_affects[affsel]->m_modifier; m_AffType.SetCurSel( m_affects[affsel]->m_where ); UpdateData( FALSE ); } void CObjEd::GetAffects() { int i; LV_ITEM itemdata; if ( m_curaff < 0 || m_curaff >= m_affects.GetSize() ) return; UpdateData( TRUE ); m_affects[m_curaff]->m_flags = 0; for ( i = 0; i < m_AffFlags.GetItemCount(); i++ ) { itemdata.mask = LVIF_PARAM | LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; m_AffFlags.GetItem( &itemdata ); if ( itemdata.iImage ) m_affects[m_curaff]->m_flags |= itemdata.lParam; } m_affects[m_curaff]->m_location = m_AffLocation.GetCurSel(); m_affects[m_curaff]->m_modifier = m_AffModify; m_affects[m_curaff]->m_where = m_AffType.GetCurSel(); } void CObjEd::MakeAffList() { int index, i; char buf[500]; m_AffList.ResetContent(); for ( i = 0; i < m_affects.GetSize(); i++ ) { sprintf( buf, "%i", i ); index = m_AffList.AddString( buf ); m_AffList.SetItemData( index, i ); } m_AffList.SetCurSel( 0 ); SetAffects(); } void CObjEd::OnSelchangeObjedAffList() { GetAffects(); SetAffects(); } void CObjEd::OnObjedAffAgregar() { CAffectData *affect; int index, index2; char buf[500]; affect = new CAffectData(); index = m_affects.Add( affect ); sprintf( buf, "%i", index ); index2 = m_AffList.AddString( buf ); m_AffList.SetItemData( index2, index ); m_AffList.SetCurSel( index2 ); OnSelchangeObjedAffList(); } void CObjEd::OnObjedAffBorrar() { if ( m_curaff < 0 || m_curaff >= m_affects.GetSize() ) return; m_affects.RemoveAt( m_curaff ); MakeAffList(); } void CObjEd::OnSelchangeObjedAffType() { if ( m_curaff < 0 || m_curaff >= m_affects.GetSize() ) return; GetAffects(); m_affects[m_curaff]->m_flags = 0; SetAffFlags(); } void CObjEd::OnClickObjedAffFlags(NMHDR* pNMHDR, LRESULT* pResult) { int i; for ( i = 0; i < m_AffFlags.GetItemCount(); i++ ) { if ( m_AffFlags.GetItemState( i, LVIS_SELECTED ) ) { LV_ITEM itemdata; itemdata.mask = LVIF_IMAGE; itemdata.iItem = i; itemdata.iSubItem = 0; m_AffFlags.GetItem( &itemdata ); itemdata.iImage ^= 1; m_AffFlags.SetItem( &itemdata ); } } *pResult = 0; } void CObjEd::OnObjedTrained() { CTrainEd dlg; int i; CTrainData *train; dlg.m_doc = m_doc; for ( i = 0; i < m_traindata.GetSize(); i++ ) { train = new CTrainData(); *train = *m_traindata[i]; dlg.m_traindata.Add( train ); } if ( dlg.DoModal() == IDOK ) { m_traindata.RemoveAll(); for ( i = 0; i < dlg.m_traindata.GetSize(); i++ ) { train = new CTrainData(); *train = *dlg.m_traindata[i]; m_traindata.Add( train ); } } } BOOL CObjEd::PreTranslateMessage(MSG* pMsg) { if ( TranslateAccelerator( this->m_hWnd, m_accel, pMsg ) ) return TRUE; return CDialog::PreTranslateMessage(pMsg); } void CObjEd::OnEditCopiarobj() { int i; UINT clfmt = RegisterClipboardFormat( "ARCAED_OBJ" ); COleDataSource *source = new COleDataSource(); UpdateData( TRUE ); TRY { CSharedFile file( GMEM_ZEROINIT|GMEM_DDESHARE|GMEM_MOVEABLE ); TRY { CArchive ar (&file, CArchive::store); TRY { ar << m_affects.GetSize(); for ( i = 0; i < m_affects.GetSize(); i++ ) { ar << m_affects[i]->m_flags; ar << m_affects[i]->m_location; ar << m_affects[i]->m_modifier; ar << m_affects[i]->m_where; } ar << m_Condicion << m_Costo << m_Description; ar << m_extra_flags; ar << m_extradescr.GetSize(); for ( i = 0; i < m_extradescr.GetSize(); i++ ) { ar << m_extradescr[i]->m_description; ar << m_extradescr[i]->m_keyword; } ar << m_item_type << m_Material << m_Name; ar << m_Nivel << m_Peso << m_ShortDescr; ar << m_traindata.GetSize(); for ( i = 0; i < m_traindata.GetSize(); i++ ) { ar << m_traindata[i]->m_flags; ar << m_traindata[i]->m_msg; ar << m_traindata[i]->m_msgpart; ar << m_traindata[i]->m_room; ar << m_traindata[i]->m_time; } for ( i = 0; i < 5; i++ ) { ar << m_value_num[i] << m_value_str[i]; } ar << m_wear_flags; 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 CObjEd::OnEditPegarobj() { int i, index, num; LV_ITEM itemdata; UINT clfmt = RegisterClipboardFormat( "ARCAED_OBJ" ); COleDataObject source; if ( !source.AttachClipboard() ) return; CFile *pFile = source.GetFileData( clfmt ); if ( pFile == NULL ) return; UpdateData( TRUE ); TRY { CArchive ar( pFile, CArchive::load ); TRY { CExtraDescr *extradesc; CAffectData *affect; CTrainData *train; m_affects.RemoveAll(); ar >> num; for ( i = 0; i < num; i++ ) { affect = new CAffectData(); ar >> affect->m_flags; ar >> affect->m_location; ar >> affect->m_modifier; ar >> affect->m_where; m_affects.Add( affect ); } ar >> m_Condicion >> m_Costo >> m_Description; ar >> m_extra_flags; m_extradescr.RemoveAll(); ar >> num; for ( i = 0; i < num; i++ ) { extradesc = new CExtraDescr(); ar >> extradesc->m_description; ar >> extradesc->m_keyword; m_extradescr.Add( extradesc ); } ar >> m_item_type >> m_Material >> m_Name; ar >> m_Nivel >> m_Peso >> m_ShortDescr; m_traindata.RemoveAll(); ar >> num; for ( i = 0; i < num; i++ ) { train = new CTrainData(); ar >> train->m_flags; ar >> train->m_msg; ar >> train->m_msgpart; ar >> train->m_room; ar >> train->m_time; m_traindata.Add( train ); } for ( i = 0; i < 5; i++ ) { ar >> m_value_num[i] >> m_value_str[i]; } ar >> m_wear_flags; ar.Close(); } CATCH_ALL( eArRead ) { ASSERT( FALSE ); } END_CATCH_ALL; } CATCH_ALL( eArClose ) { ASSERT( FALSE ); } END_CATCH_ALL; UpdateData( FALSE ); m_ObjType.ResetContent(); for ( i = 0; i < tables.m_objtypes.GetSize(); i++ ) { index = m_ObjType.AddString( tables.m_objtypes[i]->m_text ); m_ObjType.SetItemData( index, tables.m_objtypes[i]->m_num ); if ( tables.m_objtypes[i]->m_num == m_item_type ) m_ObjType.SetCurSel( index ); } m_ExtraFlags.DeleteAllItems(); for ( i = 0; i < tables.m_extra_flags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_extra_flags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_extra_flags[i]->m_num; itemdata.iImage = m_extra_flags & itemdata.lParam ? 1 : 0; m_ExtraFlags.InsertItem( &itemdata ); } m_WearFlags.DeleteAllItems(); for ( i = 0; i < tables.m_wear_flags.GetSize(); i++ ) { itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; itemdata.iItem = i; itemdata.iSubItem = 0; itemdata.pszText = tables.m_wear_flags[i]->m_text.GetBuffer(0); itemdata.lParam = tables.m_wear_flags[i]->m_num; itemdata.iImage = m_wear_flags & itemdata.lParam ? 1 : 0; m_WearFlags.InsertItem( &itemdata ); } SetValueButtons(); m_curvalue = -1; SetValues(); 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] ); } m_AffLocation.ResetContent(); for ( i = 0; i < tables.m_affect_location.GetSize(); i++ ) { index = m_AffLocation.AddString( tables.m_affect_location[i]->m_text ); m_AffLocation.SetItemData( index, tables.m_affect_location[i]->m_num ); } MakeAffList(); if ( m_extradescr.GetSize() > 0 ) { m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword ); OnSelchangeObjedExtraedList(); } UpdateData( FALSE ); delete pFile; }