diff --git a/nwn/nwnprc/trunk/2das/cls_feat_blades.2da b/nwn/nwnprc/trunk/2das/cls_feat_blades.2da
index 323f0ac0..2bfb6098 100644
--- a/nwn/nwnprc/trunk/2das/cls_feat_blades.2da
+++ b/nwn/nwnprc/trunk/2das/cls_feat_blades.2da
@@ -1,195 +1,195 @@
2DA V2.0
- FeatLabel FeatIndex List GrantedOnLevel OnMenu
-0 BLADESONG_STYLE 3190 3 1 0
-1 LESSER_SPELLSONG 3191 3 3 0
-2 GREATER_SPELLSONG 3192 3 6 0
-3 SONG_OF_FURY 3193 3 10 1
-4 ArmProfLgt 3 3 1 0
-5 EPIC_BLADESINGER 25040 3 11 0
-6 FEAT_BSINGER_SPELLCASTING_FEY 18215 2 1 0
-7 FEAT_BSINGER_SPELLCASTING_ABERRATION 18260 2 1 0
-8 FEAT_BSINGER_SPELLCASTING_MONSTROUS 18307 2 1 0
-9 FEAT_BSINGER_SPELLCASTING_OUTSIDER 18354 2 1 0
-10 FEAT_BSINGER_SPELLCASTING_SHAPECHANGER 18401 2 1 0
-11 FEAT_BSINGER_SPELLCASTING_ASSASSIN 18446 2 1 0
-12 FEAT_BSINGER_SPELLCASTING_BARD 18479 2 1 0
-13 FEAT_BSINGER_SPELLCASTING_BEGUILER 18523 2 1 0
-14 FEAT_BSINGER_SPELLCASTING_CELEBRANT_SHARESS 18564 2 1 0
-15 FEAT_BSINGER_SPELLCASTING_CULTIST_PEAK 18594 2 1 0
-16 FEAT_BSINGER_SPELLCASTING_DNECRO 18631 2 1 0
-17 FEAT_BSINGER_SPELLCASTING_DUSKBLADE 18673 2 1 0
-18 FEAT_BSINGER_SPELLCASTING_HARPER 18713 2 1 0
-19 FEAT_BSINGER_SPELLCASTING_HEXBLADE 18747 2 1 0
-20 FEAT_BSINGER_SPELLCASTING_KNIGHT_WEAVE 18784 2 1 0
-21 FEAT_BSINGER_SPELLCASTING_SHADOWLORD 18822 2 1 0
-22 FEAT_BSINGER_SPELLCASTING_SORCERER 18863 2 1 0
-23 FEAT_BSINGER_SPELLCASTING_SUBLIME_CHORD 18911 2 1 0
-24 FEAT_BSINGER_SPELLCASTING_SUEL_ARCHANAMACH 18954 2 1 0
-25 FEAT_BSINGER_SPELLCASTING_WARMAGE 18995 2 1 0
-26 FEAT_BSINGER_SPELLCASTING_WIZARD 19041 2 1 0
-27 Empower 11 1 2 0
-28 ExtSpell 12 1 2 0
-29 MaxSpell 25 1 2 0
-30 Quicken 29 1 2 0
-31 Silent 33 1 2 0
-32 SpellPen 36 1 2 0
-33 StillSpell 37 1 2 0
-34 ImpCritRapier 66 1 2 0
-35 ImpCritLSw 68 1 2 0
-36 Mobility 26 1 2 0
-37 SpringAttack 392 1 2 0
-38 ImpDis 16 1 2 0
-39 SpellFocusCon 166 1 2 0
-40 SpellFocusDiv 167 1 2 0
-41 SpellFocusEnc 168 1 2 0
-42 SpellFocusEvo 169 1 2 0
-43 SpellFocusIll 170 1 2 0
-44 SpellFocusNec 171 1 2 0
-45 SpellFocusTra 172 1 2 0
-46 SpellFocusAbj 35 1 2 0
-47 CmbtCast 7 1 2 0
-48 WP_LightMace 7908 1 2 0
-49 WP_Dart 7914 1 2 0
-50 WP_MrngStar 7923 1 2 0
-51 WP_ShrtSpear 7927 1 2 0
-52 WP_Sickle 7929 1 2 0
-53 WP_Sling 7930 1 2 0
-54 WP_Trident 7932 1 2 0
-55 WP_BstrdSwd 7904 1 2 0
-56 WP_TwoBldSwd 7911 1 2 0
-57 WP_DireMace 7915 1 2 0
-58 WP_DblAxe 7916 1 2 0
-59 WP_Kama 7920 1 2 0
-60 WP_Katana 7921 1 2 0
-61 WP_Kukri 7922 1 2 0
-62 WP_Scythe 7926 1 2 0
-63 WP_Shuriken 7928 1 2 0
-64 WP_DwarfWaraxe 7933 1 2 0
-65 WP_Whip 7934 1 2 0
-66 WP_Lightblade 7935 1 2 0
-67 WP_Thinblade 7936 1 2 0
-68 WP_Courtblade 7937 1 2 0
-69 WP_ShrtSwd 7901 1 2 0
-70 WP_Longswd 7902 1 2 0
-71 WP_Bttlaxe 7903 1 2 0
-72 WP_Lightflail 7905 1 2 0
-73 WP_Warhammer 7906 1 2 0
-74 WP_Longbow 7907 1 2 0
-75 WP_Halberd 7909 1 2 0
-76 WP_ShrtBow 7910 1 2 0
-77 WP_Greatswd 7912 1 2 0
-78 WP_Greataxe 7913 1 2 0
-79 WP_Heavyflail 7917 1 2 0
-80 WP_LghtHammer 7918 1 2 0
-81 WP_Handaxe 7919 1 2 0
-82 WP_Rapier 7924 1 2 0
-83 WP_Scimitar 7925 1 2 0
-84 WP_ThrowingAxe 7931 1 2 0
-85 DefArrow 8 1 2 0
-86 Ambidex 1 1 2 0
-87 IMP_CRIT_ELVEN_LIGHTBLADE 24701 1 2 0
-88 IMP_CRIT_ELVEN_THINBLADE 24709 1 2 0
-89 FEAT_EPIC_SPELL_FOCUS_ABJURATION 610 1 2 0
-90 FEAT_EPIC_SPELL_FOCUS_CONJURATION 611 1 2 0
-91 FEAT_EPIC_SPELL_FOCUS_DIVINATION 612 1 2 0
-92 FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT 613 1 2 0
-93 FEAT_EPIC_SPELL_FOCUS_EVOCATION 614 1 2 0
-94 FEAT_EPIC_SPELL_FOCUS_ILLUSION 615 1 2 0
-95 FEAT_EPIC_SPELL_FOCUS_NECROMANCY 616 1 2 0
-96 FEAT_EPIC_SPELL_FOCUS_TRANSMUTATION 617 1 2 0
-97 FEAT_EPIC_IMPROVED_COMBAT_CASTING 696 1 2 0
-98 FEAT_EPIC_AUTOMATIC_STILL_SPELL_1 863 1 2 0
-99 FEAT_EPIC_AUTOMATIC_STILL_SPELL_2 864 1 2 0
-100 FEAT_EPIC_AUTOMATIC_STILL_SPELL_3 865 1 2 0
-101 FEAT_EPIC_GREAT_INTELLIGENCE_1 794 1 2 0
-102 FEAT_EPIC_GREAT_INTELLIGENCE_2 795 1 2 0
-103 FEAT_EPIC_GREAT_INTELLIGENCE_3 796 1 2 0
-104 FEAT_EPIC_GREAT_INTELLIGENCE_4 797 1 2 0
-105 FEAT_EPIC_GREAT_INTELLIGENCE_5 798 1 2 0
-106 FEAT_EPIC_GREAT_INTELLIGENCE_6 799 1 2 0
-107 FEAT_EPIC_GREAT_INTELLIGENCE_7 800 1 2 0
-108 FEAT_EPIC_GREAT_INTELLIGENCE_8 801 1 2 0
-109 FEAT_EPIC_GREAT_INTELLIGENCE_9 802 1 2 0
-110 FEAT_EPIC_GREAT_INTELLIGENCE_10 803 1 2 0
-111 FEAT_EPIC_BLINDING_SPEED 491 1 2 1
-112 FEAT_EPIC_ARMOR_SKIN 490 1 2 0
-113 FEAT_EPIC_PROWESS 584 1 2 0
-114 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 2 0
-115 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 2 0
-116 FEAT_EPIC_TOUGHNESS_1 754 1 2 0
-117 FEAT_EPIC_TOUGHNESS_2 755 1 2 0
-118 FEAT_EPIC_TOUGHNESS_3 756 1 2 0
-119 FEAT_EPIC_TOUGHNESS_4 757 1 2 0
-120 FEAT_EPIC_TOUGHNESS_5 758 1 2 0
-121 FEAT_EPIC_TOUGHNESS_6 759 1 2 0
-122 FEAT_EPIC_TOUGHNESS_7 760 1 2 0
-123 FEAT_EPIC_TOUGHNESS_8 761 1 2 0
-124 FEAT_EPIC_TOUGHNESS_9 762 1 2 0
-125 FEAT_EPIC_TOUGHNESS_10 763 1 2 0
-126 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 2 0
-127 FocusedSpellPenetrCon 3128 1 2 0
-128 FocusedSpellPenetrDiv 3129 1 2 0
-129 FocusedSpellPenetrEnc 3130 1 2 0
-130 FocusedSpellPenetrEvo 3131 1 2 0
-131 FocusedSpellPenetrIll 3132 1 2 0
-132 FocusedSpellPenetrNec 3133 1 2 0
-133 FocusedSpellPenetrTra 3134 1 2 0
-134 FocusedSpellPenetrAbj 3135 1 2 0
-135 FEAT_EPIC_SPELL_PENETRATION 618 1 -1 0
-136 FEAT_EPIC_AUTOMATIC_QUICKEN_1 857 1 -1 0
-137 FEAT_EPIC_AUTOMATIC_QUICKEN_2 858 1 -1 0
-138 FEAT_EPIC_AUTOMATIC_QUICKEN_3 859 1 -1 0
-139 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_1 860 1 -1 0
-140 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_2 861 1 -1 0
-141 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_3 862 1 -1 0
-142 Bane_Magic_Aberration 23556 0 -1 0
-143 Bane_Magic_Animal 23557 0 -1 0
-144 Bane_Magic_Beast 23558 0 -1 0
-145 Bane_Magic_Construct 23559 0 -1 0
-146 Bane_Magic_Dragon 23560 0 -1 0
-147 Bane_Magic_Dwarf 23561 0 -1 0
-148 Bane_Magic_Elemental 23562 0 -1 0
-149 Bane_Magic_Elf 23563 0 -1 0
-150 Bane_Magic_Fey 23564 0 -1 0
-151 Bane_Magic_Giant 23565 0 -1 0
-152 Bane_Magic_Gnome 23566 0 -1 0
-153 Bane_Magic_HalfElf 23567 0 -1 0
-154 Bane_Magic_Halfling 23568 0 -1 0
-155 Bane_Magic_HalfOrc 23569 0 -1 0
-156 Bane_Magic_Human 23570 0 -1 0
-157 Bane_Magic_Humanoid_Goblinoid 23571 0 -1 0
-158 Bane_Magic_Humanoid_Monstrous 23572 0 -1 0
-159 Bane_Magic_Humanoid_Orc 23573 0 -1 0
-160 Bane_Magic_Humanoid_Reptilian 23574 0 -1 0
-161 Bane_Magic_Magical_Beast 23575 0 -1 0
-162 Bane_Magic_Outsider 23576 0 -1 0
-163 Bane_Magic_Shapechanger 23577 0 -1 0
-164 Bane_Magic_Undead 23578 0 -1 0
-165 Bane_Magic_Vermin 23579 0 -1 0
-166 ArcaneDefenseAbj 415 0 -1 0
-167 ArcaneDefenseCon 416 0 -1 0
-168 ArcaneDefenseDiv 417 0 -1 0
-169 ArcaneDefenseEnch 418 0 -1 0
-170 ArcaneDefenseEvo 419 0 -1 0
-171 ArcaneDefenseIll 420 0 -1 0
-172 ArcaneDefenseNec 421 0 -1 0
-173 ArcaneDefenseTra 422 0 -1 0
-174 GrSpllFcsAbj 393 0 -1 0
-175 GrSpllFcsCnj 394 0 -1 0
-176 GrSpllFcsDiv 395 0 -1 0
-177 GrSpllFcsEnch 396 0 -1 0
-178 GrSpllFcsEvc 397 0 -1 0
-179 GrSpllFcsIll 398 0 -1 0
-180 GrSpllFcsNec 399 0 -1 0
-181 GrSpllFcsTran 400 0 -1 0
-182 GreatSpellPen 401 0 -1 0
-183 FEAT_SCRIBE_SCROLL 945 0 -1 0
-184 FEAT_BREW_POTION 944 0 -1 0
-185 FEAT_CRAFT_WAND 946 0 -1 0
-186 FEAT_DISCIPLE_OF_DARKNESS 4012 0 -1 1
-187 FEAT_CRAFT_WONDROUS_ITEM 2925 0 -1 1
-188 FEAT_CRAFT_MAGIC_ARMS_AND_ARMOR 2926 0 -1 1
-189 FEAT_CRAFT_ROD 2927 0 -1 1
-190 FEAT_CRAFT_STAFF 2928 0 -1 1
-191 FEAT_FORGE_RING 2929 0 -1 1
+ FeatLabel FeatIndex List GrantedOnLevel OnMenu
+0 BLADESONG_STYLE 3190 3 1 0
+1 LESSER_SPELLSONG 3191 3 3 0
+2 GREATER_SPELLSONG 3192 3 6 0
+3 SONG_OF_FURY 3193 3 10 1
+4 ArmProfLgt 3 3 1 0
+5 EPIC_BLADESINGER 25040 3 11 0
+6 FEAT_BSINGER_SPELLCASTING_FEY 18215 2 1 0
+7 FEAT_BSINGER_SPELLCASTING_ABERRATION 18260 2 1 0
+8 FEAT_BSINGER_SPELLCASTING_MONSTROUS 18307 2 1 0
+9 FEAT_BSINGER_SPELLCASTING_OUTSIDER 18354 2 1 0
+10 FEAT_BSINGER_SPELLCASTING_SHAPECHANGER 18401 2 1 0
+11 FEAT_BSINGER_SPELLCASTING_ASSASSIN 18446 2 1 0
+12 FEAT_BSINGER_SPELLCASTING_BARD 18479 2 1 0
+13 FEAT_BSINGER_SPELLCASTING_BEGUILER 18523 2 1 0
+14 FEAT_BSINGER_SPELLCASTING_CELEBRANT_SHARESS 18564 2 1 0
+15 FEAT_BSINGER_SPELLCASTING_CULTIST_PEAK 18594 2 1 0
+16 FEAT_BSINGER_SPELLCASTING_DNECRO 18631 2 1 0
+17 FEAT_BSINGER_SPELLCASTING_DUSKBLADE 18673 2 1 0
+18 FEAT_BSINGER_SPELLCASTING_HARPER 18713 2 1 0
+19 FEAT_BSINGER_SPELLCASTING_HEXBLADE 18747 2 1 0
+20 FEAT_BSINGER_SPELLCASTING_KNIGHT_WEAVE 18784 2 1 0
+21 FEAT_BSINGER_SPELLCASTING_SHADOWLORD 18822 2 1 0
+22 FEAT_BSINGER_SPELLCASTING_SORCERER 18863 2 1 0
+23 FEAT_BSINGER_SPELLCASTING_SUBLIME_CHORD 18911 2 1 0
+24 FEAT_BSINGER_SPELLCASTING_SUEL_ARCHANAMACH 18954 2 1 0
+25 FEAT_BSINGER_SPELLCASTING_WARMAGE 18995 2 1 0
+26 FEAT_BSINGER_SPELLCASTING_WIZARD 19041 2 1 0
+27 Empower 11 1 2 0
+28 ExtSpell 12 1 2 0
+29 MaxSpell 25 1 2 0
+30 Quicken 29 1 2 0
+31 Silent 33 1 2 0
+32 SpellPen 36 1 2 0
+33 StillSpell 37 1 2 0
+34 ImpCritRapier 66 1 2 0
+35 ImpCritLSw 68 1 2 0
+36 Mobility 26 1 2 0
+37 SpringAttack 392 1 2 0
+38 ImpDis 16 1 2 0
+39 SpellFocusCon 166 1 2 0
+40 SpellFocusDiv 167 1 2 0
+41 SpellFocusEnc 168 1 2 0
+42 SpellFocusEvo 169 1 2 0
+43 SpellFocusIll 170 1 2 0
+44 SpellFocusNec 171 1 2 0
+45 SpellFocusTra 172 1 2 0
+46 SpellFocusAbj 35 1 2 0
+47 CmbtCast 7 1 2 0
+48 WP_LightMace 7908 1 2 0
+49 WP_Dart 7914 1 2 0
+50 WP_MrngStar 7923 1 2 0
+51 WP_ShrtSpear 7927 1 2 0
+52 WP_Sickle 7929 1 2 0
+53 WP_Sling 7930 1 2 0
+54 WP_Trident 7932 1 2 0
+55 WP_BstrdSwd 7904 1 2 0
+56 WP_TwoBldSwd 7911 1 2 0
+57 WP_DireMace 7915 1 2 0
+58 WP_DblAxe 7916 1 2 0
+59 WP_Kama 7920 1 2 0
+60 WP_Katana 7921 1 2 0
+61 WP_Kukri 7922 1 2 0
+62 WP_Scythe 7926 1 2 0
+63 WP_Shuriken 7928 1 2 0
+64 WP_DwarfWaraxe 7933 1 2 0
+65 WP_Whip 7934 1 2 0
+66 WP_Lightblade 7935 1 2 0
+67 WP_Thinblade 7936 1 2 0
+68 WP_Courtblade 7937 1 2 0
+69 WP_ShrtSwd 7901 1 2 0
+70 WP_Longswd 7902 1 2 0
+71 WP_Bttlaxe 7903 1 2 0
+72 WP_Lightflail 7905 1 2 0
+73 WP_Warhammer 7906 1 2 0
+74 WP_Longbow 7907 1 2 0
+75 WP_Halberd 7909 1 2 0
+76 WP_ShrtBow 7910 1 2 0
+77 WP_Greatswd 7912 1 2 0
+78 WP_Greataxe 7913 1 2 0
+79 WP_Heavyflail 7917 1 2 0
+80 WP_LghtHammer 7918 1 2 0
+81 WP_Handaxe 7919 1 2 0
+82 WP_Rapier 7924 1 2 0
+83 WP_Scimitar 7925 1 2 0
+84 WP_ThrowingAxe 7931 1 2 0
+85 DefArrow 8 1 2 0
+86 Ambidex 1 0 2 0
+87 IMP_CRIT_ELVEN_LIGHTBLADE 24701 1 2 0
+88 IMP_CRIT_ELVEN_THINBLADE 24709 1 2 0
+89 FEAT_EPIC_SPELL_FOCUS_ABJURATION 610 1 2 0
+90 FEAT_EPIC_SPELL_FOCUS_CONJURATION 611 1 2 0
+91 FEAT_EPIC_SPELL_FOCUS_DIVINATION 612 1 2 0
+92 FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT 613 1 2 0
+93 FEAT_EPIC_SPELL_FOCUS_EVOCATION 614 1 2 0
+94 FEAT_EPIC_SPELL_FOCUS_ILLUSION 615 1 2 0
+95 FEAT_EPIC_SPELL_FOCUS_NECROMANCY 616 1 2 0
+96 FEAT_EPIC_SPELL_FOCUS_TRANSMUTATION 617 1 2 0
+97 FEAT_EPIC_IMPROVED_COMBAT_CASTING 696 1 2 0
+98 FEAT_EPIC_AUTOMATIC_STILL_SPELL_1 863 1 2 0
+99 FEAT_EPIC_AUTOMATIC_STILL_SPELL_2 864 1 2 0
+100 FEAT_EPIC_AUTOMATIC_STILL_SPELL_3 865 1 2 0
+101 FEAT_EPIC_GREAT_INTELLIGENCE_1 794 1 2 0
+102 FEAT_EPIC_GREAT_INTELLIGENCE_2 795 1 2 0
+103 FEAT_EPIC_GREAT_INTELLIGENCE_3 796 1 2 0
+104 FEAT_EPIC_GREAT_INTELLIGENCE_4 797 1 2 0
+105 FEAT_EPIC_GREAT_INTELLIGENCE_5 798 1 2 0
+106 FEAT_EPIC_GREAT_INTELLIGENCE_6 799 1 2 0
+107 FEAT_EPIC_GREAT_INTELLIGENCE_7 800 1 2 0
+108 FEAT_EPIC_GREAT_INTELLIGENCE_8 801 1 2 0
+109 FEAT_EPIC_GREAT_INTELLIGENCE_9 802 1 2 0
+110 FEAT_EPIC_GREAT_INTELLIGENCE_10 803 1 2 0
+111 FEAT_EPIC_BLINDING_SPEED 491 1 2 1
+112 FEAT_EPIC_ARMOR_SKIN 490 1 2 0
+113 FEAT_EPIC_PROWESS 584 1 2 0
+114 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 2 0
+115 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 2 0
+116 FEAT_EPIC_TOUGHNESS_1 754 1 2 0
+117 FEAT_EPIC_TOUGHNESS_2 755 1 2 0
+118 FEAT_EPIC_TOUGHNESS_3 756 1 2 0
+119 FEAT_EPIC_TOUGHNESS_4 757 1 2 0
+120 FEAT_EPIC_TOUGHNESS_5 758 1 2 0
+121 FEAT_EPIC_TOUGHNESS_6 759 1 2 0
+122 FEAT_EPIC_TOUGHNESS_7 760 1 2 0
+123 FEAT_EPIC_TOUGHNESS_8 761 1 2 0
+124 FEAT_EPIC_TOUGHNESS_9 762 1 2 0
+125 FEAT_EPIC_TOUGHNESS_10 763 1 2 0
+126 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 2 0
+127 FocusedSpellPenetrCon 3128 1 2 0
+128 FocusedSpellPenetrDiv 3129 1 2 0
+129 FocusedSpellPenetrEnc 3130 1 2 0
+130 FocusedSpellPenetrEvo 3131 1 2 0
+131 FocusedSpellPenetrIll 3132 1 2 0
+132 FocusedSpellPenetrNec 3133 1 2 0
+133 FocusedSpellPenetrTra 3134 1 2 0
+134 FocusedSpellPenetrAbj 3135 1 2 0
+135 FEAT_EPIC_SPELL_PENETRATION 618 1 -1 0
+136 FEAT_EPIC_AUTOMATIC_QUICKEN_1 857 1 -1 0
+137 FEAT_EPIC_AUTOMATIC_QUICKEN_2 858 1 -1 0
+138 FEAT_EPIC_AUTOMATIC_QUICKEN_3 859 1 -1 0
+139 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_1 860 1 -1 0
+140 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_2 861 1 -1 0
+141 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_3 862 1 -1 0
+142 Bane_Magic_Aberration 23556 0 -1 0
+143 Bane_Magic_Animal 23557 0 -1 0
+144 Bane_Magic_Beast 23558 0 -1 0
+145 Bane_Magic_Construct 23559 0 -1 0
+146 Bane_Magic_Dragon 23560 0 -1 0
+147 Bane_Magic_Dwarf 23561 0 -1 0
+148 Bane_Magic_Elemental 23562 0 -1 0
+149 Bane_Magic_Elf 23563 0 -1 0
+150 Bane_Magic_Fey 23564 0 -1 0
+151 Bane_Magic_Giant 23565 0 -1 0
+152 Bane_Magic_Gnome 23566 0 -1 0
+153 Bane_Magic_HalfElf 23567 0 -1 0
+154 Bane_Magic_Halfling 23568 0 -1 0
+155 Bane_Magic_HalfOrc 23569 0 -1 0
+156 Bane_Magic_Human 23570 0 -1 0
+157 Bane_Magic_Humanoid_Goblinoid 23571 0 -1 0
+158 Bane_Magic_Humanoid_Monstrous 23572 0 -1 0
+159 Bane_Magic_Humanoid_Orc 23573 0 -1 0
+160 Bane_Magic_Humanoid_Reptilian 23574 0 -1 0
+161 Bane_Magic_Magical_Beast 23575 0 -1 0
+162 Bane_Magic_Outsider 23576 0 -1 0
+163 Bane_Magic_Shapechanger 23577 0 -1 0
+164 Bane_Magic_Undead 23578 0 -1 0
+165 Bane_Magic_Vermin 23579 0 -1 0
+166 ArcaneDefenseAbj 415 0 -1 0
+167 ArcaneDefenseCon 416 0 -1 0
+168 ArcaneDefenseDiv 417 0 -1 0
+169 ArcaneDefenseEnch 418 0 -1 0
+170 ArcaneDefenseEvo 419 0 -1 0
+171 ArcaneDefenseIll 420 0 -1 0
+172 ArcaneDefenseNec 421 0 -1 0
+173 ArcaneDefenseTra 422 0 -1 0
+174 GrSpllFcsAbj 393 0 -1 0
+175 GrSpllFcsCnj 394 0 -1 0
+176 GrSpllFcsDiv 395 0 -1 0
+177 GrSpllFcsEnch 396 0 -1 0
+178 GrSpllFcsEvc 397 0 -1 0
+179 GrSpllFcsIll 398 0 -1 0
+180 GrSpllFcsNec 399 0 -1 0
+181 GrSpllFcsTran 400 0 -1 0
+182 GreatSpellPen 401 0 -1 0
+183 FEAT_SCRIBE_SCROLL 945 0 -1 0
+184 FEAT_BREW_POTION 944 0 -1 0
+185 FEAT_CRAFT_WAND 946 0 -1 0
+186 FEAT_DISCIPLE_OF_DARKNESS 4012 0 -1 1
+187 FEAT_CRAFT_WONDROUS_ITEM 2925 0 -1 1
+188 FEAT_CRAFT_MAGIC_ARMS_AND_ARMOR 2926 0 -1 1
+189 FEAT_CRAFT_ROD 2927 0 -1 1
+190 FEAT_CRAFT_STAFF 2928 0 -1 1
+191 FEAT_FORGE_RING 2929 0 -1 1
diff --git a/nwn/nwnprc/trunk/2das/loadhints.2da b/nwn/nwnprc/trunk/2das/loadhints.2da
new file mode 100644
index 00000000..181c3a02
--- /dev/null
+++ b/nwn/nwnprc/trunk/2das/loadhints.2da
@@ -0,0 +1,103 @@
+2DA V2.0
+
+ LABEL HINT CAMPAIGNONLY
+0 Hint1 67053 0
+1 Hint2 67054 1
+2 Hint3 67055 0
+3 Hint3 67653 0
+4 Hint3 67655 1
+5 Hint3 67656 1
+6 Hint3 67657 0
+7 Hint3 67658 0
+8 Hint3 67659 0
+9 Hint3 67660 0
+10 Hint3 67661 0
+11 Hint3 67662 1
+12 Hint3 67663 0
+13 Hint3 67664 0
+14 Hint3 67665 1
+15 Hint3 67666 1
+16 Hint3 67667 1
+17 Hint3 67668 0
+18 Hint3 67669 1
+19 Hint3 67670 1
+20 Hint3 67671 0
+21 Hint3 67672 0
+22 Hint3 67673 1
+23 Hint3 67707 1
+24 Hint 68481 0
+25 Hint 68486 0
+26 Qbar2Wp 45 0
+27 DeadHen 68700 1
+28 Hint 40109 0
+29 Hint 40112 0
+30 Hint 40113 2
+31 Hint 40114 1
+32 Hint 40115 2
+33 Hint 40116 2
+34 Hint 40117 2
+35 Hint 40118 2
+36 Hint 40119 2
+37 Hint 40120 2
+38 Hint 40121 2
+39 Hint 40122 2
+40 Hint 40123 2
+41 Hint 40124 2
+42 Hint 40125 2
+43 Hint 40126 2
+44 Hint 40127 2
+45 Hint 40128 2
+46 Hint 40129 2
+47 Hint 40130 2
+48 Hint 40131 2
+49 Hint 40132 2
+50 Hint 40133 2
+51 Hint 40134 2
+52 Hint 40135 2
+53 Hint 40136 2
+54 Hint 40137 2
+55 Hint 40545 2
+56 RestHint 40552 2
+57 HealingHint 40575 2
+58 DeathHint 40576 2
+59 WeaponHint 40580 2
+60 HenchEquipHint 76393 2
+61 RaiseDead 83458 3
+62 CraftFeatHint 83613 1
+63 ContinualLight 83786 0
+64 UseHenches 85567 3
+65 RestHint2 85569 3
+66 PowerAttack 85575 3
+67 PaleMaster1 85703 3
+68 PaleMaster2 85704 3
+69 Wounding 85765 0
+70 Geography101 86778 3
+71 spellcasting 86871 3
+72 lowac 86872 3
+73 shapeshift 86873 3
+74 lightgems 86874 3
+75 useRelic 86881 3
+76 PoolOfsouls 86882 3
+77 Rest 86883 3
+78 AC30 86884 3
+79 Armor 86885 3
+80 SpellMantle 86886 0
+81 InvisiblityCounter 86887 3
+82 UseProperWeapons 86888 3
+83 IllithidBrainSuck 86889 3
+84 AlchemistsFire 100938 0
+85 WeaponFinesse 110100 3
+86 StoresAndShifter 110118 0
+87 PRC8_LETO 16852017 0
+88 PRC8_SPONTANEOUS 16852018 0
+89 PRC8_SPELLSLOTS 16852019 0
+90 PRC8_TWOHANDED 16852020 0
+91 PRC8_DELEVEL 16852021 0
+92 PRC8_EXALTED_VILE 16852022 0
+93 PRC8_OPTIONS 16852023 0
+94 PRC8_INVALID_FEATS_SKILLS 16852024 0
+95 PRC8_MARKER_FEATS 16852025 0
+96 PRC8_INVOKING 16852026 0
+97 PRC8_SPELLCRAFT 16852027 0
+98 PRC8_TUMBLE 16852028 0
+99 PRC8_MASTERFEATS 16852029 0
diff --git a/nwn/nwnprc/trunk/scripts/prc_lasher.nss b/nwn/nwnprc/trunk/scripts/prc_lasher.nss
index 0763cd7d..c1bfd4c6 100644
--- a/nwn/nwnprc/trunk/scripts/prc_lasher.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_lasher.nss
@@ -120,7 +120,7 @@ void RemoveFeatBonuses(object oPC)
{
object oSkin = GetPCSkin(oPC);
- SendMessageToPC(oPC, "prc_lasher: Running RemoveFeatBonuses");
+ if(DEBUG) DoDebug("prc_lasher: Running RemoveFeatBonuses");
if(GetHasSpellEffect(SPELL_LASHER_CRACK_FATE, oPC))
{
@@ -141,7 +141,7 @@ void ApplyWhipBonuses(object oPC, object oWhip, int iClassLevel)
// Only apply bonuses if the item is a whip
if (GetBaseItemType(oWhip) != BASE_ITEM_WHIP) return;
- SendMessageToPC(oPC, "prc_lasher: Running ApplyWhipBonuses");
+ if(DEBUG) DoDebug("prc_lasher: Running ApplyWhipBonuses");
RemoveSpecificProperty(oWhip, ITEM_PROPERTY_DAMAGE_BONUS, IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGEBONUS_2, 1, "SLASHING_WHIP", -1, DURATION_TYPE_TEMPORARY);
@@ -179,7 +179,7 @@ void main()
if (nEvent == FALSE)
{
- SendMessageToPC(oPC, "prc_lasher: Registering Events");
+ if(DEBUG) DoDebug("prc_lasher: Registering Events");
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, "prc_lasher", TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, "prc_lasher", TRUE, FALSE);
}
@@ -187,7 +187,7 @@ void main()
{
if (!GetIsObjectValid(oPC)) return;
{
- SendMessageToPC(oPC, "prc_lasher: Running EVENT_ONPLAYEREQUIPITEM");
+ if(DEBUG) DoDebug("prc_lasher: Running EVENT_ONPLAYEREQUIPITEM");
object oMain = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
object oOff = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
@@ -198,7 +198,7 @@ void main()
}
else if (nEvent == EVENT_ONPLAYERUNEQUIPITEM)
{
- SendMessageToPC(oPC, "prc_lasher: Running EVENT_ONPLAYERUNEQUIPITEM");
+ if(DEBUG) DoDebug("prc_lasher: Running EVENT_ONPLAYERUNEQUIPITEM");
object oItem = GetItemLastUnequipped();
object oMain = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
@@ -207,19 +207,19 @@ void main()
{
if(iClassLevel > 1) //improved knockdown (whip)
{
- SendMessageToPC(oPC, "prc_lasher: Removing Improved Trip (Whip)");
+ if(DEBUG) DoDebug("prc_lasher: Removing Improved Trip (Whip)");
RemoveSpecificProperty(oSkin, ITEM_PROPERTY_BONUS_FEAT, IP_CONST_FEAT_IMPROVED_TRIP);
}
if(iClassLevel > 5) //improved disarm (whip)
{
- SendMessageToPC(oPC, "prc_lasher: Removing Improved Disarm (Whip)");
+ if(DEBUG) DoDebug("prc_lasher: Removing Improved Disarm (Whip)");
RemoveSpecificProperty(oSkin, ITEM_PROPERTY_BONUS_FEAT, IP_CONST_FEAT_IMPROVED_DISARM);
}
RemoveSpecificProperty(oItem, ITEM_PROPERTY_DAMAGE_BONUS, IP_CONST_DAMAGETYPE_SLASHING, IP_CONST_DAMAGEBONUS_2, 1, "SLASHING_WHIP", -1, DURATION_TYPE_TEMPORARY);
- SendMessageToPC(oPC, "prc_lasher: Removing Class Ability Bonuses");
+ if(DEBUG) DoDebug("prc_lasher: Removing Class Ability Bonuses");
RemoveFeatBonuses(oPC);
}
diff --git a/nwn/nwnprc/trunk/spells/sp_enred.nss b/nwn/nwnprc/trunk/spells/sp_enred.nss
index 9881cc68..7dc3bbbe 100644
--- a/nwn/nwnprc/trunk/spells/sp_enred.nss
+++ b/nwn/nwnprc/trunk/spells/sp_enred.nss
@@ -110,10 +110,14 @@ void DispelMonitor(object oCaster, object oTarget, int nSpellID, int nBeatsRemai
if ((sTag == "ARCANE_SIZE_DECREASE") ||
(sTag == "ARCANE_SIZE_INCREASE"))
{
+ if(DEBUG) DoDebug("sp_enred: Removing all effects.");
RemoveEffect(oTarget, eEffect);
}
eEffect = GetNextEffect(oTarget);
- }
+ }
+
+ DelayCommand(0.0f, ResetSize(oTarget));
+ PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
// Size has changed, evaluate PrC feats again
EvalPRCFeats(oTarget);
@@ -135,11 +139,7 @@ void main()
oCaster = OBJECT_SELF;
}
- if(nEvent == EVENT_ONPLAYERREST_STARTED)
- {
- ResetSize(oCaster);
- }
- else if(nEvent == FALSE)
+ if(nEvent == FALSE)
{
int nCasterLevel = PRCGetCasterLevel(oCaster);
int nSpellID = PRCGetSpellId();
@@ -167,6 +167,7 @@ void main()
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_DEXTERITY, 2));
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_STRENGTH, 2));
eLink = EffectLinkEffects(eLink, EffectACDecrease(1));
+ eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_INCREASE_1));
eLink = TagEffect(eLink, "ARCANE_SIZE_INCREASE");
}
else
@@ -175,6 +176,7 @@ void main()
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_DEXTERITY, 2));
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_STRENGTH, 2));
eLink = EffectLinkEffects(eLink, EffectACIncrease(1));
+ eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_DECREASE_1));
eLink = TagEffect(eLink, "ARCANE_SIZE_DECREASE");
}
@@ -187,7 +189,7 @@ void main()
if(bMass)
{
lTarget = PRCGetSpellTargetLocation();
- object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
+ oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
while(GetIsObjectValid(oTarget))
{
@@ -203,11 +205,15 @@ void main()
effect eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
+ DispelMonitor(oCaster, oTarget, nSpellID, 0);
+
string sTag = GetEffectTag(eEffect);
if (sTag == "ARCANE_SIZE_DECREASE")
{
RemoveEffect(oTarget, eEffect);
DelayCommand(0.0f, ResetSize(oTarget));
+ PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
+ DeleteLocalInt(oTarget, "PRC_Power_Compression_SizeReduction");
}
eEffect = GetNextEffect(oTarget);
}
@@ -222,6 +228,8 @@ void main()
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, nSpellID, nCasterLevel);
SetObjectVisualTransform(oTarget, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5);
DelayCommand(fDuration, ResetSize(oTarget));
+ DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ if(DEBUG) DoDebug("sp_enred: DispelMonitor started.");
}
}
else
@@ -232,14 +240,18 @@ void main()
effect eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
+ DispelMonitor(oCaster, oTarget, nSpellID, 0);
+
string sTag = GetEffectTag(eEffect);
if (sTag == "ARCANE_SIZE_INCREASE")
{
RemoveEffect(oTarget, eEffect);
DelayCommand(0.0f, ResetSize(oTarget));
+ PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
+ DeleteLocalInt(oTarget, "PRC_Power_Expansion_SizeIncrease");
}
eEffect = GetNextEffect(oTarget);
- }
+ }
}
else if(GetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction"))
{
@@ -251,15 +263,14 @@ void main()
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, nSpellID, nCasterLevel);
SetObjectVisualTransform(oTarget, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5);
DelayCommand(fDuration, ResetSize(oTarget));
- }
-
- EvalPRCFeats(oTarget);
- DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ if(DEBUG) DoDebug("sp_enred: DispelMonitor started.");
+ }
}
}
else if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC))
{
- if(bEnlarge)
+ if(bEnlarge) //:: Enlarge
{
if(GetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction"))
{
@@ -267,24 +278,35 @@ void main()
effect eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
+ DispelMonitor(oCaster, oTarget, nSpellID, 0);
+
string sTag = GetEffectTag(eEffect);
if (sTag == "ARCANE_SIZE_DECREASE")
{
RemoveEffect(oTarget, eEffect);
DelayCommand(0.0f, ResetSize(oTarget));
+ PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
+ DeleteLocalInt(oTarget, "PRC_Power_Compression_SizeReduction");
}
eEffect = GetNextEffect(oTarget);
}
+
}
- else
+ else if(GetLocalInt(oTarget, "PRC_Power_Expansion_SizeIncrease"))
{
+ FloatingTextStringOnCreature("This creature's size cannot be increased further.", oTarget);
+ }
+ else
+ {
SetLocalInt(oTarget, "PRC_Power_Expansion_SizeIncrease", 1);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, nSpellID, nCasterLevel);
SetObjectVisualTransform(oTarget, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5);
DelayCommand(fDuration, ResetSize(oTarget));
+ DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ if(DEBUG) DoDebug("sp_enred: DispelMonitor started.");
}
}
- else
+ else //:: Reduce
{
if(GetLocalInt(oTarget, "PRC_Power_Expansion_SizeIncrease"))
{
@@ -292,32 +314,46 @@ void main()
effect eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
+ DispelMonitor(oCaster, oTarget, nSpellID, 0);
+
string sTag = GetEffectTag(eEffect);
if (sTag == "ARCANE_SIZE_INCREASE")
{
RemoveEffect(oTarget, eEffect);
DelayCommand(0.0f, ResetSize(oTarget));
+ PRCRemoveEffectsFromSpell(oTarget, GetSpellId());
+ DeleteLocalInt(oTarget, "PRC_Power_Compression_SizeIncrease");
}
eEffect = GetNextEffect(oTarget);
}
}
+ else if(GetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction"))
+ {
+ FloatingTextStringOnCreature("This creature's size cannot be reduced further.", oTarget);
+ }
else
{
SetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction", 1);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, nSpellID, nCasterLevel);
SetObjectVisualTransform(oTarget, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5);
DelayCommand(fDuration, ResetSize(oTarget));
+ DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ if(DEBUG) DoDebug("sp_enred: DispelMonitor started.");
}
- }
-
- EvalPRCFeats(oTarget);
- DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID, FloatToInt(fDuration) / 6));
+ }
}
}
if(!bMass) break;
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
+
+ EvalPRCFeats(oTarget);
+
}
+ else if(nEvent == EVENT_ONPLAYERREST_STARTED)
+ {
+ ResetSize(oCaster);
+ }
PRCSetSchool();
}
\ No newline at end of file
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk
index 5f6811cb..03f2e72d 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk differ
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
index 511f60ba..ecb17405 100644
--- a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
+++ b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
@@ -71342,22 +71342,20 @@ When within your own black labyrinth, you are immune to the last two effects (mo
War mind Tower of Iron Will
War mind True Seeing, Psionic
####END_OF_PSI_SPELLBOOK_RESERVE
- ###PRC8 Loadscreen Hint Reserve 74800-75000-###
-
+ ###PRC8 Loadscreen Hint Reserve 74800-75000-###
LETO does not support the PRC8
Due to Bioware limitations, non-Bioware spontaneous casters do not use the normal spellbook. Those spells can be found in your class radial.
- Due to Bioware limitations, only your highest level Arcane or Divine class can receive new Arcane or Divine spells at level up.
+ Due to Bioware limitations, only your highest level Arcane or Divine class will receive new Arcane or Divine spellslots at level up.
Two handed weapons are shown being wielded one handed to allow feats such as Monkey Grip & Oversized Two-Weapon fighting to work properly. Combat isn't affected.
- De-leveling isn't supported by the PRC8 & can in fact break your character.
-
- Casting an Exalted or Vile spell causes ability damage.
+ De-leveling isn't supported by the PRC8 & can in fact break your character.
+ Casting an Exalted or Vile spell causes ability damage to the caster.
Enable & disable optional game features with the PRC Options radial.
- Knockdown, Called Shot, Taunt & Parry are not valid 3e D&D feats or skills & have been disabled in the PRC8.
-
+ Knockdown, Called Shot, Taunt & Parry are not valid 3e D&D feats or skills & have been disabled in the PRC8.
As in Neverwinter Nights 2, Arcane & Divine prestige classes must pick a marker feat at 1st class level to choose which spellcasting class will be boosted by the new prestige class.
Some prestige classes can advance invoking or shadowcasting instead of spellcasting.
Spellcraft doesn't provide a bonus to your save vs. spells in 3e Dungeons & Dragons. This is reflected in the PRC8.
Tumble doesn't provide a bonus to your Armor Class in 3e Dungeons & Dragons. This is reflected in the PRC8.
+ Feats for Alternate Magic Systems (Psionics, Incarnum, etc) are all organized under a Masterfeat. Psionic Feats, ToB Feats, etc...
Favored Mystery - Black Labyrinth
Holy Warrior
Type of Feat: Reserve
diff --git a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk
index 5f6811cb..03f2e72d 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk differ
diff --git a/nwn/nwnprc/trunk/users/jaysyn/ha_pa_events.nss b/nwn/nwnprc/trunk/users/jaysyn/ha_pa_events.nss
new file mode 100644
index 00000000..4a0077a3
--- /dev/null
+++ b/nwn/nwnprc/trunk/users/jaysyn/ha_pa_events.nss
@@ -0,0 +1,115 @@
+//::///////////////////////////////////////////////
+//:: Power Attack Events
+//:: hp_pa_events
+//:://////////////////////////////////////////////
+/*
+ The NUI events for the Power Attack NUI Window
+*/
+//:://////////////////////////////////////////////
+//:: Created By: Rakiov
+//:: Created On: 22.05.2005
+//:://////////////////////////////////////////////
+
+#include "nw_inc_nui"
+#include "hp_pa_view"
+
+//
+// SetWindowGeometry
+// Sets the window geometry for the Power Attack NUI to the player
+// so it can be remembered when opened next time
+//
+// Arguments:
+// oPlayer object the player that owns the window
+// nToken int the windowId
+//
+void SetWindowGeometry(object oPlayer, int nToken);
+
+void main()
+{
+ object oPlayer = NuiGetEventPlayer();
+ int nToken = NuiGetEventWindow();
+ string sEvent = NuiGetEventType();
+ string sElement = NuiGetEventElement();
+ int nIndex = NuiGetEventArrayIndex();
+ string sWindowId = NuiGetWindowId(oPlayer, nToken);
+
+ //HandleWindowInspectorEvent(); // used to debug
+
+ if(sWindowId != NUI_PRC_POWER_ATTACK_WINDOW)
+ {
+ return;
+ }
+
+ // Get the current Power Attack value for player
+ int currentPAAmount = GetLocalInt(oPlayer, "PRC_PowerAttack_Level");
+
+ // if the window is closed, save the geometry
+ if (sEvent == "close")
+ {
+ SetWindowGeometry(oPlayer, nToken);
+ return;
+ }
+
+ // Not a mouseup event, nothing to do.
+ if (sEvent != "mouseup")
+ {
+ return;
+ }
+
+ int currentBAB = GetBaseAttackBonus(oPlayer);
+
+ if (sElement == NUI_PRC_PA_LEFT_BUTTON_EVENT)
+ {
+ // if the decreased power attack doesn't go below 0 then perform PA decrease
+ if(currentPAAmount-1 >= 0)
+ {
+ SetLocalInt(oPlayer, "PRC_PowerAttack_Level", currentPAAmount-1);
+ ExecuteScript("hp_pa_script", oPlayer);
+ // if decreased pwoer attack is lower than the current BAB then allow
+ // the incrase button
+ if(currentPAAmount-1 <= currentBAB)
+ {
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND, JsonBool(TRUE));
+ }
+ }
+ else
+ {
+ // otherwise we have hit the limit and disable the left button
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND, JsonBool(FALSE));
+ }
+ }
+
+ if (sElement == NUI_PRC_PA_RIGHT_BUTTON_EVENT)
+ {
+ //if the incrased power attack amount is less than or equal to the BAB
+ // then perform the PA increase
+ if(currentPAAmount+1 <= currentBAB)
+ {
+ SetLocalInt(oPlayer, "PRC_PowerAttack_Level", currentPAAmount+1);
+ ExecuteScript("hp_pa_script", oPlayer);
+ // if the increased power attack amount is greater than 0 then enable
+ // the decrease button
+ if (currentPAAmount+1 > 0)
+ {
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND, JsonBool(TRUE));
+ }
+ }
+ else
+ {
+ // otherwise we have hit the limit and disable the right button
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND, JsonBool(FALSE));
+ }
+ }
+
+ currentPAAmount = GetLocalInt(oPlayer, "PRC_PowerAttack_Level");
+
+ // set the geometry to the player since we only get mouseup events on button presses :(
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(currentPAAmount)));
+ SetWindowGeometry(oPlayer, nToken);
+}
+
+void SetWindowGeometry(object oPlayer, int nToken)
+{
+ json dimensions = NuiGetBind(oPlayer, nToken, "geometry");
+ SetLocalJson(oPlayer, NUI_PRC_PA_GEOMETRY_VAR, dimensions);
+}
\ No newline at end of file
diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss b/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss
new file mode 100644
index 00000000..ed4b1751
--- /dev/null
+++ b/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss
@@ -0,0 +1,63 @@
+//::///////////////////////////////////////////////
+//:: Power Attack NUI
+//:: hp_pa_chatscript
+//:://////////////////////////////////////////////
+/*
+ A OnChat script that parses what is said and opens the power attack NUI
+ if provided /pa. Otherwise if /pa x is provided run the command directly
+*/
+//:://////////////////////////////////////////////
+//:: Created By: Rakiov
+//:: Created On: 22.05.2005
+//:://////////////////////////////////////////////
+
+#include "nw_inc_nui"
+#include "hp_pa_view"
+#include "hp_string_util"
+
+void main()
+{
+ // Get current player
+ object oPlayer = GetPCChatSpeaker();
+ if (!GetIsPC(oPlayer))
+ {
+ return;
+ }
+
+ // get current player message and split it up into a list
+ string sCommand = GetPCChatMessage();
+ json sCommandSplit = StringSplit(sCommand);
+
+ if(JsonGetLength(sCommandSplit) > 0)
+ {
+ string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0));
+
+ // if first word is /pa we are using the power attack interface
+ if(firstWord == "/pa")
+ {
+ if(JsonGetLength(sCommandSplit) >= 2)
+ {
+ //if a parameter is given then run the power attack command directly.
+ string param1 = JsonGetString(JsonArrayGet(sCommandSplit, 1));
+ int paAmount = StringToInt(param1);
+ SetLocalInt(oPlayer, "PRC_PowerAttack_Level", paAmount);
+ ExecuteScript("hp_pa_script", oPlayer);
+
+ // update the NUI so it is in sync
+ int nToken = NuiFindWindow(oPlayer, NUI_PRC_POWER_ATTACK_WINDOW);
+ if (nToken != 0)
+ {
+ NuiSetBind(oPlayer, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount)));
+ }
+ }
+ else
+ {
+ // if no param is given then open the NUI
+ NuiPRCPowerAttackView(oPlayer);
+ }
+
+ // clear message from chat
+ SetPCChatMessage();
+ }
+ }
+}
\ No newline at end of file
diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss b/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss
index beeb5d0b..c00e4940 100644
--- a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss
+++ b/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss
@@ -1,6 +1,6 @@
//::///////////////////////////////////////////////
//:: Power Attack Script
-//:: prc_powatk_chs
+//:: hp_pa_script
//:://////////////////////////////////////////////
/*
A script that sets the power attack on a player based on the amount
@@ -13,63 +13,80 @@
#include "prc_spell_const"
+void SetPowerAttack();
+
//
-// SetPowerAttack
-// Sets the power attack for a player, if the amount is less than or equal to
-// the players BAB it will apply the power attack, otherwise it will tell
-// the player it can't.
+// Sets the power attack for a player, if the player has power attack and the
+// amount is less than or equal to the players BAB it will apply the
+// power attack and set the current power attack to the player at variable
+// 'prcPaScriptPaVariable', otherwise it will tell the player it can't.
//
// Arguments:
-// amount int the amount of power attack you want
-// oPlayer object the player to apply the power attack to
+// amount int the amount of power attack you want
+// oPlayer object the player to apply the power attack to
//
-//
-void SetPowerAttack(int amount, object oPlayer);
-
-void SetPowerAttack(int amount, object oPlayer)
+void main()
{
- //You need the power attack feat to use this
- if (GetHasFeat(FEAT_POWER_ATTACK, oPlayer))
+ int amount = GetLocalInt(OBJECT_SELF, "PRC_PowerAttack_Level");
+ int prevPowerAttack5 = GetLocalInt(OBJECT_SELF, "prevPowerAttack5");
+ int prevPowerAttack1 = GetLocalInt(OBJECT_SELF, "prevPowerAttack1");
+ int powerAttack5Amount = amount / 5;
+ int powerAttack1Amount = amount % 5;
+
+ // Current actions can cause this to not run right away, so clear the queue
+ // and force this to happen.
+ ClearAllActions();
+
+
+ //sets the 5 values for Power attack ranging from 0,5,10,15,20 respectivly
+ if (prevPowerAttack5 != powerAttack5Amount)
{
- // It won't work if your BAB is lower than your PA Value
- if(GetBaseAttackBonus(oPlayer) <= amount)
+ if (powerAttack5Amount == 0) // Power Attack 0
{
- int powerAttack5Amount = amount / 5;
- int powerAttack1Amount = amount % 5;
-
- switch (powerAttack1Amount)
- {
- //sets the 1 values for Power attack ranging from 0,1,2,3,4 respectivly
- case 0: // Power Attack 0
- ActionCastSpellAtObject(SPELL_POWER_ATTACK1, oPlayer, TRUE);
- case 1: // Power Attack 1
- ActionCastSpellAtObject(SPELL_POWER_ATTACK2, oPlayer, TRUE);
- case 2: // Power Attack 2
- ActionCastSpellAtObject(SPELL_POWER_ATTACK3, oPlayer, TRUE);
- case 3: // Power Attack 3
- ActionCastSpellAtObject(SPELL_POWER_ATTACK4, oPlayer, TRUE);
- case 4: // Power Attack 4
- ActionCastSpellAtObject(SPELL_POWER_ATTACK5, oPlayer, TRUE);
- }
- switch (powerAttack5Amount)
- {
- case 0: // Power Attack 0
- ActionCastSpellAtObject(SPELL_POWER_ATTACK6, oPlayer, TRUE);
- case 1: // Power Attack 5
- ActionCastSpellAtObject(SPELL_POWER_ATTACK7, oPlayer, TRUE);
- case 2: // Power Attack 10
- ActionCastSpellAtObject(SPELL_POWER_ATTACK8, oPlayer, TRUE);
- case 3: // Power Attack 15
- ActionCastSpellAtObject(SPELL_POWER_ATTACK9, oPlayer, TRUE);
- case 4: // Power Attack 20
- ActionCastSpellAtObject(SPELL_POWER_ATTACK10, oPlayer, TRUE);
- }
- } else {
- FloatingTextStringOnCreature("Power Attack Higher Than BAB", oPlayer);
+ ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK6, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
}
- } else {
- FloatingTextStringOnCreature("Need Power Attack To Use", oPlayer);
+ if (powerAttack5Amount == 1) // Power Attack 5
+ {
+ ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK7, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
+ }
+ if (powerAttack5Amount == 2) // Power Attack 10
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK8, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ if (powerAttack5Amount == 3) // Power Attack 15
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK9, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ if (powerAttack5Amount == 4) // Power Attack 20
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK10, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ SetLocalInt(OBJECT_SELF, "prevPowerAttack5", powerAttack5Amount);
}
-}
-//:: void main (){}
\ No newline at end of file
+ if (prevPowerAttack1 != powerAttack1Amount)
+ {
+ //sets the 1 values for Power attack ranging from 0,1,2,3,4 respectivly
+ if (powerAttack1Amount == 0) // Power Attack 0
+ {
+ ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK1, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
+ }
+ if (powerAttack1Amount == 1) // Power Attack 1
+ {
+ ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK2, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
+ }
+ if (powerAttack1Amount == 2) // Power Attack 2
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK3, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ if (powerAttack1Amount == 3) // Power Attack 3
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK4, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ if (powerAttack1Amount == 4) // Power Attack 4
+ {
+ ActionCastSpellAtObject(SPELL_POWER_ATTACK5, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
+ }
+ SetLocalInt(OBJECT_SELF, "prevPowerAttack1", powerAttack1Amount);
+ }
+}
\ No newline at end of file