2024-02-11 14:01:05 -05:00
|
|
|
#include "prc_inc_clsfunc"
|
|
|
|
#include "psi_inc_soulkn"
|
2025-01-29 22:46:38 -05:00
|
|
|
#include "prc_inc_combat"
|
2024-02-11 14:01:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
// Sanctify_Feat(iType);
|
|
|
|
|
|
|
|
int Sanctify_Feat_Wrapper(int nType, object oPC, object oItem)
|
|
|
|
{
|
|
|
|
return Sanctify_Feat(nType) ||
|
|
|
|
(GetHasFeat(FEAT_SANCTIFY_MARTIAL_MINDBLADE) && GetIsMindblade(oItem));
|
|
|
|
}
|
|
|
|
|
|
|
|
int Vile_Feat_Wrapper(int nType, object oPC, object oItem)
|
|
|
|
{
|
|
|
|
return Vile_Feat(nType) ||
|
|
|
|
(GetHasFeat(FEAT_VILE_MARTIAL_MINDBLADE) && GetIsMindblade(oItem));
|
|
|
|
}
|
|
|
|
|
|
|
|
//const int SKILL_JUMP = 28; Moved to prc_misc_const
|
|
|
|
|
|
|
|
void Sanctify()
|
|
|
|
{
|
|
|
|
|
|
|
|
object oItem;
|
|
|
|
object oPC = OBJECT_SELF;
|
|
|
|
int iType;
|
|
|
|
int iEquip = GetLocalInt(oPC,"ONEQUIP");
|
|
|
|
|
|
|
|
|
|
|
|
if (GetLocalInt(oItem,"MartialStrik")) return;
|
|
|
|
|
|
|
|
if (iEquip==2)
|
|
|
|
{
|
|
|
|
if(GetHasFeat(FEAT_HOLY_MARTIAL_STRIKE)) return;
|
|
|
|
|
|
|
|
oItem=GetItemLastEquipped();
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
if(GetLocalInt(oItem,"SanctMar")) return ;
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!Sanctify_Feat_Wrapper(iType, oPC, oItem)) return;
|
2025-01-21 07:40:49 -05:00
|
|
|
|
|
|
|
itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
|
|
|
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
|
|
|
itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
|
|
|
itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
|
|
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
|
|
|
ip4 = TagItemProperty(ip4,"Sanctify4");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip4,oItem,9999.0);
|
2024-02-11 14:01:05 -05:00
|
|
|
SetLocalInt(oItem,"SanctMar",1);
|
2025-01-21 07:40:49 -05:00
|
|
|
|
2024-02-11 14:01:05 -05:00
|
|
|
}
|
|
|
|
else if (iEquip==1)
|
|
|
|
{
|
|
|
|
if(GetHasFeat(FEAT_HOLY_MARTIAL_STRIKE)) return;
|
|
|
|
|
|
|
|
oItem=GetItemLastUnequipped();
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (!Sanctify_Feat(iType)) return;
|
|
|
|
|
|
|
|
|
|
|
|
if(GetLocalInt(oItem,"SanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"SanctMar");
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
if (GetHasFeat(FEAT_HOLY_MARTIAL_STRIKE))
|
|
|
|
{
|
|
|
|
object oItem2=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"SanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"SanctMar");
|
|
|
|
}
|
|
|
|
if ( GetLocalInt(oItem2,"SanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem2,"SanctMar");
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
|
|
|
|
{
|
2025-01-21 07:40:49 -05:00
|
|
|
itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
|
|
|
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
|
|
|
itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
|
|
|
itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
|
|
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
|
|
|
ip4 = TagItemProperty(ip4,"Sanctify4");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip4,oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"SanctMar",1);
|
2024-02-11 14:01:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
|
|
|
|
{
|
2025-01-21 07:40:49 -05:00
|
|
|
itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
|
|
|
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
|
|
|
itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
|
|
|
itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
|
|
|
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
|
|
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
|
|
|
ip4 = TagItemProperty(ip4,"Sanctify4");
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip4,oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"SanctMar",1);
|
2024-02-11 14:01:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vile()
|
|
|
|
{
|
|
|
|
|
|
|
|
object oItem;
|
|
|
|
object oPC = OBJECT_SELF;
|
|
|
|
int iType;
|
|
|
|
|
|
|
|
// if (GetLocalInt(oPC,"ONENTER")) return;
|
|
|
|
|
|
|
|
int iEquip=GetLocalInt(oPC,"ONEQUIP");
|
|
|
|
|
|
|
|
|
|
|
|
//if (GetLocalInt(oItem,"UnholyStrik")) return;
|
|
|
|
|
|
|
|
if (iEquip==2)
|
|
|
|
{
|
|
|
|
//if (GetHasFeat(FEAT_UNHOLY_STRIKE)) return;
|
|
|
|
|
|
|
|
oItem=GetItemLastEquipped();
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"USanctMar")) return ;
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!Vile_Feat_Wrapper(iType, oPC, oItem)) return;
|
|
|
|
|
|
|
|
int nAlign = GetGoodEvilValue(oPC);
|
|
|
|
if(nAlign > 7)
|
|
|
|
AdjustAlignment(oPC, ALIGNMENT_EVIL, 7, FALSE);
|
|
|
|
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"USanctMar",1);
|
|
|
|
}
|
|
|
|
else if (iEquip==1)
|
|
|
|
{
|
|
|
|
//if (GetHasFeat(FEAT_UNHOLY_STRIKE)) return;
|
|
|
|
|
|
|
|
oItem=GetItemLastUnequipped();
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (!Sanctify_Feat(iType)) return;
|
|
|
|
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"USanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"USanctMar");
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
|
|
|
|
{
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"USanctMar",1);
|
|
|
|
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
|
|
|
if (nAlign>7)
|
|
|
|
AdjustAlignment(oPC,ALIGNMENT_EVIL,7, FALSE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
if(Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
|
|
|
|
{
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
|
|
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
|
|
|
SetLocalInt(oItem,"USanctMar",1);
|
|
|
|
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
|
|
|
if (nAlign>7)
|
|
|
|
AdjustAlignment(oPC,ALIGNMENT_EVIL,7, FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void Pwatk(object oPC)
|
|
|
|
{
|
|
|
|
object oSkin = GetPCSkin(oPC);
|
|
|
|
int n = 47 - 12 - 19 - 6;
|
|
|
|
int i = 9 * 2;
|
|
|
|
SetCompositeBonus(oSkin, "898y4546", 50, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, i);
|
|
|
|
SetCompositeBonus(oSkin, "fghjklh", 50, ITEM_PROPERTY_DECREASED_SKILL_MODIFIER, n);
|
|
|
|
if (GetLocalInt(oPC,"ONEQUIP")!= 2 ) return;
|
|
|
|
|
|
|
|
object oItem = GetItemLastEquipped();
|
|
|
|
|
|
|
|
// don't run this if the equipped item is not a weapon
|
|
|
|
if (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) != oItem) return;
|
|
|
|
|
|
|
|
if (!GetWeaponRanged(oItem))
|
|
|
|
{
|
|
|
|
int iSpell = GetHasSpellEffect(SPELL_PA_POWERSHOT,oPC) ||
|
|
|
|
GetHasSpellEffect(SPELL_PA_IMP_POWERSHOT,oPC) ||
|
|
|
|
GetHasSpellEffect(SPELL_PA_SUP_POWERSHOT,oPC);
|
|
|
|
|
|
|
|
if(iSpell)
|
|
|
|
{
|
|
|
|
PRCRemoveSpellEffects(iSpell,oPC,oPC);
|
|
|
|
|
|
|
|
string nMes = "*Power Shot Mode Deactivated*";
|
|
|
|
FloatingTextStringOnCreature(nMes, oPC, FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
object oPC = OBJECT_SELF;
|
|
|
|
|
|
|
|
Pwatk(oPC);
|
|
|
|
|
|
|
|
|
|
|
|
object oSkin = GetPCSkin(oPC);
|
|
|
|
|
|
|
|
if (GetAlignmentGoodEvil(oPC)!= ALIGNMENT_GOOD)
|
|
|
|
{
|
|
|
|
|
|
|
|
object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
|
|
int iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"SanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"SanctMar");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GetLocalInt(oItem,"MartialStrik"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"MartialStrik");
|
|
|
|
}
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"SanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"SanctMar");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( GetLocalInt(oItem,"MartialStrik"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"MartialStrik");
|
|
|
|
}
|
|
|
|
if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
|
|
|
|
{
|
|
|
|
//Vile();
|
|
|
|
UnholyStrike();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (GetAlignmentGoodEvil(oPC)!= ALIGNMENT_EVIL)
|
|
|
|
{
|
|
|
|
|
|
|
|
object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
|
|
|
int iType= GetBaseItemType(oItem);
|
|
|
|
|
|
|
|
switch (iType)
|
|
|
|
{
|
|
|
|
case BASE_ITEM_BOLT:
|
|
|
|
case BASE_ITEM_BULLET:
|
|
|
|
case BASE_ITEM_ARROW:
|
|
|
|
iType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SHORTBOW:
|
|
|
|
case BASE_ITEM_LONGBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_LIGHTCROSSBOW:
|
|
|
|
case BASE_ITEM_HEAVYCROSSBOW:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS);
|
|
|
|
break;
|
|
|
|
case BASE_ITEM_SLING:
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
if ( GetLocalInt(oItem,"USanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"USanctMar");
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
if (GetLocalInt(oItem,"UnholyStrik"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_GOOD,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"UnholyStrik");
|
|
|
|
}
|
|
|
|
|
|
|
|
oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
|
|
|
iType= GetBaseItemType(oItem);
|
|
|
|
/*
|
|
|
|
if ( GetLocalInt(oItem,"USanctMar"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"USanctMar");
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
if ( GetLocalInt(oItem,"UnholyStrik"))
|
|
|
|
{
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_GOOD,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
|
|
|
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
|
|
|
DeleteLocalInt(oItem,"UnholyStrik");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
|
|
|
|
{
|
|
|
|
Sanctify();
|
|
|
|
MartialStrike();
|
|
|
|
}
|
2025-01-29 22:46:38 -05:00
|
|
|
|
|
|
|
if(GetIsUnarmed(oPC))
|
|
|
|
{
|
|
|
|
effect eCheckEffect = GetFirstEffect(oPC);
|
|
|
|
while (GetIsEffectValid(eCheckEffect))
|
|
|
|
{
|
|
|
|
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE),1);
|
|
|
|
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_HOLYKISTRIKE),1);
|
|
|
|
eCheckEffect = GetNextEffect(oPC);
|
|
|
|
}
|
|
|
|
// Sanctify Strike
|
|
|
|
if (GetHasFeat(FEAT_SANCTIFYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)))
|
|
|
|
{
|
|
|
|
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
|
|
|
|
effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_POSITIVE),RACIAL_TYPE_OUTSIDER);
|
|
|
|
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
|
|
|
|
eLink = TagEffect(eLink,"SanctifyKiStrike");
|
|
|
|
|
|
|
|
//Remove any prior bonus to avoid duplication
|
|
|
|
effect eCheckEffect = GetFirstEffect(oPC);
|
|
|
|
while (GetIsEffectValid(eCheckEffect))
|
|
|
|
{
|
|
|
|
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
|
|
|
eCheckEffect = GetNextEffect(oPC);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Give player the bonus
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Holy Ki Strike
|
|
|
|
if (GetHasFeat(FEAT_HOLYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)))
|
|
|
|
{
|
|
|
|
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2d6,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
|
|
|
|
eEffect1 = TagEffect(eEffect1,"HolyKiStrike");
|
|
|
|
|
|
|
|
//Remove any prior bonus to avoid duplication and remove Sanctify Ki Strike
|
|
|
|
effect eCheckEffect = GetFirstEffect(oPC);
|
|
|
|
while (GetIsEffectValid(eCheckEffect))
|
|
|
|
{
|
|
|
|
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike" || GetEffectTag(eCheckEffect) == "HolyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
|
|
|
eCheckEffect = GetNextEffect(oPC);
|
|
|
|
}
|
|
|
|
|
|
|
|
//Give player the bonus
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect1, oPC);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
effect eCheckEffect = GetFirstEffect(oPC);
|
|
|
|
while (GetIsEffectValid(eCheckEffect))
|
|
|
|
{
|
|
|
|
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike" || GetEffectTag(eCheckEffect) == "HolyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
|
|
|
eCheckEffect = GetNextEffect(oPC);
|
|
|
|
}
|
|
|
|
}
|
2024-02-11 14:01:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
Vile();
|
|
|
|
//WeapEnh();
|
|
|
|
}
|