/*
 *  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:20 1999
 *
 */


/*
 * File: MobEd.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... :-)
 *
 */


// MobEd.cpp : implementation file
//

#include "stdafx.h"
#include "arcaed.h"
#include "MobEd.h"
#include "ShopEd.h"
#include "MobprogEd.h"
#include "MercDataEd.h"
#include "SkillTrEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef struct {
	int level;
	int hit_num, hit_type, hit_bonus;
	int ac;
	int dam_num, dam_type, dam_bonus;
} t_levmob;

const t_levmob levmob[] = {
{  1,   2, 6, 10,        90,     1, 4, 0 },
{  2,   2, 7, 21,        80,     1, 5, 0 },
{  3,   2, 6, 35,        70,     1, 6, 0 },
{  4,   2, 7, 46,        60,     1, 5, 1 },
{  5,   2, 6, 60,        50,     1, 6, 1 },

{  6,   2, 7, 71,        40,     1, 7, 1 },
{  7,   2, 6, 85,        40,     1, 8, 1 },
{  8,   2, 7, 96,        30,     1, 7, 2 },
{  9,   2, 6, 110,       20,     1, 8, 2 },
{ 10,   2, 7, 121,       10,     2, 4, 2 },

{ 11,   2,  8, 134,      10,     1, 10, 2 },
{ 12,   2, 10, 150,       0,     1, 10, 3 },
{ 13,   2, 10, 170,     -10,     2,  5, 3 },
{ 14,   2, 10, 190,     -10,     1, 12, 3 },
{ 15,   3,  9, 208,     -20,     2,  6, 3 },

{ 16,   3, 9, 233,      -20,     2, 6, 4 },
{ 17,   3, 9, 258,      -30,     3, 4, 4 },
{ 18,   3, 9, 283,      -30,     2, 7, 4 },
{ 19,   3, 9, 308,      -40,     2, 7, 5 },
{ 20,   3, 9, 333,      -40,     2, 8, 5 },

{ 21,   4, 10, 360,     -50,     4,  4, 5 },
{ 22,   5, 10, 400,     -50,     4,  4, 6 },
{ 23,   5, 10, 450,     -60,     3,  6, 6 },
{ 24,   5, 10, 500,     -60,     2, 10, 6 },
{ 25,   5, 10, 550,     -70,     2, 10, 7 },

{ 26,   5, 10, 600,     -70,     3,  7, 7 },
{ 27,   5, 10, 650,     -80,     5,  4, 7 },
{ 28,   6, 12, 703,     -80,     2, 12, 8 },
{ 29,   6, 12, 778,     -90,     2, 12, 8 },
{ 30,   6, 12, 853,     -90,     4,  6, 8 },

{ 31,   6, 12, 928,    -100,   4, 6,  9 },
{ 32,  10, 10, 1000,   -100,   6, 4,  9 },
{ 33,  10, 10, 1100,   -110,   6, 4, 10 },
{ 34,  10, 10, 1200,   -110,   4, 7, 10 },
{ 35,  10, 10, 1300,   -110,   4, 7, 11 },

{ 36,  10, 10, 1400,   -120,   3, 10, 11 },
{ 37,  10, 10, 1500,   -120,   3, 10, 12 },
{ 38,  10, 10, 1600,   -130,   5,  6, 12 },
{ 39,  15, 10, 1700,   -130,   5,  6, 13 },
{ 40,  15, 10, 1850,   -130,   4,  8, 13 },

{ 41,  25, 10, 2000,   -140,   4,  8, 14 },
{ 42,  25, 10, 2250,   -140,   3, 12, 14 },
{ 43,  25, 10, 2500,   -150,   3, 12, 15 },
{ 44,  25, 10, 2750,   -150,   8,  4, 15 },
{ 45,  25, 10, 3000,   -150,   8,  4, 16 },

{ 46,  25, 10, 3250,   -160,   6,  6, 16 },
{ 47,  25, 10, 3500,   -170,   6,  6, 17 },
{ 48,  25, 10, 3750,   -180,   6,  6, 18 },
{ 49,  50, 10, 4000,   -190,   4, 10, 18 },
{ 50,  50, 10, 4500,   -200,   5,  8, 19 },

{ 51,  50, 10, 5000,   -210,    5, 8, 20 },
{ 52,  50, 10, 5500,   -220,    6, 7, 20 },
{ 53,  50, 10, 6000,   -230,    6, 7, 21 },
{ 54,  50, 10, 6500,   -240,    7, 6, 22 },
{ 55,  50, 10, 7000,   -250,   10, 4, 23 },

{ 56,  50, 10, 7500,   -260,   10,  4, 24 },
{ 57,  50, 10, 8000,   -270,    6,  8, 24 },
{ 58,  50, 10, 8500,   -280,    5, 10, 25 },
{ 59,  50, 10, 9000,   -290,    8,  6, 26 },
{ 60,  50, 10, 9500,   -300,    8,  6, 28 }
};


/////////////////////////////////////////////////////////////////////////////
// CMobEd dialog


CMobEd::CMobEd(CWnd* pParent /*=NULL*/)
	: CDialog(CMobEd::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMobEd)
	m_Description = _T("");
	m_LongDescr = _T("");
	m_Name = _T("");
	m_ShortDescr = _T("");
	m_Vnum = 0;
	m_Alignment = 0;
	m_Group = 0;
	m_HitRoll = 0;
	m_Level = 0;
	m_DamDBonus = 0;
	m_DamDNumber = 0;
	m_DamDType = 0;
	m_HitDBonus = 0;
	m_HitDNumber = 0;
	m_HitDType = 0;
	m_ManaDBonus = 0;
	m_ManaDNumber = 0;
	m_ManaDType = 0;
	m_AcBash = 0;
	m_AcExotic = 0;
	m_AcPierce = 0;
	m_AcSlash = 0;
	m_Wealth = 0;
	m_Material = _T("");
	m_SpecFun = _T("");
	//}}AFX_DATA_INIT

	m_seldamtype = "";
	m_off_flags = 0;
	m_imm_flags = 0;
	m_res_flags = 0;
	m_vuln_flags = 0;
	m_form_flags = 0;
	m_parts_flags = 0;
	m_start_pos = "";
	m_default_pos = "";
	m_sex = "";
	m_size = "";
	m_shopdata = NULL;

	m_index = -1;
	m_doc = NULL;

	m_selrace = "";
	m_act_flags = 0;
	m_aff_flags = 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_MOBED_ACC ) );
}

CMobEd::~CMobEd()
{
	if ( m_shopdata != NULL )
		delete m_shopdata;
}

void CMobEd::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMobEd)
	DDX_Control(pDX, IDC_MOBED_MOBPROG_UP, m_MobProgUp);
	DDX_Control(pDX, IDC_MOBED_MOBPROG_DOWN, m_MobProgDown);
	DDX_Control(pDX, IDC_MOBED_MOBPROG, m_MobProgs);
	DDX_Control(pDX, IDC_MOBED_SHOPEDIT, m_ShopEdit);
	DDX_Control(pDX, IDC_MOBED_SHOPDEL, m_ShopDel);
	DDX_Control(pDX, IDC_MOBED_STARTPOS, m_StartPos);
	DDX_Control(pDX, IDC_MOBED_SIZE, m_Size);
	DDX_Control(pDX, IDC_MOBED_SEX, m_Sex);
	DDX_Control(pDX, IDC_MOBED_DEFAULTPOS, m_DefaultPos);
	DDX_Control(pDX, IDC_MOBED_WEALTH_SPIN, m_WealthSpin);
	DDX_Control(pDX, IDC_MOBED_VULN, m_FlagsVuln);
	DDX_Control(pDX, IDC_MOBED_RES, m_FlagsRes);
	DDX_Control(pDX, IDC_MOBED_PARTS, m_FlagsParts);
	DDX_Control(pDX, IDC_MOBED_OFF, m_FlagsOff);
	DDX_Control(pDX, IDC_MOBED_IMM, m_FlagsImm);
	DDX_Control(pDX, IDC_MOBED_FORM, m_FlagsForm);
	DDX_Control(pDX, IDC_MOBED_AFFECT, m_FlagsAffect);
	DDX_Control(pDX, IDC_MOBED_ACT, m_FlagsAct);
	DDX_Control(pDX, IDC_MOBED_FLAGS, m_Flags);
	DDX_Control(pDX, IDC_MOBED_ACSLASH_SPIN, m_AcSlashSpin);
	DDX_Control(pDX, IDC_MOBED_ACPIERCE_SPIN, m_AcPierceSpin);
	DDX_Control(pDX, IDC_MOBED_ACEXOTIC_SPIN, m_AcExoticSpin);
	DDX_Control(pDX, IDC_MOBED_ACBASH_SPIN, m_AcBashSpin);
	DDX_Control(pDX, IDC_MOBED_DAMTYPE, m_DamType);
	DDX_Control(pDX, IDC_MOBED_MANA_DBONUS_SPIN, m_ManaDBonusSpin);
	DDX_Control(pDX, IDC_MOBED_MANA_DTYPE_SPIN, m_ManaDTypeSpin);
	DDX_Control(pDX, IDC_MOBED_MANA_DNUMBER_SPIN, m_ManaDNumberSpin);
	DDX_Control(pDX, IDC_MOBED_HIT_DTYPE_SPIN, m_HitDTypeSpin);
	DDX_Control(pDX, IDC_MOBED_HIT_DNUMBER_SPIN, m_HitDNumberSpin);
	DDX_Control(pDX, IDC_MOBED_HIT_DBONUS_SPIN, m_HitDBonusSpin);
	DDX_Control(pDX, IDC_MOBED_DAMAGE_DTYPE_SPIN, m_DamDTypeSpin);
	DDX_Control(pDX, IDC_MOBED_DAMAGE_DNUMBER_SPIN, m_DamDNumberSpin);
	DDX_Control(pDX, IDC_MOBED_DAMAGE_DBONUS_SPIN, m_DamDBonusSpin);
	DDX_Control(pDX, IDC_MOBED_LEVEL_SPIN, m_LevelSpin);
	DDX_Control(pDX, IDC_MOBED_HITROLL_SPIN, m_HitRollSpin);
	DDX_Control(pDX, IDC_MOBED_GROUP_SPIN, m_GroupSpin);
	DDX_Control(pDX, IDC_MOBED_ALIGNMENT_SPIN, m_AlignmentSpin);
	DDX_Control(pDX, IDC_MOBED_RACE, m_Race);
	DDX_Control(pDX, IDC_MOBED_VNUM_SPIN, m_VnumSpin);
	DDX_Text(pDX, IDC_MOBED_DESCRIPTION, m_Description);
	DDX_Text(pDX, IDC_MOBED_LONGDESCR, m_LongDescr);
	DDX_Text(pDX, IDC_MOBED_NAME, m_Name);
	DDX_Text(pDX, IDC_MOBED_SHORTDESCR, m_ShortDescr);
	DDX_Text(pDX, IDC_MOBED_VNUM, m_Vnum);
	DDV_MinMaxInt(pDX, m_Vnum, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_ALIGNMENT, m_Alignment);
	DDV_MinMaxInt(pDX, m_Alignment, -1000, 1000);
	DDX_Text(pDX, IDC_MOBED_GROUP, m_Group);
	DDV_MinMaxInt(pDX, m_Group, -1, 32767);
	DDX_Text(pDX, IDC_MOBED_HITROLL, m_HitRoll);
	DDV_MinMaxInt(pDX, m_HitRoll, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_LEVEL, m_Level);
	DDV_MinMaxInt(pDX, m_Level, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_DAMAGE_DBONUS, m_DamDBonus);
	DDV_MinMaxInt(pDX, m_DamDBonus, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_DAMAGE_DNUMBER, m_DamDNumber);
	DDV_MinMaxInt(pDX, m_DamDNumber, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_DAMAGE_DTYPE, m_DamDType);
	DDV_MinMaxInt(pDX, m_DamDType, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_HIT_DBONUS, m_HitDBonus);
	DDV_MinMaxInt(pDX, m_HitDBonus, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_HIT_DNUMBER, m_HitDNumber);
	DDV_MinMaxInt(pDX, m_HitDNumber, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_HIT_DTYPE, m_HitDType);
	DDV_MinMaxInt(pDX, m_HitDType, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_MANA_DBONUS, m_ManaDBonus);
	DDV_MinMaxInt(pDX, m_ManaDBonus, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_MANA_DNUMBER, m_ManaDNumber);
	DDV_MinMaxInt(pDX, m_ManaDNumber, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_MANA_DTYPE, m_ManaDType);
	DDV_MinMaxInt(pDX, m_ManaDType, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_ACBASH, m_AcBash);
	DDV_MinMaxInt(pDX, m_AcBash, -32768, 32767);
	DDX_Text(pDX, IDC_MOBED_ACEXOTIC, m_AcExotic);
	DDV_MinMaxInt(pDX, m_AcExotic, -32768, 32767);
	DDX_Text(pDX, IDC_MOBED_ACPIERCE, m_AcPierce);
	DDV_MinMaxInt(pDX, m_AcPierce, -32768, 32767);
	DDX_Text(pDX, IDC_MOBED_ACSLASH, m_AcSlash);
	DDV_MinMaxInt(pDX, m_AcSlash, -32768, 32767);
	DDX_Text(pDX, IDC_MOBED_WEALTH, m_Wealth);
	DDV_MinMaxInt(pDX, m_Wealth, 0, 32767);
	DDX_Text(pDX, IDC_MOBED_MATERIAL, m_Material);
	DDX_Text(pDX, IDC_MOBED_SPECFUN, m_SpecFun);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMobEd, CDialog)
	//{{AFX_MSG_MAP(CMobEd)
	ON_CBN_SELCHANGE(IDC_MOBED_RACE, OnSelchangeMobedRace)
	ON_CBN_SELCHANGE(IDC_MOBED_DAMTYPE, OnSelchangeMobedDamtype)
	ON_BN_CLICKED(IDC_MOBED_ACT, OnMobedFlags)
	ON_NOTIFY(NM_CLICK, IDC_MOBED_FLAGS, OnClickMobedFlags)
	ON_CBN_SELCHANGE(IDC_MOBED_STARTPOS, OnSelchangeMobedStartpos)
	ON_CBN_SELCHANGE(IDC_MOBED_DEFAULTPOS, OnSelchangeMobedDefaultpos)
	ON_CBN_SELCHANGE(IDC_MOBED_SEX, OnSelchangeMobedSex)
	ON_CBN_SELCHANGE(IDC_MOBED_SIZE, OnSelchangeMobedSize)
	ON_BN_CLICKED(IDC_MOBED_SHOPDEL, OnMobedShopdel)
	ON_BN_CLICKED(IDC_MOBED_SHOPEDIT, OnMobedShopedit)
	ON_NOTIFY(NM_RCLICK, IDC_MOBED_MOBPROG, OnRclickMobedMobprog)
	ON_BN_CLICKED(IDC_MOBED_MERCEDIT, OnMobedMercedit)
	ON_BN_CLICKED(IDC_MOBED_DEFAULT, OnMobedDefault)
	ON_NOTIFY(NM_CLICK, IDC_MOBED_MOBPROG, OnClickMobedMobprog)
	ON_BN_CLICKED(IDC_MOBED_MOBPROG_UP, OnMobedMobprogUp)
	ON_BN_CLICKED(IDC_MOBED_MOBPROG_DOWN, OnMobedMobprogDown)
	ON_COMMAND(ID_EDIT_COPIARMOB, OnEditCopiarmob)
	ON_COMMAND(ID_EDIT_PEGARMOB, OnEditPegarmob)
	ON_BN_CLICKED(IDC_MOBED_AFFECT, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_FORM, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_IMM, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_OFF, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_PARTS, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_RES, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_VULN, OnMobedFlags)
	ON_BN_CLICKED(IDC_MOBED_TRAINER, OnMobedTrainer)
	//}}AFX_MSG_MAP
	ON_COMMAND( ID_MOBPROGPOP_AGREGAR, OnMobprogPopAgregar )
	ON_COMMAND( ID_MOBPROGPOP_BORRAR, OnMobprogPopBorrar )
	ON_COMMAND( ID_MOBPROGPOP_EDITAR, OnMobprogPopEditar )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMobEd message handlers

BOOL CMobEd::OnInitDialog() 
{
	CDialog::OnInitDialog();

	int i, j, index;
	LV_COLUMN column;

	m_VnumSpin.SetBuddy( GetDlgItem( IDC_MOBED_VNUM ) );
	m_VnumSpin.SetRange( 0, 32767 );
	
	for ( i = 0; i < tables.m_mobflags.GetSize(); i++ )
	{
		index = m_Race.AddString( tables.m_mobflags[i]->m_race );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Race.SetItemData( index, i );
	}
	m_Race.SetCurSel( m_Race.FindStringExact( -1, m_selrace ) );

	m_Flags.SetImageList( &m_imagelist, LVSIL_SMALL );
	m_FlagsAct.SetCheck( 1 );
	m_FlagsAffect.SetCheck( 0 );
	m_FlagsOff.SetCheck( 0 );
	m_FlagsImm.SetCheck( 0 );
	m_FlagsRes.SetCheck( 0 );
	m_FlagsVuln.SetCheck( 0 );
	m_FlagsForm.SetCheck( 0 );
	m_FlagsParts.SetCheck( 0 );
	SetFlags();

	m_AlignmentSpin.SetBuddy( GetDlgItem( IDC_MOBED_ALIGNMENT ) );
	m_AlignmentSpin.SetRange( -1000, 1000 );
	m_GroupSpin.SetBuddy( GetDlgItem( IDC_MOBED_GROUP ) );
	m_GroupSpin.SetRange( -1, 32767 );
	m_LevelSpin.SetBuddy( GetDlgItem( IDC_MOBED_LEVEL ) );
	m_LevelSpin.SetRange( 0, 32767 );
	m_HitRollSpin.SetBuddy( GetDlgItem( IDC_MOBED_HITROLL ) );
	m_HitRollSpin.SetRange( 0, 32767 );

	m_HitDNumberSpin.SetBuddy( GetDlgItem( IDC_MOBED_HIT_DNUMBER ) );
	m_HitDTypeSpin.SetBuddy( GetDlgItem( IDC_MOBED_HIT_DTYPE ) );
	m_HitDBonusSpin.SetBuddy( GetDlgItem( IDC_MOBED_HIT_DBONUS ) );
	m_ManaDNumberSpin.SetBuddy( GetDlgItem( IDC_MOBED_MANA_DNUMBER ) );
	m_ManaDTypeSpin.SetBuddy( GetDlgItem( IDC_MOBED_MANA_DTYPE ) );
	m_ManaDBonusSpin.SetBuddy( GetDlgItem( IDC_MOBED_MANA_DBONUS ) );
	m_DamDNumberSpin.SetBuddy( GetDlgItem( IDC_MOBED_DAMAGE_DNUMBER ) );
	m_DamDTypeSpin.SetBuddy( GetDlgItem( IDC_MOBED_DAMAGE_DTYPE ) );
	m_DamDBonusSpin.SetBuddy( GetDlgItem( IDC_MOBED_DAMAGE_DBONUS ) );
	m_HitDNumberSpin.SetRange( 0, 32767 );
	m_HitDTypeSpin.SetRange( 0, 32767 );
	m_HitDBonusSpin.SetRange( 0, 32767 );
	m_ManaDNumberSpin.SetRange( 0, 32767 );
	m_ManaDTypeSpin.SetRange( 0, 32767 );
	m_ManaDBonusSpin.SetRange( 0, 32767 );
	m_DamDNumberSpin.SetRange( 0, 32767 );
	m_DamDTypeSpin.SetRange( 0, 32767 );
	m_DamDBonusSpin.SetRange( 0, 32767 );

	m_AcPierceSpin.SetBuddy( GetDlgItem( IDC_MOBED_ACPIERCE ) );
	m_AcBashSpin.SetBuddy( GetDlgItem( IDC_MOBED_ACBASH ) );
	m_AcSlashSpin.SetBuddy( GetDlgItem( IDC_MOBED_ACSLASH ) );
	m_AcExoticSpin.SetBuddy( GetDlgItem( IDC_MOBED_ACEXOTIC ) );
	m_AcPierceSpin.SetRange( -32768, 32767 );
	m_AcBashSpin.SetRange( -32768, 32767 );
	m_AcSlashSpin.SetRange( -32768, 32767 );
	m_AcExoticSpin.SetRange( -32768, 32767 );

	for ( i = 0; i < tables.m_attack_types.GetSize(); i++ )
	{
		index = m_DamType.AddString( tables.m_attack_types[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_DamType.SetItemData( index, i );
		if ( tables.m_attack_types[i]->m_text == m_seldamtype )
			m_DamType.SetCurSel( index );
	}

	for ( i = 0; i < tables.m_pos.GetSize(); i++ )
	{
		index = m_StartPos.AddString( tables.m_pos[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_StartPos.SetItemData( index, i );
		if ( tables.m_pos[i]->m_text == m_start_pos )
			m_StartPos.SetCurSel( index );
	}

	for ( i = 0; i < tables.m_pos.GetSize(); i++ )
	{
		index = m_DefaultPos.AddString( tables.m_pos[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_DefaultPos.SetItemData( index, i );
		if ( tables.m_pos[i]->m_text == m_default_pos )
			m_DefaultPos.SetCurSel( index );
	}

	for ( i = 0; i < tables.m_sex.GetSize(); i++ )
	{
		index = m_Sex.AddString( tables.m_sex[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Sex.SetItemData( index, i );
	}
	m_Sex.SetCurSel( m_Sex.FindStringExact( -1, m_sex ) );

	m_WealthSpin.SetBuddy( GetDlgItem( IDC_MOBED_WEALTH ) );
	m_WealthSpin.SetRange( 0, 32767 );

	for ( i = 0; i < tables.m_size.GetSize(); i++ )
	{
		index = m_Size.AddString( tables.m_size[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Size.SetItemData( index, i );
	}
	m_Size.SetCurSel( m_Size.FindStringExact( -1, m_size ) );

	if ( m_shopdata == NULL )
	{
		m_ShopDel.EnableWindow( FALSE );
		CString temp;
		temp.LoadString( IDS_NEW );
		m_ShopEdit.SetWindowText( temp );
	}

	CString temp;

	temp.LoadString( IDS_TYPE );
	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = temp.GetBuffer(0);
	column.cx = 90;
	column.iSubItem = 0;
	m_MobProgs.InsertColumn( 0, &column );

	temp.LoadString( IDS_VNUM );
	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = temp.GetBuffer(0);
	column.cx = 60;
	column.iSubItem = 1;
	m_MobProgs.InsertColumn( 1, &column );

	temp.LoadString( IDS_ARGUMENT );
	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = temp.GetBuffer(0);
	column.cx = 300;
	column.iSubItem = 2;
	m_MobProgs.InsertColumn( 2, &column );

	MakeMobprogList();

	for ( i = 0; i < tables.m_skills.GetSize(); i++ )
	{
		for ( j = 0; j < m_skills.GetSize(); j++ )
			if ( tables.m_skills[i]->m_text == m_skills[j]->m_skill )
				break;
		if ( j >= m_skills.GetSize() )
		{
			CSkillData *skill = new CSkillData();
			skill->m_skill = tables.m_skills[i]->m_text;
			skill->m_percent = 0;
			m_skills.Add( skill );
		}
	}

	m_MobProgUp.SetIcon( AfxGetApp()->LoadIcon( IDI_UP ) );
	m_MobProgDown.SetIcon( AfxGetApp()->LoadIcon( IDI_DOWN ) );
	m_MobProgDown.EnableWindow( FALSE );
	m_MobProgUp.EnableWindow( FALSE );

	UpdateData( FALSE );

	if ( tables.m_mudtype != MUD_ARCANUM )
	{
		GetDlgItem( IDC_MOBED_MERCEDIT )->EnableWindow( FALSE );
		GetDlgItem( IDC_MOBED_TRAINER )->EnableWindow( FALSE );
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CMobEd::OnSelchangeMobedRace() 
{
	int index, num;

	if ( ( index = m_Race.GetCurSel() ) == CB_ERR )
		return;

	num = m_Race.GetItemData( index );
	m_selrace = tables.m_mobflags[num]->m_race;
	m_act_flags = tables.m_mobflags[num]->m_act;
	m_aff_flags = tables.m_mobflags[num]->m_aff;
	m_off_flags = tables.m_mobflags[num]->m_off;
	m_imm_flags = tables.m_mobflags[num]->m_imm;
	m_res_flags = tables.m_mobflags[num]->m_res;
	m_vuln_flags = tables.m_mobflags[num]->m_vul;
	m_form_flags = tables.m_mobflags[num]->m_for;
	m_parts_flags = tables.m_mobflags[num]->m_par;
	SetFlags();
}

void CMobEd::SetFlags()
{
	int i;
	LV_ITEM itemdata;
	CArray< CNumStrData*, CNumStrData* > *table;
	int flagsel, tempflag;

	if ( m_FlagsAct.GetCheck() ) flagsel = 0;
	else if ( m_FlagsAffect.GetCheck() ) flagsel = 1;
	else if ( m_FlagsOff.GetCheck() ) flagsel = 2;
	else if ( m_FlagsImm.GetCheck() ) flagsel = 3;
	else if ( m_FlagsRes.GetCheck() ) flagsel = 4;
	else if ( m_FlagsVuln.GetCheck() ) flagsel = 5;
	else if ( m_FlagsForm.GetCheck() ) flagsel = 6;
	else if ( m_FlagsParts.GetCheck() ) flagsel = 7;
	else return;

	switch ( flagsel )
	{
	case 0: table = &tables.m_act_flags; tempflag = m_act_flags; break;
	case 1: table = &tables.m_affect_flags; tempflag = m_aff_flags; break;
	case 2: table = &tables.m_off_flags; tempflag = m_off_flags; break;
	case 3: table = &tables.m_imm_flags; tempflag = m_imm_flags; break;
	case 4: table = &tables.m_imm_flags; tempflag = m_res_flags; break;
	case 5: table = &tables.m_imm_flags; tempflag = m_vuln_flags; break;
	case 6: table = &tables.m_form_flags; tempflag = m_form_flags; break;
	case 7: table = &tables.m_parts_flags; tempflag = m_parts_flags; break;
	}

	m_Flags.DeleteAllItems();
	for ( i = 0; i < table->GetSize(); i++ )
	{
		itemdata.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.pszText = (*table)[i]->m_text.GetBuffer(0);
		itemdata.lParam = (*table)[i]->m_num;
		itemdata.iImage = itemdata.lParam & tempflag ? 1 : 0;
		m_Flags.InsertItem( &itemdata );
	}

}

void CMobEd::OnOK()
{
	char buf[500];
	int i;
	CString text, tit;

	UpdateData( TRUE );

	m_act_flags |= 1;

	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_MOBED_VNUM ) );
		return;
	}

	if ( m_doc->FindMob( m_Vnum, m_index ) != -1 )
	{
		text.LoadString( IDS_VNUMUSE );
		tit.LoadString( IDS_ERROR );
		MessageBox( text, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_MOBED_VNUM ) );
		return;
	}

	if ( ( m_Group < m_doc->m_minvnum || m_Group > m_doc->m_maxvnum )
		&& m_Group > 0 )
	{
		text.LoadString( IDS_GROUPUSE );
		tit.LoadString( IDS_ERROR );
		sprintf( buf, text, m_doc->m_minvnum, m_doc->m_maxvnum );
		MessageBox( buf, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_MOBED_GROUP ) );
		return;
	}

	if ( m_selrace == "" ) 
	{
		text.LoadString( IDS_MOBRACE );
		tit.LoadString( IDS_ERROR );
		MessageBox( text, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_MOBED_RACE ) );
		return;
	}

	if ( m_Name == "" )
	{
		text.LoadString( IDS_MOBNAME );
		tit.LoadString( IDS_ERROR );
		MessageBox( text, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_MOBED_NAME ) );
		return;
	}

	for ( i = 0; i < m_skills.GetSize(); i++ )
		if ( m_skills[i]->m_percent == 0 )
			m_skills.RemoveAt( i-- );

	UpdateData( FALSE );

	CDialog::OnOK();
}

void CMobEd::OnSelchangeMobedDamtype() 
{
	int index, num;

	if ( ( index = m_DamType.GetCurSel() ) == CB_ERR )
		return;

	num = m_DamType.GetItemData( index );
	m_seldamtype = tables.m_attack_types[num]->m_text;
}

void CMobEd::OnMobedFlags() 
{
	CButton *boton;

	if ( ( boton = (CButton*) GetFocus() ) == NULL )
		return;
	if ( !boton->GetCheck() ) 
	{
		boton->SetCheck( 1 );
		return;
	}

	m_FlagsAct.SetCheck( 0 );
	m_FlagsAffect.SetCheck( 0 );
	m_FlagsOff.SetCheck( 0 );
	m_FlagsImm.SetCheck( 0 );
	m_FlagsRes.SetCheck( 0 );
	m_FlagsVuln.SetCheck( 0 );
	m_FlagsForm.SetCheck( 0 );
	m_FlagsParts.SetCheck( 0 );

	boton->SetCheck( 1 );
	SetFlags();
}

void CMobEd::OnClickMobedFlags(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int *flags;

	if ( m_FlagsAct.GetCheck() ) flags = &m_act_flags;
	else if ( m_FlagsAffect.GetCheck() ) flags = &m_aff_flags;
	else if ( m_FlagsOff.GetCheck() ) flags = &m_off_flags;
	else if ( m_FlagsImm.GetCheck() ) flags = &m_imm_flags;
	else if ( m_FlagsRes.GetCheck() ) flags = &m_res_flags;
	else if ( m_FlagsVuln.GetCheck() ) flags = &m_vuln_flags;
	else if ( m_FlagsForm.GetCheck() ) flags = &m_form_flags;
	else if ( m_FlagsParts.GetCheck() ) flags = &m_parts_flags;
	else return;

	for ( int i = 0; i < m_Flags.GetItemCount(); i++ )
	{
		if ( m_Flags.GetItemState( i, LVIS_SELECTED ) )
		{
			*flags ^= m_Flags.GetItemData( i );

			LV_ITEM itemdata;
			itemdata.mask = LVIF_IMAGE;
			itemdata.iItem = i;
			itemdata.iSubItem = 0;
			itemdata.iImage = *flags & m_Flags.GetItemData( i ) ? 1 : 0;
			m_Flags.SetItem( &itemdata );
		}
	}

	*pResult = 0;
}

void CMobEd::OnSelchangeMobedStartpos() 
{
	int index, num;

	if ( ( index = m_StartPos.GetCurSel() ) == CB_ERR )
		return;

	num = m_StartPos.GetItemData( index );
	m_start_pos = tables.m_pos[num]->m_text;
}

void CMobEd::OnSelchangeMobedDefaultpos() 
{
	int index, num;

	if ( ( index = m_DefaultPos.GetCurSel() ) == CB_ERR )
		return;

	num = m_DefaultPos.GetItemData( index );
	m_default_pos = tables.m_pos[num]->m_text;
}

void CMobEd::OnSelchangeMobedSex() 
{
	int index, num;

	if ( ( index = m_Sex.GetCurSel() ) == CB_ERR )
		return;

	num = m_Sex.GetItemData( index );
	m_sex = tables.m_sex[num]->m_text;
}

void CMobEd::OnSelchangeMobedSize() 
{
	int index, num;

	if ( ( index = m_Size.GetCurSel() ) == CB_ERR )
		return;

	num = m_Size.GetItemData( index );
	m_size = tables.m_size[num]->m_text;
}

void CMobEd::OnMobedShopdel() 
{
	CString text;

	m_ShopDel.EnableWindow( FALSE );
	text.LoadString( IDS_NEW );
	m_ShopEdit.SetWindowText( text );

	if ( m_shopdata == NULL ) return;
	delete m_shopdata;
	m_shopdata = NULL;
}

void CMobEd::OnMobedShopedit() 
{
	CShopEd dlg;
	int i;
	CString text;

	if ( m_shopdata == NULL )
	{
		m_ShopDel.EnableWindow( TRUE );
		text.LoadString( IDS_EDIT );
		m_ShopEdit.SetWindowText( text );
		m_shopdata = new CShopData();
	}

	for ( i = 0; i < 5; i++ )
		dlg.m_trade[i] = m_shopdata->m_trade[i];
	dlg.m_Buy = m_shopdata->m_percent_buy;
	dlg.m_Sell = m_shopdata->m_percent_sell;
	dlg.m_Open = m_shopdata->m_open_hour;
	dlg.m_Close = m_shopdata->m_close_hour;

	if ( dlg.DoModal() == IDOK )
	{
		for ( i = 0; i < 5; i++ )
			m_shopdata->m_trade[i] = dlg.m_trade[i];
		m_shopdata->m_percent_buy = dlg.m_Buy;
		m_shopdata->m_percent_sell = dlg.m_Sell;
		m_shopdata->m_open_hour = dlg.m_Open;
		m_shopdata->m_close_hour = dlg.m_Close;
	}

}

void CMobEd::MakeMobprogList()
{
	int i, index;
	char buf[500];

	m_MobProgs.DeleteAllItems();

	if ( !tables.m_mobprog )
	{
		m_MobProgs.EnableWindow( FALSE );
		return;
	}

	for ( i = 0; i < m_mobprog.GetSize(); i++ )
	{
		index = m_MobProgs.InsertItem( i, m_mobprog[i]->m_type );
		itoa( m_mobprog[i]->m_vnum, buf, 10 );
		m_MobProgs.SetItemText( index, 1, buf );
		m_MobProgs.SetItemText( index, 2, m_mobprog[i]->m_trigphrase );
		m_MobProgs.SetItemData( index, i );
	}

}

void CMobEd::OnRclickMobedMobprog(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POINT curPos;
	CMenu menu;
	int i;
	CString text;

	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;

	GetCursorPos( &curPos );
	menu.CreatePopupMenu();
	text.LoadString( IDS_MADD );
	menu.AppendMenu( MF_ENABLED, ID_MOBPROGPOP_AGREGAR, text );
	text.LoadString( IDS_MDEL );
	menu.AppendMenu( i < m_MobProgs.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_MOBPROGPOP_BORRAR, text );
	text.LoadString( IDS_MEDIT );
	menu.AppendMenu( i < m_MobProgs.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_MOBPROGPOP_EDITAR, text );
	menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, curPos.x, curPos.y, this );
	
	*pResult = 0;
}

int CMobEd::MobProgEd( CMobProg *mobprog )
{
	CMobProgEd dlg;

	dlg.m_seltype = mobprog->m_type;
	dlg.m_Vnum = mobprog->m_vnum;
	dlg.m_Trigphrase = mobprog->m_trigphrase;

	if ( dlg.DoModal() == IDOK )
	{
		mobprog->m_type = dlg.m_seltype;
		mobprog->m_vnum = dlg.m_Vnum;
		mobprog->m_trigphrase = dlg.m_Trigphrase;

		return IDOK;
	}

	return IDCANCEL;
}

void CMobEd::OnMobprogPopAgregar()
{
	CMobProg *mobprog;

	mobprog = new CMobProg();
	if ( MobProgEd( mobprog ) == IDOK )
	{
		m_mobprog.Add( mobprog );
		MakeMobprogList();
	}
	else delete mobprog;
}

void CMobEd::OnMobprogPopBorrar()
{
	int i;

	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_MobProgs.GetItemCount() ) return;
	m_mobprog.RemoveAt( m_MobProgs.GetItemData( i ) );
	MakeMobprogList();
}

void CMobEd::OnMobprogPopEditar()
{
	int i;

	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_MobProgs.GetItemCount() ) return;
	if ( MobProgEd( m_mobprog[m_MobProgs.GetItemData( i )] ) == IDOK )
		MakeMobprogList();
}

void CMobEd::OnMobedMercedit() 
{
	CMercDataEd dlg;
	int i;
	CSkillData *skill;

	dlg.m_Clan = m_clan;
	dlg.m_Rank = m_rank;
	for ( i = 0; i < m_mercmsg.GetSize(); i++ )
		dlg.m_mercmsg.Add( m_mercmsg[i] );
	for ( i = 0; i < m_skills.GetSize(); i++ )
	{
		skill = new CSkillData();
		*skill = *m_skills[i];
		dlg.m_skills.Add( skill );
	}

	if ( dlg.DoModal() == IDOK )
	{
		m_clan = dlg.m_Clan;
		m_rank = dlg.m_Rank;
		m_mercmsg.RemoveAll();
		for ( i = 0; i < dlg.m_mercmsg.GetSize(); i++ )
			m_mercmsg.Add( dlg.m_mercmsg[i] );
		m_skills.RemoveAll();
		for ( i = 0; i < dlg.m_skills.GetSize(); i++ )
		{
			skill = new CSkillData();
			*skill = *dlg.m_skills[i];
			m_skills.Add( skill );
		}
	}

}

void CMobEd::OnMobedDefault() 
{
	UpdateData( TRUE );

	//The following line of code is the one which determines
	//if the level they have entered is valid as to the 
	//level table at the top of this document.  This has been 
	//modified for Angel's Fire to allow for 115 levels 
	//as opposed to the previous 60 from the origional
	//Arcanum Edit
	if ( m_Level < 1 || m_Level > 115 ) return;

	m_HitDNumber = levmob[m_Level-1].hit_num;
	m_HitDType = levmob[m_Level-1].hit_type;
	m_HitDBonus = levmob[m_Level-1].hit_bonus;
	m_AcBash = levmob[m_Level-1].ac;
	m_AcExotic = levmob[m_Level-1].ac;
	m_AcPierce = levmob[m_Level-1].ac;
	m_AcSlash = levmob[m_Level-1].ac;
	m_DamDNumber = levmob[m_Level-1].dam_num;
	m_DamDType = levmob[m_Level-1].dam_type;
	m_DamDBonus = levmob[m_Level-1].dam_bonus;

	UpdateData( FALSE );
}

void CMobEd::OnClickMobedMobprog(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int i;

	m_MobProgDown.EnableWindow( FALSE );
	m_MobProgUp.EnableWindow( FALSE );
	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i < m_MobProgs.GetItemCount() - 1 ) m_MobProgDown.EnableWindow();
	if ( i > 0 && i < m_MobProgs.GetItemCount() ) m_MobProgUp.EnableWindow();
	
	*pResult = 0;
}

void CMobEd::OnMobedMobprogUp() 
{
	int i, k;
	char buf[500];
	CMobProg *mobprog;

	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_MobProgs.GetItemCount() ) return;
	if ( i <= 0 ) return;

	mobprog = m_mobprog[i-1];
	m_mobprog[i-1] = m_mobprog[i];
	m_mobprog[i] = mobprog;

	for ( k = i-1; k <= i; k++ )
	{
		m_MobProgs.DeleteItem( k );
		int index = m_MobProgs.InsertItem( k, m_mobprog[k]->m_type );
		itoa( m_mobprog[k]->m_vnum, buf, 10 );
		m_MobProgs.SetItemText( index, 1, buf );
		m_MobProgs.SetItemText( index, 2, m_mobprog[k]->m_trigphrase );
		m_MobProgs.SetItemData( index, k );
	}

	m_MobProgs.SetItemState( i-1, LVIS_SELECTED, LVIS_SELECTED );
	m_MobProgs.EnsureVisible( --i, FALSE );
	m_MobProgDown.EnableWindow( FALSE );
	m_MobProgUp.EnableWindow( FALSE );
	if ( i < m_MobProgs.GetItemCount() - 1 ) m_MobProgDown.EnableWindow();
	if ( i > 0 && i < m_MobProgs.GetItemCount() ) m_MobProgUp.EnableWindow();
}

void CMobEd::OnMobedMobprogDown() 
{
	int i, k;
	char buf[500];
	CMobProg *mobprog;

	for ( i = 0; i < m_MobProgs.GetItemCount(); i++ )
		if ( m_MobProgs.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_MobProgs.GetItemCount() - 1 ) return;

	mobprog = m_mobprog[i+1];
	m_mobprog[i+1] = m_mobprog[i];
	m_mobprog[i] = mobprog;

	for ( k = i; k <= i+1; k++ )
	{
		m_MobProgs.DeleteItem( k );
		int index = m_MobProgs.InsertItem( k, m_mobprog[k]->m_type );
		itoa( m_mobprog[k]->m_vnum, buf, 10 );
		m_MobProgs.SetItemText( index, 1, buf );
		m_MobProgs.SetItemText( index, 2, m_mobprog[k]->m_trigphrase );
		m_MobProgs.SetItemData( index, k );
	}

	m_MobProgs.SetItemState( i+1, LVIS_SELECTED, LVIS_SELECTED );
	m_MobProgs.EnsureVisible( ++i, FALSE );
	m_MobProgDown.EnableWindow( FALSE );
	m_MobProgUp.EnableWindow( FALSE );
	if ( i < m_MobProgs.GetItemCount() - 1 ) m_MobProgDown.EnableWindow();
	if ( i > 0 && i < m_MobProgs.GetItemCount() ) m_MobProgUp.EnableWindow();
}

BOOL CMobEd::PreTranslateMessage(MSG* pMsg) 
{
	if ( TranslateAccelerator( this->m_hWnd, m_accel, pMsg ) )
		return TRUE;
	
	return CDialog::PreTranslateMessage(pMsg);
}

void CMobEd::OnEditCopiarmob() 
{
	int i;

	UINT clfmt = RegisterClipboardFormat( "ARCAED_MOB" );

	COleDataSource *source = new COleDataSource();
	UpdateData( TRUE );

	TRY
	{

		CSharedFile file( GMEM_ZEROINIT|GMEM_DDESHARE|GMEM_MOVEABLE );
		TRY
		{

			CArchive ar (&file, CArchive::store);
			TRY
			{
				ar << m_AcBash << m_AcExotic << m_AcPierce;
				ar << m_AcSlash << m_act_flags << m_aff_flags;
				ar << m_Alignment << m_clan;
				ar << m_DamDBonus << m_DamDNumber << m_DamDType;
				ar << m_default_pos << m_Description;
				ar << m_form_flags << m_Group;
				ar << m_HitDBonus << m_HitDNumber << m_HitDType;
				ar << m_HitRoll << m_imm_flags << m_Level;
				ar << m_LongDescr;
				ar << m_ManaDBonus << m_ManaDNumber << m_ManaDType;
				ar << m_Material;
				ar << m_mercmsg.GetSize();
				for ( i = 0; i < m_mercmsg.GetSize(); i++ )
				{
					ar << m_mercmsg[i];
				}
				ar << m_mobprog.GetSize();
				for ( i = 0; i < m_mobprog.GetSize(); i++ )
				{
					ar << m_mobprog[i]->m_trigphrase;
					ar << m_mobprog[i]->m_type;
					ar << m_mobprog[i]->m_vnum;
				}
				ar << m_Name << m_off_flags << m_parts_flags;
				ar << m_rank << m_res_flags << m_seldamtype;
				ar << m_selrace << m_sex;
				if ( m_shopdata != NULL )
				{
					ar << 1;
					ar << m_shopdata->m_close_hour;
					ar << m_shopdata->m_open_hour;
					ar << m_shopdata->m_percent_buy;
					ar << m_shopdata->m_percent_sell;
					for ( i = 0; i < 5; i++ )
						ar << m_shopdata->m_trade[i];
				}
				else ar << 0;
				ar << m_size;
				ar << m_skills.GetSize();
				for ( i = 0; i < m_skills.GetSize(); i++ )
				{
					ar << m_skills[i]->m_percent;
					ar << m_skills[i]->m_skill;
				}
				ar << m_SpecFun << m_start_pos << m_vuln_flags;
				ar << m_Wealth << m_ShortDescr;

				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 CMobEd::OnEditPegarmob() 
{
	int i, j, index, num;

	UINT clfmt = RegisterClipboardFormat( "ARCAED_MOB" );

	COleDataObject source;
	if ( !source.AttachClipboard() ) return;
	CFile *pFile = source.GetFileData( clfmt );
	if ( pFile == NULL ) return;
	UpdateData( TRUE );

	TRY
	{

		CArchive ar( pFile, CArchive::load );
		TRY
		{
			CMobProg *mobprog;
			CShopData *shop;
			CSkillData *skill;
			CString line;

			ar >> m_AcBash >> m_AcExotic >> m_AcPierce;
			ar >> m_AcSlash >> m_act_flags >> m_aff_flags;
			ar >> m_Alignment >> m_clan;
			ar >> m_DamDBonus >> m_DamDNumber >> m_DamDType;
			ar >> m_default_pos >> m_Description;
			ar >> m_form_flags >> m_Group;
			ar >> m_HitDBonus >> m_HitDNumber >> m_HitDType;
			ar >> m_HitRoll >> m_imm_flags >> m_Level;
			ar >> m_LongDescr;
			ar >> m_ManaDBonus >> m_ManaDNumber >> m_ManaDType;
			ar >> m_Material;
			ar >> num;
			m_mercmsg.RemoveAll();
			for ( i = 0; i < num; i++ )
			{
				ar >> line;
				m_mercmsg.Add( line );
			}
			ar >> num;
			m_mobprog.RemoveAll();
			for ( i = 0; i < num; i++ )
			{
				mobprog = new CMobProg();
				ar >> mobprog->m_trigphrase;
				ar >> mobprog->m_type;
				ar >> mobprog->m_vnum;
				m_mobprog.Add( mobprog );
			}
			ar >> m_Name >> m_off_flags >> m_parts_flags;
			ar >> m_rank >> m_res_flags >> m_seldamtype;
			ar >> m_selrace >> m_sex;
			ar >> num;
			if ( m_shopdata != NULL )
			{
				delete m_shopdata;
				m_shopdata = NULL;
			}
			if ( num )
			{
				shop = new CShopData();
				ar >> shop->m_close_hour;
				ar >> shop->m_open_hour;
				ar >> shop->m_percent_buy;
				ar >> shop->m_percent_sell;
				for ( i = 0; i < 5; i++ )
					ar >> shop->m_trade[i];
				m_shopdata = shop;
			}
			ar >> m_size;
			ar >> num;
			m_skills.RemoveAll();
			for ( i = 0; i < num; i++ )
			{
				skill = new CSkillData();
				ar >> skill->m_percent;
				ar >> skill->m_skill;
				m_skills.Add( skill );
			}
			ar >> m_SpecFun >> m_start_pos >> m_vuln_flags;
			ar >> m_Wealth >> m_ShortDescr;

			ar.Close();

		}
		CATCH_ALL( eArRead )
		{
			ASSERT( FALSE );
		}
		END_CATCH_ALL;

	}
	CATCH_ALL( eArClose )
	{
		ASSERT( FALSE );
	}
	END_CATCH_ALL;

	UpdateData( FALSE );

	m_Race.SetCurSel( m_Race.FindStringExact( -1, m_selrace ) );

	m_FlagsAct.SetCheck( 1 );
	m_FlagsAffect.SetCheck( 0 );
	m_FlagsOff.SetCheck( 0 );
	m_FlagsImm.SetCheck( 0 );
	m_FlagsRes.SetCheck( 0 );
	m_FlagsVuln.SetCheck( 0 );
	m_FlagsForm.SetCheck( 0 );
	m_FlagsParts.SetCheck( 0 );
	SetFlags();

	m_DamType.ResetContent();
	for ( i = 0; i < tables.m_attack_types.GetSize(); i++ )
	{
		index = m_DamType.AddString( tables.m_attack_types[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_DamType.SetItemData( index, i );
		if ( tables.m_attack_types[i]->m_text == m_seldamtype )
			m_DamType.SetCurSel( index );
	}

	m_StartPos.ResetContent();
	for ( i = 0; i < tables.m_pos.GetSize(); i++ )
	{
		index = m_StartPos.AddString( tables.m_pos[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_StartPos.SetItemData( index, i );
		if ( tables.m_pos[i]->m_text == m_start_pos )
			m_StartPos.SetCurSel( index );
	}

	m_DefaultPos.ResetContent();
	for ( i = 0; i < tables.m_pos.GetSize(); i++ )
	{
		index = m_DefaultPos.AddString( tables.m_pos[i]->m_show );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_DefaultPos.SetItemData( index, i );
		if ( tables.m_pos[i]->m_text == m_default_pos )
			m_DefaultPos.SetCurSel( index );
	}

	m_Sex.ResetContent();
	for ( i = 0; i < tables.m_sex.GetSize(); i++ )
	{
		index = m_Sex.AddString( tables.m_sex[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Sex.SetItemData( index, i );
	}
	m_Sex.SetCurSel( m_Sex.FindStringExact( -1, m_sex ) );

	m_Size.ResetContent();
	for ( i = 0; i < tables.m_size.GetSize(); i++ )
	{
		index = m_Size.AddString( tables.m_size[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Size.SetItemData( index, i );
	}
	m_Size.SetCurSel( m_Size.FindStringExact( -1, m_size ) );

	if ( m_shopdata == NULL )
	{
		m_ShopDel.EnableWindow( FALSE );
		m_ShopEdit.SetWindowText( "Nuevo" );
	}

	MakeMobprogList();

	for ( i = 0; i < tables.m_skills.GetSize(); i++ )
	{
		for ( j = 0; j < m_skills.GetSize(); j++ )
			if ( tables.m_skills[i]->m_text == m_skills[j]->m_skill )
				break;
		if ( j >= m_skills.GetSize() )
		{
			CSkillData *skill = new CSkillData();
			skill->m_skill = tables.m_skills[i]->m_text;
			skill->m_percent = 0;
			m_skills.Add( skill );
		}
	}

	m_MobProgDown.EnableWindow( FALSE );
	m_MobProgUp.EnableWindow( FALSE );

	UpdateData( FALSE );

	delete pFile;

}

void CMobEd::OnMobedTrainer() 
{
	CSkillTrEdit dlg;
	int i;
	CSkillPrac *prskill;

	for ( i = 0; i < m_trskill.GetSize(); i++ )
	{
		prskill = new CSkillPrac;
		*prskill = *m_trskill[i];
		dlg.m_trskill.Add( prskill );
	}
	dlg.m_class = m_class;

	if ( dlg.DoModal() == IDOK )
	{
		m_trskill.RemoveAll();
		for ( i = 0; i < dlg.m_trskill.GetSize(); i++ )
		{
			if ( dlg.m_trskill[i]->m_skill != "" )
			{
				prskill = new CSkillPrac;
				*prskill = *dlg.m_trskill[i];
				m_trskill.Add( prskill );
			}
		}
		m_class = dlg.m_class;
	}
}