2026/01/12 Late Update
Hexblade doesn't get Shield proficency. Forsaker gets Craft (Alchemy) and Craft (Poison) as class skills. Forsaker can use default helms now. Forsaker can use arms & armor made from special materials. Fixed Dread Necromancer Spirit Worm TLK error. Disabled AI Talent for Awesome Blow. Fixed Warlock + Battlecaster ASF w/ Chain Shirt. Add Material and Quality itemprops to special material crafting. Fixed bug where breaking concentration can screw up next manifestation due to variables not being cleared. Tweaked Defensive Manifestation. Hexblades can't cast in heavy armor. +1 Attack Bonus from Masterwork is removed after enchantment to +1. Fixed issue where Forsaker's Ability Boost would stack with each login. Tweaked Celebrant of Sharess TLK entry. Tweaked Soulblade Warrior TLK entry. Tweaked Vow of Poverty's TLK entry.
This commit is contained in:
@@ -102,7 +102,7 @@
|
||||
98 WP_Falchion 7943 3 1 0
|
||||
99 WP_Maul 7947 3 1 0
|
||||
100 ArmProfLgt 3 3 1 0
|
||||
101 Shield 32 3 1 0
|
||||
101 Shield 32 0 0 0
|
||||
102 DefArrow 8 0 -1 0
|
||||
103 TwoWeap 41 0 -1 0
|
||||
104 Ambidex 1 0 -1 0
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
2DA V2.0
|
||||
|
||||
SkillLabel SkillIndex ClassSkill
|
||||
0 Concentration 1 0
|
||||
1 DisableTrap 2 0
|
||||
2 Discipline 3 1
|
||||
3 Heal 4 1
|
||||
4 Hide 5 0
|
||||
5 Listen 6 1
|
||||
6 Lore 7 0
|
||||
7 MoveSilently 8 0
|
||||
8 OpenLock 9 0
|
||||
9 Perform 11 0
|
||||
10 Persuade 12 0
|
||||
11 PickPocket 13 0
|
||||
12 Search 14 0
|
||||
13 SetTrap 15 0
|
||||
14 Spellcraft 16 0
|
||||
15 Spot 17 0
|
||||
16 Appraise 20 0
|
||||
17 Tumble 21 1
|
||||
18 CraftTrap 22 1
|
||||
19 Bluff 23 0
|
||||
20 Intimidate 24 1
|
||||
21 CraftArmor 25 1
|
||||
22 CraftWeapon 26 1
|
||||
23 Ride 27 1
|
||||
24 Jump 28 1
|
||||
25 TrueSpeak 29 1
|
||||
26 Sense_Motive 30 1
|
||||
27 Balance 32 0
|
||||
28 IaijutsuFocus 33 0
|
||||
29 CraftAlchemy 34 0
|
||||
30 CraftPoison 35 0
|
||||
31 Psicraft 36 0
|
||||
32 Climb 37 1
|
||||
33 CraftGeneral 38 1
|
||||
SkillLabel SkillIndex ClassSkill
|
||||
0 Concentration 1 0
|
||||
1 DisableTrap 2 0
|
||||
2 Discipline 3 1
|
||||
3 Heal 4 1
|
||||
4 Hide 5 0
|
||||
5 Listen 6 1
|
||||
6 Lore 7 0
|
||||
7 MoveSilently 8 0
|
||||
8 OpenLock 9 0
|
||||
9 Perform 11 0
|
||||
10 Persuade 12 0
|
||||
11 PickPocket 13 0
|
||||
12 Search 14 0
|
||||
13 SetTrap 15 0
|
||||
14 Spellcraft 16 0
|
||||
15 Spot 17 0
|
||||
16 Appraise 20 0
|
||||
17 Tumble 21 1
|
||||
18 CraftTrap 22 1
|
||||
19 Bluff 23 0
|
||||
20 Intimidate 24 1
|
||||
21 CraftArmor 25 1
|
||||
22 CraftWeapon 26 1
|
||||
23 Ride 27 1
|
||||
24 Jump 28 1
|
||||
25 TrueSpeak 29 1
|
||||
26 Sense_Motive 30 1
|
||||
27 Balance 32 0
|
||||
28 IaijutsuFocus 33 0
|
||||
29 CraftAlchemy 34 1
|
||||
30 CraftPoison 35 1
|
||||
31 Psicraft 36 0
|
||||
32 Climb 37 1
|
||||
33 CraftGeneral 38 1
|
||||
|
||||
@@ -2341,7 +2341,7 @@
|
||||
2337 Skarn_Spines **** 1 1 1 9 0
|
||||
2338 ScorpionsGrasp **** 1 1 1 9 0
|
||||
2339 CultistShatteredPeak_SmiteMage **** 1 1 1 **** 0
|
||||
2340 AwesomeBlow **** 1 1 1 **** 0
|
||||
2340 AwesomeBlow **** 1 1 1 3 0
|
||||
2341 BloodedOne_War_Cry **** 1 1 1 4 0
|
||||
2342 Desecrate **** 1 1 1 2 0
|
||||
2343 BlastOfForce **** 1 1 1 2 0
|
||||
|
||||
@@ -5371,7 +5371,7 @@
|
||||
5367 VremyonniTraining 16789650 16789651 ife_sk_mast **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 1
|
||||
5368 CultistShatteredPeak_SmiteMage 16789658 16789659 ife_X1ADAbj **** **** **** **** **** **** **** **** **** **** 0 0 **** **** **** 2339 **** 0.5 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5369 Forsaker_FastHealing 16824830 16847615 ife_divineheal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3913 **** 1 1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5370 AwesomeBlow 16833142 16833143 ife_wepspec_Bax **** 25 **** **** **** **** **** **** 2806 28 0 0 1 22 1 2340 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5370 AwesomeBlow 16833142 16833143 ife_wepspec_Bax **** 25 **** **** **** **** **** **** 2806 28 0 0 1 **** 6 2340 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_AWESOME_BLOW 6 1 **** **** **** **** 0 1
|
||||
5371 OversizedTWF 16790149 16790150 ife_twoweap **** 13 **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** 41 374 **** **** **** **** **** **** **** FEAT_OTWF 6 1 **** **** **** **** 0 1
|
||||
5372 FrostFolk_IceBlast 16790167 16790168 is_ConeCold **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3802 **** 1 -1 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5373 Uldra_RayFrost 894 6238 is_RayFrost **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3804 **** 1 3 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
@@ -13248,7 +13248,7 @@
|
||||
13244 DreadNecromancer_Necrotic_Termination 16841609 16829213 is_Nec_Term **** **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 7973 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13245 DreadNecromancer_PlagueOfUndead 16841610 16847585 is_AnimDead **** **** **** **** **** **** **** **** **** **** **** **** **** 15 **** 7974 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
13246 DreadNecromancer_Wail_of_the_Banshee 16841611 6521 is_WailBansh **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** 7975 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13247 DreadNecromancer_Spirit_Worm 16841612 is_GhoulTch is_GhoulTch **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 7976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13247 DreadNecromancer_Spirit_Worm 16841612 16990523 is_GhoulTch **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 7976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13248 ****_Inflict_Minor_Wounds 16841613 1570 is_X1InfMin **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7977 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13249 ****_Light 16841614 6197 is_Light **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7978 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
13250 ****_Read_Magic 16841615 16789529 is_ReadMagic **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7979 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
|
||||
@@ -2341,7 +2341,7 @@
|
||||
2337 Skarn_Spines 16833164 ife_mastelem T P 0 **** 0x01 race_skarn_spine **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 3 **** 0 0 **** 0 3000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2338 ScorpionsGrasp 16836466 ife_mastelem T P 0 **** 0x01 prc_ft_scorpgrsp **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 3 **** 0 0 **** 0 3000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2339 CultistShatteredPeak_SmiteMage 16789658 ife_wepspec_Bax V T 0 **** 0x02 prc_peak_smitemg **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** **** 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 0 0 **** 1 3991 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2340 AwesomeBlow 16833142 ife_wepspec_Bax V T 0 **** 0x02 prc_ft_aweblow **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** **** 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 0 0 **** 1 3991 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2340 AwesomeBlow 16833142 ife_wepspec_Bax V T 0 **** 0x02 prc_ft_aweblow **** **** **** **** **** **** 3 0 **** **** **** **** **** **** **** **** 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 0 0 **** 1 5370 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2341 BloodedOne_War_Cry 6339 is_WarCry E P 0 **** 0x09 tmp_blooded_cry **** **** **** **** **** **** 4 1500 hand **** vco_mehansonc02 **** sco_mehansonc02 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 1 **** 1 6539 1 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
2342 Desecrate 16838054 is_PrEvil E S v 0x3a 0x3f sp_desecrate **** 2 **** **** **** **** 2 1500 hand **** **** **** **** **** **** out 500 **** vco_gazemind **** c_archlant_bat1 0 **** **** **** **** **** **** 0 **** **** **** **** **** 2 **** 1 16838055 0 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3 **** **** ****
|
||||
2343 BlastOfForce 16838078 is_MagMiss V M vs 0x3d 0x3A sp_blastfrc **** **** **** **** **** 2 2 1500 hand **** vco_mehansonc01 **** sco_mehansonc01 vs_chant_evoc_lm vs_chant_evoc_lf area 1000 **** **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16838079 1 0 **** 1 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
@@ -39,8 +39,10 @@ int InvocationASFCheck(object oInvoker, int nClass)
|
||||
case 1: nASF -= 5; break;//light
|
||||
case 2: nASF -= 10; break;//light
|
||||
case 3: nASF -= 20; break;//light
|
||||
case 4: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 20 : 0; break;//medium;
|
||||
case 5: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 30 : 0; break;//medium
|
||||
//case 4: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 20 : 0; break; //medium;
|
||||
//case 5: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 30 : 0; break; //medium
|
||||
case 4: nASF = GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 0 : nASF; break; //medium
|
||||
case 5: nASF = GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 0 : nASF; break; //medium;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1808,6 +1808,11 @@ int GetCraftingDC(object oItem)
|
||||
void MakeMasterwork(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
|
||||
itemproperty ip = ItemPropertyQuality(IP_CONST_QUALITY_MASTERWORK);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
|
||||
int nBase = GetBaseItemType(oItem);
|
||||
if((nBase == BASE_ITEM_ARMOR) ||
|
||||
(nBase == BASE_ITEM_SMALLSHIELD) ||
|
||||
@@ -1817,6 +1822,70 @@ void MakeMasterwork(object oItem)
|
||||
{
|
||||
//no armour check penalty here
|
||||
if(GetItemArmourCheckPenalty(oItem) == 0) return;
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_BALANCE, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_CLIMB, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_HIDE, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_MOVE_SILENTLY, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_PICK_POCKET, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_SET_TRAP, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_TUMBLE, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_JUMP, 1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
}
|
||||
else if(GetWeaponType(nBase))
|
||||
{
|
||||
ip = ItemPropertyAttackBonus(1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
}
|
||||
else if(StringToInt(Get2DACache("prc_craft_gen_it", "Type", nBase)) == PRC_CRAFT_ITEM_TYPE_AMMO)
|
||||
{
|
||||
ip = ItemPropertyAttackBonus(1);
|
||||
ip = TagItemProperty(ip, "Quality_Masterwork");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
/* void MakeMasterwork(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
|
||||
int nBase = GetBaseItemType(oItem);
|
||||
if((nBase == BASE_ITEM_ARMOR) ||
|
||||
(nBase == BASE_ITEM_SMALLSHIELD) ||
|
||||
(nBase == BASE_ITEM_LARGESHIELD) ||
|
||||
(nBase == BASE_ITEM_TOWERSHIELD)
|
||||
)
|
||||
{
|
||||
//no armour check penalty here
|
||||
if(GetItemArmourCheckPenalty(oItem) == 0) return;
|
||||
|
||||
IPSafeAddItemProperty(oItem, ItemPropertySkillBonus(SKILL_HIDE, 1) , 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
IPSafeAddItemProperty(oItem, ItemPropertySkillBonus(SKILL_MOVE_SILENTLY, 1), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
IPSafeAddItemProperty(oItem, ItemPropertySkillBonus(SKILL_PICK_POCKET, 1) , 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
@@ -1830,17 +1899,226 @@ void MakeMasterwork(object oItem)
|
||||
}
|
||||
else if(StringToInt(Get2DACache("prc_craft_gen_it", "Type", nBase)) == PRC_CRAFT_ITEM_TYPE_AMMO)
|
||||
{
|
||||
/*
|
||||
int nDamageType = (nBase == BASE_ITEM_BULLET) ? DAMAGE_TYPE_BLUDGEONING : DAMAGE_TYPE_PIERCING;
|
||||
itemproperty ip1 = ItemPropertyDamageBonus(nDamageType, IP_CONST_DAMAGEBONUS_1);
|
||||
*/
|
||||
|
||||
//int nDamageType = (nBase == BASE_ITEM_BULLET) ? DAMAGE_TYPE_BLUDGEONING : DAMAGE_TYPE_PIERCING;
|
||||
//itemproperty ip1 = ItemPropertyDamageBonus(nDamageType, IP_CONST_DAMAGEBONUS_1);
|
||||
|
||||
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(1), 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
void MakeAdamantine(object oItem)
|
||||
void MakeAdamantine(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
||||
{
|
||||
int nBonus = 0;
|
||||
switch(GetItemBaseAC(oItem))
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
case 3: nBonus = IP_CONST_DAMAGERESIST_1; break;
|
||||
case 4:
|
||||
case 5: nBonus = IP_CONST_DAMAGERESIST_2; break;
|
||||
case 6:
|
||||
case 7:
|
||||
case 8: nBonus = IP_CONST_DAMAGERESIST_3; break;
|
||||
}
|
||||
if(nBonus)
|
||||
{
|
||||
itemproperty ip = ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Adamantine");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_PIERCING, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Adamantine");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SLASHING, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Adamantine");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertyMaterial(IP_MATERIAL_ADAMANTINE);
|
||||
ip = TagItemProperty(ip, "Material_Adamantine");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MakeDarkwood(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
|
||||
itemproperty ip = ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
|
||||
int nBase = GetBaseItemType(oItem);
|
||||
if(((nBase == BASE_ITEM_SMALLSHIELD) ||
|
||||
(nBase == BASE_ITEM_LARGESHIELD) ||
|
||||
(nBase == BASE_ITEM_TOWERSHIELD))
|
||||
)
|
||||
{
|
||||
int nBonus = 2;
|
||||
if(nBase == BASE_ITEM_SMALLSHIELD) nBonus = 1;
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_BALANCE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_CLIMB, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_HIDE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_MOVE_SILENTLY, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_PICK_POCKET, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_SET_TRAP, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_TUMBLE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_JUMP, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertyMaterial(IP_MATERIAL_WOOD_DARKWOOD_ZALANTAR);
|
||||
ip = TagItemProperty(ip, "Material_Darkwood");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
|
||||
void MakeDragonhide(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
}
|
||||
|
||||
void MakeMithral(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
|
||||
itemproperty ip = ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
|
||||
int nBase = GetBaseItemType(oItem);
|
||||
|
||||
if(GetWeaponType(nBase))
|
||||
{
|
||||
ip = ItemPropertyMaterial(IP_MATERIAL_MITHRAL);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
else if(((nBase == BASE_ITEM_ARMOR) ||
|
||||
(nBase == BASE_ITEM_SMALLSHIELD) ||
|
||||
(nBase == BASE_ITEM_LARGESHIELD) ||
|
||||
(nBase == BASE_ITEM_TOWERSHIELD))
|
||||
)
|
||||
{
|
||||
int nBonus = 3;
|
||||
int nPenalty = GetItemArmourCheckPenalty(oItem);
|
||||
if(nBonus > nPenalty) nBonus = nPenalty;
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_BALANCE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_CLIMB, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_HIDE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_MOVE_SILENTLY, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_PICK_POCKET, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_SET_TRAP, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_TUMBLE, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertySkillBonus(SKILL_JUMP, nBonus);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
ip = ItemPropertyMaterial(IP_MATERIAL_MITHRAL);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
|
||||
if(GetItemBaseAC(oItem) == 1)
|
||||
{
|
||||
ip = ItemPropertyArcaneSpellFailure(IP_CONST_ARCANE_SPELL_FAILURE_MINUS_5_PERCENT);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
else
|
||||
{
|
||||
ip = ItemPropertyArcaneSpellFailure(IP_CONST_ARCANE_SPELL_FAILURE_MINUS_10_PERCENT);
|
||||
ip = TagItemProperty(ip, "Material_Mithral");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void MakeColdIron(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ip = ItemPropertyMaterial(IP_MATERIAL_COLD_IRON);
|
||||
ip = TagItemProperty(ip, "Material_ColdIron");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
void MakeSilver(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ip = ItemPropertyMaterial(IP_MATERIAL_SILVER);
|
||||
ip = TagItemProperty(ip, "Material_ColdIron");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
void MakeMundaneCrystal(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ip = ItemPropertyMaterial(IP_MATERIAL_GEM_CRYSTAL_MUNDANE);
|
||||
ip = TagItemProperty(ip, "Material_MundaneCrystal");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
void MakeDeepCrystal(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ip = ItemPropertyMaterial(IP_MATERIAL_GEM_CRYSTAL_DEEP);
|
||||
ip = TagItemProperty(ip, "Material_DeepCrystal");
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
/* void MakeAdamantine(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
||||
@@ -1867,9 +2145,9 @@ void MakeAdamantine(object oItem)
|
||||
IPSafeAddItemProperty(oItem, ipAdamantine, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
void MakeDarkwood(object oItem)
|
||||
/* void MakeDarkwood(object oItem)
|
||||
{
|
||||
if(GetPlotFlag(oItem)) return; //sanity check
|
||||
IPSafeAddItemProperty(oItem, ItemPropertyWeightReduction(IP_CONST_REDUCEDWEIGHT_50_PERCENT), 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||
@@ -1892,8 +2170,9 @@ void MakeDarkwood(object oItem)
|
||||
IPSafeAddItemProperty(oItem, ipDarkwood, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void MakeDragonhide(object oItem)
|
||||
/* void MakeDragonhide(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
}
|
||||
@@ -1929,35 +2208,40 @@ void MakeMithral(object oItem)
|
||||
IPSafeAddItemProperty(oItem, ipMithral, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void MakeColdIron(object oItem)
|
||||
/* void MakeColdIron(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ipColdIron = ItemPropertyMaterial(IP_MATERIAL_COLD_IRON);
|
||||
IPSafeAddItemProperty(oItem, ipColdIron, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
*/
|
||||
|
||||
void MakeSilver(object oItem)
|
||||
/* void MakeSilver(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ipSilver = ItemPropertyMaterial(IP_MATERIAL_SILVER);
|
||||
IPSafeAddItemProperty(oItem, ipSilver, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
void MakeMundaneCrystal(object oItem)
|
||||
*/
|
||||
|
||||
/* void MakeMundaneCrystal(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ipCrystal = ItemPropertyMaterial(IP_MATERIAL_GEM_CRYSTAL_MUNDANE);
|
||||
IPSafeAddItemProperty(oItem, ipCrystal, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
*/
|
||||
|
||||
void MakeDeepCrystal(object oItem)
|
||||
/* void MakeDeepCrystal(object oItem)
|
||||
{
|
||||
//Does nothing so far
|
||||
itemproperty ipDeepCrystal = ItemPropertyMaterial(IP_MATERIAL_GEM_CRYSTAL_DEEP);
|
||||
IPSafeAddItemProperty(oItem, ipDeepCrystal, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
//Creates an item on oOwner, from the baseitemtype and base AC (for armour)
|
||||
object CreateStandardItem(object oOwner, int nBaseItemType, int nBaseAC = -1)
|
||||
{
|
||||
@@ -2985,4 +3269,4 @@ int ITEM_APPR_WEAPON_COLOR_MIDDLE = 1;
|
||||
int ITEM_APPR_WEAPON_COLOR_TOP = 2;
|
||||
*/
|
||||
|
||||
// void main () {}
|
||||
//:: void main () {}
|
||||
|
||||
@@ -120,6 +120,10 @@ const int PRC_GEM_PERLEVEL = 6;
|
||||
// Craft Skull Talisman constants
|
||||
const int PRC_SKULL_BASECOST = 7;
|
||||
|
||||
int GetWeaponType(int nBaseItem);
|
||||
|
||||
void RemoveMasterworkProperties(object oItem);
|
||||
|
||||
// * Returns TRUE if an item is a Craft Base Item
|
||||
// * to be used in spellscript that can be cast on items - i.e light
|
||||
int CIGetIsCraftFeatBaseItem( object oItem );
|
||||
@@ -214,6 +218,78 @@ int CICraftCheckCreateInfusion(object oSpellTarget, object oCaster, int nID = 0)
|
||||
/* Function definitions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
void RemoveMasterworkProperties(object oItem)
|
||||
{
|
||||
if(DEBUG) DoDebug("RemoveMasterworkProperties() called on: " + DebugObject2Str(oItem));
|
||||
|
||||
int nBase = GetBaseItemType(oItem);
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Item base type: " + IntToString(nBase));
|
||||
|
||||
int nRemoved = 0;
|
||||
|
||||
// For armor/shields: remove only the Quality property, keep skill bonuses
|
||||
if((nBase == BASE_ITEM_ARMOR) ||
|
||||
(nBase == BASE_ITEM_SMALLSHIELD) ||
|
||||
(nBase == BASE_ITEM_LARGESHIELD) ||
|
||||
(nBase == BASE_ITEM_TOWERSHIELD))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Processing armor/shield");
|
||||
|
||||
itemproperty ip = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ip))
|
||||
{
|
||||
string sTag = GetItemPropertyTag(ip);
|
||||
int nType = GetItemPropertyType(ip);
|
||||
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Found property - Type: " + IntToString(nType) +
|
||||
", Tag: " + sTag +
|
||||
", String: " + DebugIProp2Str(ip));
|
||||
|
||||
if(sTag == "Quality_Masterwork" && nType == ITEM_PROPERTY_QUALITY)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Removing Quality property");
|
||||
RemoveItemProperty(oItem, ip);
|
||||
nRemoved++;
|
||||
ip = GetFirstItemProperty(oItem); // Restart iteration
|
||||
continue;
|
||||
}
|
||||
ip = GetNextItemProperty(oItem);
|
||||
}
|
||||
}
|
||||
|
||||
// For weapons/ammo: remove both Quality and Attack Bonus properties
|
||||
if(GetWeaponType(nBase) ||
|
||||
StringToInt(Get2DACache("prc_craft_gen_it", "Type", nBase)) == 4)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Processing weapon/ammo");
|
||||
|
||||
itemproperty ip = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ip))
|
||||
{
|
||||
string sTag = GetItemPropertyTag(ip);
|
||||
int nType = GetItemPropertyType(ip);
|
||||
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Found property - Type: " + IntToString(nType) +
|
||||
", Tag: " + sTag +
|
||||
", String: " + DebugIProp2Str(ip));
|
||||
|
||||
// Check for both Quality and Attack Bonus with Quality_Masterwork tag
|
||||
if(sTag == "Quality_Masterwork" &&
|
||||
(nType == ITEM_PROPERTY_QUALITY || nType == ITEM_PROPERTY_ATTACK_BONUS))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_x2_craft >> RemoveMasterworkProperties(): Removing property type " + IntToString(nType));
|
||||
RemoveItemProperty(oItem, ip);
|
||||
nRemoved++;
|
||||
ip = GetFirstItemProperty(oItem); // Restart iteration
|
||||
continue;
|
||||
}
|
||||
ip = GetNextItemProperty(oItem);
|
||||
}
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("prc_x2_craft: RemoveMasterworkProperties() completed. Removed " +
|
||||
IntToString(nRemoved) + " properties.");
|
||||
}
|
||||
|
||||
// * Returns the innate level of a spell. If bDefaultZeroToOne is given
|
||||
// * Level 0 spell will be returned as level 1 spells
|
||||
@@ -2416,8 +2492,8 @@ int CIDoCraftItemFromConversation(int nNumber)
|
||||
|
||||
DeleteLocalObject(oPC,"X2_CI_CRAFT_MAJOR");
|
||||
DeleteLocalObject(oPC,"X2_CI_CRAFT_MINOR");
|
||||
|
||||
if (!GetIsObjectValid(oMajor))
|
||||
|
||||
if (!GetIsObjectValid(oMajor))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(83374,oPC); //"Invalid target"
|
||||
DeleteLocalInt(oPC,"X2_CRAFT_SUCCESS");
|
||||
@@ -2472,7 +2548,7 @@ int CIDoCraftItemFromConversation(int nNumber)
|
||||
{
|
||||
oContainer = GetItemPossessedBy(oPC,"x2_it_craftcont");
|
||||
}
|
||||
|
||||
|
||||
// Do the crafting...
|
||||
object oRet = CIUseCraftItemSkill( oPC, nSkill, stItem.sResRef, stItem.nDC, oContainer) ;
|
||||
|
||||
@@ -2481,7 +2557,9 @@ int CIDoCraftItemFromConversation(int nNumber)
|
||||
|
||||
if (GetIsObjectValid(oRet))
|
||||
{
|
||||
// -----------------------------------------------------------------------
|
||||
RemoveMasterworkProperties(oMajor);
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Copy all item properties from the major object on the resulting item
|
||||
// Through we problably won't use this, its a neat thing to have for the
|
||||
// community
|
||||
@@ -2499,7 +2577,8 @@ int CIDoCraftItemFromConversation(int nNumber)
|
||||
{
|
||||
//TakeGoldFromCreature(stItem.nCost, oPC,TRUE);
|
||||
SpendGP(oPC, stItem.nCost);
|
||||
IPCopyItemProperties(oMajor,oRet);
|
||||
RemoveMasterworkProperties(oMajor);
|
||||
IPCopyItemProperties(oMajor,oRet);
|
||||
}
|
||||
// set success variable for conversation
|
||||
SetLocalInt(oPC,"X2_CRAFT_SUCCESS",TRUE);
|
||||
|
||||
@@ -557,6 +557,9 @@ void _ManifestationHB(object oManifester, location lManifester, object oMfToken)
|
||||
{
|
||||
if(DEBUG) DoDebug("_ManifestationHB(): Manifester moved or lost concentration, destroying token");
|
||||
_DestroyManifestationToken(oManifester, oMfToken);
|
||||
|
||||
//:: Clean up variables
|
||||
_CleanManifestationVariables(oManifester);
|
||||
|
||||
// Inform manifester
|
||||
FloatingTextStrRefOnCreature(16828435, oManifester, FALSE); // "You have lost concentration on the power you were attempting to manifest!"
|
||||
@@ -810,6 +813,25 @@ struct manifestation EvaluateManifestation(object oManifester, object oTarget, s
|
||||
manif.bCanManifest = FALSE;
|
||||
}
|
||||
|
||||
// Check defensive manifestation BEFORE PP deduction
|
||||
if(GetLocalInt(oManifester, "PRC_DefensiveManifestActive"))
|
||||
{
|
||||
int nPowerLevel = GetPowerLevel(oManifester);
|
||||
int nDC = 15 + nPowerLevel;
|
||||
|
||||
if(!GetPRCIsSkillSuccessful(oManifester, SKILL_CONCENTRATION, nDC))
|
||||
{
|
||||
// Failed - deduct PP and prevent manifestation
|
||||
LosePowerPoints(oManifester, manif.nPPCost, TRUE);
|
||||
PayMetapsionicsFocuses(manif);
|
||||
manif.bCanManifest = FALSE;
|
||||
SendMessageToPC(oManifester, "Defensive manifestation concentration check failed.");
|
||||
return manif;
|
||||
}
|
||||
|
||||
manif.bDefensive = TRUE;
|
||||
}
|
||||
|
||||
// Psi-like abilities ignore PP costs and metapsi
|
||||
if(!bIsPsiLike)
|
||||
{
|
||||
@@ -820,7 +842,7 @@ struct manifestation EvaluateManifestation(object oManifester, object oTarget, s
|
||||
PayMetapsionicsFocuses(manif);
|
||||
}
|
||||
|
||||
if(GetLocalInt(oManifester, "PRC_DefensiveManifestActive"))
|
||||
/* if(GetLocalInt(oManifester, "PRC_DefensiveManifestActive"))
|
||||
{
|
||||
// Concentration check (DC 15 + power level)
|
||||
int nPowerLevel = GetPowerLevel(oManifester);
|
||||
@@ -837,7 +859,7 @@ struct manifestation EvaluateManifestation(object oManifester, object oTarget, s
|
||||
// Set defensive flag for any other systems that need it
|
||||
SendMessageToPC(oManifester, "Defensive manifestion concentration check successful.");
|
||||
manif.bDefensive = TRUE;
|
||||
}
|
||||
} */
|
||||
|
||||
//* APPLY SIDE-EFFECTS THAT RESULT FROM SUCCESSFULL MANIFESTATION HERE *//
|
||||
// Psicraft for all those who can see
|
||||
@@ -1118,4 +1140,4 @@ struct manifestation EvaluateDiaDragChannel(object oManifester, object oTarget,
|
||||
}
|
||||
|
||||
// Test main
|
||||
//void main(){}
|
||||
//:: void main(){}
|
||||
|
||||
@@ -327,8 +327,25 @@ int ArcaneSpellFailure(object oCaster, int nCastingClass, int nSpellLevel, int n
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
// Hexblade can cast in light/medium armour and while using small shield.
|
||||
else if(nCastingClass == CLASS_TYPE_HEXBLADE)
|
||||
|
||||
// Hexblade can cast in light armour only.
|
||||
else if(nCastingClass == CLASS_TYPE_HEXBLADE)
|
||||
{
|
||||
//armors
|
||||
switch(nAC)
|
||||
{
|
||||
case 1: nASF -= 5; break; //light
|
||||
case 2: nASF -= 10; break; //light
|
||||
case 3: nASF -= 20; break; //light
|
||||
case 4: nASF = bBattleCaster ? 0 : nASF; break; //medium with Battlecaster
|
||||
case 5: nASF = bBattleCaster ? 0 : nASF; break; //medium with Battlecaster
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
// WRONG: Hexblade can cast in light/medium armour and while using small shield.
|
||||
//:: RIGHT: Hexblades are proficient with all simple and martial weapons, and with light armor but not with shields.
|
||||
/* else if(nCastingClass == CLASS_TYPE_HEXBLADE)
|
||||
{
|
||||
//shields
|
||||
if(GetBaseItemType(oShield) == BASE_ITEM_SMALLSHIELD) nASF -= 5;
|
||||
@@ -345,7 +362,7 @@ int ArcaneSpellFailure(object oCaster, int nCastingClass, int nSpellLevel, int n
|
||||
case 8: nASF -= bBattleCaster ? 45 : 0; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
} */
|
||||
// Bards cannot cast in light armour and while using small shield in 3e
|
||||
/* else if(nCastingClass == CLASS_TYPE_BARD)
|
||||
{
|
||||
|
||||
@@ -806,7 +806,14 @@ void CraftingHB(object oPC, object oItem, itemproperty ip, int nCost, int nXP, s
|
||||
FloatingTextStringOnCreature("Crafting Complete!", oPC);
|
||||
DeleteLocalInt(oPC, PRC_CRAFT_HB);
|
||||
//if(GetIsItemPropertyValid(ip))
|
||||
ApplyProperties(oPC, oItem, ip, nCost, nXP, sFile, nLine);
|
||||
ApplyProperties(oPC, oItem, ip, nCost, nXP, sFile, nLine);
|
||||
|
||||
if(GetLocalInt(oPC, "PRC_CRAFT_REMOVE_MASTERWORK"))
|
||||
{
|
||||
RemoveMasterworkProperties(oItem);
|
||||
DeleteLocalInt(oPC, "PRC_CRAFT_REMOVE_MASTERWORK");
|
||||
}
|
||||
|
||||
if(sFile == "craft_golem")
|
||||
{
|
||||
}
|
||||
@@ -1874,12 +1881,18 @@ void main()
|
||||
int bCheck = FALSE;
|
||||
TakeGoldFromCreature(GetLocalInt(oPC, PRC_CRAFT_COST), oPC, TRUE);
|
||||
if(GetCraftingFeat(oNewItem) != FEAT_CRAFT_ARMS_ARMOR)
|
||||
CopyItem(oNewItem, oPC, TRUE);
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_CRAFT_REMOVE_MASTERWORK", TRUE);
|
||||
CopyItem(oNewItem, oPC, TRUE);
|
||||
}
|
||||
else if(GetIsSkillSuccessful(oPC, nSkill, GetCraftingDC(oNewItem)))
|
||||
{
|
||||
bCheck = (nMaterial & PRC_CRAFT_FLAG_MASTERWORK) ? GetIsSkillSuccessful(oPC, nSkill, 20) : TRUE;
|
||||
if(bCheck)
|
||||
CopyItem(oNewItem, oPC, TRUE);
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_CRAFT_REMOVE_MASTERWORK", TRUE);
|
||||
CopyItem(oNewItem, oPC, TRUE);
|
||||
}
|
||||
}
|
||||
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
||||
}
|
||||
@@ -2147,8 +2160,6 @@ void main()
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
case <CONSTANT>:
|
||||
{
|
||||
|
||||
@@ -78,7 +78,34 @@ void main()
|
||||
// should be handled transparently by the system
|
||||
if(DEBUG) DoDebug("prc_forsake_abil: ERROR: Conversation abort section run");
|
||||
}
|
||||
// Handle PC response
|
||||
// Handle PC response
|
||||
else
|
||||
{
|
||||
int nChoice = GetChoice(oPC);
|
||||
if(DEBUG) DoDebug("prc_forsake_abil: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " +
|
||||
IntToString(nChoice) + "; choice text = '" + GetChoiceText(oPC) + "'");
|
||||
if(nStage == STAGE_SELECT_ABIL)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_forsake_abil: nChoice: " + IntToString(nChoice));
|
||||
|
||||
effect eAbility = EffectAbilityIncrease(nChoice, 1);
|
||||
eAbility = UnyieldingEffect(eAbility);
|
||||
eAbility = TagEffect(eAbility, "ForsakerAbilityBoost");
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC); //Give the boost
|
||||
|
||||
SetPersistantLocalInt(oPC, "ForsakerBoost"+IntToString(nClass), nChoice+1); //Register the boost has been given
|
||||
DeletePersistantLocalInt(oPC,"ForsakerBoostCheck");
|
||||
|
||||
// And we're all done
|
||||
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("prc_forsake_abil: New stage: " + IntToString(nStage));
|
||||
|
||||
// Store the stage value. If it has been changed, this clears out the choices
|
||||
SetStage(nStage, oPC);
|
||||
}
|
||||
/* // Handle PC response
|
||||
else
|
||||
{
|
||||
int nChoice = GetChoice(oPC);
|
||||
@@ -100,5 +127,5 @@ void main()
|
||||
|
||||
// Store the stage value. If it has been changed, this clears out the choices
|
||||
SetStage(nStage, oPC);
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
@@ -121,8 +121,94 @@ void main()
|
||||
// Item is a creature weapon, allow it
|
||||
return;
|
||||
}
|
||||
// Check if the item being equipped is magical
|
||||
// Only check the item being equipped, not entire inventory
|
||||
int bIsMagical = FALSE;
|
||||
int nPropertyCount = 0;
|
||||
itemproperty ipCheck = GetFirstItemProperty(oItem);
|
||||
|
||||
while (GetIsItemPropertyValid(ipCheck))
|
||||
{
|
||||
string sTag = GetItemPropertyTag(ipCheck);
|
||||
int nType = GetItemPropertyType(ipCheck);
|
||||
|
||||
// Check for protected properties
|
||||
if(sTag == "Tag_PRC_OnHitKeeper" ||
|
||||
sTag == "Quality_Masterwork" ||
|
||||
sTag == "Material_Mithral" ||
|
||||
sTag == "Material_Adamantine" ||
|
||||
sTag == "Material_Darkwood" ||
|
||||
sTag == "Material_ColdIron" ||
|
||||
sTag == "Material_MundaneCrystal" ||
|
||||
sTag == "Material_DeepCrystal" ||
|
||||
nType == ITEM_PROPERTY_MATERIAL) // All material properties
|
||||
{
|
||||
// Protected property - skip, don't set bIsMagical
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check for helmet carveout: +1 Concentration only
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_HELMET &&
|
||||
GetItemPropertyType(ipCheck) == ITEM_PROPERTY_SKILL_BONUS &&
|
||||
GetItemPropertySubType(ipCheck) == SKILL_CONCENTRATION &&
|
||||
GetItemPropertyCostTableValue(ipCheck) == 1)
|
||||
{
|
||||
// This is a +1 Concentration helmet with no other properties, allow it
|
||||
bIsMagical = FALSE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
bIsMagical = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ipCheck = GetNextItemProperty(oItem);
|
||||
}
|
||||
|
||||
|
||||
// Check if the item being equipped is magical
|
||||
/* while (GetIsItemPropertyValid(ipCheck))
|
||||
{
|
||||
// Skip protected properties
|
||||
if(GetItemPropertyTag(ipCheck) != "Tag_PRC_OnHitKeeper")
|
||||
{
|
||||
nPropertyCount++;
|
||||
|
||||
// Check for helmet carveout: +1 Concentration only
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_HELMET &&
|
||||
nPropertyCount == 1 &&
|
||||
GetItemPropertyType(ipCheck) == ITEM_PROPERTY_SKILL_BONUS &&
|
||||
GetItemPropertySubType(ipCheck) == SKILL_CONCENTRATION &&
|
||||
GetItemPropertyCostTableValue(ipCheck) == 1)
|
||||
{
|
||||
// This is a +1 Concentration helmet with no other properties, allow it
|
||||
bIsMagical = FALSE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
bIsMagical = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ipCheck = GetNextItemProperty(oItem);
|
||||
} */
|
||||
|
||||
// Apply torch exclusion here (after magical item determination)
|
||||
if(bIsMagical && GetResRef(oItem) == "nw_it_torch001")
|
||||
{
|
||||
bIsMagical = FALSE;
|
||||
}
|
||||
|
||||
// If item is magical, unequip it
|
||||
if(bIsMagical)
|
||||
{
|
||||
AssignCommand(oPC, ClearAllActions(TRUE));
|
||||
AssignCommand(oPC, ActionUnequipItem(oItem));
|
||||
FloatingTextStringOnCreature(GetName(oItem)+" is a magical item!", oPC, FALSE);
|
||||
}
|
||||
|
||||
/* // Check if the item being equipped is magical
|
||||
// Only check the item being equipped, not entire inventory
|
||||
int bIsMagical = FALSE;
|
||||
itemproperty ipCheck = GetFirstItemProperty(oItem);
|
||||
@@ -144,7 +230,7 @@ void main()
|
||||
AssignCommand(oPC, ActionUnequipItem(oItem));
|
||||
FloatingTextStringOnCreature(GetName(oItem)+" is a magical item!", oPC, FALSE);
|
||||
}
|
||||
// If non-magical weapon and Forsaker has DR bypass, add bonuses
|
||||
*/ // If non-magical weapon and Forsaker has DR bypass, add bonuses
|
||||
else if(!bIsMagical && (IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) && (nForsakerLvl >= 3))
|
||||
{
|
||||
// Add DR bypass bonuses to non-magical weapons
|
||||
@@ -167,7 +253,8 @@ void main()
|
||||
}
|
||||
}
|
||||
}
|
||||
// We are called from the OnPlayerUnEquipItem eventhook. Clean up Forsaker properties
|
||||
|
||||
// We are called from the OnPlayerUnEquipItem eventhook. Clean up Forsaker properties
|
||||
else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
|
||||
{
|
||||
oPC = GetItemLastUnequippedBy();
|
||||
|
||||
@@ -10,22 +10,32 @@
|
||||
#include "prc_inc_template"
|
||||
#include "prc_inc_factotum"
|
||||
|
||||
void RestoreForsakerAbilities(object oPC)
|
||||
{
|
||||
int nForsakerLevel = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
|
||||
int i;
|
||||
|
||||
for(i = 1; i <= nForsakerLevel; i++)
|
||||
{
|
||||
int nAbility = GetPersistantLocalInt(oPC, "ForsakerBoost" + IntToString(i));
|
||||
|
||||
if(nAbility > 0 && nAbility <= 6)
|
||||
{
|
||||
effect eAbility = EffectAbilityIncrease(nAbility - 1, 1);
|
||||
eAbility = SupernaturalEffect(eAbility);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC);
|
||||
}
|
||||
}
|
||||
void RestoreForsakerAbilities(object oPC)
|
||||
{
|
||||
int nForsakerLevel = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
|
||||
int i;
|
||||
|
||||
// Remove existing Forsaker ability effects first
|
||||
effect eLoop = GetFirstEffect(oPC);
|
||||
while(GetIsEffectValid(eLoop))
|
||||
{
|
||||
if(GetEffectTag(eLoop) == "ForsakerAbilityBoost")
|
||||
RemoveEffect(oPC, eLoop);
|
||||
eLoop = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
for(i = 1; i <= nForsakerLevel; i++)
|
||||
{
|
||||
int nAbility = GetPersistantLocalInt(oPC, "ForsakerBoost" + IntToString(i));
|
||||
|
||||
if(nAbility > 0 && nAbility <= 6)
|
||||
{
|
||||
effect eAbility = EffectAbilityIncrease(nAbility - 1, 1);
|
||||
eAbility = SupernaturalEffect(eAbility);
|
||||
eAbility = TagEffect(eAbility, "ForsakerAbilityBoost"); // Add tag for removal
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Binary file not shown.
@@ -10021,7 +10021,8 @@ Combining the dynamic powers of martial prowess and arcane might, the Hexblade p
|
||||
|
||||
- Alignment Restrictions: non-good only
|
||||
- Hit Die: d10
|
||||
- Proficiencies: A Hexblade gains proficiency with Simple and Martial Weapons, Light and Medium Armour and with Shields.
|
||||
- Proficiencies: Hexblades are proficient with all simple and martial weapons, and with light armor but not with shields.
|
||||
|
||||
- Skill Points: 2+ Int Modifier.
|
||||
|
||||
CLASS FEATURES:
|
||||
@@ -20878,7 +20879,7 @@ Sharess is a paradoxical deity. Originally, she was a war goddess of the Mulhora
|
||||
REQUIREMENTS:
|
||||
|
||||
Alignment: Chaotic good
|
||||
Skills: Diplomacy 7 ranks , Perform 7 ranks
|
||||
Skills: Persuade 7 ranks , Perform 7 ranks
|
||||
Feats: Sacred Vow, Vow of Purity
|
||||
|
||||
CLASS FEATURES:
|
||||
@@ -26873,9 +26874,9 @@ Note: if you take this feat and are not a Kalashtar, you will have to reselect y
|
||||
Use: Selected.</entry>
|
||||
<entry id="50961" lang="en" sex="m">Soulblade Warrior</entry>
|
||||
<entry id="50962" lang="en" sex="m">Type of Feat: Racial
|
||||
Prerequisite: Kalashtar, ability to manifest a mindblade
|
||||
Prerequisite: Kalashtar, Soulknife 6
|
||||
You can manifest a mindblade(using this feat) as a swift action. Your effective level for determining the mind blade enhancement class feature is 2 higher than normal, but you still do not get access to it until level 6 soulknife.
|
||||
Note: if you take this feat and are not a Kalashtar, you will have to reselect your feats. if you take this feat at level 1 and are not Kalashtar, you will be unable to level.
|
||||
Note: if you take this feat and are not a Kalashtar, you will have to reselect your feats.
|
||||
Use: Selected.</entry>
|
||||
<entry id="50963" lang="en" sex="m">Spiritual Force</entry>
|
||||
<entry id="50964" lang="en" sex="m">Type of Feat: Racial
|
||||
@@ -73732,13 +73733,13 @@ Use: Selected</entry>
|
||||
<entry id="200103" lang="en" sex="m">Type of Feat: Exalted
|
||||
You have taken a sacred vow to forswear material possessions.
|
||||
|
||||
You gain bonuses to your Armor Class, ability scores, and saving throws, as well as bonus exalted feats, all depending on your character level.
|
||||
You gain bonuses to your Armor Class, ability scores, and saving throws, as well as bonus exalted feats, all depending on your character's ascetic level.
|
||||
|
||||
To fulfill your vow, you must not own or use any material possessions, with the following exceptions: You may carry and use ordinary (neither magic nor masterwork) simple weapons, usually just a quarterstaff that serves as a walking stick. You may wear simple clothes (usually just a homespun robe, possibly also including a hat and sandals) with no magical properties. You may carry and use a spell component pouch. You may not use any magic item of any sort, though you can benefit from magic items used on your behalf-you can drink a potion of cure serious wounds a friend gives you, receive a spell cast from a wand, scroll, or staff, or ride on your companion's ebony fly. You may not, however, "borrow" a cloak of resistance or any other magic item from a companion for even a single round, nor may you yourself cast a spell from a scroll, wand, or staff.
|
||||
|
||||
FEAT FEATURES:
|
||||
|
||||
Level
|
||||
Ascetic Level
|
||||
1: AC Armor +4
|
||||
2: Exalted Feat
|
||||
3: AC Armor +5
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user