Fixed Mithral armor Max DEX Penalty
Fixed Mithral armor Max DEX Penalty. Tweaked Superior Defense.
This commit is contained in:
parent
1ab40ace96
commit
3ca3a73cd8
@ -42,48 +42,75 @@ 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
|
|
||||||
if (nAC < 4) // Medium armor starts @ 4 AC
|
|
||||||
{
|
|
||||||
SetLocalInt(oSkin, "SuperiorDefenseDexBonus", 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
//:: Get modifier for Mithral armor, if any.
|
||||||
|
if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16) //:: TAG ID for Mithral armor
|
||||||
|
{
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Mithral armor found. +2 Max DEX Bonus");
|
||||||
|
nMithral = 2;
|
||||||
|
nBonus = nBonus + nMithral;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Check if the armor is medium or heavy based on its AC value
|
||||||
|
if (nAC < 4) //:: Medium armor starts @ 4 AC
|
||||||
|
{
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Light armor found, Superior Defense aborting.");
|
||||||
|
SetCompositeBonus(oSkin, "SuperiorDefenseDexBonus", 0, ITEM_PROPERTY_AC_BONUS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get the maximum Dexterity bonus from armor.2da
|
||||||
|
string sMaxDexBonus = Get2DACache("armor", "DEXBONUS", nAC);
|
||||||
|
int nMaxDexBonus = StringToInt(sMaxDexBonus);
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> Armor's Max DEX bonus is "+ IntToString(nMaxDexBonus)+".");
|
||||||
|
|
||||||
|
//:: Calculate the new bonus from CoC levels
|
||||||
|
nBonus = 1 + (nLevel - 3) / 3;
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus from class levels is "+ IntToString(nBonus)+".");
|
||||||
|
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus before DEX cap is "+ IntToString(nBonus)+".");
|
||||||
|
|
||||||
|
if (nBonus > nDEXb) //:: Caps AC bonus @ PCs Dex bonus
|
||||||
{
|
{
|
||||||
// Retrieve the base item type row
|
nBonus == nDEXb;
|
||||||
int nRow = GetBaseItemType(oArmor);
|
}
|
||||||
|
|
||||||
// Get the maximum Dexterity bonus from armor.2da
|
|
||||||
string sBaseDexBonus = Get2DACache("armor", "DEXBONUS", nRow);
|
|
||||||
int nBaseDexBonus = StringToInt(sBaseDexBonus);
|
|
||||||
|
|
||||||
// Calculate the new Dexterity bonus
|
|
||||||
int nBonus = 1 + ((nLevel - 3) / 3);
|
|
||||||
|
|
||||||
if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16)
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_coc -> nBonus after DEX cap is "+ IntToString(nBonus)+".");
|
||||||
{ //mithral armour :P
|
|
||||||
nBonus += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nNewDexBonus = nBaseDexBonus + nBonus;
|
|
||||||
|
|
||||||
// Store the new Dex bonus on the character's skin
|
if (nAC > 3) //:: Medium armor starts @ 4 AC
|
||||||
SetLocalInt(oSkin, "SuperiorDefenseDexBonus", nNewDexBonus);
|
{
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
@ -129,5 +156,4 @@ void main()
|
|||||||
{
|
{
|
||||||
SuperiorDefense(oPC, nLevel);
|
SuperiorDefense(oPC, nLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
if(nLevel >= 3)
|
|
||||||
{ //increases by 1 every 3 levels of champion of corellon
|
|
||||||
nCapIncrease += nLevel / 3;
|
|
||||||
}
|
|
||||||
if(nCapIncrease)
|
|
||||||
{
|
|
||||||
int nMaxDexBonus;
|
|
||||||
SetIdentified(oArmour, FALSE);
|
|
||||||
switch(GetGoldPieceValue(oArmour))
|
|
||||||
{
|
|
||||||
case 1: nMaxDexBonus = -1; break; // None - assumes you can't make robes mithral
|
|
||||||
case 5: nMaxDexBonus = 8; break; // Padded
|
|
||||||
case 10: nMaxDexBonus = 6; break; // Leather
|
|
||||||
case 15: nMaxDexBonus = 4; break; // Studded Leather / Hide
|
|
||||||
case 100: nMaxDexBonus = 4; break; // Chain Shirt / Scale Mail
|
|
||||||
case 150: nMaxDexBonus = 2; break; // Chainmail / Breastplate
|
|
||||||
case 200: nMaxDexBonus = 1; break; // Splint Mail / Banded Mail
|
|
||||||
case 600: nMaxDexBonus = 1; break; // Half-Plate
|
|
||||||
case 1500: nMaxDexBonus = 1; break; // Full Plate
|
|
||||||
}
|
|
||||||
SetIdentified(oArmour, TRUE);
|
|
||||||
if(nMaxDexBonus == -1)
|
|
||||||
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(nDexBonus > nMaxDexBonus)
|
|
||||||
{
|
|
||||||
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));
|
BaneCheck(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
|
||||||
BaneCheck(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
|
BaneCheck(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
|
||||||
|
|
||||||
|
if (oArmor == OBJECT_INVALID)
|
||||||
|
{
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> Invalid armor found.");
|
||||||
|
SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nAC < 1) //:: Must be wearing armor
|
||||||
|
{
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> No armor found.");
|
||||||
|
SetCompositeBonus(oSkin, "PRC_CRAFT_MITHRAL", 0, ITEM_PROPERTY_AC_BONUS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(StringToInt(GetStringLeft(GetTag(oArmor), 3)) & 16) //:: TAG ID for Mithral armor
|
||||||
|
{
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> Mithral armor found.");
|
||||||
|
nCapIncrease += 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)
|
||||||
|
{
|
||||||
|
nBonus = min(nDexBonus - nMaxDexBonus, nCapIncrease);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> nBonus is "+ IntToString(nBonus)+".");
|
||||||
|
|
||||||
|
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.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user