Aschbourne_PRC8/_module/nss/mk_inc_iprp.nss

1470 lines
57 KiB
Plaintext
Raw Normal View History

// mk_inc_iprp
#include "mk_inc_debug"
#include "mk_inc_version"
#include "mk_inc_tools"
#include "mk_inc_math"
#include "x2_inc_itemprop"
//const int MK_IPRP_DEBUG = TRUE;
const int MK_IPRP_DEBUG = FALSE;
string MK_IPRP_GetSubTypeResRefByID(int nIPropID);
string MK_IPRP_GetSubTypeResRef(itemproperty iProp);
int MK_IPRP_GetCostTableResRefID(itemproperty iProp);
int MK_IPRP_GetCostTableResRefIDByID(int nIPropID);
string MK_IPRP_GetCostTableResRef(itemproperty iProp);
string MK_IPRP_GetCostTableResRefByID(int nIPropID);
int MK_IPRP_GetParam1ResRefIDByID(int nIPropID, int nSubType=-1);
string MK_IPRP_GetParam1ResRefByID(int nIPropID, int nSubType=-1);
int MK_IPRP_GetParam1ResRefID(itemproperty iProp);
string MK_IPRP_GetParam1ResRef(itemproperty iProp);
int MK_IPRP_GetMaxCharges();
int MK_IPRP_ItemPropertyMatch(itemproperty iProp, int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
itemproperty MK_IPRP_GetItemProperty(object oItem, int nType, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
itemproperty MK_IPRP_CreateItemPropertyByID(int nIPropID, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=0);
string MK_IPRP_GetItemPropertyName(itemproperty iProp);
int MK_IPRP_CalculateGoldPieceValue(object oItem, int nAdditionalCost=0, int bWriteLog=FALSE);
int MK_IPRP_RemoveAllItemProperties(object oItem, int nType=-1, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
int MK_IPRP_GetItemPropertyCount(object oItem, int nType=-1, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1);
string MK_IPRP_GetItemName(object oItem, int bBaseItemNameIfUnidentified=TRUE);
///////////////////////////////////////////////////////////////////////////////
void MK_IPRP_DEBUG_TRACE(string sMessage)
{
if (MK_IPRP_DEBUG)
{
MK_DEBUG_TRACE(sMessage);
}
}
string MK_IPRP_GetItemName(object oItem, int bBaseItemNameIfUnidentified)
{
string sName = "";
int nObjectType = GetObjectType(oItem);
if (nObjectType == OBJECT_TYPE_ITEM)
{
if (bBaseItemNameIfUnidentified && !GetIdentified(oItem))
{
int nBaseItemType = GetBaseItemType(oItem);
int nStrRef = MK_Get2DAInt("baseitems", "Name", nBaseItemType, 0);
sName = GetStringByStrRef(nStrRef) + " " + GetStringByStrRef(5548);
}
else
{
sName = GetName(oItem);
}
}
return sName;
}
int MK_IPRP_GetItemPropertyCount(object oItem, int nType, int nSubType, int nCostTableValue, int nParam1Value)
{
int nCount = 0;
if (GetIsObjectValid(oItem))
{
itemproperty iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
if ((nType==-1) || MK_IPRP_ItemPropertyMatch(iProp, nType, nSubType, nCostTableValue, nParam1Value))
{
nCount++;
}
iProp = GetNextItemProperty(oItem);
}
}
return nCount;
}
int MK_IPRP_GetIsNumberOfCastSpellPropsValid(object oItem)
{
int bResult = FALSE;
int nBaseItemType = GetBaseItemType(oItem);
int nMinProps = MK_Get2DAInt("baseitems", "MinProps", nBaseItemType, 0);
int nMaxProps = MK_Get2DAInt("baseitems", "MaxProps", nBaseItemType, 0);
int nCastSpellProps = MK_IPRP_GetItemPropertyCount(oItem, ITEM_PROPERTY_CAST_SPELL);
if ((nMinProps<=nCastSpellProps) && (nMaxProps>=nCastSpellProps))
{
bResult = TRUE;
}
return bResult;
}
int MK_IPRP_RemoveAllItemProperties(object oItem, int nType, int nSubType, int nCostTableValue, int nParam1Value)
{
int nCount = 0;
if (GetIsObjectValid(oItem))
{
itemproperty iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
if ((nType==-1) || MK_IPRP_ItemPropertyMatch(iProp, nType, nSubType, nCostTableValue, nParam1Value))
{
RemoveItemProperty(oItem, iProp);
nCount++;
}
iProp = GetNextItemProperty(oItem);
}
}
return nCount;
}
int MK_IPRP_ItemPropertyMatch(itemproperty iProp, int nType, int nSubType, int nCostTableValue, int nParam1Value)
{
int bReturn = FALSE;
if (GetIsItemPropertyValid(iProp))
{
int nTypeQ = GetItemPropertyType(iProp);
int nSubTypeQ = GetItemPropertySubType(iProp);
int nCostTableQ = MK_IPRP_GetCostTableResRefID(iProp);
int nCostTableValueQ = GetItemPropertyCostTableValue(iProp);
// int nParam1Q1 = GetItemPropertyParam1(iProp);
int nParam1Q2 = MK_IPRP_GetParam1ResRefID(iProp);
int nParam1ValueQ = GetItemPropertyParam1Value(iProp);
/* MK_IPRP_DEBUG_TRACE("MK_IPRP_ItemPropertyMatch('"+MK_IPRP_GetItemPropertyName(iProp)+"):"
+", nType=("+IntToString(nType)+","+IntToString(nTypeQ)+")"
+", nSubType=("+IntToString(nSubType)+","+IntToString(nSubTypeQ)+")"
+", nCostTable=(-,"+IntToString(nCostTableQ)+")"
+", nCostTableValue=("+IntToString(nCostTableValue)+","+IntToString(nCostTableValueQ)+")"
+", nParam1=(-,"+IntToString(nParam1Q1)+"/"+IntToString(nParam1Q2)+")"
+", nParam1Value=("+IntToString(nParam1Value)+","+IntToString(nParam1ValueQ)+")");
*/
if (nType == nTypeQ)
{
string sSubTypeResRef = MK_IPRP_GetSubTypeResRefByID(nType);
if ((nSubType == -1) || (sSubTypeResRef=="") || (nSubType == nSubTypeQ))
{
string sCostTableResRef = MK_IPRP_GetCostTableResRef(iProp);
if ((nCostTableValue == -1) || (nCostTableQ <= 0) || (sCostTableResRef=="") || (nCostTableValue == nCostTableValueQ))
{
string sParam1ResRef = MK_IPRP_GetParam1ResRef(iProp);
if ((nParam1Value == -1) || (nParam1Q2 == -1) || (sParam1ResRef=="") || (nParam1Value == nParam1ValueQ))
{
bReturn = TRUE;
}
}
}
}
}
return bReturn;
}
itemproperty MK_IPRP_GetItemProperty(object oItem, int nType, int nSubType, int nCostTableValue, int nParam1Value)
{
itemproperty iProp;
// if (!GetItemHasItemProperty(oItem, nType))
// {
// return iProp;
// }
string s2DAfile = "itempropdef";
iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
if (MK_IPRP_ItemPropertyMatch(iProp, nType, nSubType, nCostTableValue, nParam1Value))
{
return iProp;
}
iProp = GetNextItemProperty(oItem);
}
return iProp;
}
itemproperty MK_IPRP_CreateItemPropertyByID(int nIPropID, int nSubType, int nCostTableValue, int nParam1Value)
{
itemproperty iProp;
if (MK_VERSION_GetIsBuildVersionGreaterEqual(OBJECT_SELF, 8193, 21))
{
iProp = ItemPropertyCustom(nIPropID, nSubType, nCostTableValue, nParam1Value);
return iProp;
}
switch (nIPropID)
{
case ITEM_PROPERTY_ABILITY_BONUS: // 0
iProp = ItemPropertyAbilityBonus(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_AC_BONUS: // 1
iProp = ItemPropertyACBonus(nCostTableValue);
break;
case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP: // 2
iProp = ItemPropertyACBonusVsAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE: // 3
iProp = ItemPropertyACBonusVsDmgType(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP: // 4
iProp = ItemPropertyACBonusVsRace(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT: // 5
iProp = ItemPropertyACBonusVsSAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_ENHANCEMENT_BONUS: // 6
iProp = ItemPropertyEnhancementBonus(nCostTableValue);
break;
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP: // 7
iProp = ItemPropertyEnhancementBonusVsAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP: // 8
iProp = ItemPropertyEnhancementBonusVsRace(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT: // 9
iProp = ItemPropertyEnhancementBonusVsSAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER: // 10
iProp = ItemPropertyEnhancementPenalty(nCostTableValue);
break;
case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION: // 11
iProp = ItemPropertyWeightReduction(nCostTableValue);
break;
case ITEM_PROPERTY_BONUS_FEAT: // 12
iProp = ItemPropertyBonusFeat(nSubType);
break;
case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N: // 13
iProp = ItemPropertyBonusLevelSpell(nSubType, nCostTableValue);
break;
case 14: // 14 Boomerang
// iProp = *missing*
break;
case ITEM_PROPERTY_CAST_SPELL: // 15
iProp = ItemPropertyCastSpell(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_BONUS: // 16
iProp = ItemPropertyDamageBonus(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP: // 17
iProp = ItemPropertyDamageBonusVsAlign(nSubType, nParam1Value, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP: // 18
iProp = ItemPropertyDamageBonusVsRace(nSubType, nParam1Value, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT: // 19
iProp = ItemPropertyDamageBonusVsSAlign(nSubType, nParam1Value, nCostTableValue);
break;
case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE: // 20
iProp = ItemPropertyDamageImmunity(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_DAMAGE: // 21
iProp = ItemPropertyDamagePenalty(nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_REDUCTION: // 22
iProp = ItemPropertyDamageReduction(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_RESISTANCE: // 23
iProp = ItemPropertyDamageResistance(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DAMAGE_VULNERABILITY: // 24
iProp = ItemPropertyDamageResistance(nSubType, nCostTableValue);
break;
case 25: // 25 Dancing Scimitar
// iProp = *missing*
break;
case ITEM_PROPERTY_DARKVISION: // 26
iProp = ItemPropertyDarkvision();
break;
case ITEM_PROPERTY_DECREASED_ABILITY_SCORE: // 27
iProp = ItemPropertyDecreaseAbility(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_AC: // 28
iProp = ItemPropertyDecreaseAC(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER: // 29
iProp = ItemPropertyDecreaseSkill(nSubType, nCostTableValue);
break;
case 30: // 30 Double Stack
// iProp = *missing*
break;
case 31: // 31 Enhanced Container: Bonus Slot
// iProp = *missing*
break;
case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT: // 32
iProp = ItemPropertyContainerReducedWeight(nCostTableValue);
break;
case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE: // 33
iProp = ItemPropertyExtraMeleeDamageType(nSubType);
break;
case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE: // 34
iProp = ItemPropertyExtraRangeDamageType(nSubType);
break;
case ITEM_PROPERTY_HASTE: // 35
iProp = ItemPropertyHaste();
break;
case ITEM_PROPERTY_HOLY_AVENGER: // 36
iProp = ItemPropertyHolyAvenger();
break;
case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS: // 37
iProp = ItemPropertyImmunityMisc(nSubType);
break;
case ITEM_PROPERTY_IMPROVED_EVASION: // 38
iProp = ItemPropertyImprovedEvasion();
break;
case ITEM_PROPERTY_SPELL_RESISTANCE: // 39
iProp = ItemPropertyBonusSpellResistance(nCostTableValue);
break;
case ITEM_PROPERTY_SAVING_THROW_BONUS: // 40
// item property 40 seemd to be ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC actually
iProp = ItemPropertyBonusSavingThrowVsX(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC: // 41
// item property 41 seemd to be ITEM_PROPERTY_SAVING_THROW_BONUS actually
iProp = ItemPropertyBonusSavingThrow(nSubType, nCostTableValue);
break;
case 42: // 42 empty
// iProp = *missing*
break;
case ITEM_PROPERTY_KEEN: // 43
iProp = ItemPropertyKeen();
break;
case ITEM_PROPERTY_LIGHT: // 44
iProp = ItemPropertyLight(nCostTableValue, nParam1Value);
break;
case ITEM_PROPERTY_MIGHTY: // 45
iProp = ItemPropertyMaxRangeStrengthMod(nCostTableValue);
break;
case ITEM_PROPERTY_MIND_BLANK: // 46 Mind Blank
break;
case ITEM_PROPERTY_NO_DAMAGE: // 47
iProp = ItemPropertyNoDamage();
break;
case ITEM_PROPERTY_ON_HIT_PROPERTIES: // 48
// nParam1Value = nParam1Value(nSubType)
iProp = ItemPropertyOnHitProps(nSubType, nCostTableValue, nParam1Value);
break;
case ITEM_PROPERTY_DECREASED_SAVING_THROWS: // 49
// item property 49 seemd to be ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC actually
iProp = ItemPropertyReducedSavingThrowVsX(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC: // 50
// item property 50 seemd to be ITEM_PROPERTY_DECREASED_SAVING_THROWS actually
iProp = ItemPropertyReducedSavingThrow(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_REGENERATION: // 51
iProp = ItemPropertyRegeneration(nCostTableValue);
break;
case ITEM_PROPERTY_SKILL_BONUS: // 52
iProp = ItemPropertySkillBonus(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL: // 53
iProp = ItemPropertySpellImmunitySpecific(nCostTableValue);
break;
case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL: // 54
iProp = ItemPropertySpellImmunitySchool(nSubType);
break;
case ITEM_PROPERTY_THIEVES_TOOLS: // 55
iProp = ItemPropertyThievesTools(nCostTableValue);
break;
case ITEM_PROPERTY_ATTACK_BONUS: // 56
iProp = ItemPropertyAttackBonus(nCostTableValue);
break;
case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP: // 57
iProp = ItemPropertyAttackBonusVsAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP: // 58
iProp = ItemPropertyAttackBonusVsRace(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT: // 59
iProp = ItemPropertyAttackBonusVsSAlign(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER: // 60
iProp = ItemPropertyAttackPenalty(nCostTableValue);
break;
case ITEM_PROPERTY_UNLIMITED_AMMUNITION: // 61
iProp = ItemPropertyUnlimitedAmmo(nCostTableValue);
break;
case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP: // 62
iProp = ItemPropertyLimitUseByAlign(nSubType);
break;
case ITEM_PROPERTY_USE_LIMITATION_CLASS: // 63
iProp = ItemPropertyLimitUseByClass(nSubType);
break;
case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE: // 64
iProp = ItemPropertyLimitUseByRace(nSubType);
break;
case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT: // 65
iProp = ItemPropertyLimitUseBySAlign(nSubType);
break;
case ITEM_PROPERTY_USE_LIMITATION_TILESET: // 66 UseLimitationTerrain
break;
case ITEM_PROPERTY_REGENERATION_VAMPIRIC: // 67
iProp = ItemPropertyVampiricRegeneration(nCostTableValue);
break;
case 68: // 68 vorpal
// iProp = *missing*
break;
case 69: // 69 wounding
// iProp = *missing*
break;
case ITEM_PROPERTY_TRAP: // 70
iProp = ItemPropertyTrap(nSubType, nCostTableValue);
break;
case ITEM_PROPERTY_TRUE_SEEING: // 71
iProp = ItemPropertyTrueSeeing();
break;
case ITEM_PROPERTY_ON_MONSTER_HIT: // 72
iProp = ItemPropertyOnMonsterHitProperties(nSubType, nParam1Value);
break;
case ITEM_PROPERTY_TURN_RESISTANCE: // 73
iProp = ItemPropertyTurnResistance(nCostTableValue);
break;
case ITEM_PROPERTY_MASSIVE_CRITICALS: // 74
iProp = ItemPropertyMassiveCritical(nCostTableValue);
break;
case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT: // 75
iProp = ItemPropertyFreeAction();
break;
case ITEM_PROPERTY_POISON: // 76 Poison
break;
case ITEM_PROPERTY_MONSTER_DAMAGE: // 77
iProp = ItemPropertyMonsterDamage(nCostTableValue);
break;
case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL: // 78
iProp = ItemPropertyImmunityToSpellLevel(nCostTableValue);
break;
case ITEM_PROPERTY_SPECIAL_WALK: // 79
iProp = ItemPropertySpecialWalk(nSubType);
break;
case ITEM_PROPERTY_HEALERS_KIT: // 80
iProp = ItemPropertyHealersKit(nCostTableValue);
break;
case ITEM_PROPERTY_WEIGHT_INCREASE: // 81
iProp = ItemPropertyWeightIncrease(nParam1Value);
break;
case ITEM_PROPERTY_ONHITCASTSPELL: // 82
iProp = ItemPropertyOnHitCastSpell(nSubType, nCostTableValue+1);
break;
case ITEM_PROPERTY_VISUALEFFECT: // 83
iProp = ItemPropertyVisualEffect(nSubType);
break;
case ITEM_PROPERTY_ARCANE_SPELL_FAILURE: // 84
iProp = ItemPropertyArcaneSpellFailure(nCostTableValue);
break;
case ITEM_PROPERTY_MATERIAL: // 85
iProp = ItemPropertyMaterial(nCostTableValue);
break;
case ITEM_PROPERTY_QUALITY: // 86
iProp = ItemPropertyQuality(nCostTableValue);
break;
case ITEM_PROPERTY_ADDITIONAL: // 87
iProp = ItemPropertyAdditional(nCostTableValue);
break;
}
return iProp;
}
string MK_IPRP_GetSubTypeResRefByID(int nIPropID)
{
return Get2DAString("itempropdef", "SubTypeResRef", nIPropID);
}
string MK_IPRP_GetSubTypeResRef(itemproperty iProp)
{
return Get2DAString("itempropdef", "SubTypeResRef", GetItemPropertyType(iProp));
}
int MK_IPRP_GetParam1ResRefID(itemproperty iProp)
{
int nType = GetItemPropertyType(iProp);
int nSubType = GetItemPropertySubType(iProp);
return MK_IPRP_GetParam1ResRefIDByID(nType, nSubType);
}
int MK_IPRP_GetParam1ResRefIDByID(int nIPropID, int nSubType)
{
int nParam1ResRef = MK_Get2DAInt("itempropdef", "Param1ResRef", nIPropID, -1);
if (nSubType!=-1)
{
string sSubTypeResRef = MK_IPRP_GetSubTypeResRefByID(nIPropID);
if (sSubTypeResRef!="")
{
string sParam1ResRef = Get2DAString(sSubTypeResRef, "Param1ResRef", nSubType);
if (sParam1ResRef!="")
{
nParam1ResRef = StringToInt(sParam1ResRef);
}
}
}
return nParam1ResRef;
}
string MK_IPRP_GetParam1ResRef(itemproperty iProp)
{
int nType = GetItemPropertyType(iProp);
int nSubType = GetItemPropertySubType(iProp);
return MK_IPRP_GetParam1ResRefByID(nType, nSubType);
/*
string sParam1ResRef="";
int nParam1 = GetItemPropertyParam1(iProp);
if (nParam1!=-1)
{
sParam1ResRef = Get2DAString("iprp_paramtable", "TableResRef", nParam1);
}
return sParam1ResRef;*/
}
string MK_IPRP_GetParam1ResRefByID(int nIPropID, int nSubType)
{
string sParam1ResRef = "";
int nParam1ResRef = MK_IPRP_GetParam1ResRefIDByID(nIPropID, nSubType);
if (nParam1ResRef!=-1)
{
sParam1ResRef = Get2DAString("iprp_paramtable", "TableResRef", nParam1ResRef);
}
return sParam1ResRef;
}
int MK_IPRP_GetCostTableResRefID(itemproperty iProp)
{
return MK_IPRP_GetCostTableResRefIDByID(GetItemPropertyType(iProp));
}
int MK_IPRP_GetCostTableResRefIDByID(int nIPropID)
{
return MK_Get2DAInt("itempropdef", "CostTableResRef", nIPropID);
}
string MK_IPRP_GetCostTableResRef(itemproperty iProp)
{
return MK_IPRP_GetCostTableResRefByID(GetItemPropertyType(iProp));
// string sCostTableResRef = "";
// int nCostTableResRef = GetItemPropertyCostTable(iProp);
// if (nCostTableResRef>0)
// {
// sCostTableResRef = Get2DAString("iprp_costtable", "Name", nCostTableResRef);
// MK_DEBUG_TRACE("MK_IPRP_GetCostTableResRef: "+IntToString(nCostTableResRef)+" ("+sCostTableResRef+")");
// }
// return sCostTableResRef;
}
string MK_IPRP_GetCostTableResRefByID(int nIPropID)
{
string sCostTableResRef="";
int nCostTableResRef = MK_IPRP_GetCostTableResRefIDByID(nIPropID);
if (nCostTableResRef>=1)
{
sCostTableResRef = Get2DAString("iprp_costtable", "Name", nCostTableResRef);
}
return sCostTableResRef;
}
int MK_IPRP_CreateItemPropertyOnItem(object oItem, int nIPropID, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1)
{
int bResult=FALSE;
itemproperty iProp = MK_IPRP_CreateItemPropertyByID(nIPropID, nSubType, nCostTableValue, nParam1Value);
/* MK_IPRP_DEBUG_TRACE("MK_IPRP_CreateItemPropertyOnItem('"+GetName(oItem)
+"', nIPropID="+IntToString(nIPropID)
+", nSubType="+IntToString(nSubType)
+", nParam1Value="+IntToString(nParam1Value)
+", nCostTableValue="+IntToString(nCostTableValue));*/
if (GetIsItemPropertyValid(iProp))
{
IPSafeAddItemProperty(oItem, iProp);
bResult=TRUE;
}
return bResult;
}
int MK_IPRP_GetSkillBonus(object oItem, int nSkill, int bRemoveProperties=FALSE)
{
int nSkillBonus = 0;
if (GetIsObjectValid(oItem))
{
if (nSkill!=-1)
{
itemproperty iProp;
iProp = MK_IPRP_GetItemProperty(oItem, ITEM_PROPERTY_SKILL_BONUS, nSkill);
if (GetIsItemPropertyValid(iProp))
{
nSkillBonus += GetItemPropertyCostTableValue(iProp);
if (bRemoveProperties)
{
RemoveItemProperty(oItem, iProp);
}
}
iProp = MK_IPRP_GetItemProperty(oItem, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, nSkill);
if (GetIsItemPropertyValid(iProp))
{
nSkillBonus -= GetItemPropertyCostTableValue(iProp);
if (bRemoveProperties)
{
RemoveItemProperty(oItem, iProp);
}
}
}
}
return nSkillBonus;
}
int MK_IPRP_GetItemHasFeat(object oItem, int nFeat)
{
return GetIsItemPropertyValid(MK_IPRP_GetItemProperty(oItem, ITEM_PROPERTY_BONUS_FEAT, nFeat));
}
int MK_IPRP_SetPlotFlag(object oTarget, int bPlotFlag)
{
int bPlotFlagOld = GetPlotFlag(oTarget);
if (bPlotFlagOld!=bPlotFlag)
{
SetPlotFlag(oTarget, bPlotFlag);
}
return bPlotFlagOld;
}
int MK_IPRP_SetIdentified(object oItem, int bIdentified)
{
int bIdentifiedOld = GetIdentified(oItem);
if (bIdentifiedOld!=bIdentified)
{
SetIdentified(oItem, bIdentified);
}
return bIdentifiedOld;
}
int MK_IPRP_SetItemCursedFlag(object oItem, int nCursed)
{
int nCursedOld = GetItemCursedFlag(oItem);
if (nCursedOld!=nCursed)
{
SetItemCursedFlag(oItem, nCursed);
}
return nCursedOld;
}
int MK_IPRP_GetGoldPieceValue(object oItem)
{
int nValue=0;
if (GetIsObjectValid(oItem))
{
int bPlotFlag = MK_IPRP_SetPlotFlag(oItem, FALSE);
int bIdentified = MK_IPRP_SetIdentified(oItem, TRUE);
int nCursed = MK_IPRP_SetItemCursedFlag(oItem, FALSE);
nValue = GetGoldPieceValue(oItem);
MK_IPRP_SetItemCursedFlag(oItem, nCursed);
MK_IPRP_SetIdentified(oItem, bIdentified);
MK_IPRP_SetPlotFlag(oItem, bPlotFlag);
// MK_IPRP_DEBUG_TRACE("MK_IPRP_GetGoldPieceValue('"+GetName(oItem)
// +"'): indentified=("+IntToString(bIdentified)+"/"+IntToString(GetIdentified(oItem))
// +"), bPlot=("+IntToString(bPlotFlag)+"/"+IntToString(GetPlotFlag(oItem))
// +"), nCursed=("+IntToString(nCursed)+"/"+IntToString(GetItemCursedFlag(oItem))
// +") = "+IntToString(nValue) + "("+IntToString(GetGoldPieceValue(oItem))+")");
}
return nValue;
}
string MK_IPRP_GetItemPropertyNameByID(int nIPropID, int nSubType=-1, int nCostTableValue=-1, int nParam1Value=-1)
{
string sPropertyName = "";
int nGender = GetGender(OBJECT_SELF);
int nStrRef;
if (nIPropID!=-1)
{
nStrRef = MK_Get2DAInt("itempropdef", "GameStrRef", nIPropID, 0);
sPropertyName = GetStringByStrRef(nStrRef, GetGender(OBJECT_SELF));
if (nSubType!=-1)
{
string sSubTypeResRef = MK_IPRP_GetSubTypeResRefByID(nIPropID);
if (sSubTypeResRef!="")
{
nStrRef = MK_Get2DAInt(sSubTypeResRef, "Name", nSubType, 0);
if (nStrRef>0)
{
sPropertyName += (" " + GetStringByStrRef(nStrRef, nGender));
}
}
}
if (nCostTableValue!=-1)
{
string sCostTableResRef = MK_IPRP_GetCostTableResRefByID(nIPropID);
if (sCostTableResRef!="")
{
nStrRef = MK_Get2DAInt(sCostTableResRef, "Name", nCostTableValue, 0);
if (nStrRef>0)
{
sPropertyName += (" " + GetStringByStrRef(nStrRef, nGender));
}
}
}
if (nParam1Value!=-1)
{
string sParam1ResRef = MK_IPRP_GetParam1ResRefByID(nIPropID, nSubType);
if (sParam1ResRef!="")
{
nStrRef = MK_Get2DAInt(sParam1ResRef, "Name", nParam1Value, 0);
if (nStrRef>0)
{
sPropertyName += (" " + GetStringByStrRef(nStrRef, nGender));
}
}
}
}
return sPropertyName;
}
string MK_IPRP_GetItemPropertyName(itemproperty iProp)
{
string sPropertyName="";
if (GetIsItemPropertyValid(iProp))
{
int nType = GetItemPropertyType(iProp);
int nSubType = GetItemPropertySubType(iProp);
int nCostTableValue = GetItemPropertyCostTableValue(iProp);
int nParam1Value = GetItemPropertyParam1Value(iProp);
sPropertyName = MK_IPRP_GetItemPropertyNameByID(nType, nSubType, nCostTableValue, nParam1Value);
}
return sPropertyName;
}
float MK_IPRP_CalculateItemPropertyCost(itemproperty iProp, int nCharges=-1)
{
float fValue = 0.0f;
if (GetIsItemPropertyValid(iProp))
{
int nType = GetItemPropertyType(iProp);
int nSubType = GetItemPropertySubType(iProp);
int nCostTableValue = GetItemPropertyCostTableValue(iProp);
// int nParam1Value = GetItemPropertyParam1Value(iProp);
string sTypeResRef = "itempropdef";
string sSubTypeResRef = MK_IPRP_GetSubTypeResRef(iProp);
string sCostTableResRef = MK_IPRP_GetCostTableResRef(iProp);
// string sParam1ResRef = MK_IPRP_GetParam1ResRef(iProp);
string sIPropCost = Get2DAString(sTypeResRef, "Cost", nType);
string sSubTypeCost = Get2DAString(sSubTypeResRef, "Cost", nSubType);
string sCostTableCost = Get2DAString(sCostTableResRef, "Cost", nCostTableValue);
// string sParam1Cost = Get2DAString(sParam1ResRef, "Cost", nParam1Value);
float fCharges = 1.0f;
switch (nType)
{
case ITEM_PROPERTY_CAST_SPELL:
fValue = (StringToFloat(sSubTypeCost) * StringToFloat(sCostTableCost));
switch (nCostTableValue)
{
case IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE:
case IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE:
case IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE:
case IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE:
case IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE:
fCharges = (IntToFloat(nCharges) / MK_IPRP_GetMaxCharges());
fValue *= fCharges;
break;
}
break;
default:
fValue = StringToFloat(sIPropCost!="" ? sIPropCost : sSubTypeCost) * (sCostTableCost!="" ? StringToFloat(sCostTableCost) : 1.0f);
break;
}
MK_IPRP_DEBUG_TRACE(" > '"+sIPropCost+"("+ (sIPropCost!="" ? FloatToString(StringToFloat(sIPropCost)): "") +")"
+"', '"+sSubTypeCost+"('"+sSubTypeResRef+"':"+ (sSubTypeCost!="" ? FloatToString(StringToFloat(sSubTypeCost)): "") +")"
+"', '"+sCostTableCost+"('"+sCostTableResRef+"':"+ (sCostTableCost!="" ? FloatToString(StringToFloat(sCostTableCost)): "") +")"
+"', "+FloatToString(fCharges)+" = "+FloatToString(fValue)+"' ('"+MK_IPRP_GetItemPropertyName(iProp)+"' ("+
IntToString(nType)+","+IntToString(nSubType)+","+IntToString(nCostTableValue)+","+IntToString(GetItemPropertyParam1Value(iProp))
+"))");
}
return fValue;
}
int MK_IPRP_GetArmorType(object oItem)
{
int nArmorType = -1;
if (GetIsObjectValid(oItem))
{
int nChest = GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_TORSO);
nArmorType = FloatToInt(MK_Get2DAFloat("parts_chest", "ACBONUS", nChest, -1.0f));
}
return nArmorType;
}
int MK_IPRP_GetItemBaseCost(object oItem)
{
int nBaseCost = 0;
if (GetIsObjectValid(oItem))
{
int nBaseItemType = GetBaseItemType(oItem);
switch (nBaseItemType)
{
case BASE_ITEM_ARMOR:
{
int nArmorType = MK_IPRP_GetArmorType(oItem);
if (nArmorType!=-1)
{
nBaseCost = MK_Get2DAInt("armor", "COST", nArmorType);
}
break;
}
default:
nBaseCost = MK_Get2DAInt("baseitems", "BaseCost", nBaseItemType, 0);
break;
}
}
return nBaseCost;
}
int MK_IPRP_GetItemHasItemPropertyOfDurationType(object oItem, int nItemPropertyType)
{
if (GetIsObjectValid(oItem))
{
itemproperty iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
if (GetItemPropertyDurationType(iProp)==nItemPropertyType)
{
return TRUE;
}
iProp = GetNextItemProperty(oItem);
}
}
return FALSE;
}
int MK_IPRP_GetBaseItemValue(object oItem /*, int bIgnoreStackSize=TRUE*/)
{
int nBaseItemValue;
int nBaseCost = MK_IPRP_GetItemBaseCost(oItem);
int nBaseItemType = GetBaseItemType(oItem);
float fItemMultiplier = MK_Get2DAFloat("baseitems", "ItemMultiplier", nBaseItemType, 1.0);
// int nItemStackSize = (bIgnoreStackSize ? 1 : GetItemStackSize(oItem));
nBaseItemValue = FloatToInt(nBaseCost * fItemMultiplier);
if (nBaseItemValue==0)
{
switch (nBaseItemType)
{
case BASE_ITEM_ARROW: // 20
case BASE_ITEM_BOLT: // 25
case BASE_ITEM_BULLET: // 27
// category = 6
break;
case BASE_ITEM_DART: // 31
case BASE_ITEM_SHURIKEN: // 59
case BASE_ITEM_THROWINGAXE: // 63
// category = 7
break;
case BASE_ITEM_POTIONS: // 49
case BASE_ITEM_BLANK_POTION: // 101
case BASE_ITEM_ENCHANTED_POTION: // 104
// category = 9
break;
// case BASE_ITEM_SCROLL: // 54
case BASE_ITEM_SPELLSCROLL: // 75
case BASE_ITEM_BLANK_SCROLL: // 102
case BASE_ITEM_ENCHANTED_SCROLL: // 105
// category = 10
break;
case BASE_ITEM_THIEVESTOOLS: // 62
// category = 11
break;
case BASE_ITEM_GEM: // 77
// category = 17
break;
default:
nBaseItemValue = 1;
break;
}
// int nCategory = MK_Get2DAInt("baseitems", "Category", nBaseItemType, -1);
/* switch (nCategory)
{
case 6: // ammunition ?
case 7: // throwing ?
case 9: // potions ?
case 10: // scrolls ?
// case 11: // thieves's tools
case 17: // gems
// case 19: // medi kits
{
// int nMaxStackSize = MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1);
// if (nItemStackSize==nMaxStackSize) nBaseItemValue = 1;
break;
}
default:
// nBaseItemValue = nItemStackSize;
nBaseItemValue = 1;
break;
}
*/
}
// else
// {
// nBaseItemValue *= nItemStackSize;
// }
// MK_IPRP_DEBUG_TRACE("MK_IPRP_GetBaseItemValue('"+GetName(oItem)+/*"', "+IntToString(bIgnoreStackSize)+*/"):");
// MK_IPRP_DEBUG_TRACE(" > nBaseItemType="+IntToString(nBaseItemType));
// MK_IPRP_DEBUG_TRACE(" > nCategory="+IntToString(MK_Get2DAInt("baseitems", "Category", nBaseItemType, -1)));
// MK_IPRP_DEBUG_TRACE(" > nBaseCost="+IntToString(nBaseCost));
// MK_IPRP_DEBUG_TRACE(" > nfItemMultiplier="+FloatToString(fItemMultiplier));
// MK_IPRP_DEBUG_TRACE(" > nItemStackSize="+IntToString(nItemStackSize));
// MK_IPRP_DEBUG_TRACE(" > nMaxStackSize="+IntToString(MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1)));
// MK_IPRP_DEBUG_TRACE(" > nBaseItemValue = "+IntToString(nBaseItemValue));
return nBaseItemValue;
}
itemproperty MK_IPRP_CreateItemProperty(int nBaseItemType, int nMinValue=1)
{
int nPropColumn = MK_Get2DAInt("baseitems", "PropColumn", nBaseItemType, -1);
float fItemMultiplier = MK_Get2DAFloat("baseitems", "ItemMultiplier", nBaseItemType, 1.0f);
if (nPropColumn!=-1)
{
int nIPropID = -1;
int nSubType = -1;
int nCostTableValue = -1;
int nParam1Value = 0;
string sPropColumn = Get2DAString("mk_iprp_cols", "Column", nPropColumn);
int nLength1 = MK_Get2DALength("itemprops", sPropColumn, 100);
int nStart1 = 0;
// int iRow1;
for (nIPropID = nStart1; nIPropID<nLength1; nIPropID++)
{
if (MK_Get2DAInt("itemprops", sPropColumn, nIPropID, 0))
{
// int nIPropID = iRow;
int nStart2, nLength2;
string sSubTypeResRef = MK_IPRP_GetSubTypeResRefByID(nIPropID);
if (sSubTypeResRef!="")
{
nStart2 = 0;
nLength2 = MK_Get2DALength(sSubTypeResRef, "Label", 5);
}
else
{
nStart2 = -1;
nLength2 = 0;
}
for (nSubType=nStart2; nSubType<nLength2; nSubType++)
{
// nSubType = iPos2;
string sCostTableResRef = MK_IPRP_GetCostTableResRefByID(nIPropID);
int nStart3, nLength3;
if (sCostTableResRef !="")
{
nStart3 = 0;
nLength3 = MK_Get2DALength(sCostTableResRef, "Label", 5);
}
else
{
nStart3 = -1;
nLength3 = 0;
}
for (nCostTableValue = nStart3; nCostTableValue<nLength3; nCostTableValue++)
{
// nCostTableValue = iPos3;
int nStart4, nLength4;
string sParam1ResRef = MK_IPRP_GetParam1ResRefByID(nIPropID, nSubType);
if (sParam1ResRef!="")
{
nStart4 = 0;
nLength4 = MK_Get2DALength(sParam1ResRef, "Label", 5);
}
else
{
nStart4 = 0;
nLength4 = 1;
}
for (nParam1Value = nStart4; nParam1Value < nLength4; nParam1Value++)
{
// nParam1 = iPos4;
itemproperty iProp = MK_IPRP_CreateItemPropertyByID(nIPropID, nSubType, nCostTableValue, nParam1Value);
if (GetIsItemPropertyValid(iProp))
{
float fCost = MK_IPRP_CalculateItemPropertyCost(iProp);
int nValue;
switch (nIPropID)
{
case ITEM_PROPERTY_CAST_SPELL:
nValue = MK_MATH_Round(FloatToInt(fCost) * fItemMultiplier);
break;
default:
nValue = FloatToInt(FloatToInt(fCost*fCost*1000) * fItemMultiplier);
break;
}
if (nValue > nMinValue)
{
return iProp;
}
}
}
}
}
}
}
}
itemproperty iProp;
return iProp;
}
int MK_IPRP_GetItemAdditionalCostValue(object oItem)
{
int nAdditionalCostValue=-1;
if (GetIsObjectValid(oItem))
{
// int nBaseCost = MK_IPRP_GetItemBaseCost(oItem);
// int nItemStackSize = GetItemStackSize(oItem);
// float fItemMultiplier = MK_Get2DAFloat("baseitems", "ItemMultiplier", nBaseItemType, 1.0);
if (MK_IPRP_GetItemHasItemPropertyOfDurationType(oItem, DURATION_TYPE_PERMANENT))
{
SendMessageToPC(OBJECT_SELF, "Can't calculate additional cost for items with properties!");
}
else if (GetItemStackSize(oItem)!=1)
{
SendMessageToPC(OBJECT_SELF, "Can't calculate additional cost for items with stack size other than 1!");
}
else
{
int nItemValue = MK_IPRP_GetGoldPieceValue(oItem);
int nBaseItemValue = MK_IPRP_GetBaseItemValue(oItem/*, FALSE*/);
if ((nBaseItemValue == 0) && (nItemValue == 1))
{
int nBaseItemType = GetBaseItemType(oItem);
int nMaxStackSize = MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1);
if (MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1) == 1)
{
// here we have a problem. ItemValue could be 1 gold because
// of additional cost = 1 gold or because it was set to 1 because
// of StackSize (=1) = Stacking(=1). So either it's
// BaseItemValue = 1 and AdditionalCostValue = 0
// or
// BaseItemValue = 0 and AdditionalCostValue = 1
// To decide which is true we have to make oItem more valuable
// Unfortunately we can't increase stacksize (because MaxStackSize=1)
// So we have to add a property.
object oPC = OBJECT_SELF;
itemproperty iProp = MK_IPRP_CreateItemProperty(nBaseItemType, 1);
if (GetIsItemPropertyValid(iProp))
{
AddItemProperty(DURATION_TYPE_PERMANENT, iProp, oItem);
int nItemValueQ = MK_IPRP_GetGoldPieceValue(oItem);
int nCalcValueQ = MK_IPRP_CalculateGoldPieceValue(oItem, 0);
if (nItemValueQ>1)
{
if (nItemValueQ==nCalcValueQ)
{
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'): iProp="+MK_IPRP_GetItemPropertyName(iProp)+", nItemValueQ="+IntToString(nItemValueQ)+", nCalcValueQ="+IntToString(nCalcValueQ));
nBaseItemValue = 1;
}
else if (nItemValueQ==nCalcValueQ+1)
{
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'): iProp="+MK_IPRP_GetItemPropertyName(iProp)+", nItemValueQ="+IntToString(nItemValueQ)+", nCalcValueQ="+IntToString(nCalcValueQ));
nBaseItemValue = 0;
}
else
{
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'): iProp="+MK_IPRP_GetItemPropertyName(iProp)+", nItemValueQ="+IntToString(nItemValueQ)+", nCalcValueQ="+IntToString(nCalcValueQ));
SendMessageToPC(oPC, "Can't calculate additional cost for this item (there seems something wrong with the item value calculation algorithm).");
return -1;
}
}
else
{
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'): iProp="+MK_IPRP_GetItemPropertyName(iProp)+", nItemValueQ="+IntToString(nItemValueQ)+", nCalcValueQ="+IntToString(nCalcValueQ));
SendMessageToPC(oPC, "Can't calculate additional cost for this item (created IP did not make item valuable).");
return -1;
}
}
else
{
SendMessageToPC(oPC, "Can't calculate additional cost for this item (can't create IP to make item valuable).");
return -1;
}
}
}
nAdditionalCostValue = MK_MATH_MaxInt(nItemValue - nBaseItemValue, 0);
/*
int nCalculatedValue = FloatToInt(fItemMultiplier * nBaseCost);
int nCategory = MK_Get2DAInt("baseitems", "Category", nBaseItemType, -1);
if (nCalculatedValue==0)
{
switch (nCategory)
{
case 6: // ammunition ?
case 7: // throwing ?
case 9: // potions ?
case 10: // scrolls ?
if (nItemStackSize==nMaxStackSize) nCalculatedValue = 1;
break;
default:
nCalculatedValue = 1;
break;
}
}
nAdditionalCostValue = MK_MATH_MaxInt(nItemValue - nCalculatedValue, 0);
*/
// if (nItemStackSize>0)
// {
// nAdditionalCostValue = FloatToInt(IntToFloat(nAdditionalCostValue) / IntToFloat(nItemStackSize));
// }
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'):");
int nBaseItemType = GetBaseItemType(oItem);
MK_IPRP_DEBUG_TRACE(" > nBaseItemType ="+IntToString(nBaseItemType));
MK_IPRP_DEBUG_TRACE(" > nStacking = "+IntToString(MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1)));
MK_IPRP_DEBUG_TRACE(" > nItemValue = "+IntToString(nItemValue));
MK_IPRP_DEBUG_TRACE(" > nBaseItemValue = "+IntToString(nBaseItemValue));
// MK_IPRP_DEBUG_TRACE(" > nItemStackSize="+IntToString(GetItemStackSize(oItem)));
MK_IPRP_DEBUG_TRACE(" > nAdditionalCostValue="+IntToString(nAdditionalCostValue));
// nAdditionalCostValue = MK_MATH_MaxInt(nItemValue - MK_MATH_MaxInt(FloatToInt(nBaseCost * fItemMultiplier), (nMaxStackSize==1 ? 1 : 0)), 0);
/*
MK_IPRP_DEBUG_TRACE("MK_IPRP_GetItemAdditionalCostValue('"+GetName(oItem)+"'):");
MK_IPRP_DEBUG_TRACE(" > nBaseItemType="+IntToString(nBaseItemType));
MK_IPRP_DEBUG_TRACE(" > nCategory="+IntToString(nCategory));
MK_IPRP_DEBUG_TRACE(" > nBaseCost="+IntToString(nBaseCost));
MK_IPRP_DEBUG_TRACE(" > nfItemMultiplier="+FloatToString(fItemMultiplier));
MK_IPRP_DEBUG_TRACE(" > bIdentified="+IntToString(GetIdentified(oItem)));
MK_IPRP_DEBUG_TRACE(" > bPlot="+IntToString(GetPlotFlag(oItem)));
MK_IPRP_DEBUG_TRACE(" > nItemValue(without properties)="+IntToString(nItemValue));
MK_IPRP_DEBUG_TRACE(" > nItemStackSize="+IntToString(nItemStackSize));
MK_IPRP_DEBUG_TRACE(" > nCalculatedValue="+IntToString(nCalculatedValue));
MK_IPRP_DEBUG_TRACE(" > nAdditionalCostValue="+IntToString(nAdditionalCostValue));
*/
}
}
return nAdditionalCostValue;
}
int MK_IPRP_GetMaxCharges()
{
if (MK_VERSION_GetIsVersionGreaterEqual_1_74())
{
return 250;
}
else
{
return 50;
}
}
int MK_IPRP_FloatToInt(float fNumber, int nRoundUp)
{
int nNumber = FloatToInt(fNumber);;
string sNumber = FloatToString(fNumber);
int nPos = FindSubString(sNumber, ".");
if (nPos != -1)
{
if (nRoundUp>1)
{
if (StringToInt(GetSubString(sNumber, nPos+1, 1))>=nRoundUp)
{
nNumber++;
}
}
else
{
string sFractionalPart = GetSubString(sNumber, nPos+1, GetStringLength(sNumber)-nPos);
if (StringToInt(sFractionalPart)>0)
{
nNumber++;
}
}
}
return nNumber;
}
int MK_IPRP_CalculateGoldPieceValue(object oItem, int nAdditionalCost, int bWriteLog)
{
int nItemValue=-1;
if (GetIsObjectValid(oItem))
{
MK_IPRP_DEBUG_TRACE("MK_IPRP_CalculateItemValue('"+GetName(oItem)+":");
int nBaseItemType = GetBaseItemType(oItem);
// get the base cost from either baseitems.2da (everything but armor)
// or armor.2da (armor)
// int nBaseCost = MK_IPRP_GetItemBaseCost(oItem);
float fItemMultiplier = MK_Get2DAFloat("baseitems", "ItemMultiplier", nBaseItemType, 0.0);
int nCharges = GetItemCharges(oItem);
float fIPCost = 0.0f;
float fSpellCost1 = 0.0f;
float fSpellCost2 = 0.0f;
float fSpellCostR = 0.0f;
itemproperty iProp = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(iProp))
{
if (GetItemPropertyDurationType(iProp) == DURATION_TYPE_PERMANENT)
{
switch (GetItemPropertyType(iProp))
{
case ITEM_PROPERTY_CAST_SPELL:
{
float fSpellCost = MK_IPRP_CalculateItemPropertyCost(iProp, nCharges);
if (fSpellCost>fSpellCost1)
{
// *****************************************************
// The following line is somewhat queer as it makes
// the item value depend on the order in which 'Cast-
// Spell' properties are added to the item. If they are
// added in order from most expensive first and least
// expensive last the item will become more expensive as
// if they were added in reverse order. The original
// Bioware documentation (BioWare Aurora Engine Item
// Format) hints that following was supposed to happen:
//
// - fSpellCost1: highest spell cost
// - fSpellCost2: 2nd highest spell cost
// - fSpellCostR: the rest
//
// The highest spell cost is multiplied by 1.0, the 2nd
// highest is multiplied by 0.75 and the rest is
// multiplied by 0.5.
//
// But if the CastSpell property with the highest cost
// is added after the 2nd highest then when no. 1 and
// no. 2 fight for first place no. 2 will not go to 2nd
// place but to the rest instead. So at the end 2nd
// place will be given tot he wrong SpellCast property.
// It's even possible that 2nd place remains empty.
//
fSpellCostR += fSpellCost1;
//
// Using these two lines instead of the previous one
// would fix that.
// fSpellCastR += fSpellCast2;
// fSpellCast2 = fSpellCast1;
fSpellCost1 = fSpellCost;
// *****************************************************
}
else if (fSpellCost>fSpellCost2)
{
fSpellCostR += fSpellCost2;
fSpellCost2 = fSpellCost;
}
else
{
fSpellCostR += fSpellCost;
}
break;
}
default:
// Properties that aren't CastSpell properties
fIPCost += MK_IPRP_CalculateItemPropertyCost(iProp);
break;
}
}
iProp = GetNextItemProperty(oItem);
}
int nBaseItemValue = MK_IPRP_GetBaseItemValue(oItem);
// For the next line the order of the multiplicands is important.
//
// Actually 1000*fIPCost*fIPCost would give us the correct result but
// unfortunately for some fIPCost that would be not the result the
// official NWN item value calculation apparently gets sometimes (result-1).
//
// More precisely for every fIPCost where the IEEE 754 floating
// point represenation is lower than fIPCost. That is for example 0.7,
// 0.9, 1.4, 1.8, 2.1, 2.8, 3.3, 3.6, ...
// In game this can be seen on any melee weapon+1 with no other IPs.
// Its gold piece value is two gold to low (two because of the item
// multiplier which is 2 for any weapon).
//
// For example for a simple dagger+1 we have:
// - basecost is 2,
// - item multiplier is 2,
// - fIPCost is StringToFloat("0.9") (IEEE 754 presentation is 0.899999976).
// Calculating the better but wrong way would give us:
// - 1000 * 0.899999976 * 0.899999976 = 900.000 * 0.899999976 = 810.000 = 810
// Item value then would be 2*(2 + 810) = 2*812 = 1624
// Doing the calculation as it's apparently done in NWN we get:
// - 0.899999976 * 0.899999976 * 1000 = 0.809999943 * 1000 = 809.999938 = 809
// That makes the item value 2*(2 + 809) = 2*811 = 1622 (two less than it should be)
//
int nIPCost =FloatToInt(fIPCost*fIPCost*1000);
int nIPCostValue = FloatToInt(nIPCost*fItemMultiplier);
// To calculate nSpellCostValue we have round down the product
// fSpellCost*fItemMultiplier if the first number after the decimal point
// is 0,1,2,3,4,5,6,7 and we have to round up if it's 8 or 9.
// This looks simple but unfortunately it's not. For example
//
// nSpellCostValue = FloatToInt(fSpellCost*fItemMultiplier + 0.2f);
//
// won't work always. Example:
//
// FloatToInt(266.799987793 + 0.2f)
// = FloatToInt(267.000000)
// = 267 # 266
//
// nSpellCostValue = FloatToInt((fSpellCost*fItemMultiplier*10 + 2.0) / 10);
//
// does not work too. Example
//
// FloatToInt((266.799987793 * 10 + 2) / 10)
// = FloatToInt((2668.0000 + 2) / 10)
// = FloatToInt( 2670 / 10 )
// = 267 # 266
//
// In the end we have to convert the product into a string, search for the
// decimal point and look at character following the decimal point.
// int nSpellCostValue = MK_IPRP_FloatToInt(fSpellCost * fItemMultiplier, 8);
// MK_IPRP_DEBUG_TRACE(" > fSpellCost*fIMulti="+FloatToString(fSpellCost * fItemMultiplier));
// MK_IPRP_DEBUG_TRACE(" > (fSpellCost+1)*fIMulti="+FloatToString((fSpellCost+1) * fItemMultiplier));
// MK_IPRP_DEBUG_TRACE(" > FloatToInt(fSpellCost+1)*fIMulti)="+IntToString(FloatToInt((fSpellCost+1) * fItemMultiplier)));
// int nSpellCost = FloatToInt(fSpellCost1 + 0.75f*fSpellCost2 + 0.5f*fSpellCostR);
// int nSpellCost = MK_MATH_Round(fSpellCost1 + 0.75f*fSpellCost2 + 0.5f*fSpellCostR);
// float fSpellCost = fSpellCost1 + 0.75f*fSpellCost2 + 0.5f*fSpellCostR;
// int nSpellCost = FloatToInt(fSpellCost1) + FloatToInt(0.75f*fSpellCost2) + FloatToInt(0.5f*fSpellCostR);
float fSpellCost1q = fSpellCost1;
float fSpellCost2q = 0.75f*fSpellCost2;
float fSpellCostRq = 0.5f*fSpellCostR;
int nSpellCost1 = FloatToInt(fSpellCost1q); float fSpellCost1r = fSpellCost1q-nSpellCost1;
int nSpellCost2 = FloatToInt(fSpellCost2q); float fSpellCost2r = fSpellCost2q-nSpellCost2;
int nSpellCostR = FloatToInt(fSpellCostRq); float fSpellCostRr = fSpellCostRq-nSpellCostR;
float fSpellCostRes = (fSpellCost1r+fSpellCost2r+fSpellCostRr);
int nSpellCostRes = FloatToInt(fSpellCostRes);
int nSpellCostS = nSpellCost1+nSpellCost2+nSpellCostR;
// float fSpellCost = nSpellCost1+nSpellCost2+nSpellCostR + (fSpellCost1r+fSpellCost2r+fSpellCostRr);
// int nSpellCost = nSpellCost1+nSpellCost2+nSpellCostR + FloatToInt(fSpellCost1r+fSpellCost2r+fSpellCostRr);
float fSpellCost = fSpellCost1 + (7.5f*fSpellCost2/10) + 0.5f*fSpellCostR;
int nSpellCost = FloatToInt(fSpellCost);
float fSpellCostValue = (nSpellCost + 1) * fItemMultiplier - FloatToInt(fItemMultiplier);
int nSpellCostValue = FloatToInt(fSpellCostValue);
int nStackSize = GetItemStackSize(oItem);
nItemValue = (nBaseItemValue + nIPCostValue + nSpellCostValue + nAdditionalCost) * nStackSize;
if (nItemValue==0)
{
int nMaxStack = MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1);
if (nStackSize>=nMaxStack)
{
nItemValue = 1;
}
}
if (bWriteLog)
{
itemproperty iProp = GetFirstItemProperty(oItem);
string sMsg="";
string sSubTypeCosts="";
string sCostTableCosts="";
while (GetIsItemPropertyValid(iProp))
{
if (GetItemPropertyType(iProp) == ITEM_PROPERTY_CAST_SPELL)
{
int nSubType = GetItemPropertySubType(iProp);
sMsg += (";"+IntToString(nSubType));
sSubTypeCosts += (";"+FloatToString(MK_Get2DAFloat("iprp_spells", "Cost", nSubType)));
sCostTableCosts += (";"+FloatToString(MK_Get2DAFloat("iprp_chargecost", "Cost", GetItemPropertyCostTableValue(iProp))));
}
iProp = GetNextItemProperty(oItem);
}
sMsg += sSubTypeCosts;
sMsg += sCostTableCosts;
sMsg += (";"+FloatToString(fSpellCost1)+";"+FloatToString(fSpellCost2)+";"+FloatToString(fSpellCostR)+";"
+FloatToString(fSpellCost1q)+";"+FloatToString(fSpellCost2q)+";"+FloatToString(fSpellCostRq)+";"
+IntToString(nSpellCost1)+";"+IntToString(nSpellCost2)+";"+IntToString(nSpellCostR)+";"
+FloatToString(fSpellCost1r)+";"+FloatToString(fSpellCost2r)+";"+FloatToString(fSpellCostRr)+";"
+IntToString(nSpellCostS)+";"+FloatToString(fSpellCostRes)+";"+IntToString(nSpellCostRes)+";"
+FloatToString(fSpellCost)+";"+IntToString(nSpellCost)+";"+FloatToString(fSpellCostValue)+";"
+IntToString(nSpellCostValue)+";"
+FloatToString(fItemMultiplier)+";"+IntToString(nItemValue-nAdditionalCost-nBaseItemValue)+";"+IntToString(GetGoldPieceValue(oItem)-nAdditionalCost-nBaseItemValue));
WriteTimestampedLogEntry(sMsg);
}
MK_IPRP_DEBUG_TRACE(" > nBaseItemValue = "+IntToString(nBaseItemValue));
MK_IPRP_DEBUG_TRACE(" > fItemMultiplier="+FloatToString(fItemMultiplier));
MK_IPRP_DEBUG_TRACE(" > nIPCostValue = "+IntToString(nIPCostValue)+ " (fIPCost="+FloatToString(fIPCost)+")");
MK_IPRP_DEBUG_TRACE(" > nSpellCostValue = "+IntToString(nSpellCostValue));
MK_IPRP_DEBUG_TRACE(" > fSpellCost1,2,R="+FloatToString(fSpellCost1)+", "+FloatToString(fSpellCost2)+", "+FloatToString(fSpellCostR));
MK_IPRP_DEBUG_TRACE(" > 1*fSpC1/0,75*fSpC2/0,5*fSpCR="+FloatToString(1.0*fSpellCost1)+", "+FloatToString(0.75*fSpellCost2)+", "+FloatToString(0.5*fSpellCostR));
MK_IPRP_DEBUG_TRACE(" > 1*fSpC1+0,75*fSpC2+0,5*fSpCR="+FloatToString(fSpellCost));
MK_IPRP_DEBUG_TRACE(" > nSpellCost="+IntToString(nSpellCost));
MK_IPRP_DEBUG_TRACE(" > fSpellCostValue [ =(nSpellCost + 1) * fItemMultiplier - FloatToInt(fItemMultiplier) ]="+FloatToString(fSpellCostValue));
MK_IPRP_DEBUG_TRACE(" > nAdditionalCost = "+IntToString(nAdditionalCost));
int nMaxStack = MK_Get2DAInt("baseitems", "Stacking", nBaseItemType, 1);
MK_IPRP_DEBUG_TRACE(" > nStackSize/nStackMax="+IntToString(nStackSize)+"/"+IntToString(nMaxStack));
MK_IPRP_DEBUG_TRACE(" > nItemValue = "+IntToString(nItemValue));
}
return nItemValue;
}
int MK_IPRP_GetItemPropertyType(itemproperty iProp)
{
return GetItemPropertyType(iProp);
}
int MK_IPRP_GetItemPropertySubType(itemproperty iProp)
{
return ((MK_IPRP_GetSubTypeResRef(iProp)!="") ? GetItemPropertySubType(iProp) : 0);
}
int MK_IPRP_GetItemPropertyCostTableValue(itemproperty iProp)
{
return ((MK_IPRP_GetCostTableResRef(iProp)!="") ? GetItemPropertyCostTableValue(iProp) : 0);
}
int MK_IPRP_GetItemPropertyParam1Value(itemproperty iProp)
{
return ((MK_IPRP_GetParam1ResRef(iProp)!="") ? GetItemPropertyParam1Value(iProp) : 0);
}
/*
void main()
{
}
/**/