/*
 *  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;

}