Fixed Mithral armor Max DEX Penalty

Fixed Mithral armor Max DEX Penalty.  Tweaked Superior Defense.
This commit is contained in:
Jaysyn904 2024-05-27 22:04:18 -04:00
parent 1ab40ace96
commit 3ca3a73cd8
2 changed files with 119 additions and 73 deletions

View File

@ -42,49 +42,76 @@ void CritSTR(object oPC, int iEquip)
void SuperiorDefense(object oPC, int nLevel) void SuperiorDefense(object oPC, int nLevel)
{ {
object oSkin = GetPCSkin(oPC); object oSkin = GetPCSkin(oPC);
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); int nDEXb = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
int nMithral = 0;
int nBonus = 0;
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> PC's DEX bonus is "+ IntToString(nDEXb)+".");
//:: Abort CoC & Mithral checks if not wearing armor
if (oArmor == OBJECT_INVALID) if (oArmor == OBJECT_INVALID)
{ {
SetLocalInt(oSkin, "SuperiorDefenseDexBonus", 0); //SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> No armor found, aborting.");
return; SetCompositeBonus(oSkin, "SuperiorDefenseDexBonus", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
return;
} }
// Determine the base AC value of the armor //:: Determine the base AC value of the armor
int nAC = GetBaseAC(oArmor); int nAC = GetBaseAC(oArmor);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Base AC is "+ IntToString(nAC)+".");
// Check if the armor is medium or heavy based on its AC value //:: Get modifier for Mithral armor, if any.
if (nAC < 4) // Medium armor starts @ 4 AC if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16) //:: TAG ID for Mithral armor
{
SetLocalInt(oSkin, "SuperiorDefenseDexBonus", 0);
return;
}
else
{ {
// Retrieve the base item type row //SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Mithral armor found. +2 Max DEX Bonus");
int nRow = GetBaseItemType(oArmor); nMithral = 2;
nBonus = nBonus + nMithral;
}
// Get the maximum Dexterity bonus from armor.2da //:: Check if the armor is medium or heavy based on its AC value
string sBaseDexBonus = Get2DACache("armor", "DEXBONUS", nRow); if (nAC < 4) //:: Medium armor starts @ 4 AC
int nBaseDexBonus = StringToInt(sBaseDexBonus); {
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Light armor found, Superior Defense aborting.");
SetCompositeBonus(oSkin, "SuperiorDefenseDexBonus", 0, ITEM_PROPERTY_AC_BONUS);
}
// Calculate the new Dexterity bonus //:: Get the maximum Dexterity bonus from armor.2da
int nBonus = 1 + ((nLevel - 3) / 3); string sMaxDexBonus = Get2DACache("armor", "DEXBONUS", nAC);
int nMaxDexBonus = StringToInt(sMaxDexBonus);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Armor's Max DEX bonus is "+ IntToString(nMaxDexBonus)+".");
if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16) //:: Calculate the new bonus from CoC levels
{ //mithral armour :P nBonus = 1 + (nLevel - 3) / 3;
nBonus += 2; //SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus from class levels is "+ IntToString(nBonus)+".");
}
int nNewDexBonus = nBaseDexBonus + nBonus; //SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus before DEX cap is "+ IntToString(nBonus)+".");
// Store the new Dex bonus on the character's skin if (nBonus > nDEXb) //:: Caps AC bonus @ PCs Dex bonus
SetLocalInt(oSkin, "SuperiorDefenseDexBonus", nNewDexBonus); {
nBonus == nDEXb;
}
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus after DEX cap is "+ IntToString(nBonus)+".");
if (nAC > 3) //:: Medium armor starts @ 4 AC
{
int nNewDexBonus = nMaxDexBonus + nBonus;
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nNewDexBonus is "+ IntToString(nNewDexBonus)+".");
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nMithral Bonus is "+ IntToString(nMithral)+".");
//:: Store the new Dex bonus as deflection AC on the character's skin (should be dodge)
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Final SuperiorDefenseDexBonus is "+ IntToString(nNewDexBonus + nMithral)+".");
SetCompositeBonus(oSkin, "SuperiorDefenseDexBonus", nNewDexBonus + nMithral, ITEM_PROPERTY_AC_BONUS);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> -------------------------------------------");
} }
} }
/* void SuperiorDefense(object oPC, int nLevel) /* void SuperiorDefense(object oPC, int nLevel)
{ {
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
@ -130,4 +157,3 @@ void main()
SuperiorDefense(oPC, nLevel); SuperiorDefense(oPC, nLevel);
} }
} }

View File

@ -2,7 +2,7 @@
#include "prc_craft_inc" #include "prc_craft_inc"
//Assumes only one bane/dread can be applied //:: Assumes only one bane/dread can be applied
void BaneCheck(object oItem) void BaneCheck(object oItem)
{ {
if(!GetIsObjectValid(oItem)) if(!GetIsObjectValid(oItem))
@ -37,46 +37,66 @@ void BaneCheck(object oItem)
void main() void main()
{ {
object oPC = OBJECT_SELF; object oPC = OBJECT_SELF;
object oArmour = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
int nBonus = 0; object oSkin = GetPCSkin(oPC);
int nCapIncrease = 0; int nBonus = 0;
int nLevel = (GetLevelByClass(CLASS_TYPE_COC, oPC)); int nCapIncrease = 0;
if(StringToInt(GetStringLeft(GetTag(oArmour), 3)) & 16) int nLevel = (GetLevelByClass(CLASS_TYPE_COC, oPC));
{ //mithral armour :P int nAC = GetBaseAC(oArmor);
nCapIncrease += 2;
} BaneCheck(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
if(nLevel >= 3) BaneCheck(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
{ //increases by 1 every 3 levels of champion of corellon
nCapIncrease += nLevel / 3; if (oArmor == OBJECT_INVALID)
}
if(nCapIncrease)
{ {
int nMaxDexBonus; //SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> Invalid armor found.");
SetIdentified(oArmour, FALSE); SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
switch(GetGoldPieceValue(oArmour)) return;
{ }
case 1: nMaxDexBonus = -1; break; // None - assumes you can't make robes mithral
case 5: nMaxDexBonus = 8; break; // Padded if (nAC < 1) //:: Must be wearing armor
case 10: nMaxDexBonus = 6; break; // Leather {
case 15: nMaxDexBonus = 4; break; // Studded Leather / Hide //SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> No armor found.");
case 100: nMaxDexBonus = 4; break; // Chain Shirt / Scale Mail SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
case 150: nMaxDexBonus = 2; break; // Chainmail / Breastplate return;
case 200: nMaxDexBonus = 1; break; // Splint Mail / Banded Mail }
case 600: nMaxDexBonus = 1; break; // Half-Plate
case 1500: nMaxDexBonus = 1; break; // Full Plate if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16) //:: TAG ID for Mithral armor
} {
SetIdentified(oArmour, TRUE); //SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> Mithral armor found.");
if(nMaxDexBonus == -1) nCapIncrease += 2;
nBonus = 0; //can't increase max dex bonus on 0 base AC armour since it's unlimited }
int nDexBonus = (GetAbilityScore(oPC, ABILITY_DEXTERITY) - 10) / 2;
if(nCapIncrease)
{
//:: Get the maximum Dexterity bonus from armor.2da
string sMaxDexBonus = Get2DACache("armor", "DEXBONUS", nAC);
int nMaxDexBonus = StringToInt(sMaxDexBonus);
if(nMaxDexBonus < 1)
nBonus = 0; //:: can't increase max dex bonus on 0 base AC armour since it's unlimited
int nDexBonus = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> DEX bonus is "+ IntToString(nDexBonus)+".");
if(nDexBonus > nMaxDexBonus) if(nDexBonus > nMaxDexBonus)
{ {
nBonus = min(nDexBonus - nMaxDexBonus, nCapIncrease); nBonus = min(nDexBonus - nMaxDexBonus, nCapIncrease);
} }
}
//SetCompositeBonus(GetPCSkin(oPC), "PRC_CRAFT_MITHRAL", nBonus, ITEM_PROPERTY_AC_BONUS); //:: all of this is already in prc_coc.nss
BaneCheck(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC)); //SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> nBonus is "+ IntToString(nBonus)+".");
BaneCheck(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
if (nLevel < 3) //:: 3rd lvl+ Champion of Corellon handles this in their class script
{
SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", nBonus, ITEM_PROPERTY_AC_BONUS);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> adding bonus.");
}
else
{
SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> skipping bonus.");
}
}
} }