areaeditor/
/*
** AreaEditor - a program for editing SMAUG and ROM area files.
** Author: Nick Gammon
** http://www.gammon.com.au/
** See Copyright Notice at the end of AreaEditor.h
*/

// MobileStatsPage.cpp : implementation file
//

#include "stdafx.h"
#include "AreaEditor.h"
#include "AreaEditorDoc.h"
#include "defaults.h"

#include "MobileStatsPage.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMobileStatsPage dialog


CMobileStatsPage::CMobileStatsPage(CWnd* pParent /*=NULL*/)
	: CDialog(CMobileStatsPage::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMobileStatsPage)
	m_ac = 0;
	m_alignment = 0;
	m_cha = 0;
	m_con = 0;
	m_damnodice = 0;
	m_damplus = 0;
	m_damroll = 0;
	m_damsizedice = 0;
	m_dex = 0;
	m_exp = 0;
	m_gold = 0;
	m_height = 0;
	m_hitnodice = 0;
	m_hitplus = 0;
	m_hitroll = 0;
	m_hitsizedice = 0;
	m_int = 0;
	m_lck = 0;
	m_mobthac0 = 0;
	m_numattacks = 0;
	m_saving_breath = 0;
	m_saving_poison_death = 0;
	m_saving_wand = 0;
	m_str = 0;
	m_weight = 0;
	m_wis = 0;
	m_saving_spell_staff = 0;
	m_saving_para_petri = 0;
	m_mananodice = 0;
	m_manasizedice = 0;
	m_manaplusdice = 0;
	m_ac_label = _T("");
	m_exp_label = _T("");
	m_height_label = _T("");
	m_weight_label = _T("");
	//}}AFX_DATA_INIT

  m_mob = NULL;

}

#undef LOAD_VALUE
#define LOAD_VALUE(field, value)  \
  field = m_mob->value

#undef UNLOAD_VALUE
#define UNLOAD_VALUE(field, value)  \
  do {    \
    if (field != m_mob->value) bChanged = true; \
    m_mob->value = field;   \
    } while (false)

void CMobileStatsPage::DoDataExchange(CDataExchange* pDX)
{
bool bChanged = false;

  if (!pDX->m_bSaveAndValidate)
    {
	  LOAD_VALUE (m_alignment, alignment);
	  LOAD_VALUE (m_cha, perm_cha);
	  LOAD_VALUE (m_con, perm_con);
	  LOAD_VALUE (m_damnodice, damnodice);
	  LOAD_VALUE (m_damplus, damplus);
	  LOAD_VALUE (m_damroll, damroll);
	  LOAD_VALUE (m_damsizedice, damsizedice);
	  LOAD_VALUE (m_mananodice, mananodice);
	  LOAD_VALUE (m_manaplusdice, manaplus);
	  LOAD_VALUE (m_manasizedice, manasizedice);
	  LOAD_VALUE (m_dex, perm_dex);
	  LOAD_VALUE (m_gold, gold);
	  LOAD_VALUE (m_hitnodice, hitnodice);
	  LOAD_VALUE (m_hitplus, hitplus);
	  LOAD_VALUE (m_hitroll, hitroll);
	  LOAD_VALUE (m_hitsizedice, hitsizedice);
	  LOAD_VALUE (m_int, perm_int);
	  LOAD_VALUE (m_lck, perm_lck);
	  LOAD_VALUE (m_mobthac0, mobthac0);
	  LOAD_VALUE (m_numattacks, numattacks);
	  LOAD_VALUE (m_saving_breath, saving_breath);
	  LOAD_VALUE (m_saving_para_petri, saving_para_petri);
	  LOAD_VALUE (m_saving_poison_death, saving_poison_death);
	  LOAD_VALUE (m_saving_spell_staff, saving_spell_staff);
	  LOAD_VALUE (m_saving_wand, saving_wand);
	  LOAD_VALUE (m_str, perm_str);
	  LOAD_VALUE (m_wis, perm_wis);

    if (m_mob && m_mob->m_pDoc->m_AreaType == eSMAUG)
      {
      m_ac_label = "AC:";
      m_exp_label = "Exp:";
      m_height_label = "Height:";
      m_weight_label = "Weight:";
  	  LOAD_VALUE (m_ac, ac);
  	  LOAD_VALUE (m_exp, exp);
  	  LOAD_VALUE (m_height, height);
  	  LOAD_VALUE (m_weight, weight);
      } // end of SMAUG mob
    else if (m_mob && m_mob->m_pDoc->m_AreaType == eROM)
      {
      m_ac_label = "AC pierce:";
      m_exp_label = "AC bash:";
      m_height_label = "AC slash:";
      m_weight_label = "AC exotic:";
  	  LOAD_VALUE (m_ac, ac_pierce);
  	  LOAD_VALUE (m_exp, ac_bash);
  	  LOAD_VALUE (m_height, ac_slash);
  	  LOAD_VALUE (m_weight, ac_exotic);
      } // end of ROM mob

    }


	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMobileStatsPage)
	DDX_Control(pDX, IDC_NUMATTACKS, m_ctlNumAttacks);
	DDX_Control(pDX, IDC_DAMAGE_TYPE_LABEL, m_ctlDamageTypeLabel);
	DDX_Control(pDX, IDC_DAMAGE_TYPE, m_ctlDamageType);
	DDX_Control(pDX, IDC_SAVING_SPELL_STAFF, m_ctlSavingSpell);
	DDX_Control(pDX, IDC_SAVING_BREATH, m_ctlSavingBreath);
	DDX_Control(pDX, IDC_SAVING_PARA_PETRI, m_ctlSavingPara);
	DDX_Control(pDX, IDC_SAVING_WAND, m_ctlSavingWand);
	DDX_Control(pDX, IDC_SAVING_POISON_DEATH, m_ctlSavingPoison);
	DDX_Control(pDX, IDC_MOBTHAC0, m_ctlMobthac0);
	DDX_Control(pDX, IDC_LCK, m_ctlLck);
	DDX_Control(pDX, IDC_CHA, m_ctlCha);
	DDX_Control(pDX, IDC_CON, m_ctlCon);
	DDX_Control(pDX, IDC_DEX, m_ctlDex);
	DDX_Control(pDX, IDC_WIS, m_ctlWis);
	DDX_Control(pDX, IDC_INT, m_ctlInt);
	DDX_Control(pDX, IDC_STR, m_ctlStr);
	DDX_Control(pDX, IDC_MOBSIZE, m_ctlSize);
	DDX_Control(pDX, IDC_MANASIZEDICE, m_ctlManaSizeDice);
	DDX_Control(pDX, IDC_MANAPLUS, m_ctlManaPlusDice);
	DDX_Control(pDX, IDC_MANANODICE, m_ctlManaNoDice);
	DDX_Control(pDX, IDC_AC, m_ctlArmourClass);
	DDX_Control(pDX, IDC_HITPLUS, m_ctlHitPlus);
	DDX_Control(pDX, IDC_HITSIZEDICE, m_ctlHitSizeDice);
	DDX_Control(pDX, IDC_HITNODICE, m_ctlHitNoDice);
	DDX_Control(pDX, IDC_DEFPOSITION, m_ctlDefposition);
	DDX_Control(pDX, IDC_POSITION, m_ctlPosition);
	DDX_Control(pDX, IDC_CLASS, m_ctlClass);
	DDX_Control(pDX, IDC_RACE, m_ctlRace);
	DDX_Text(pDX, IDC_GOLD, m_gold);
	DDX_Text(pDX, IDC_AC_LABEL, m_ac_label);
	DDX_Text(pDX, IDC_EXP_LABEL, m_exp_label);
	DDX_Text(pDX, IDC_HEIGHT_LABEL, m_height_label);
	DDX_Text(pDX, IDC_WEIGHT_LABEL, m_weight_label);
	//}}AFX_DATA_MAP

  // basic stats    - SMAUG
  if (m_mob->m_pDoc->m_AreaType == eSMAUG)
    {
	  DDX_Text(pDX, IDC_CHA, m_cha);
	  DDV_MinMaxInt(pDX, m_cha, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_CON, m_con);
	  DDV_MinMaxInt(pDX, m_con, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_DEX, m_dex);
	  DDV_MinMaxInt(pDX, m_dex, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_INT, m_int);
	  DDV_MinMaxInt(pDX, m_int, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_LCK, m_lck);
	  DDV_MinMaxInt(pDX, m_lck, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_STR, m_str);
	  DDV_MinMaxInt(pDX, m_str, iMinStats, iMaxStats);
	  DDX_Text(pDX, IDC_WIS, m_wis);
	  DDV_MinMaxInt(pDX, m_wis, iMinStats, iMaxStats);

    // this is SMAUG only too
  	DDX_Text(pDX, IDC_MOBTHAC0, m_mobthac0);
    }

  // alignment
	DDX_Text(pDX, IDC_ALIGNMENT, m_alignment);
	DDV_MinMaxInt(pDX, m_alignment, iMinAlignment, iMaxAlignment);

  // SMAUG: ac, exp, height, weight
  if (m_mob->m_pDoc->m_AreaType == eSMAUG)
    {
	  DDX_Text(pDX, IDC_AC, m_ac);
    DDV_MinMaxInt(pDX, m_ac, iMinAC, iMaxAC);
	  DDX_Text(pDX, IDC_EXP, m_exp);
	  DDX_Text(pDX, IDC_HEIGHT, m_height);
	  DDX_Text(pDX, IDC_WEIGHT, m_weight);
    }
  else if (m_mob->m_pDoc->m_AreaType == eROM)
    {
	  DDX_Text(pDX, IDC_AC, m_ac);
    DDV_MinMaxInt(pDX, m_ac, iMinAC, iMaxAC);
	  DDX_Text(pDX, IDC_EXP, m_exp);
    DDV_MinMaxInt(pDX, m_exp, iMinAC, iMaxAC);
	  DDX_Text(pDX, IDC_HEIGHT, m_height);
    DDV_MinMaxInt(pDX, m_height, iMinAC, iMaxAC);
	  DDX_Text(pDX, IDC_WEIGHT, m_weight);
    DDV_MinMaxInt(pDX, m_weight, iMinAC, iMaxAC);
    }

  // damage
	DDX_Text(pDX, IDC_DAMNODICE, m_damnodice);
	DDV_MinMaxInt(pDX, m_damnodice, 0, iMaxdamnodice);
	DDX_Text(pDX, IDC_DAMPLUS, m_damplus);
	DDV_MinMaxInt(pDX, m_damplus, 0, iMaxdamplus);
	DDX_Text(pDX, IDC_DAMROLL, m_damroll);
	DDV_MinMaxInt(pDX, m_damroll, 0, iMaxdamroll);
	DDX_Text(pDX, IDC_DAMSIZEDICE, m_damsizedice);
	DDV_MinMaxInt(pDX, m_damsizedice, 0, iMaxdamsizedice);

  // hits
	DDX_Text(pDX, IDC_HITNODICE, m_hitnodice);
	DDV_MinMaxInt(pDX, m_hitnodice, 0, iMaxhitnodice);
	DDX_Text(pDX, IDC_HITPLUS, m_hitplus);
	DDV_MinMaxInt(pDX, m_hitplus, 0, iMaxhitplus);
	DDX_Text(pDX, IDC_HITROLL, m_hitroll);
	DDV_MinMaxInt(pDX, m_hitroll, 0, iMaxhitroll);
	DDX_Text(pDX, IDC_HITSIZEDICE, m_hitsizedice);
	DDV_MinMaxInt(pDX, m_hitsizedice, 0, iMaxhitsizedice);
	DDX_Text(pDX, IDC_NUMATTACKS, m_numattacks);
	DDV_MinMaxInt(pDX, m_numattacks, 0, iMaxNumattacks);

  // mana  - for ROM
  if (m_mob->m_pDoc->m_AreaType == eROM)
    {
	  DDX_Text(pDX, IDC_MANANODICE, m_mananodice);
	  DDV_MinMaxInt(pDX, m_mananodice, 0, iMaxmananodice);
	  DDX_Text(pDX, IDC_MANASIZEDICE, m_manasizedice);
	  DDV_MinMaxInt(pDX, m_manasizedice, 0, iMaxmanasizedice);
	  DDX_Text(pDX, IDC_MANAPLUS, m_manaplusdice);
	  DDV_MinMaxInt(pDX, m_manaplusdice, 0, iMaxmanaplus);
    }

  // saving throws   - SMAUG
  if (m_mob->m_pDoc->m_AreaType == eSMAUG)
    {
	  DDX_Text(pDX, IDC_SAVING_BREATH, m_saving_breath);
	  DDV_MinMaxInt(pDX, m_saving_breath, iMinSavingthrow, iMaxSavingthrow);
	  DDX_Text(pDX, IDC_SAVING_POISON_DEATH, m_saving_poison_death);
	  DDV_MinMaxInt(pDX, m_saving_poison_death, iMinSavingthrow, iMaxSavingthrow);
	  DDX_Text(pDX, IDC_SAVING_WAND, m_saving_wand);
	  DDV_MinMaxInt(pDX, m_saving_wand, iMinSavingthrow, iMaxSavingthrow);
	  DDX_Text(pDX, IDC_SAVING_SPELL_STAFF, m_saving_spell_staff);
	  DDV_MinMaxInt(pDX, m_saving_spell_staff, iMinSavingthrow, iMaxSavingthrow);
	  DDX_Text(pDX, IDC_SAVING_PARA_PETRI, m_saving_para_petri);
	  DDV_MinMaxInt(pDX, m_saving_para_petri, iMinSavingthrow, iMaxSavingthrow);
    }

  if (!pDX->m_bSaveAndValidate)
    {
    LoadComboBoxList (m_ctlRace,        MobRaceList,     m_mob->race);
    LoadComboBoxList (m_ctlClass,       MobClassList,    m_mob->mobclass);
    LoadComboBoxList (m_ctlPosition,    MobPositionList, m_mob->position);
    LoadComboBoxList (m_ctlDefposition, MobPositionList, m_mob->defposition);
    LoadComboBoxList (m_ctlSize, MobSizeList, m_mob->size);
    LoadComboBoxList (m_ctlDamageType, ObjectAttackList, m_mob->dam_type);

    if (m_mob->m_pDoc->m_AreaType != eROM)
      {
      m_ctlManaSizeDice.EnableWindow (FALSE);
      m_ctlManaPlusDice.EnableWindow (FALSE);
      m_ctlManaNoDice.EnableWindow (FALSE);
      m_ctlSize.EnableWindow (FALSE);
      m_ctlDamageTypeLabel.ShowWindow (SW_HIDE);
      m_ctlDamageType.ShowWindow (SW_HIDE);
      }   // end of not ROM

    if (m_mob->m_pDoc->m_AreaType != eSMAUG)
      {
      m_ctlMobthac0.EnableWindow (FALSE);
      m_ctlLck.EnableWindow (FALSE);
      m_ctlCha.EnableWindow (FALSE);
      m_ctlCon.EnableWindow (FALSE);
      m_ctlDex.EnableWindow (FALSE);
      m_ctlWis.EnableWindow (FALSE);
      m_ctlInt.EnableWindow (FALSE);
      m_ctlStr.EnableWindow (FALSE);
      m_ctlNumAttacks.EnableWindow (FALSE);
      m_ctlSavingPoison.EnableWindow (FALSE);
      m_ctlSavingWand.EnableWindow (FALSE);
      m_ctlSavingPara.EnableWindow (FALSE);
      m_ctlSavingBreath.EnableWindow (FALSE);
      m_ctlSavingSpell.EnableWindow (FALSE);
      }   // end of not SMAUG

    }

  if (pDX->m_bSaveAndValidate)
    {
	  UNLOAD_VALUE (m_alignment, alignment);
	  UNLOAD_VALUE (m_cha, perm_cha);
	  UNLOAD_VALUE (m_con, perm_con);
	  UNLOAD_VALUE (m_damnodice, damnodice);
	  UNLOAD_VALUE (m_damplus, damplus);
	  UNLOAD_VALUE (m_damroll, damroll);
	  UNLOAD_VALUE (m_damsizedice, damsizedice);
	  UNLOAD_VALUE (m_dex, perm_dex);
	  UNLOAD_VALUE (m_gold, gold);
	  UNLOAD_VALUE (m_hitnodice, hitnodice);
	  UNLOAD_VALUE (m_hitplus, hitplus);
	  UNLOAD_VALUE (m_hitroll, hitroll);
	  UNLOAD_VALUE (m_hitsizedice, hitsizedice);
	  UNLOAD_VALUE (m_int, perm_int);
	  UNLOAD_VALUE (m_lck, perm_lck);
	  UNLOAD_VALUE (m_mobthac0, mobthac0);
	  UNLOAD_VALUE (m_numattacks, numattacks);
	  UNLOAD_VALUE (m_saving_breath, saving_breath);
	  UNLOAD_VALUE (m_saving_para_petri, saving_para_petri);
	  UNLOAD_VALUE (m_saving_poison_death, saving_poison_death);
	  UNLOAD_VALUE (m_saving_spell_staff, saving_spell_staff);
	  UNLOAD_VALUE (m_saving_wand, saving_wand);
	  UNLOAD_VALUE (m_str, perm_str);
	  UNLOAD_VALUE (m_wis, perm_wis);

    if (m_mob->m_pDoc->m_AreaType == eSMAUG)
      {
  	  UNLOAD_VALUE (m_ac, ac);
  	  UNLOAD_VALUE (m_exp, exp);
  	  UNLOAD_VALUE (m_height, height);
  	  UNLOAD_VALUE (m_weight, weight);
      } // end of SMAUG mob
    else if (m_mob->m_pDoc->m_AreaType == eROM)
      {
  	  UNLOAD_VALUE (m_ac, ac_pierce);
  	  UNLOAD_VALUE (m_exp, ac_bash);
  	  UNLOAD_VALUE (m_height, ac_slash);
  	  UNLOAD_VALUE (m_weight, ac_exotic);
      } // end of ROM mob

    int i;
    if (UnloadComboBox (m_ctlClass, i))
  	  UNLOAD_VALUE (i, mobclass);
    if (UnloadComboBox (m_ctlRace, i))
  	  UNLOAD_VALUE (i, race);
    if (UnloadComboBox (m_ctlPosition, i))
  	  UNLOAD_VALUE (i, position);
    if (UnloadComboBox (m_ctlDefposition, i))
  	  UNLOAD_VALUE (i, defposition);
    if (UnloadComboBox (m_ctlSize, i))
	    UNLOAD_VALUE (i, size);
    if (UnloadComboBox (m_ctlDamageType, i))
	    UNLOAD_VALUE (i, dam_type);

     if (bChanged)
       m_mob->m_pDoc->SetModifiedFlag ();
    } // of saving


}


BEGIN_MESSAGE_MAP(CMobileStatsPage, CDialog)
	//{{AFX_MSG_MAP(CMobileStatsPage)
	ON_BN_CLICKED(IDC_SUGGEST_HIT, OnSuggestHit)
	ON_BN_CLICKED(IDC_SUGGEST_AC, OnSuggestAc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMobileStatsPage message handlers

void CMobileStatsPage::OnSuggestHit() 
{
 int hit		= m_mob->level * 8 + number_range(
					        m_mob->level * m_mob->level / 4,
					        m_mob->level * m_mob->level );
	

  m_ctlHitNoDice.SetWindowText (CFormat ("%i", hit));
  m_ctlHitSizeDice.SetWindowText ("1");
  m_ctlHitPlus.SetWindowText ("0");

}


void CMobileStatsPage::OnSuggestAc() 
{
int AC = interpolate( m_mob->level, 100, -100 );

  m_ctlArmourClass.SetWindowText (CFormat ("%i", AC));
}