/* ** 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 */ // ObjectStatsPage.cpp : implementation file // #include "stdafx.h" #include "AreaEditor.h" #include "AreaEditorDoc.h" #include "defaults.h" #include "ObjectView.h" #include "ObjectStatsPage.h" #include "ChooseSpellDlg.h" #include "ChooseFromListDlg.h" #include "ChooseFlagsDlg.h" #include "ChooseObjectDlg.h" #include "ChooseRoomDlg.h" #pragma warning( disable : 4244) #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CObjectStatsPage dialog CObjectStatsPage::CObjectStatsPage(CWnd* pParent /*=NULL*/) : CDialog(CObjectStatsPage::IDD, pParent) { //{{AFX_DATA_INIT(CObjectStatsPage) m_cost = 0; m_layers = 0; m_rent = 0; m_value1 = 0; m_value2 = 0; m_value3 = 0; m_value4 = 0; m_value5 = 0; m_value6 = 0; m_weight = 0; m_type = _T(""); m_iCondition = 0; m_iLevel = 0; m_strMaterial = _T(""); m_strUnits = _T(""); //}}AFX_DATA_INIT m_object = NULL; } #undef LOAD_VALUE #define LOAD_VALUE(field, value) \ field = m_object->value #undef UNLOAD_VALUE #define UNLOAD_VALUE(field, value) \ if (field != m_object->value) bChanged = true; \ m_object->value = field void CObjectStatsPage::DoDataExchange(CDataExchange* pDX) { bool bChanged = false; if (!pDX->m_bSaveAndValidate && m_object) { m_type = ObjectItemList.ReturnName (m_object->item_type, true); LOAD_VALUE (m_cost, cost); LOAD_VALUE (m_layers, layers); LOAD_VALUE (m_rent, rent); LOAD_VALUE (m_value1, value [0]); LOAD_VALUE (m_value2, value [1]); LOAD_VALUE (m_value3, value [2]); LOAD_VALUE (m_value4, value [3]); LOAD_VALUE (m_value5, value [4]); LOAD_VALUE (m_value6, value [5]); LOAD_VALUE (m_weight, weight); LOAD_VALUE (m_strMaterial, material); LOAD_VALUE (m_iLevel, level); LOAD_VALUE (m_iCondition, condition); if (m_object->m_pDoc->m_AreaType == eROM) m_strUnits = "1/10ths. pound"; else m_strUnits = "pound(s)"; } CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CObjectStatsPage) DDX_Control(pDX, IDC_MATERIAL_LABEL, m_ctlMaterialLabel); DDX_Control(pDX, IDC_MATERIAL, m_ctlMaterial); DDX_Control(pDX, IDC_LEVEL_LABEL, m_ctlLevelLabel); DDX_Control(pDX, IDC_LEVEL, m_ctlLevel); DDX_Control(pDX, IDC_CONDITION_LABEL, m_ctlConditionLabel); DDX_Control(pDX, IDC_CONDITION, m_ctlCondition); DDX_Control(pDX, IDC_CHOOSE6, m_ctlChoose6); DDX_Control(pDX, IDC_CHOOSE5, m_ctlChoose5); DDX_Control(pDX, IDC_CHOOSE4, m_ctlChoose4); DDX_Control(pDX, IDC_CHOOSE3, m_ctlChoose3); DDX_Control(pDX, IDC_CHOOSE2, m_ctlChoose2); DDX_Control(pDX, IDC_CHOOSE1, m_ctlChoose1); DDX_Control(pDX, IDC_VALUE6, m_ctlValue6); DDX_Control(pDX, IDC_VALUE5, m_ctlValue5); DDX_Control(pDX, IDC_VALUE4, m_ctlValue4); DDX_Control(pDX, IDC_VALUE3, m_ctlValue3); DDX_Control(pDX, IDC_VALUE2, m_ctlValue2); DDX_Control(pDX, IDC_VALUE1, m_ctlValue1); DDX_Control(pDX, IDC_LABEL_VALUE6, m_ctlLabelValue6); DDX_Control(pDX, IDC_LABEL_VALUE5, m_ctlLabelValue5); DDX_Control(pDX, IDC_LABEL_VALUE4, m_ctlLabelValue4); DDX_Control(pDX, IDC_LABEL_VALUE3, m_ctlLabelValue3); DDX_Control(pDX, IDC_LABEL_VALUE2, m_ctlLabelValue2); DDX_Control(pDX, IDC_DESC_VALUE6, m_ctlDescValue6); DDX_Control(pDX, IDC_DESC_VALUE5, m_ctlDescValue5); DDX_Control(pDX, IDC_DESC_VALUE3, m_ctlDescValue3); DDX_Control(pDX, IDC_DESC_VALUE4, m_ctlDescValue4); DDX_Control(pDX, IDC_DESC_VALUE2, m_ctlDescValue2); DDX_Control(pDX, IDC_DESC_VALUE1, m_ctlDescValue1); DDX_Control(pDX, IDC_LABEL_VALUE1, m_ctlLabelValue1); DDX_Text(pDX, IDC_COST, m_cost); DDX_Text(pDX, IDC_LAYERS, m_layers); DDX_Text(pDX, IDC_RENT, m_rent); DDX_Text(pDX, IDC_VALUE1, m_value1); DDX_Text(pDX, IDC_VALUE2, m_value2); DDX_Text(pDX, IDC_VALUE3, m_value3); DDX_Text(pDX, IDC_VALUE4, m_value4); DDX_Text(pDX, IDC_VALUE5, m_value5); DDX_Text(pDX, IDC_VALUE6, m_value6); DDX_Text(pDX, IDC_WEIGHT, m_weight); DDX_Text(pDX, IDC_TYPE, m_type); DDX_Text(pDX, IDC_CONDITION, m_iCondition); DDX_Text(pDX, IDC_MATERIAL, m_strMaterial); DDX_Text(pDX, IDC_WEIGHT_UNITS, m_strUnits); //}}AFX_DATA_MAP if (m_object->m_pDoc->m_AreaType == eROM) { DDX_Text(pDX, IDC_LEVEL, m_iLevel); DDV_MinMaxInt(pDX, m_iLevel, 0, iMaxLevel); DDX_Text(pDX, IDC_CONDITION, m_iCondition); DDV_MinMaxInt(pDX, m_iCondition, iMinCondition, iMaxCondition); } if (!pDX->m_bSaveAndValidate) { if (m_object->m_pDoc->m_AreaType != eROM) { m_ctlMaterialLabel.ShowWindow (SW_HIDE); m_ctlMaterial.ShowWindow (SW_HIDE); m_ctlLevelLabel.ShowWindow (SW_HIDE); m_ctlLevel.ShowWindow (SW_HIDE); m_ctlConditionLabel.ShowWindow (SW_HIDE); m_ctlCondition.ShowWindow (SW_HIDE); } // end of not ROM UpdateLabels (); } if (pDX->m_bSaveAndValidate) { UNLOAD_VALUE (m_cost, cost); UNLOAD_VALUE (m_layers, layers); UNLOAD_VALUE (m_rent, rent); UNLOAD_VALUE (m_value1, value [0]); UNLOAD_VALUE (m_value2, value [1]); UNLOAD_VALUE (m_value3, value [2]); UNLOAD_VALUE (m_value4, value [3]); UNLOAD_VALUE (m_value5, value [4]); UNLOAD_VALUE (m_value6, value [5]); UNLOAD_VALUE (m_weight, weight); UNLOAD_VALUE (m_strMaterial, material); UNLOAD_VALUE (m_iLevel, level); UNLOAD_VALUE (m_iCondition, condition); if (bChanged) m_object->m_pDoc->SetModifiedFlag (); } } BEGIN_MESSAGE_MAP(CObjectStatsPage, CDialog) //{{AFX_MSG_MAP(CObjectStatsPage) ON_EN_CHANGE(IDC_VALUE1, OnChangeValue) ON_BN_CLICKED(IDC_CHOOSE1, OnChoose1) ON_BN_CLICKED(IDC_CHOOSE2, OnChoose2) ON_BN_CLICKED(IDC_CHOOSE3, OnChoose3) ON_BN_CLICKED(IDC_CHOOSE4, OnChoose4) ON_BN_CLICKED(IDC_CHOOSE5, OnChoose5) ON_EN_CHANGE(IDC_VALUE2, OnChangeValue) ON_EN_CHANGE(IDC_VALUE3, OnChangeValue) ON_EN_CHANGE(IDC_VALUE4, OnChangeValue) ON_EN_CHANGE(IDC_VALUE5, OnChangeValue) ON_EN_CHANGE(IDC_VALUE6, OnChangeValue) ON_BN_CLICKED(IDC_CHOOSE6, OnChoose6) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CObjectStatsPage message handlers typedef CString (* t_DisplayMeaning) (const __int64 iValue, CAreaEditorDoc * const pDoc); typedef __int64 (* t_ChooseMeaning) (const __int64 iValue, CAreaEditorDoc * const pDoc); CString DisplayLiquid (const __int64 iValue, CAreaEditorDoc * const pDoc) { return ObjectLiquidList.ReturnName (iValue, false); } // end of DisplayLiquid CString DisplayWeaponType (const __int64 iValue, CAreaEditorDoc * const pDoc) { return ObjectAttackList.ReturnName (iValue, false); } // end of DisplayWeaponType CString DisplayWeaponClass (const __int64 iValue, CAreaEditorDoc * const pDoc) { return ObjectWeaponList.ReturnName (iValue, false); } // end of DisplayWeaponClass CString DisplayFurniture (const __int64 iValue, CAreaEditorDoc * const pDoc) { return FlagToString (iValue, ObjectFurnitureFlags); } // end of DisplayFurniture CString DisplayContainer (const __int64 iValue, CAreaEditorDoc * const pDoc) { return FlagToString (iValue, ObjectContainerFlags); } // end of DisplayContainer CString DisplayPortalFlags (const __int64 iValue, CAreaEditorDoc * const pDoc) { return FlagToString (iValue, ObjectPortalFlags); } // end of DisplayPortalFlags CString DisplayWeaponFlags (const __int64 iValue, CAreaEditorDoc * const pDoc) { return FlagToString (iValue, ObjectWeaponFlags); } // end of DisplayWeaponFlags CString DisplayYesOrNo (const __int64 iValue, CAreaEditorDoc * const pDoc) { return iValue ? "Yes" : "No"; } // end of DisplayYesOrNo CString DisplayWeaponCondition (const __int64 iValue, CAreaEditorDoc * const pDoc) { __int64 dam = ObjectWeaponConditionList.list.GetCount () - iValue; return ObjectWeaponConditionList.ReturnName (dam, false); } // end of DisplayWeaponCondition CString DisplayKey (const __int64 iValue, CAreaEditorDoc * const pDoc) { CMUDObject * object; // key of 0 or -1 means "no key" if (iValue <= 0) return "(no key)"; // find key object if (object = pDoc->get_obj_index (iValue)) return object->short_descr; if (object = FindObj ( iValue )) return FullObjName (object); // not found - say so // (nb - this is not too bad, key may be in a different area) return CFormat ("Object #%i not in this area", iValue); } // end of DisplayKey CString DisplayRoom (const __int64 iValue, CAreaEditorDoc * const pDoc) { CRoom * room; // key of 0 or -1 means "no room" if (iValue <= 0) return "(no room)"; // find room if (room = pDoc->get_room_index (iValue)) return room->name; // if room is in a different area, say so if (room = FindRoom (iValue)) return FullRoomName (room); // not found - say so // (nb - this is not too bad, room may be in a different area) return CFormat ("Room #%i not in this area", iValue); } // end of DisplayRoom CString DisplayArmourCondition (const __int64 iValue, CAreaEditorDoc * const pDoc) { __int64 dam = ObjectArmourConditionList.list.GetCount () - iValue; return ObjectArmourConditionList.ReturnName (dam, false); } // end of DisplayArmourCondition CString DisplaySMAUGSpell (const __int64 iValue, CAreaEditorDoc * const pDoc) { CSkill * skill; if (iValue == -1) return "(none)"; if (App.m_SkillList.IsEmpty ()) return "(Skill list not loaded)"; for (POSITION skillPos = App.m_SkillList.GetHeadPosition (); skillPos; ) { skill = App.m_SkillList.GetNext (skillPos); if (skill->slot == iValue) return skill->name; } return CFormat ("Unknown skill=%i", iValue); } // end of DisplaySMAUGSpell CString DisplayROMSpell (const __int64 iValue, CAreaEditorDoc * const pDoc) { if (iValue == -1) return "(none)"; return ROMSkillNameList.ReturnName (iValue, false); } // end of DisplayROMSpell __int64 ChooseSMAUGSpell (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseSpellDlg dlg; if (App.m_SkillList.IsEmpty ()) { ::AfxMessageBox ("Please load the skills table before choosing spells"); return iValue; // keep same value if no skills table } dlg.m_iSelectedSpell = iValue; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_iSelectedSpell; } // end of ChooseSMAUGSpell __int64 ChooseROMSpell (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFromListDlg dlg; dlg.m_iSelectedItem = iValue; dlg.m_pList = &ROMSkillNameList; dlg.m_strTitle = "Choose spell"; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_iSelectedItem; } // end of ChooseROMSpell __int64 ChooseFurniture (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFlagsDlg dlg; dlg.m_pFlags = iValue; dlg.m_pFlagsArray = &ObjectFurnitureFlags; dlg.m_strTitle = "Choose furniture flags"; dlg.m_AreaType = pDoc->m_AreaType; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_pFlags; } // end of ChooseFurniture __int64 ChooseContainer (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFlagsDlg dlg; dlg.m_pFlags = iValue; dlg.m_pFlagsArray = &ObjectContainerFlags; dlg.m_strTitle = "Choose container flags"; dlg.m_AreaType = pDoc->m_AreaType; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_pFlags; } // end of ChooseContainer __int64 ChoosePortalFlags (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFlagsDlg dlg; dlg.m_pFlags = iValue; dlg.m_pFlagsArray = &ObjectPortalFlags; dlg.m_strTitle = "Choose portal flags"; dlg.m_AreaType = pDoc->m_AreaType; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_pFlags; } // end of ChoosePortalFlags __int64 ChooseWeaponFlags(const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFlagsDlg dlg; dlg.m_pFlags = iValue; dlg.m_pFlagsArray = &ObjectWeaponFlags; dlg.m_strTitle = "Choose weapon flags"; dlg.m_AreaType = pDoc->m_AreaType; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_pFlags; } // end of ChooseWeaponFlags __int64 ChooseKey (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseObjectDlg dlg; dlg.m_pDoc = pDoc; dlg.m_iSelectedObject = iValue; dlg.m_iItemType = eTakeItem; // only choose take-type items if (dlg.DoModal () == IDOK) if (dlg.m_iSelectedObject != -1) return dlg.m_iSelectedObject; return iValue; // default to what they originally had } // end of ChooseKey __int64 ChooseRoom (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseRoomDlg dlg; dlg.m_pDoc = pDoc; dlg.m_iSelectedRoom = iValue; if (dlg.DoModal () == IDOK) if (dlg.m_iSelectedRoom != -1) return dlg.m_iSelectedRoom; return iValue; // default to what they originally had } // end of ChooseRoom __int64 ChooseLiquid (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFromListDlg dlg; dlg.m_iSelectedItem = iValue; dlg.m_pList = &ObjectLiquidList; dlg.m_strTitle = "Choose liquid type"; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_iSelectedItem; } // end of ChooseLiquid __int64 ChooseWeaponClass (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFromListDlg dlg; dlg.m_iSelectedItem = iValue; dlg.m_pList = &ObjectWeaponList; dlg.m_strTitle = "Choose weapon class"; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_iSelectedItem; } // end of ChooseWeaponClass __int64 ChooseWeaponType (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFromListDlg dlg; dlg.m_iSelectedItem = iValue; dlg.m_pList = &ObjectAttackList; dlg.m_strTitle = "Choose weapon type"; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return dlg.m_iSelectedItem; } // end of ChooseWeaponType __int64 ChooseWeaponCondition (const __int64 iValue, CAreaEditorDoc * const pDoc) { CChooseFromListDlg dlg; dlg.m_iSelectedItem = ObjectWeaponConditionList.list.GetCount () - iValue; dlg.m_pList = &ObjectWeaponConditionList; dlg.m_strTitle = "Choose weapon condition"; if (dlg.DoModal () != IDOK) return iValue; // keep same value if they cancel return ObjectWeaponConditionList.list.GetCount () - dlg.m_iSelectedItem; } // end of ChooseWeaponCondition __int64 ChoosePoisoned (const __int64 iValue, CAreaEditorDoc * const pDoc) { int iResult = ::AfxMessageBox ("Poisoned?", MB_YESNOCANCEL | MB_ICONQUESTION | (iValue ? MB_DEFBUTTON1 : MB_DEFBUTTON2)); if (iResult == IDCANCEL) return iValue; else if (iResult == IDYES) return 1; else return 0; } // end of ChoosePoisoned __int64 ChooseKeep (const __int64 iValue, CAreaEditorDoc * const pDoc) { int iResult = ::AfxMessageBox ("Keep?", MB_YESNOCANCEL | MB_ICONQUESTION | (iValue ? MB_DEFBUTTON1 : MB_DEFBUTTON2)); if (iResult == IDCANCEL) return iValue; else if (iResult == IDYES) return 1; else return 0; } // end of ChooseKeep // this food stuff seems a bit dodgy - I think I'll leave the condition out of it CString DisplayFoodCondition (const __int64 iValue, CAreaEditorDoc * const pDoc) { int dam = ObjectFoodConditionList.list.GetCount () - iValue; return ObjectFoodConditionList.ReturnName (dam, false); } // end of DisplayFoodCondition #define MAXVALUES 6 typedef struct { char * sLabel; bool bEnabled; t_DisplayMeaning DisplayMeaning; t_ChooseMeaning ChooseMeaning; } t_itemvalue; typedef struct { int iItemType; t_itemvalue ValueDetails [MAXVALUES]; // meaning of all 6 values } t_itemvalues; const t_itemvalues SMAUGItemValues [] = { { ITEM_ARMOR, { { "Current AC:", true }, // 1 { "Original AC:", true }, // 2 } // end of 6 values }, // end of item { ITEM_CONTAINER, { { "Capacity:", true }, // 1 { "Flags:", true }, // 2 { "Key vnum:", true, DisplayKey, ChooseKey }, // 3 { "Condition:", true }, // 4 } // end of 6 values }, // end of item { ITEM_DRINK_CON, { { "Capacity:", true }, // 1 { "Quantity:", true }, // 2 { "Liquid #:", true }, // 3 { "Poison?:", true, DisplayYesOrNo, ChoosePoisoned }, // 4 } // end of 6 values }, // end of item { ITEM_FOOD, { { "Food value:", true }, // 1 { "Condition:", true }, // 2 { "?:", true }, // 3 { "Poison?:", true, DisplayYesOrNo, ChoosePoisoned }, // 4 } // end of 6 values }, // end of item { ITEM_HERB, { { "?:", true }, // 1 { "Charges:", true }, // 2 { "Herb #:", true }, // 3 } // end of 6 values }, // end of item { ITEM_KEY, { { "Lock #:", true }, // 1 } // end of 6 values }, // end of item { ITEM_LEVER, { { "Lever flags:", true }, // 1 { "Vnum/sn:", true }, // 2 { "Vnum:", true }, // 3 { "Vnum/value:", true }, // 4 } // end of 6 values }, // end of item { ITEM_LIGHT, { { "" }, // 1 { "" }, // 2 { "Hours left:", true }, // 3 } // end of 6 values }, // end of item { ITEM_MONEY, { { "# coins:", true }, // 1 { "Coin type:", true }, // 2 } // end of 6 values }, // end of item { ITEM_PILL, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 2 { "Spell 2:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 3 { "Spell 3:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 4 { "Food value:", true }, // 5 } // end of 6 values }, // end of item { ITEM_POTION, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 2 { "Spell 2:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 3 { "Spell 3:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 4 } // end of 6 values }, // end of item { ITEM_SALVE, { { "Spell level:", true }, // 1 { "Max charge:", true }, // 2 { "Charges:", true }, // 3 { "Delay:", true }, // 4 { "Spell:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 5 { "Spell:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 6 } // end of 6 values }, // end of item { ITEM_SCROLL, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 2 { "Spell 2:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 3 { "Spell 3:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 4 } // end of 6 values }, // end of item { ITEM_STAFF, { { "Spell level:", true }, // 1 { "Max charges:", true }, // 2 { "Charges:", true }, // 3 { "Spell:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 4 } // end of 6 values }, // end of item { ITEM_SWITCH, { { "Lever flags:", true }, // 1 { "Vnum/sn:", true }, // 2 { "Vnum:", true }, // 3 { "Vnum/value:", true }, // 4 } // end of 6 values }, // end of item { ITEM_TRAP, { { "Charges:", true }, // 1 { "Type:", true }, // 2 { "Level:", true }, // 3 { "Flags:", true }, // 4 } // end of 6 values }, // end of item { ITEM_TREASURE, { { "Type:", true }, // 1 { "Condition:", true }, // 2 } // end of 6 values }, // end of item { ITEM_WAND, { { "Level:", true }, // 1 { "Max charges:", true }, // 2 { "Charges:", true }, // 3 { "Spell:", true, DisplaySMAUGSpell, ChooseSMAUGSpell }, // 4 } // end of 6 values }, // end of item { ITEM_WEAPON, { { "Condition:", true, DisplayWeaponCondition, ChooseWeaponCondition }, // 1 { "Num dice:", true }, // 2 { "Size dice:", true }, // 3 { "Weapon type:", true, DisplayWeaponType, ChooseWeaponType }, // 4 } // end of 6 values }, // end of item { -1 } // end of item list }; // end of SMAUGItemValues const t_itemvalues ROMItemValues [] = { { ITEM_ARMOR, { { "AC pierce:", true }, // 1 { "AC bash:", true }, // 2 { "AC slash:", true }, // 3 { "AC magic:", true }, // 4 } // end of 6 values }, // end of item { ITEM_CONTAINER, { { "Max. total wt:", true }, // 1 { "Flags:", true, DisplayContainer, ChooseContainer }, // 2 { "Key vnum:", true, DisplayKey, ChooseKey }, // 3 { "Max single weight:", true }, // 4 { "Weight multiplier %:", true }, // 5 } // end of 6 values }, // end of item { ITEM_DRINK_CON, { { "Capacity:", true }, // 1 { "Quantity:", true }, // 2 { "Liquid type:", true, DisplayLiquid, ChooseLiquid }, // 3 { "Poison?:", true, DisplayYesOrNo, ChoosePoisoned }, // 4 } // end of 6 values }, // end of item { ITEM_FOUNTAIN, { { "" }, // 1 { "" }, // 2 { "Liquid type:", true, DisplayLiquid, ChooseLiquid }, // 3 { "Poison?:", true, DisplayYesOrNo, ChoosePoisoned }, // 4 } // end of 6 values }, // end of item { ITEM_FURNITURE, { { "Max. people:", true }, // 1 { "" }, // 2 { "Flags:", true, DisplayFurniture, ChooseFurniture }, // 3 { "Mana regen.:", true }, // 4 { "HP regen.:", true }, // 5 } // end of 6 values }, // end of item { ITEM_FOOD, { { "Fill value:", true }, // 1 { "Sate value:", true }, // 2 { "" }, // 3 { "Poison?:", true, DisplayYesOrNo, ChoosePoisoned }, // 4 } // end of 6 values }, // end of item { ITEM_KEY, { { "Keep?:", true, DisplayYesOrNo, ChooseKeep }, // 1 } // end of 6 values }, // end of item { ITEM_LIGHT, { { "" }, // 1 { "" }, // 2 { "Hours left:", true }, // 3 } // end of 6 values }, // end of item { ITEM_MONEY, { { "Silver value:", true }, // 1 { "Gold value:", true }, // 2 } // end of 6 values }, // end of item { ITEM_PILL, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplayROMSpell, ChooseROMSpell }, // 2 { "Spell 2:", true, DisplayROMSpell, ChooseROMSpell }, // 3 { "Spell 3:", true, DisplayROMSpell, ChooseROMSpell }, // 4 { "Spell 4:", true, DisplayROMSpell, ChooseROMSpell }, // 5 } // end of 6 values }, // end of item { ITEM_POTION, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplayROMSpell, ChooseROMSpell }, // 2 { "Spell 2:", true, DisplayROMSpell, ChooseROMSpell }, // 3 { "Spell 3:", true, DisplayROMSpell, ChooseROMSpell }, // 4 { "Spell 4:", true, DisplayROMSpell, ChooseROMSpell }, // 5 } // end of 6 values }, // end of item { ITEM_SCROLL, { { "Spell level:", true }, // 1 { "Spell 1:", true, DisplayROMSpell, ChooseROMSpell }, // 2 { "Spell 2:", true, DisplayROMSpell, ChooseROMSpell }, // 3 { "Spell 3:", true, DisplayROMSpell, ChooseROMSpell }, // 4 { "Spell 4:", true, DisplayROMSpell, ChooseROMSpell }, // 5 } // end of 6 values }, // end of item { ITEM_STAFF, { { "Spell level:", true }, // 1 { "Max charges:", true }, // 2 { "Charges:", true }, // 3 { "Sn:", true, DisplayROMSpell, ChooseROMSpell }, // 4 } // end of 6 values }, // end of item { ITEM_PORTAL, { { "Num. charges:", true }, // 1 { "" }, // 2 { "Gate flag:", true, DisplayPortalFlags, ChoosePortalFlags }, // 3 { "Room vnum:", true, DisplayRoom, ChooseRoom }, // 4 } // end of 6 values }, // end of item { ITEM_WAND, { { "Level:", true }, // 1 { "Max charges:", true }, // 2 { "Current charges:", true }, // 3 { "Spell:", true, DisplayROMSpell, ChooseROMSpell }, // 4 } // end of 6 values }, // end of item { ITEM_WEAPON, { { "Weapon class:", true, DisplayWeaponClass, ChooseWeaponClass }, // 1 { "Num dice:", true }, // 2 { "Size dice:", true }, // 3 { "Weapon type:", true, DisplayWeaponType, ChooseWeaponType }, // 4 { "Flags:", true, DisplayWeaponFlags, ChooseWeaponFlags } // 5 } // end of 6 values }, // end of item { -1 } // end of item list }; // end of ROMItemValues // arrays of item value lists (0 = SMAUG, 1 = ROM) const t_itemvalues * ItemValues [] = { SMAUGItemValues, ROMItemValues, }; void CObjectStatsPage::UpdateLabels (void) { int i, value; CWnd * ctlLabel [MAXVALUES] = { &m_ctlLabelValue1, &m_ctlLabelValue2, &m_ctlLabelValue3, &m_ctlLabelValue4, &m_ctlLabelValue5, &m_ctlLabelValue6 }; // end of label controls CWnd * ctlButton [MAXVALUES] = { &m_ctlChoose1, &m_ctlChoose2, &m_ctlChoose3, &m_ctlChoose4, &m_ctlChoose5, &m_ctlChoose6 }; // end of button controls // 0 = eAsk, 1=SMAUG, 2=ROM etc. int AreaIndex = m_object->m_pDoc->m_AreaType - 1; // scan table provided area type is allowed for here if (AreaIndex < NUMITEMS (ItemValues)) { const t_itemvalues * ItemList = ItemValues [AreaIndex]; for (i = 0; ItemList [i].iItemType != -1; i++) { if (ItemList [i].iItemType == m_object->item_type) { for (value = 0; value < MAXVALUES; value++) { if (ItemList [i].ValueDetails [value].sLabel) ctlLabel [value]->SetWindowText (ItemList [i].ValueDetails [value].sLabel); else ctlLabel [value]->SetWindowText (""); ctlButton [value]->ShowWindow (ItemList [i].ValueDetails [value].ChooseMeaning != NULL ? SW_SHOW : SW_HIDE); } UpdateDescriptions (); return; } // end of type found } // end of searching for item type } // end of area type allowed for // not found - use defaults -- which at present will be nothing :) for (value = 0; value < MAXVALUES; value++) { // ctlLabel [value]->SetWindowText (CFormat ("Value%i:", value + 1)); ctlLabel [value]->SetWindowText (""); ctlButton [value]->ShowWindow (SW_HIDE); } // end of setting labels and buttons to defaults UpdateDescriptions (); } // end of CObjectStatsPage::UpdateLabels void CObjectStatsPage::UpdateDescriptions (void) { int i, value; CString strField; CString strOldDescription, strNewDescription; int iField; CWnd * ctlDescription [MAXVALUES] = { &m_ctlDescValue1, &m_ctlDescValue2, &m_ctlDescValue3, &m_ctlDescValue4, &m_ctlDescValue5, &m_ctlDescValue6 }; // end of description controls CWnd * ctlValue [MAXVALUES] = { &m_ctlValue1, &m_ctlValue2, &m_ctlValue3, &m_ctlValue4, &m_ctlValue5, &m_ctlValue6 }; // end of value controls // 0 = eAsk, 1=SMAUG, 2=ROM etc. int AreaIndex = m_object->m_pDoc->m_AreaType - 1; // scan table provided area type is allowed for here if (AreaIndex < NUMITEMS (ItemValues)) { const t_itemvalues * ItemList = ItemValues [AreaIndex]; for (i = 0; ItemList [i].iItemType != -1; i++) { if (ItemList [i].iItemType == m_object->item_type) { for (value = 0; value < MAXVALUES; value++) { // get amended text of window ctlValue [value]->GetWindowText(strField); // convert to number // if empty, assume zero if (strField.IsEmpty ()) iField = 0; else iField = atoi (strField); if (ItemList [i].ValueDetails [value].DisplayMeaning) { strNewDescription = ((*(ItemList [i].ValueDetails [value].DisplayMeaning)) (iField, m_object->m_pDoc)); ctlDescription [value]->GetWindowText (strOldDescription); if (strOldDescription != strNewDescription) // avoid flicker ctlDescription [value]->SetWindowText (strNewDescription); } else // no description routine given - blank out any existing description { ctlDescription [value]->GetWindowText (strOldDescription); if (!strOldDescription.IsEmpty ()) ctlDescription [value]->SetWindowText (""); } } // end of all 6 values return; } // end of type found } // end of searching for item type } // end of area type allowed for for (value = 0; value < MAXVALUES; value++) { ctlDescription [value]->GetWindowText (strOldDescription); if (!strOldDescription.IsEmpty ()) ctlDescription [value]->SetWindowText (""); } } // end of CObjectStatsPage::UpdateDescriptions // if any of the 6 values change, update all descriptions (ie. value explanations) void CObjectStatsPage::OnChangeValue() { UpdateDescriptions (); } void CObjectStatsPage::ChooseItem (const int iItem) { CWnd * ctlValue [MAXVALUES] = { &m_ctlValue1, &m_ctlValue2, &m_ctlValue3, &m_ctlValue4, &m_ctlValue5, &m_ctlValue6 }; // end of value controls int iValue; CString strField; int iField; int i; CObjectView * wndParent = (CObjectView *) GetParent (); // 0 = eAsk, 1=SMAUG, 2=ROM etc. int AreaIndex = m_object->m_pDoc->m_AreaType - 1; // scan table provided area type is allowed for here if (AreaIndex < NUMITEMS (ItemValues)) { const t_itemvalues * ItemList = ItemValues [AreaIndex]; for (i = 0; ItemList [i].iItemType != -1; i++) { if (ItemList [i].iItemType == m_object->item_type) { if (ItemList [i].ValueDetails [iItem].ChooseMeaning) { // get amended text of window ctlValue [iItem]->GetWindowText(strField); // convert to number iField = atoi (strField); wndParent->m_bEditingText = true; iValue = ((*(ItemList [i].ValueDetails [iItem].ChooseMeaning)) (iField, m_object->m_pDoc)); wndParent->m_bEditingText = false; ctlValue [iItem]->SetWindowText(CFormat ("%i", iValue)); } return; } // end of type found } // end of searching for item type } // end of area type allowed for } // end of CObjectStatsPage::ChooseItem void CObjectStatsPage::OnChoose1() { ChooseItem (0); } void CObjectStatsPage::OnChoose2() { ChooseItem (1); } void CObjectStatsPage::OnChoose3() { ChooseItem (2); } void CObjectStatsPage::OnChoose4() { ChooseItem (3); } void CObjectStatsPage::OnChoose5() { ChooseItem (4); } void CObjectStatsPage::OnChoose6() { ChooseItem (5); }